Index: neercs/trunk/src/term.c
===================================================================
--- neercs/trunk/src/term.c	(revision 3899)
+++ neercs/trunk/src/term.c	(revision 3900)
@@ -92,6 +92,6 @@
     unsigned char const *buffer = (unsigned char const*)data;
     unsigned int i, j, k,skip, dummy = 0;
-    unsigned int width, height;
-    uint32_t savedattr, scrolled = 0;
+    unsigned int width, height, top, bottom;
+    uint32_t savedattr;
     int x = 0, y = 0, save_x = 0, save_y = 0;
 
@@ -100,4 +100,6 @@
     x = caca_get_cursor_x(sc->cv);
     y = caca_get_cursor_y(sc->cv);
+    top = 1;
+    bottom = height;
 
     if(!sc->init)
@@ -438,4 +440,19 @@
                 //x = width;
                 break;
+            case 'L': /* IL - Insert line */
+                {
+                    unsigned int nb_lines = argc ? argv[0] : 1;
+                    debug("IL %d %d", argc, nb_lines);
+                    for(j = bottom - 1; j >= (unsigned int)y + nb_lines; j--)
+                    {
+                        for(k = 0; k < width; k++)
+                        {
+                            caca_put_char(sc->cv, k, j, caca_get_char(sc->cv, k, j - nb_lines));
+                            caca_put_attr(sc->cv, k, j, caca_get_attr(sc->cv, k, j - nb_lines));
+                         }
+                        caca_draw_line(sc->cv, 0, j - nb_lines, width, j - nb_lines, ' ');
+                    }
+                }
+                break;
             case 'P': /* DCH (0x50) - Delete Character */
                 if(!argc || argv[0] == 0)
@@ -470,18 +487,13 @@
                 y = (argc > 0 && argv[0] > 0) ? argv[0] - 1 : 0;
                 break;
-            case 'r': /* SS  (0x72) - Scroll Screen FIXME */
-                debug("SCROLL scrolled=%d argv=%s", scrolled, argv);
-                if(scrolled) break;
-                if((argv[0]==0 && argv[1]==0)  || scrolled) break;
-                for(j = argv[0]-1; j < argv[1]-1; j++)
-                {
-                    for(k = 0; k < width; k++)
-                    {
-                        caca_put_char(sc->cv, k, j, caca_get_char(sc->cv, k, j+1));
-                        caca_put_attr(sc->cv, k, j, caca_get_attr(sc->cv, k, j+1));
-                    }
-                }
-                caca_draw_line(sc->cv, 0, argv[1]-1, width, argv[1]-1, ' ');
-                scrolled = 1;
+            case 'r': /* FIXME */
+                if(argc == 2) /* DCSTBM - Set top and bottom margin */
+                {
+                    debug("DCSTBM %d %d", argv[0], argv[1]);
+                    top = argv[0];
+                    bottom = argv[1];
+                }
+                else
+                    debug("ansi import: command r with %d params", argc);
                 break;
             case 'h': /* SM (0x68) - FIXME */
@@ -609,11 +621,11 @@
 
         /* Scroll or grow vertically */
-        if((unsigned int)y >= height)
-        {
-            int lines = (y - height) + 1;
+        if((unsigned int)y >= bottom)
+        {
+            int lines = (y - bottom) + 1;
 
             savedattr = caca_get_attr(sc->cv, -1, -1);
 
-            for(j = 0; j + lines < height; j++)
+            for(j = top - 1; j + lines < bottom; j++)
             {
                 for(k = 0; k < width; k++)
@@ -624,6 +636,6 @@
             }
             caca_set_attr(sc->cv, sc->clearattr);
-            caca_fill_box(sc->cv, 0, height - lines,
-                                   width - 1, height - 1, ' ');
+            caca_fill_box(sc->cv, 0, bottom - lines,
+                                   width - 1, bottom - 1, ' ');
             y -= lines;
             caca_set_attr(sc->cv, savedattr);
