billiob pushed a commit to branch master.

commit f5cad4ff7f3298b3ea4f18df85f6c1e50c6d8024
Author: Boris Faure <[email protected]>
Date:   Thu Apr 18 23:12:15 2013 +0200

    compat: only clear cells when scrolling to add text
    
    and to delete lines, but not when just moving the cursor
---
 src/bin/termptyesc.c | 20 ++++++++++----------
 src/bin/termptyops.c | 26 ++++++++++++++++----------
 src/bin/termptyops.h |  8 ++++----
 3 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/src/bin/termptyesc.c b/src/bin/termptyesc.c
index 7f425bd..59fa40b 100644
--- a/src/bin/termptyesc.c
+++ b/src/bin/termptyesc.c
@@ -309,7 +309,7 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, 
Eina_Unicode *ce)
         for (i = 0; i < arg; i++)
           {
              ty->state.cy--;
-             _termpty_text_scroll_rev_test(ty);
+             _termpty_text_scroll_rev_test(ty, EINA_FALSE);
           }
         break;
       case 'B': // cursor down N
@@ -319,7 +319,7 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, 
Eina_Unicode *ce)
         for (i = 0; i < arg; i++)
           {
              ty->state.cy++;
-             _termpty_text_scroll_test(ty);
+             _termpty_text_scroll_test(ty, EINA_FALSE);
           }
         break;
       case 'D': // cursor left N
@@ -413,12 +413,12 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, 
Eina_Unicode *ce)
       case 'S': // scroll up N lines
         arg = _csi_arg_get(&b);
         if (arg < 1) arg = 1;
-        for (i = 0; i < arg; i++) _termpty_text_scroll(ty);
+        for (i = 0; i < arg; i++) _termpty_text_scroll(ty, EINA_FALSE);
         break;
       case 'T': // scroll down N lines
         arg = _csi_arg_get(&b);
         if (arg < 1) arg = 1;
-        for (i = 0; i < arg; i++) _termpty_text_scroll_rev(ty);
+        for (i = 0; i < arg; i++) _termpty_text_scroll_rev(ty, EINA_FALSE);
         break;
       case 'M': // delete N lines - cy
       case 'L': // insert N lines - cy
@@ -442,8 +442,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, 
Eina_Unicode *ce)
              if (arg < 1) arg = 1;
              for (i = 0; i < arg; i++)
                {
-                  if (*cc == 'M') _termpty_text_scroll(ty);
-                  else _termpty_text_scroll_rev(ty);
+                  if (*cc == 'M') _termpty_text_scroll(ty, EINA_TRUE);
+                  else _termpty_text_scroll_rev(ty, EINA_TRUE);
                }
              ty->state.scroll_y1 = sy1;
              ty->state.scroll_y2 = sy2;
@@ -1136,18 +1136,18 @@ _handle_esc(Termpty *ty, const Eina_Unicode *c, 
Eina_Unicode *ce)
       case 'M': // move to prev line
         ty->state.wrapnext = 0;
         ty->state.cy--;
-        _termpty_text_scroll_rev_test(ty);
+        _termpty_text_scroll_rev_test(ty, EINA_TRUE);
         return 1;
       case 'D': // move to next line
         ty->state.wrapnext = 0;
         ty->state.cy++;
-        _termpty_text_scroll_test(ty);
+        _termpty_text_scroll_test(ty, EINA_FALSE);
         return 1;
       case 'E': // add \n\r
         ty->state.wrapnext = 0;
         ty->state.cx = 0;
         ty->state.cy++;
-        _termpty_text_scroll_test(ty);
+        _termpty_text_scroll_test(ty, EINA_FALSE);
         return 1;
       case 'Z': // same a 'ESC [ Pn c'
         _term_txt_write(ty, "\033[?1;2C");
@@ -1311,7 +1311,7 @@ _termpty_handle_seq(Termpty *ty, Eina_Unicode *c, 
Eina_Unicode *ce)
              ty->state.wrapnext = 0;
              if (ty->state.crlf) ty->state.cx = 0;
              ty->state.cy++;
-             _termpty_text_scroll_test(ty);
+             _termpty_text_scroll_test(ty, EINA_TRUE);
              return 1;
            case 0x0d: // CR  '\r' (carriage ret)
              DBG("->CR");
diff --git a/src/bin/termptyops.c b/src/bin/termptyops.c
index 624ab9d..9256536 100644
--- a/src/bin/termptyops.c
+++ b/src/bin/termptyops.c
@@ -59,7 +59,7 @@ termpty_text_save_top(Termpty *ty, Termcell *cells, ssize_t 
w_max)
 }
 
 void
-_termpty_text_scroll(Termpty *ty)
+_termpty_text_scroll(Termpty *ty, Eina_Bool clear)
 {
    Termcell *cells = NULL, *cells2;
    int y, start_y = 0, end_y = ty->h - 1;
@@ -82,6 +82,9 @@ _termpty_text_scroll(Termpty *ty)
      }
    DBG("... scroll!!!!! [%i->%i]", start_y, end_y);
 
+   if (!clear)
+     return;
+
    if (start_y == 0 && end_y == ty->h - 1)
      {
        // screen is a circular buffer now
@@ -90,7 +93,7 @@ _termpty_text_scroll(Termpty *ty)
 
        ty->circular_offset++;
        if (ty->circular_offset >= ty->h)
-        ty->circular_offset = 0;
+         ty->circular_offset = 0;
      }
    else
      {
@@ -106,7 +109,7 @@ _termpty_text_scroll(Termpty *ty)
 }
 
 void
-_termpty_text_scroll_rev(Termpty *ty)
+_termpty_text_scroll_rev(Termpty *ty, Eina_Bool clear)
 {
    Termcell *cells, *cells2 = NULL;
    int y, start_y = 0, end_y = ty->h - 1;
@@ -118,12 +121,15 @@ _termpty_text_scroll_rev(Termpty *ty)
      }
    DBG("... scroll rev!!!!! [%i->%i]", start_y, end_y);
 
+   if (!clear)
+     return;
+
    if (start_y == 0 && end_y == ty->h - 1)
      {
        // screen is a circular buffer now
        ty->circular_offset--;
        if (ty->circular_offset < 0)
-        ty->circular_offset = ty->h - 1;
+         ty->circular_offset = ty->h - 1;
 
        cells = &(ty->screen[ty->circular_offset * ty->w]);
        _text_clear(ty, cells, ty->w, 0, EINA_TRUE);
@@ -143,27 +149,27 @@ _termpty_text_scroll_rev(Termpty *ty)
 }
 
 void
-_termpty_text_scroll_test(Termpty *ty)
+_termpty_text_scroll_test(Termpty *ty, Eina_Bool clear)
 {
    int e = ty->h;
 
    if (ty->state.scroll_y2 != 0) e = ty->state.scroll_y2;
    if (ty->state.cy >= e)
      {
-        _termpty_text_scroll(ty);
+        _termpty_text_scroll(ty, clear);
         ty->state.cy = e - 1;
      }
 }
 
 void
-_termpty_text_scroll_rev_test(Termpty *ty)
+_termpty_text_scroll_rev_test(Termpty *ty, Eina_Bool clear)
 {
    int b = 0;
 
-   if (ty->state.scroll_y2 != 0) b = ty->state.scroll_y1;
+   if (ty->state.scroll_y1 != 0) b = ty->state.scroll_y1;
    if (ty->state.cy < b)
      {
-        _termpty_text_scroll_rev(ty);
+        _termpty_text_scroll_rev(ty, clear);
         ty->state.cy = b;
      }
 }
@@ -185,7 +191,7 @@ _termpty_text_append(Termpty *ty, const Eina_Unicode 
*codepoints, int len)
              ty->state.wrapnext = 0;
              ty->state.cx = 0;
              ty->state.cy++;
-             _termpty_text_scroll_test(ty);
+             _termpty_text_scroll_test(ty, EINA_TRUE);
              cells = &(TERMPTY_SCREEN(ty, 0, ty->state.cy));
           }
         if (ty->state.insert)
diff --git a/src/bin/termptyops.h b/src/bin/termptyops.h
index 3358602..8d11a41 100644
--- a/src/bin/termptyops.h
+++ b/src/bin/termptyops.h
@@ -7,10 +7,10 @@ typedef enum _Termpty_Clear
 
 void termpty_text_save_top(Termpty *ty, Termcell *cells, ssize_t w_max);
 void _termpty_text_copy(Termpty *ty, Termcell *cells, Termcell *dest, int 
count);
-void _termpty_text_scroll(Termpty *ty);
-void _termpty_text_scroll_rev(Termpty *ty);
-void _termpty_text_scroll_test(Termpty *ty);
-void _termpty_text_scroll_rev_test(Termpty *ty);
+void _termpty_text_scroll(Termpty *ty, Eina_Bool clear);
+void _termpty_text_scroll_rev(Termpty *ty, Eina_Bool clear);
+void _termpty_text_scroll_test(Termpty *ty, Eina_Bool clear);
+void _termpty_text_scroll_rev_test(Termpty *ty, Eina_Bool clear);
 void _termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int 
len);
 void _termpty_clear_line(Termpty *ty, Termpty_Clear mode, int limit);
 void _termpty_clear_screen(Termpty *ty, Termpty_Clear mode);

-- 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to