From 3635b3cd6c3343b2ec3f7173facef8a284e7e613 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 6 Jul 2019 20:37:29 +0000 Subject: Correctly clear underscore colour in grid_get_cell1, also fix struct grid_cell to avoid padding. Fixes increased memory use reported by Suraj N Kurapati. --- format-draw.c | 2 +- grid.c | 5 +++-- screen-write.c | 2 +- style.c | 2 +- tmux.h | 6 +++--- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/format-draw.c b/format-draw.c index bb5c65fb..e0ca89f0 100644 --- a/format-draw.c +++ b/format-draw.c @@ -565,7 +565,7 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base, cp++; } - /* Draw the cell to th current screen. */ + /* Draw the cell to the current screen. */ screen_write_cell(&ctx[current], &sy.gc); width[current] += ud->width; continue; diff --git a/grid.c b/grid.c index cddb5871..cbff99e2 100644 --- a/grid.c +++ b/grid.c @@ -37,12 +37,12 @@ /* Default grid cell data. */ const struct grid_cell grid_default_cell = { - 0, 0, 8, 8, 0, { { ' ' }, 0, 1, 1 } + { { ' ' }, 0, 1, 1 }, 0, 0, 8, 8, 0 }; /* Cleared grid cell data. */ const struct grid_cell grid_cleared_cell = { - GRID_FLAG_CLEARED, 0, 8, 8, 0, { { ' ' }, 0, 1, 1 } + { { ' ' }, 0, 1, 1 }, 0, GRID_FLAG_CLEARED, 8, 8, 0 }; static const struct grid_cell_entry grid_cleared_entry = { GRID_FLAG_CLEARED, { .data = { 0, 8, 8, ' ' } } @@ -475,6 +475,7 @@ grid_get_cell1(struct grid_line *gl, u_int px, struct grid_cell *gc) gc->bg = gce->data.bg; if (gce->flags & GRID_FLAG_BG256) gc->bg |= COLOUR_FLAG_256; + gc->us = 0; utf8_set(&gc->data, gce->data.data); } diff --git a/screen-write.c b/screen-write.c index 631328a3..943e3044 100644 --- a/screen-write.c +++ b/screen-write.c @@ -36,7 +36,7 @@ static const struct grid_cell *screen_write_combine(struct screen_write_ctx *, const struct utf8_data *, u_int *); static const struct grid_cell screen_write_pad_cell = { - GRID_FLAG_PADDING, 0, 8, 8, 0, { { 0 }, 0, 0, 0 } + { { 0 }, 0, 0, 0 }, 0, GRID_FLAG_PADDING, 0, 8, 8 }; struct screen_write_collect_item { diff --git a/style.c b/style.c index f195301f..9f986314 100644 --- a/style.c +++ b/style.c @@ -30,7 +30,7 @@ /* Default style. */ static struct style style_default = { - { 0, 0, 8, 8, 0, { { ' ' }, 0, 1, 1 } }, + { { { ' ' }, 0, 1, 1 }, 0, 0, 8, 8, 0 }, 8, STYLE_ALIGN_DEFAULT, diff --git a/tmux.h b/tmux.h index e43140b2..0b0d998e 100644 --- a/tmux.h +++ b/tmux.h @@ -596,13 +596,13 @@ enum utf8_state { /* Grid cell data. */ struct grid_cell { - u_char flags; + struct utf8_data data; /* 21 bytes */ u_short attr; + u_char flags; int fg; int bg; int us; - struct utf8_data data; -}; +} __packed; struct grid_cell_entry { u_char flags; union { -- cgit From ddf53d6e4e76463e6d777b2de7304572333935e9 Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 6 Jul 2019 20:56:34 +0000 Subject: Correctly adjust mouse position if the status line is at the top and more than one line. GitHub issue 1822. --- cmd-resize-pane.c | 8 ++++---- cmd.c | 4 ++-- server-client.c | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c index c978edfb..8d35d96f 100644 --- a/cmd-resize-pane.c +++ b/cmd-resize-pane.c @@ -144,13 +144,13 @@ cmd_resize_pane_mouse_update(struct client *c, struct mouse_event *m) w = wl->window; y = m->y + m->oy; x = m->x + m->ox; - if (m->statusat == 0 && y > 0) - y--; + if (m->statusat == 0 && y >= m->statuslines) + y -= m->statuslines; else if (m->statusat > 0 && y >= (u_int)m->statusat) y = m->statusat - 1; ly = m->ly + m->oy; lx = m->lx + m->ox; - if (m->statusat == 0 && ly > 0) - ly--; + if (m->statusat == 0 && ly >= m->statuslines) + ly -= m->statuslines; else if (m->statusat > 0 && ly >= (u_int)m->statusat) ly = m->statusat - 1; diff --git a/cmd.c b/cmd.c index a071dec5..c838c53f 100644 --- a/cmd.c +++ b/cmd.c @@ -597,8 +597,8 @@ cmd_mouse_at(struct window_pane *wp, struct mouse_event *m, u_int *xp, } log_debug("%s: x=%u, y=%u%s", __func__, x, y, last ? " (last)" : ""); - if (m->statusat == 0 && y > 0) - y--; + if (m->statusat == 0 && y >= m->statuslines) + y -= m->statuslines; if (x < wp->xoff || x >= wp->xoff + wp->sx) return (-1); diff --git a/server-client.c b/server-client.c index 7aeead41..3fd16ec5 100644 --- a/server-client.c +++ b/server-client.c @@ -524,9 +524,10 @@ have_event: /* Is this on the status line? */ m->statusat = status_at_line(c); + m->statuslines = status_line_size(c); if (m->statusat != -1 && y >= (u_int)m->statusat && - y < m->statusat + status_line_size(c)) { + y < m->statusat + m->statuslines) { sr = status_get_range(c, x, y - m->statusat); if (sr == NULL) { where = STATUS_DEFAULT; @@ -555,8 +556,8 @@ have_event: /* Not on status line. Adjust position and check for border or pane. */ if (where == NOWHERE) { px = x; - if (m->statusat == 0 && y > 0) - py = y - 1; + if (m->statusat == 0 && y >= m->statuslines) + py = y - m->statuslines; else if (m->statusat > 0 && y >= (u_int)m->statusat) py = m->statusat - 1; else -- cgit