remove selection when content selected changes
This commit is contained in:
parent
bc15fc6ff6
commit
8c7dab9fdf
|
@ -108,6 +108,7 @@ static void
|
|||
_sel_set(Evas_Object *obj, Eina_Bool enable)
|
||||
{
|
||||
Termio *sd = evas_object_smart_data_get(obj);
|
||||
|
||||
if (sd->pty->selection.is_active == enable) return;
|
||||
sd->pty->selection.is_active = enable;
|
||||
if (enable)
|
||||
|
@ -3276,7 +3277,6 @@ _smart_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUS
|
|||
sd = evas_object_smart_data_get(data);
|
||||
if (!sd) return;
|
||||
|
||||
DBG("(%d; %d)", ev->cur.canvas.y, ev->cur.canvas.x);
|
||||
evas_object_geometry_get(data, &ox, &oy, NULL, NULL);
|
||||
cx = (ev->cur.canvas.x - ox) / sd->font.chw;
|
||||
cy = (ev->cur.canvas.y - oy) / sd->font.chh;
|
||||
|
@ -3946,7 +3946,6 @@ termio_scroll(Evas_Object *obj, int direction)
|
|||
{
|
||||
Termio *sd;
|
||||
Termpty *ty;
|
||||
int changed = 0;
|
||||
|
||||
sd = evas_object_smart_data_get(obj);
|
||||
if (!sd) return;
|
||||
|
@ -3958,16 +3957,76 @@ termio_scroll(Evas_Object *obj, int direction)
|
|||
sd->scroll++;
|
||||
if (sd->scroll > sd->pty->backscroll_num)
|
||||
sd->scroll = sd->pty->backscroll_num;
|
||||
changed = 1;
|
||||
}
|
||||
ty = sd->pty;
|
||||
if (ty->selection.is_active)
|
||||
{
|
||||
ty->selection.start.y += direction;
|
||||
ty->selection.end.y += direction;
|
||||
changed = 1;
|
||||
}
|
||||
if (changed) _smart_update_queue(obj, sd);
|
||||
}
|
||||
|
||||
void
|
||||
termio_content_change(Evas_Object *obj, Evas_Coord x, Evas_Coord y,
|
||||
int n)
|
||||
{
|
||||
Termio *sd;
|
||||
Termpty *ty;
|
||||
int start_x, start_y, end_x, end_y;
|
||||
|
||||
sd = evas_object_smart_data_get(obj);
|
||||
if (!sd) return;
|
||||
ty = sd->pty;
|
||||
if (!ty->selection.is_active) return;
|
||||
|
||||
start_x = sd->pty->selection.start.x;
|
||||
start_y = sd->pty->selection.start.y;
|
||||
end_x = sd->pty->selection.end.x;
|
||||
end_y = sd->pty->selection.end.y;
|
||||
if (ty->selection.is_box)
|
||||
{
|
||||
int _y = y + (x + n) / ty->w;
|
||||
|
||||
if (start_y > end_y)
|
||||
INT_SWAP(start_y, end_y);
|
||||
if (start_x > end_x)
|
||||
INT_SWAP(start_x, end_x);
|
||||
|
||||
y = MAX(y, start_y);
|
||||
for (; y <= MIN(_y, end_y); y++)
|
||||
{
|
||||
int d = MIN(n, ty->w - x);
|
||||
if (!((x > end_x) || (x + d < start_x)))
|
||||
{
|
||||
_sel_set(obj, EINA_FALSE);
|
||||
break;
|
||||
}
|
||||
n -= d;
|
||||
x = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int sel_len;
|
||||
Termcell *cells_changed, *cells_selection;
|
||||
|
||||
/* probably doing that way too much… */
|
||||
if ((start_y > end_y) ||
|
||||
((start_y == end_y) && (end_x < start_x)))
|
||||
{
|
||||
INT_SWAP(start_y, end_y);
|
||||
INT_SWAP(start_x, end_x);
|
||||
}
|
||||
|
||||
sel_len = end_x - start_y + ty->w * (end_y - start_y);
|
||||
cells_changed = &(TERMPTY_SCREEN(ty, x, y));
|
||||
cells_selection = &(TERMPTY_SCREEN(ty, start_x, start_y));
|
||||
|
||||
if (!((cells_changed > (cells_selection + sel_len)) ||
|
||||
(cells_selection > (cells_changed + n))))
|
||||
_sel_set(obj, EINA_FALSE);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -13,6 +13,7 @@ char *termio_selection_get(Evas_Object *obj,
|
|||
size_t *len);
|
||||
Eina_Bool termio_selection_exists(const Evas_Object *obj);
|
||||
void termio_scroll(Evas_Object *obj, int direction);
|
||||
void termio_content_change(Evas_Object *obj, Evas_Coord x, Evas_Coord y, int n);
|
||||
|
||||
void termio_config_update(Evas_Object *obj);
|
||||
Config *termio_config_get(const Evas_Object *obj);
|
||||
|
|
|
@ -174,6 +174,8 @@ _termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len)
|
|||
Termcell *cells;
|
||||
int i, j;
|
||||
|
||||
termio_content_change(ty->obj, ty->state.cx, ty->state.cy, len);
|
||||
|
||||
cells = &(TERMPTY_SCREEN(ty, 0, ty->state.cy));
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
|
@ -244,13 +246,13 @@ _termpty_clear_line(Termpty *ty, Termpty_Clear mode, int limit)
|
|||
{
|
||||
Termcell *cells;
|
||||
int n = 0;
|
||||
Evas_Coord x = 0, y = ty->state.cy;
|
||||
|
||||
cells = &(TERMPTY_SCREEN(ty, 0, ty->state.cy));
|
||||
switch (mode)
|
||||
{
|
||||
case TERMPTY_CLR_END:
|
||||
n = ty->w - ty->state.cx;
|
||||
cells = &(cells[ty->state.cx]);
|
||||
x = ty->state.cx;
|
||||
break;
|
||||
case TERMPTY_CLR_BEGIN:
|
||||
n = ty->state.cx + 1;
|
||||
|
@ -261,7 +263,9 @@ _termpty_clear_line(Termpty *ty, Termpty_Clear mode, int limit)
|
|||
default:
|
||||
return;
|
||||
}
|
||||
cells = &(TERMPTY_SCREEN(ty, x, y));
|
||||
if (n > limit) n = limit;
|
||||
termio_content_change(ty->obj, x, y, n);
|
||||
_text_clear(ty, cells, n, 0, EINA_TRUE);
|
||||
}
|
||||
|
||||
|
@ -278,6 +282,8 @@ _termpty_clear_screen(Termpty *ty, Termpty_Clear mode)
|
|||
{
|
||||
int l = ty->h - (ty->state.cy + 1);
|
||||
|
||||
termio_content_change(ty->obj, 0, ty->state.cy, l * ty->w);
|
||||
|
||||
while (l)
|
||||
{
|
||||
cells = &(TERMPTY_SCREEN(ty, 0, (ty->state.cy + l)));
|
||||
|
@ -292,6 +298,8 @@ _termpty_clear_screen(Termpty *ty, Termpty_Clear mode)
|
|||
// First clear from circular > height, then from 0 to circular
|
||||
int y = ty->state.cy + ty->circular_offset;
|
||||
|
||||
termio_content_change(ty->obj, 0, 0, ty->state.cy * ty->w);
|
||||
|
||||
cells = &(TERMPTY_SCREEN(ty, 0, 0));
|
||||
|
||||
if (y < ty->h)
|
||||
|
@ -313,12 +321,13 @@ _termpty_clear_screen(Termpty *ty, Termpty_Clear mode)
|
|||
ty->circular_offset = 0;
|
||||
_text_clear(ty, ty->screen, ty->w * ty->h, 0, EINA_TRUE);
|
||||
ty->state.scroll_y2 = 0;
|
||||
ERR("foo");
|
||||
if (ty->cb.cancel_sel.func)
|
||||
ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (ty->cb.cancel_sel.func)
|
||||
ty->cb.cancel_sel.func(ty->cb.cancel_sel.data);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in New Issue