summaryrefslogtreecommitdiffstats
path: root/window-copy.c
diff options
context:
space:
mode:
authornicm <nicm>2015-11-13 08:09:28 +0000
committernicm <nicm>2015-11-13 08:09:28 +0000
commitc5689a5a4031a43769b8b721cafa6d1eab6abc44 (patch)
tree8eb234cb05f7934a41365dc0674794ccb34561c5 /window-copy.c
parente71a9154126c7ee853b9a657678de40d475279eb (diff)
Long overdue change to the way we store cells in the grid: now, instead
of storing a full grid_cell with UTF-8 data and everything, store a new type grid_cell_entry. This can either be the cell itself (for ASCII cells), or an offset into an extended array (per line) for UTF-8 data. This avoid a large (8 byte) overhead on non-UTF-8 cells (by far the majority for most users) without the complexity of the shadow array we had before. Grid memory without any UTF-8 is about half. The disadvantage that cells can no longer be modified in place and need to be copied out of the grid and back but it turned out to be lot less complicated than I expected.
Diffstat (limited to 'window-copy.c')
-rw-r--r--window-copy.c105
1 files changed, 47 insertions, 58 deletions
diff --git a/window-copy.c b/window-copy.c
index 1c1ea29c..a28cdecc 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -942,21 +942,21 @@ int
window_copy_search_compare(struct grid *gd, u_int px, u_int py,
struct grid *sgd, u_int spx, int cis)
{
- const struct grid_cell *gc, *sgc;
- struct utf8_data ud, sud;
+ struct grid_cell gc, sgc;
+ const struct utf8_data *ud, *sud;
- gc = grid_peek_cell(gd, px, py);
- grid_cell_get(gc, &ud);
- sgc = grid_peek_cell(sgd, spx, 0);
- grid_cell_get(sgc, &sud);
+ grid_get_cell(gd, px, py, &gc);
+ ud = &gc.data;
+ grid_get_cell(sgd, spx, 0, &sgc);
+ sud = &sgc.data;
- if (ud.size != sud.size || ud.width != sud.width)
+ if (ud->size != sud->size || ud->width != sud->width)
return (0);
- if (cis && ud.size == 1)
- return (tolower(ud.data[0]) == sud.data[0]);
+ if (cis && ud->size == 1)
+ return (tolower(ud->data[0]) == sud->data[0]);
- return (memcmp(ud.data, sud.data, ud.size) == 0);
+ return (memcmp(ud->data, sud->data, ud->size) == 0);
}
int
@@ -1541,12 +1541,12 @@ window_copy_append_selection(struct window_pane *wp, const char *bufname)
}
void
-window_copy_copy_line(struct window_pane *wp,
- char **buf, size_t *off, u_int sy, u_int sx, u_int ex)
+window_copy_copy_line(struct window_pane *wp, char **buf, size_t *off, u_int sy,
+ u_int sx, u_int ex)
{
struct window_copy_mode_data *data = wp->modedata;
struct grid *gd = data->backing->grid;
- const struct grid_cell *gc;
+ struct grid_cell gc;
struct grid_line *gl;
struct utf8_data ud;
u_int i, xx, wrapped = 0;
@@ -1575,11 +1575,11 @@ window_copy_copy_line(struct window_pane *wp,
if (sx < ex) {
for (i = sx; i < ex; i++) {
- gc = grid_peek_cell(gd, i, sy);
- if (gc->flags & GRID_FLAG_PADDING)
+ grid_get_cell(gd, i, sy, &gc);
+ if (gc.flags & GRID_FLAG_PADDING)
continue;
- grid_cell_get(gc, &ud);
- if (ud.size == 1 && (gc->attr & GRID_ATTR_CHARSET)) {
+ utf8_copy(&ud, &gc.data);
+ if (ud.size == 1 && (gc.attr & GRID_ATTR_CHARSET)) {
s = tty_acs_get(NULL, ud.data[0]);
if (s != NULL && strlen(s) <= sizeof ud.data) {
ud.size = strlen(s);
@@ -1618,16 +1618,17 @@ int
window_copy_in_set(struct window_pane *wp, u_int px, u_int py, const char *set)
{
struct window_copy_mode_data *data = wp->modedata;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
+ const struct utf8_data *ud;
+
+ grid_get_cell(data->backing->grid, px, py, &gc);
- gc = grid_peek_cell(data->backing->grid, px, py);
- grid_cell_get(gc, &ud);
- if (ud.size != 1 || gc->flags & GRID_FLAG_PADDING)
+ ud = &gc.data;
+ if (ud->size != 1 || (gc.flags & GRID_FLAG_PADDING))
return (0);
- if (*ud.data == 0x00 || *ud.data == 0x7f)
+ if (*ud->data == 0x00 || *ud->data == 0x7f)
return (0);
- return (strchr(set, *ud.data) != NULL);
+ return (strchr(set, *ud->data) != NULL);
}
u_int
@@ -1635,8 +1636,7 @@ window_copy_find_length(struct window_pane *wp, u_int py)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *s = data->backing;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
u_int px;
/*
@@ -1649,9 +1649,8 @@ window_copy_find_length(struct window_pane *wp, u_int py)
if (px > screen_size_x(s))
px = screen_size_x(s);
while (px > 0) {
- gc = grid_peek_cell(s->grid, px - 1, py);
- grid_cell_get(gc, &ud);
- if (ud.size != 1 || *ud.data != ' ')
+ grid_get_cell(s->grid, px - 1, py, &gc);
+ if (gc.data.size != 1 || *gc.data.data != ' ')
break;
px--;
}
@@ -1685,17 +1684,15 @@ window_copy_cursor_back_to_indentation(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
u_int px, py, xx;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
px = 0;
py = screen_hsize(data->backing) + data->cy - data->oy;
xx = window_copy_find_length(wp, py);
while (px < xx) {
- gc = grid_peek_cell(data->backing->grid, px, py);
- grid_cell_get(gc, &ud);
- if (ud.size != 1 || *ud.data != ' ')
+ grid_get_cell(data->backing->grid, px, py, &gc);
+ if (gc.data.size != 1 || *gc.data.data != ' ')
break;
px++;
}
@@ -1909,8 +1906,7 @@ window_copy_cursor_jump(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *back_s = data->backing;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
u_int px, py, xx;
px = data->cx + 1;
@@ -1918,10 +1914,9 @@ window_copy_cursor_jump(struct window_pane *wp)
xx = window_copy_find_length(wp, py);
while (px < xx) {
- gc = grid_peek_cell(back_s->grid, px, py);
- grid_cell_get(gc, &ud);
- if (!(gc->flags & GRID_FLAG_PADDING) &&
- ud.size == 1 && *ud.data == data->jumpchar) {
+ grid_get_cell(back_s->grid, px, py, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == 1 && *gc.data.data == data->jumpchar) {
window_copy_update_cursor(wp, px, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
@@ -1936,8 +1931,7 @@ window_copy_cursor_jump_back(struct window_pane *wp)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *back_s = data->backing;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
u_int px, py;
px = data->cx;
@@ -1947,10 +1941,9 @@ window_copy_cursor_jump_back(struct window_pane *wp)
px--;
for (;;) {
- gc = grid_peek_cell(back_s->grid, px, py);
- grid_cell_get(gc, &ud);
- if (!(gc->flags & GRID_FLAG_PADDING) &&
- ud.size == 1 && *ud.data == data->jumpchar) {
+ grid_get_cell(back_s->grid, px, py, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == 1 && *gc.data.data == data->jumpchar) {
window_copy_update_cursor(wp, px, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
@@ -1967,8 +1960,7 @@ window_copy_cursor_jump_to(struct window_pane *wp, int jump_again)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *back_s = data->backing;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
u_int px, py, xx;
px = data->cx + 1 + jump_again;
@@ -1976,10 +1968,9 @@ window_copy_cursor_jump_to(struct window_pane *wp, int jump_again)
xx = window_copy_find_length(wp, py);
while (px < xx) {
- gc = grid_peek_cell(back_s->grid, px, py);
- grid_cell_get(gc, &ud);
- if (!(gc->flags & GRID_FLAG_PADDING) &&
- ud.size == 1 && *ud.data == data->jumpchar) {
+ grid_get_cell(back_s->grid, px, py, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == 1 && *gc.data.data == data->jumpchar) {
window_copy_update_cursor(wp, px - 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);
@@ -1994,8 +1985,7 @@ window_copy_cursor_jump_to_back(struct window_pane *wp, int jump_again)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *back_s = data->backing;
- const struct grid_cell *gc;
- struct utf8_data ud;
+ struct grid_cell gc;
u_int px, py;
px = data->cx;
@@ -2008,10 +1998,9 @@ window_copy_cursor_jump_to_back(struct window_pane *wp, int jump_again)
px--;
for (;;) {
- gc = grid_peek_cell(back_s->grid, px, py);
- grid_cell_get(gc, &ud);
- if (!(gc->flags & GRID_FLAG_PADDING) &&
- ud.size == 1 && *ud.data == data->jumpchar) {
+ grid_get_cell(back_s->grid, px, py, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == 1 && *gc.data.data == data->jumpchar) {
window_copy_update_cursor(wp, px + 1, data->cy);
if (window_copy_update_selection(wp, 1))
window_copy_redraw_lines(wp, data->cy, 1);