keep selection when scrolling
This commit is contained in:
parent
d682db21fb
commit
bc15fc6ff6
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue