aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBoris Faure <billiob@gmail.com>2016-11-17 23:30:57 +0100
committerBoris Faure <billiob@gmail.com>2016-11-17 23:30:57 +0100
commit6957ecb642e86f15bcc022a709d0b28e2be2ccbc (patch)
tree0084588660b4382d14d4aa819d0a6631a8e31a14 /src
parentadd copy link item in rightclick menu (diff)
downloadterminology-6957ecb642e86f15bcc022a709d0b28e2be2ccbc.tar.gz
link detection: rewrite moving around the grid
There are difference between the grid and the backlog. In the backlog, full lines are stored (and thus can be larger than the width of the terminal).
Diffstat (limited to 'src')
-rw-r--r--src/bin/termiolink.c90
1 files changed, 59 insertions, 31 deletions
diff --git a/src/bin/termiolink.c b/src/bin/termiolink.c
index a69c7d6..c1f88f5 100644
--- a/src/bin/termiolink.c
+++ b/src/bin/termiolink.c
@@ -74,7 +74,7 @@ _txt_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
if (!cells || !w)
goto bad;
if ((*x >= w))
- *x = w-1;
+ goto empty;
cell = cells[*x];
if ((cell.codepoint == 0) && (cell.att.dblwidth))
{
@@ -85,15 +85,15 @@ _txt_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
}
if (cell.codepoint == 0)
- {
+ goto empty;
+
+ *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
+
+ return 0;
+
+empty:
txt[0] = '\0';
*txtlenp = 0;
- }
- else
- {
- *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
- }
-
return 0;
bad:
@@ -111,14 +111,32 @@ _txt_prev_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
(*x)--;
if ((*x) < 0)
+ {
(*y)--;
- cells = termpty_cellrow_get(ty, *y, &w);
- if (!cells || !w)
- goto bad;
- if (((*x) < 0) || ((*x) >= w))
- *x = w-1;
+ *x = ty->w-1;
+ cells = termpty_cellrow_get(ty, *y, &w);
+ if (!cells || !w)
+ goto bad;
+ if ((*x) >= w)
+ goto empty;
+ cell = cells[*x];
+ /* Either the cell is in the normal screen and needs to have
+ * autowrapped flag or is in the backlog and its length is larger than
+ * the screen, spanning multiple lines */
+ if (((!cell.att.autowrapped) && (*y) >= 0)
+ || (w < ty->w))
+ goto empty;
+ }
+ else
+ {
+ cells = termpty_cellrow_get(ty, *y, &w);
+ if (!cells || !w)
+ goto bad;
+ if ((*x) >= w)
+ goto empty;
- cell = cells[*x];
+ cell = cells[*x];
+ }
if ((cell.codepoint == 0) && (cell.att.dblwidth))
{
(*x)--;
@@ -128,17 +146,17 @@ _txt_prev_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
}
if (cell.codepoint == 0)
- {
- txt[0] = '\0';
- *txtlenp = 0;
- }
- else
- {
- *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
- }
+ goto empty;
+
+ *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
return 0;
+empty:
+ txt[0] = '\0';
+ *txtlenp = 0;
+ return 0;
+
bad:
*txtlenp = 0;
txt[0] = '\0';
@@ -156,9 +174,16 @@ _txt_next_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
cells = termpty_cellrow_get(ty, *y, &w);
if (!cells || !w)
goto bad;
- if (*x >= w)
+ if ((*x) >= w)
{
(*y)++;
+ if ((*x) <= ty->w)
+ {
+ cell = cells[w-1];
+ if (!cell.att.autowrapped)
+ goto empty;
+ }
+
*x = 0;
cells = termpty_cellrow_get(ty, *y, &w);
if (!cells || !w)
@@ -171,6 +196,9 @@ _txt_next_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
(*x)++;
if (*x >= w)
{
+ cell = cells[w-1];
+ if (!cell.att.autowrapped && w == ty->w)
+ goto empty;
(*y)++;
*x = 0;
cells = termpty_cellrow_get(ty, *y, &w);
@@ -182,15 +210,15 @@ _txt_next_at(Termpty *ty, int *x, int *y, char *txt, int *txtlenp)
cell = cells[*x];
if (cell.codepoint == 0)
- {
- txt[0] = '\0';
- *txtlenp = 0;
- }
- else
- {
- *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
- }
+ goto empty;
+
+ *txtlenp = codepoint_to_utf8(cell.codepoint, txt);
+
+ return 0;
+empty:
+ txt[0] = '\0';
+ *txtlenp = 0;
return 0;
bad: