aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Faure <billiob@gmail.com>2017-08-26 18:51:22 +0200
committerBoris Faure <billiob@gmail.com>2017-08-26 18:51:22 +0200
commitacbf3387fa07426cd6143b5d900f79dbbcd154ca (patch)
tree027ef7c95ce20e094425f45cbf71ee963446b078
parenttermptyops.c: fix scrolling wrt bottom margin (diff)
downloadterminology-acbf3387fa07426cd6143b5d900f79dbbcd154ca.tar.gz
fix selections in the backlog. Closes https://phab.enlightenment.org/T5743
In the backlog, every cell but the last one has the autowrapped flag set. _termpty_cellrow_from_beacon_get() now returns a length in the "screen space".
-rw-r--r--src/bin/termio.c2
-rw-r--r--src/bin/termpty.c20
-rw-r--r--src/bin/termpty.h2
-rw-r--r--src/bin/termptyops.c2
-rw-r--r--src/bin/termptysave.c2
5 files changed, 15 insertions, 13 deletions
diff --git a/src/bin/termio.c b/src/bin/termio.c
index 6c49100..8b97e41 100644
--- a/src/bin/termio.c
+++ b/src/bin/termio.c
@@ -2494,6 +2494,7 @@ _sel_line(Termio *sd, int cy)
sd->pty->selection.end.x = sd->grid.w - 1;
sd->pty->selection.end.y = cy;
+ /* check lines above */
y = cy;
for (;;)
{
@@ -2505,6 +2506,7 @@ _sel_line(Termio *sd, int cy)
sd->pty->selection.start.y = y;
y = cy;
+ /* check lines below */
for (;;)
{
cells = termpty_cellrow_get(sd->pty, y, &w);
diff --git a/src/bin/termpty.c b/src/bin/termpty.c
index 7a355c0..1efc594 100644
--- a/src/bin/termpty.c
+++ b/src/bin/termpty.c
@@ -879,7 +879,7 @@ void
termpty_text_save_top(Termpty *ty, Termcell *cells, ssize_t w_max)
{
Termsave *ts;
- ssize_t w;
+ ssize_t w, i;
if (ty->backsize <= 0)
return;
@@ -889,6 +889,10 @@ termpty_text_save_top(Termpty *ty, Termcell *cells, ssize_t w_max)
termpty_backlog_lock();
w = termpty_line_length(cells, w_max);
+ for (i = 0; i < w - 1; i++)
+ {
+ cells[i].att.autowrapped = 1;
+ }
if (ty->backsize >= 1)
{
ts = BACKLOG_ROW_GET(ty, 1);
@@ -1015,6 +1019,7 @@ termpty_backscroll_adjust(Termpty *ty, int *scroll)
}
}
+/* @requested_y unit is in visual lines on the screen */
static Termcell*
_termpty_cellrow_from_beacon_get(Termpty *ty, int requested_y, ssize_t *wret)
{
@@ -1059,8 +1064,8 @@ _termpty_cellrow_from_beacon_get(Termpty *ty, int requested_y, ssize_t *wret)
/* found the line */
int delta = screen_y - requested_y;
*wret = ts->w - delta * ty->w;
- if (*wret > ts->w)
- *wret = ts->w;
+ if (*wret > ty->w)
+ *wret = ty->w;
return &ts->cells[delta * ty->w];
}
backlog_y++;
@@ -1085,8 +1090,8 @@ _termpty_cellrow_from_beacon_get(Termpty *ty, int requested_y, ssize_t *wret)
/* found the line */
int delta = screen_y - requested_y;
*wret = ts->w - delta * ty->w;
- if (*wret > ts->w)
- *wret = ts->w;
+ if (*wret > ty->w)
+ *wret = ty->w;
return &ts->cells[delta * ty->w];
}
screen_y -= nb_lines;
@@ -1096,6 +1101,7 @@ _termpty_cellrow_from_beacon_get(Termpty *ty, int requested_y, ssize_t *wret)
return NULL;
}
+/* @requested_y unit is in visual lines on the screen */
Termcell *
termpty_cellrow_get(Termpty *ty, int y_requested, ssize_t *wret)
{
@@ -1110,7 +1116,6 @@ termpty_cellrow_get(Termpty *ty, int y_requested, ssize_t *wret)
return NULL;
return _termpty_cellrow_from_beacon_get(ty, y_requested, wret);
-
}
void
@@ -1182,7 +1187,6 @@ _termpty_line_rewrap(Termpty *ty, Termcell *src_cells, int len,
}
autowrapped = src_cells[len-1].att.autowrapped;
- src_cells[len-1].att.autowrapped = 0;
while (len > 0)
{
@@ -1290,8 +1294,6 @@ termpty_resize(Termpty *ty, int new_w, int new_h)
*new_cells;
int len;
- ts->cells[ts->w - 1].att.autowrapped = 0;
-
len = termpty_line_length(cells, old_w);
new_cells = malloc((ts->w + len) * sizeof(Termcell));
diff --git a/src/bin/termpty.h b/src/bin/termpty.h
index 64ad99a..5ef8f93 100644
--- a/src/bin/termpty.h
+++ b/src/bin/termpty.h
@@ -267,8 +267,6 @@ extern int _termpty_log_dom;
#define TERMPTY_SCREEN(Tpty, X, Y) \
Tpty->screen[X + (((Y + Tpty->circular_offset) % Tpty->h) * Tpty->w)]
-#define TERMPTY_FMTCLR(Tatt) \
- (Tatt).autowrapped = (Tatt).newline = 0
#define TERMPTY_RESTRICT_FIELD(Field, Min, Max) \
do { \
diff --git a/src/bin/termptyops.c b/src/bin/termptyops.c
index ba7bbf1..6d3c00a 100644
--- a/src/bin/termptyops.c
+++ b/src/bin/termptyops.c
@@ -226,7 +226,7 @@ termpty_text_append(Termpty *ty, const Eina_Unicode *codepoints, int len)
cells[ty->cursor_state.cx].att.dblwidth = _termpty_is_dblwidth_get(ty, g);
if (EINA_UNLIKELY((cells[ty->cursor_state.cx].att.dblwidth) && (ty->cursor_state.cx < (max_right - 1))))
{
- TERMPTY_FMTCLR(cells[ty->cursor_state.cx].att);
+ cells[ty->cursor_state.cx].att.newline = 0;
termpty_cell_codepoint_att_fill(ty, 0, cells[ty->cursor_state.cx].att,
&(cells[ty->cursor_state.cx + 1]), 1);
}
diff --git a/src/bin/termptysave.c b/src/bin/termptysave.c
index 09b5da2..0187af1 100644
--- a/src/bin/termptysave.c
+++ b/src/bin/termptysave.c
@@ -119,7 +119,7 @@ termpty_save_expand(Termsave *ts, Termcell *cells, size_t delta)
newcells = realloc(ts->cells, (ts->w + delta) * sizeof(Termcell));
if (!newcells)
return NULL;
- newcells[ts->w - 1].att.autowrapped = 0;
+
memcpy(&newcells[ts->w], cells, delta * sizeof(Termcell));
ts->w += delta;
ts->cells = newcells;