From bc15fc6ff62b2eb2c55870b3af42b964861a7e75 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sun, 10 Nov 2013 22:13:19 +0100 Subject: [PATCH] keep selection when scrolling --- src/bin/termio.c | 18 ++++++------- src/bin/termio.h | 1 + src/bin/termpty.h | 2 +- src/bin/termptyops.c | 64 +++++++++++++++++++++----------------------- 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/bin/termio.c b/src/bin/termio.c index 1360f443..86a37c91 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 817bc87d..51969c4c 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 517e5177..6f3b1d2e 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 91bb781b..aa1a631b 100644 --- a/src/bin/termptyops.c +++ b/src/bin/termptyops.c @@ -1,5 +1,6 @@ #include "private.h" #include +#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; + { + // First clear from circular > height, then from 0 to circular + int y = ty->state.cy + ty->circular_offset; - cells = &(TERMPTY_SCREEN(ty, 0, 0)); + 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; + 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); - } - } + _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;