Compare commits

...

8 Commits

Author SHA1 Message Date
Nicholas Marriott
e9634d4074 Set used for popup ranges. 2026-08-31 11:25:09 +01:00
nicm
181e818b93 Do no free input context if it is NULL when popup create fails. 2026-08-28 11:46:41 +01:00
nicm
1c98c3a2a3 Do not walk off end of grid lines if last line is wrapped, reported by
Moe Khalilov.
2026-08-28 11:46:20 +01:00
Nicholas Marriott
d28c9f613d Do not loop forever if a pane ends up with borders the wrong way round. 2026-08-28 10:25:42 +01:00
Nicholas Marriott
0d7b9e87f4 Update CHANGES. 2026-08-24 16:01:11 +01:00
nicm
4ec08da492 Do not use stale pointers in modes. 2026-08-24 15:57:56 +01:00
Nicholas Marriott
22cdf6acac 3.7d bits. 2026-08-24 08:18:18 +01:00
nicm
83b9aff1ae Make list-keys only use a message if -1 is given, otherwise behave like
other commands (stdout or mode).
2026-08-24 08:17:56 +01:00
8 changed files with 29 additions and 8 deletions

View File

@@ -1,3 +1,9 @@
CHANGES FROM 3.7c TO 3.7d
* Do not use stale pointers to windows when panes in modes are joined.
* Fix problem where list-keys output can go to view mode instead of stdout.
CHANGES FROM 3.7b TO 3.7c CHANGES FROM 3.7b TO 3.7c
* Build with jemalloc on macOS to avoid what appears to be a bug in calloc * Build with jemalloc on macOS to avoid what appears to be a bug in calloc

View File

@@ -237,7 +237,7 @@ cmd_list_keys_exec(struct cmd *self, struct cmdq_item *item)
cmd_list_keys_format_add_key_binding(ft, l[i], prefix); cmd_list_keys_format_add_key_binding(ft, l[i], prefix);
line = format_expand(ft, template); line = format_expand(ft, template);
if ((single && tc != NULL) || n == 1) if (single && tc != NULL && (~tc->flags & CLIENT_CONTROL))
status_message_set(tc, -1, 1, 0, 0, "%s", line); status_message_set(tc, -1, 1, 0, 0, "%s", line);
else if (*line != '\0') else if (*line != '\0')
cmdq_print(item, "%s", line); cmdq_print(item, "%s", line);

View File

@@ -1,6 +1,6 @@
# configure.ac # configure.ac
AC_INIT([tmux], 3.7c) AC_INIT([tmux], 3.7d)
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_CONFIG_AUX_DIR(etc) AC_CONFIG_AUX_DIR(etc)

4
grid.c
View File

@@ -1538,7 +1538,7 @@ grid_wrap_position(struct grid *gd, u_int px, u_int py, u_int *wx, u_int *wy)
void void
grid_unwrap_position(struct grid *gd, u_int *px, u_int *py, u_int wx, u_int wy) grid_unwrap_position(struct grid *gd, u_int *px, u_int *py, u_int wx, u_int wy)
{ {
u_int yy, ay = 0; u_int yy, ay = 0, ey = gd->hsize + gd->sy - 1;
for (yy = 0; yy < gd->hsize + gd->sy - 1; yy++) { for (yy = 0; yy < gd->hsize + gd->sy - 1; yy++) {
if (ay == wy) if (ay == wy)
@@ -1552,7 +1552,7 @@ grid_unwrap_position(struct grid *gd, u_int *px, u_int *py, u_int wx, u_int wy)
* until we find the end or the line now containing wx. * until we find the end or the line now containing wx.
*/ */
if (wx == UINT_MAX) { if (wx == UINT_MAX) {
while (gd->linedata[yy].flags & GRID_LINE_WRAPPED) while (yy < ey && gd->linedata[yy].flags & GRID_LINE_WRAPPED)
yy++; yy++;
wx = gd->linedata[yy].cellused; wx = gd->linedata[yy].cellused;
} else { } else {

View File

@@ -110,7 +110,8 @@ popup_free(struct popup_data *pd)
if (pd->job != NULL) if (pd->job != NULL)
job_free(pd->job); job_free(pd->job);
input_free(pd->ictx); if (pd->ictx != NULL)
input_free(pd->ictx);
free(pd->or[0].ranges); free(pd->or[0].ranges);
free(pd->or[1].ranges); free(pd->or[1].ranges);
@@ -278,6 +279,7 @@ popup_check_cb(struct client* c, void *data, u_int px, u_int py, u_int nx)
k++; k++;
} }
} }
r->used = k;
return (r); return (r);
} }

View File

@@ -1201,6 +1201,8 @@ screen_redraw_get_visible_ranges(struct window_pane *base_wp, int px,
for (i = 0; i < r->used; i++) { for (i = 0; i < r->used; i++) {
ri = &r->ranges[i]; ri = &r->ranges[i];
if (ri->nx == 0)
continue;
if (w->sb_pos == PANE_SCROLLBARS_LEFT) { if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
if (wp->xoff > sb_w) if (wp->xoff > sb_w)
lb = wp->xoff - 1 - sb_w; lb = wp->xoff - 1 - sb_w;
@@ -1218,6 +1220,8 @@ screen_redraw_get_visible_ranges(struct window_pane *base_wp, int px,
rb = wp->xoff + wp->sx + sb_w; rb = wp->xoff + wp->sx + sb_w;
if (rb > (int)w->sx) if (rb > (int)w->sx)
rb = w->sx - 1; rb = w->sx - 1;
if (lb > rb)
continue;
sx = ri->px; sx = ri->px;
ex = sx + ri->nx - 1; ex = sx + ri->nx - 1;

View File

@@ -73,6 +73,7 @@ const struct window_mode window_client_mode = {
struct window_client_itemdata { struct window_client_itemdata {
struct client *c; struct client *c;
char *ttyname;
}; };
struct window_client_modedata { struct window_client_modedata {
@@ -110,6 +111,7 @@ static void
window_client_free_item(struct window_client_itemdata *item) window_client_free_item(struct window_client_itemdata *item)
{ {
server_client_unref(item->c); server_client_unref(item->c);
free(item->ttyname);
free(item); free(item);
} }
@@ -137,6 +139,7 @@ window_client_build(void *modedata, struct sort_criteria *sort_crit,
item = window_client_add_item(data); item = window_client_add_item(data);
item->c = l[i]; item->c = l[i];
item->ttyname = xstrdup(l[i]->ttyname);
l[i]->references++; l[i]->references++;
} }
@@ -381,7 +384,7 @@ window_client_key(struct window_mode_entry *wme, struct client *c,
break; break;
case '\r': case '\r':
item = mode_tree_get_current(mtd); item = mode_tree_get_current(mtd);
mode_tree_run_command(c, NULL, data->command, item->c->ttyname); mode_tree_run_command(c, NULL, data->command, item->ttyname);
finished = 1; finished = 1;
break; break;
} }

View File

@@ -254,6 +254,7 @@ window_tree_build_window(struct session *s, struct winlink *wl,
u_int n, i; u_int n, i;
int expanded; int expanded;
struct format_tree *ft; struct format_tree *ft;
uint64_t tag = FORMAT_NONE;
item = window_tree_add_item(data); item = window_tree_add_item(data);
item->type = WINDOW_TREE_WINDOW; item->type = WINDOW_TREE_WINDOW;
@@ -261,7 +262,9 @@ window_tree_build_window(struct session *s, struct winlink *wl,
item->winlink = wl->idx; item->winlink = wl->idx;
item->pane = -1; item->pane = -1;
ft = format_create(NULL, NULL, FORMAT_PANE|wl->window->active->id, 0); if (wl->window != NULL && wl->window->active != NULL)
tag = FORMAT_PANE|wl->window->active->id;
ft = format_create(NULL, NULL, tag, 0);
format_defaults(ft, NULL, s, wl, NULL); format_defaults(ft, NULL, s, wl, NULL);
text = format_expand(ft, data->format); text = format_expand(ft, data->format);
xasprintf(&name, "%u", wl->idx); xasprintf(&name, "%u", wl->idx);
@@ -313,6 +316,7 @@ window_tree_build_session(struct session *s, void *modedata,
u_int n, i, empty; u_int n, i, empty;
int expanded; int expanded;
struct format_tree *ft; struct format_tree *ft;
uint64_t tag = FORMAT_NONE;
item = window_tree_add_item(data); item = window_tree_add_item(data);
item->type = WINDOW_TREE_SESSION; item->type = WINDOW_TREE_SESSION;
@@ -320,7 +324,9 @@ window_tree_build_session(struct session *s, void *modedata,
item->winlink = -1; item->winlink = -1;
item->pane = -1; item->pane = -1;
ft = format_create(NULL, NULL, FORMAT_PANE|wl->window->active->id, 0); if (wl != NULL && wl->window != NULL && wl->window->active != NULL)
tag = FORMAT_PANE|wl->window->active->id;
ft = format_create(NULL, NULL, tag, 0);
format_defaults(ft, NULL, s, NULL, NULL); format_defaults(ft, NULL, s, NULL, NULL);
text = format_expand(ft, data->format); text = format_expand(ft, data->format);
format_free(ft); format_free(ft);