keep selection when scrolling

This commit is contained in:
Boris Faure 2013-11-10 22:13:19 +01:00
parent d682db21fb
commit bc15fc6ff6
4 changed files with 41 additions and 44 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;
{
// 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;