billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=bc15fc6ff62b2eb2c55870b3af42b964861a7e75

commit bc15fc6ff62b2eb2c55870b3af42b964861a7e75
Author: Boris Faure <bill...@gmail.com>
Date:   Sun Nov 10 22:13:19 2013 +0100

    keep selection when scrolling
---
 src/bin/termio.c     | 18 +++++++-------
 src/bin/termio.h     |  1 +
 src/bin/termpty.h    |  2 +-
 src/bin/termptyops.c | 70 +++++++++++++++++++++++++---------------------------
 4 files changed, 44 insertions(+), 47 deletions(-)

diff --git a/src/bin/termio.c b/src/bin/termio.c
index 1360f44..86a37c9 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -3941,12 +3941,13 @@ _smart_pty_change(void *data)
    _smart_update_queue(data, sd);
 }
 
-static void
-_smart_pty_scroll(void *data)
+void
+termio_scroll(Evas_Object *obj, int direction)
 {
-   Evas_Object *obj = data;
    Termio *sd;
+   Termpty *ty;
    int changed = 0;
+
    sd = evas_object_smart_data_get(obj);
    if (!sd) return;
 
@@ -3959,13 +3960,14 @@ _smart_pty_scroll(void *data)
           sd->scroll = sd->pty->backscroll_num;
         changed = 1;
      }
-   if (sd->pty->selection.is_active)
+   ty = sd->pty;
+   if (ty->selection.is_active)
      {
-        sd->pty->selection.start.y--;
-        sd->pty->selection.end.y--;
+        ty->selection.start.y += direction;
+        ty->selection.end.y += direction;
         changed = 1;
      }
-   if (changed) _smart_update_queue(data, sd);
+   if (changed) _smart_update_queue(obj, sd);
 }
 
 static void
@@ -4402,8 +4404,6 @@ termio_add(Evas_Object *parent, Config *config, const 
char *cmd, Eina_Bool login
    sd->pty->obj = obj;
    sd->pty->cb.change.func = _smart_pty_change;
    sd->pty->cb.change.data = obj;
-   sd->pty->cb.scroll.func = _smart_pty_scroll;
-   sd->pty->cb.scroll.data = obj;
    sd->pty->cb.set_title.func = _smart_pty_title;
    sd->pty->cb.set_title.data = obj;
    sd->pty->cb.set_icon.func = _smart_pty_icon;
diff --git a/src/bin/termio.h b/src/bin/termio.h
index 817bc87..51969c4 100644
--- a/src/bin/termio.h
+++ b/src/bin/termio.h
@@ -12,6 +12,7 @@ char        *termio_selection_get(Evas_Object *obj,
                                   int c1x, int c1y, int c2x, int c2y,
                                   size_t *len);
 Eina_Bool    termio_selection_exists(const Evas_Object *obj);
+void termio_scroll(Evas_Object *obj, int direction);
 
 void         termio_config_update(Evas_Object *obj);
 Config      *termio_config_get(const Evas_Object *obj);
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index 517e517..6f3b1d2 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -109,7 +109,7 @@ struct _Termpty
       struct {
          void (*func) (void *data);
          void *data;
-      } change, scroll, set_title, set_icon, cancel_sel, exited, bell, command;
+      } change, set_title, set_icon, cancel_sel, exited, bell, command;
    } cb;
    struct {
       const char *title, *icon;
diff --git a/src/bin/termptyops.c b/src/bin/termptyops.c
index 91bb781..aa1a631 100644
--- a/src/bin/termptyops.c
+++ b/src/bin/termptyops.c
@@ -1,5 +1,6 @@
 #include "private.h"
 #include <Elementary.h>
+#include "termio.h"
 #include "termpty.h"
 #include "termptydbl.h"
 #include "termptyops.h"
@@ -70,24 +71,18 @@ _termpty_text_scroll(Termpty *ty, Eina_Bool clear)
         end_y = ty->state.scroll_y2 - 1;
      }
    else
-     {
-        if (!ty->altbuf)
-          {
-             termpty_text_save_top(ty, &(TERMPTY_SCREEN(ty, 0, 0)), ty->w);
-             if (ty->cb.scroll.func) ty->cb.scroll.func(ty->cb.scroll.data);
-          }
-        else
-          if (ty->cb.cancel_sel.func)
-            ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
-     }
+     if (!ty->altbuf)
+       termpty_text_save_top(ty, &(TERMPTY_SCREEN(ty, 0, 0)), ty->w);
+
+   termio_scroll(ty->obj, -1);
    DBG("... scroll!!!!! [%i->%i]", start_y, end_y);
 
    if (start_y == 0 && end_y == ty->h - 1)
      {
        // screen is a circular buffer now
-       cells2 = &(ty->screen[ty->circular_offset * ty->w]);
+       cells = &(ty->screen[ty->circular_offset * ty->w]);
        if (clear)
-          _text_clear(ty, cells2, ty->w, 0, EINA_TRUE);
+          _text_clear(ty, cells, ty->w, 0, EINA_TRUE);
 
        ty->circular_offset++;
        if (ty->circular_offset >= ty->h)
@@ -95,15 +90,15 @@ _termpty_text_scroll(Termpty *ty, Eina_Bool clear)
      }
    else
      {
-       cells2 = &(ty->screen[end_y * ty->w]);
+       cells = &(ty->screen[end_y * ty->w]);
        for (y = start_y; y < end_y; y++)
          {
-            cells = &(ty->screen[y * ty->w]);
-            cells2 = &(ty->screen[(y + 1) * ty->w]);
-            termpty_cell_copy(ty, cells2, cells, ty->w);
+            cells = &(ty->screen[(y + 1) * ty->w]);
+            cells2 = &(ty->screen[y * ty->w]);
+            termpty_cell_copy(ty, cells, cells2, ty->w);
          }
        if (clear)
-          _text_clear(ty, cells2, ty->w, 0, EINA_TRUE);
+          _text_clear(ty, cells, ty->w, 0, EINA_TRUE);
      }
 }
 
@@ -119,6 +114,7 @@ _termpty_text_scroll_rev(Termpty *ty, Eina_Bool clear)
         end_y = ty->state.scroll_y2 - 1;
      }
    DBG("... scroll rev!!!!! [%i->%i]", start_y, end_y);
+   termio_scroll(ty->obj, 1);
 
    if (start_y == 0 && end_y == ty->h - 1)
      {
@@ -292,29 +288,29 @@ _termpty_clear_screen(Termpty *ty, Termpty_Clear mode)
         break;
       case TERMPTY_CLR_BEGIN:
         if (ty->state.cy > 0)
-         {
-           // First clear from circular > height, then from 0 to circular
-           int y = ty->state.cy + ty->circular_offset;
-
-            cells = &(TERMPTY_SCREEN(ty, 0, 0));
-
-           if (y < ty->h)
-             {
-               _text_clear(ty, cells, ty->w * ty->state.cy, 0, EINA_TRUE);
-             }
-           else
-             {
-               int yt = y % ty->w;
-               int yb = ty->h - ty->circular_offset;
-
-               _text_clear(ty, cells, ty->w * yb, 0, EINA_TRUE);
-               _text_clear(ty, ty->screen, ty->w * yt, 0, EINA_TRUE);
-             }
-         }
+          {
+             // First clear from circular > height, then from 0 to circular
+             int y = ty->state.cy + ty->circular_offset;
+
+             cells = &(TERMPTY_SCREEN(ty, 0, 0));
+
+             if (y < ty->h)
+               {
+                  _text_clear(ty, cells, ty->w * ty->state.cy, 0, EINA_TRUE);
+               }
+             else
+               {
+                  int yt = y % ty->w;
+                  int yb = ty->h - ty->circular_offset;
+
+                  _text_clear(ty, cells, ty->w * yb, 0, EINA_TRUE);
+                  _text_clear(ty, ty->screen, ty->w * yt, 0, EINA_TRUE);
+               }
+          }
         _termpty_clear_line(ty, mode, ty->w);
         break;
       case TERMPTY_CLR_ALL:
-       ty->circular_offset = 0;
+        ty->circular_offset = 0;
         _text_clear(ty, ty->screen, ty->w * ty->h, 0, EINA_TRUE);
         ty->state.scroll_y2 = 0;
         break;

-- 


Reply via email to