termio: unset selection in _smart_apply if codepoints have changed in sel
This commit is contained in:
parent
988a9dad4d
commit
4c8634686c
110
src/bin/termio.c
110
src/bin/termio.c
|
@ -2437,6 +2437,7 @@ _sel_set(Termio *sd, Eina_Bool enable)
|
||||||
sd->pty->selection.by_word = EINA_FALSE;
|
sd->pty->selection.by_word = EINA_FALSE;
|
||||||
sd->pty->selection.by_line = EINA_FALSE;
|
sd->pty->selection.by_line = EINA_FALSE;
|
||||||
free(sd->pty->selection.codepoints);
|
free(sd->pty->selection.codepoints);
|
||||||
|
sd->pty->selection.codepoints = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5153,6 +5154,8 @@ _smart_apply(Evas_Object *obj)
|
||||||
int x, y, ch1 = 0, ch2 = 0, inv = 0, preedit_x = 0, preedit_y = 0;
|
int x, y, ch1 = 0, ch2 = 0, inv = 0, preedit_x = 0, preedit_y = 0;
|
||||||
const char *preedit_str;
|
const char *preedit_str;
|
||||||
ssize_t w;
|
ssize_t w;
|
||||||
|
int sel_start_x = 0, sel_start_y = 0, sel_end_x = 0, sel_end_y = 0;
|
||||||
|
Eina_Unicode *cp;
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN(sd);
|
EINA_SAFETY_ON_NULL_RETURN(sd);
|
||||||
|
|
||||||
|
@ -5166,42 +5169,102 @@ _smart_apply(Evas_Object *obj)
|
||||||
inv = sd->pty->termstate.reverse;
|
inv = sd->pty->termstate.reverse;
|
||||||
termpty_backlog_lock();
|
termpty_backlog_lock();
|
||||||
termpty_backscroll_adjust(sd->pty, &sd->scroll);
|
termpty_backscroll_adjust(sd->pty, &sd->scroll);
|
||||||
|
|
||||||
|
/* Make selection bottom to top */
|
||||||
|
sel_start_x = sd->pty->selection.start.x;
|
||||||
|
sel_start_y = sd->pty->selection.start.y;
|
||||||
|
sel_end_x = sd->pty->selection.end.x;
|
||||||
|
sel_end_y = sd->pty->selection.end.y;
|
||||||
|
if (!sd->pty->selection.is_top_to_bottom)
|
||||||
|
{
|
||||||
|
INT_SWAP(sel_start_y, sel_end_y);
|
||||||
|
INT_SWAP(sel_start_x, sel_end_x);
|
||||||
|
}
|
||||||
|
cp = sd->pty->selection.codepoints;
|
||||||
|
|
||||||
/* Look at every visible line */
|
/* Look at every visible line */
|
||||||
for (y = 0; y < sd->grid.h; y++)
|
for (y = 0; y < sd->grid.h; y++)
|
||||||
{
|
{
|
||||||
Termcell *cells;
|
Termcell *cells;
|
||||||
Evas_Textgrid_Cell *tc;
|
Evas_Textgrid_Cell *tc;
|
||||||
|
int cur_sel_start_x = -1, cur_sel_end_x = -1;
|
||||||
|
int rel_y = y - sd->scroll;
|
||||||
|
|
||||||
w = 0;
|
w = 0;
|
||||||
cells = termpty_cellrow_get(sd->pty, y - sd->scroll, &w);
|
cells = termpty_cellrow_get(sd->pty, rel_y, &w);
|
||||||
if (!cells)
|
if (!cells)
|
||||||
continue;
|
continue;
|
||||||
tc = evas_object_textgrid_cellrow_get(sd->grid.obj, y);
|
tc = evas_object_textgrid_cellrow_get(sd->grid.obj, y);
|
||||||
if (!tc)
|
if (!tc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Compute @cur_sel_start_x, @cur_sel_end_x */
|
||||||
|
if (sd->pty->selection.codepoints)
|
||||||
|
{
|
||||||
|
if (sel_start_y <= rel_y && rel_y <= sel_end_y)
|
||||||
|
{
|
||||||
|
if (sd->pty->selection.is_box)
|
||||||
|
{
|
||||||
|
cur_sel_start_x = sel_start_x;
|
||||||
|
cur_sel_end_x = sel_end_x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur_sel_start_x = sel_start_x;
|
||||||
|
cur_sel_end_x = sel_end_x;
|
||||||
|
if (sel_start_y != sel_end_y)
|
||||||
|
{
|
||||||
|
if (rel_y == sel_start_y)
|
||||||
|
{
|
||||||
|
cur_sel_end_x = sd->grid.w - 1;
|
||||||
|
}
|
||||||
|
else if (y == sel_end_y)
|
||||||
|
{
|
||||||
|
cur_sel_start_x = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cur_sel_start_x = 0;
|
||||||
|
cur_sel_end_x = sd->grid.w - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ch1 = -1;
|
ch1 = -1;
|
||||||
/* Look at every cell in that line */
|
/* Look at every cell in that line */
|
||||||
for (x = 0; x < sd->grid.w; x++)
|
for (x = 0; x < sd->grid.w; x++)
|
||||||
{
|
{
|
||||||
|
Eina_Unicode *u = NULL;
|
||||||
|
|
||||||
|
if (cp && cur_sel_start_x <= x && x <= cur_sel_end_x)
|
||||||
|
u = cp;
|
||||||
|
|
||||||
if ((!cells) || (x >= w))
|
if ((!cells) || (x >= w))
|
||||||
{
|
{
|
||||||
if ((tc[x].codepoint != 0) ||
|
if ((tc[x].codepoint != 0) ||
|
||||||
(tc[x].bg != COL_INVIS) ||
|
(tc[x].bg != COL_INVIS) ||
|
||||||
(tc[x].bg_extended))
|
(tc[x].bg_extended))
|
||||||
{
|
{
|
||||||
if (ch1 < 0) ch1 = x;
|
if (ch1 < 0)
|
||||||
|
ch1 = x;
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
}
|
}
|
||||||
tc[x].codepoint = 0;
|
tc[x].codepoint = 0;
|
||||||
if (inv) tc[x].bg = COL_INVERSEBG;
|
tc[x].bg = (inv) ? COL_INVERSEBG : COL_INVIS;
|
||||||
else tc[x].bg = COL_INVIS;
|
|
||||||
tc[x].bg_extended = 0;
|
tc[x].bg_extended = 0;
|
||||||
tc[x].underline = 0;
|
tc[x].underline = 0;
|
||||||
tc[x].strikethrough = 0;
|
tc[x].strikethrough = 0;
|
||||||
tc[x].bold = 0;
|
tc[x].bold = 0;
|
||||||
tc[x].italic = 0;
|
tc[x].italic = 0;
|
||||||
tc[x].double_width = 0;
|
tc[x].double_width = 0;
|
||||||
|
|
||||||
|
if (u && *u != ' ')
|
||||||
|
{
|
||||||
|
_sel_set(sd, EINA_FALSE);
|
||||||
|
u = cp = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5210,7 +5273,8 @@ _smart_apply(Evas_Object *obj)
|
||||||
bid = termpty_block_id_get(&(cells[x]), &bx, &by);
|
bid = termpty_block_id_get(&(cells[x]), &bx, &by);
|
||||||
if (bid >= 0)
|
if (bid >= 0)
|
||||||
{
|
{
|
||||||
if (ch1 < 0) ch1 = x;
|
if (ch1 < 0)
|
||||||
|
ch1 = x;
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
tc[x].codepoint = 0;
|
tc[x].codepoint = 0;
|
||||||
tc[x].fg_extended = 0;
|
tc[x].fg_extended = 0;
|
||||||
|
@ -5235,6 +5299,11 @@ _smart_apply(Evas_Object *obj)
|
||||||
blk->w * sd->font.chw,
|
blk->w * sd->font.chw,
|
||||||
blk->h * sd->font.chh);
|
blk->h * sd->font.chh);
|
||||||
}
|
}
|
||||||
|
if (u && *u != ' ')
|
||||||
|
{
|
||||||
|
_sel_set(sd, EINA_FALSE);
|
||||||
|
u = cp = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (cells[x].att.invisible)
|
else if (cells[x].att.invisible)
|
||||||
{
|
{
|
||||||
|
@ -5242,12 +5311,12 @@ _smart_apply(Evas_Object *obj)
|
||||||
(tc[x].bg != COL_INVIS) ||
|
(tc[x].bg != COL_INVIS) ||
|
||||||
(tc[x].bg_extended))
|
(tc[x].bg_extended))
|
||||||
{
|
{
|
||||||
if (ch1 < 0) ch1 = x;
|
if (ch1 < 0)
|
||||||
|
ch1 = x;
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
}
|
}
|
||||||
tc[x].codepoint = 0;
|
tc[x].codepoint = 0;
|
||||||
if (inv) tc[x].bg = COL_INVERSEBG;
|
tc[x].bg = (inv) ? COL_INVERSEBG : COL_INVIS;
|
||||||
else tc[x].bg = COL_INVIS;
|
|
||||||
tc[x].bg_extended = 0;
|
tc[x].bg_extended = 0;
|
||||||
tc[x].underline = 0;
|
tc[x].underline = 0;
|
||||||
tc[x].strikethrough = 0;
|
tc[x].strikethrough = 0;
|
||||||
|
@ -5257,6 +5326,11 @@ _smart_apply(Evas_Object *obj)
|
||||||
if ((tc[x].double_width) && (tc[x].codepoint == 0) &&
|
if ((tc[x].double_width) && (tc[x].codepoint == 0) &&
|
||||||
(ch2 == x - 1))
|
(ch2 == x - 1))
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
|
if (u && *u != ' ')
|
||||||
|
{
|
||||||
|
_sel_set(sd, EINA_FALSE);
|
||||||
|
u = cp = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5289,10 +5363,14 @@ _smart_apply(Evas_Object *obj)
|
||||||
else if (!bgext)
|
else if (!bgext)
|
||||||
bg = COL_INVIS;
|
bg = COL_INVIS;
|
||||||
}
|
}
|
||||||
if ((cells[x].att.fgintense) && (!fgext)) fg += 48;
|
if ((cells[x].att.fgintense) && (!fgext))
|
||||||
if ((cells[x].att.bgintense) && (!bgext)) bg += 48;
|
fg += 48;
|
||||||
if ((cells[x].att.bold) && (!fgext)) fg += 12;
|
if ((cells[x].att.bgintense) && (!bgext))
|
||||||
if ((cells[x].att.faint) && (!fgext)) fg += 24;
|
bg += 48;
|
||||||
|
if ((cells[x].att.bold) && (!fgext))
|
||||||
|
fg += 12;
|
||||||
|
if ((cells[x].att.faint) && (!fgext))
|
||||||
|
fg += 24;
|
||||||
if (cells[x].att.inverse ^ inv)
|
if (cells[x].att.inverse ^ inv)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
|
@ -5309,7 +5387,8 @@ _smart_apply(Evas_Object *obj)
|
||||||
(tc[x].underline != cells[x].att.underline) ||
|
(tc[x].underline != cells[x].att.underline) ||
|
||||||
(tc[x].strikethrough != cells[x].att.strike))
|
(tc[x].strikethrough != cells[x].att.strike))
|
||||||
{
|
{
|
||||||
if (ch1 < 0) ch1 = x;
|
if (ch1 < 0)
|
||||||
|
ch1 = x;
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
}
|
}
|
||||||
tc[x].fg_extended = fgext;
|
tc[x].fg_extended = fgext;
|
||||||
|
@ -5335,6 +5414,11 @@ _smart_apply(Evas_Object *obj)
|
||||||
ch2 = x;
|
ch2 = x;
|
||||||
// cells[x].att.blink
|
// cells[x].att.blink
|
||||||
// cells[x].att.blink2
|
// cells[x].att.blink2
|
||||||
|
if (u && *u != codepoint)
|
||||||
|
{
|
||||||
|
_sel_set(sd, EINA_FALSE);
|
||||||
|
u = cp = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue