Skip to content

Commit

Permalink
Merge branch 'obsd-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasAdam committed Jul 10, 2023
2 parents e4c4ceb + 4ece43a commit 269dab4
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 29 deletions.
17 changes: 14 additions & 3 deletions client.c
Original file line number Diff line number Diff line change
Expand Up @@ -533,11 +533,22 @@ client_signal(int sig)
{
struct sigaction sigact;
int status;
pid_t pid;

log_debug("%s: %s", __func__, strsignal(sig));
if (sig == SIGCHLD)
waitpid(WAIT_ANY, &status, WNOHANG);
else if (!client_attached) {
if (sig == SIGCHLD) {
for (;;) {
pid = waitpid(WAIT_ANY, &status, WNOHANG);
if (pid == 0)
break;
if (pid == -1) {
if (errno == ECHILD)
break;
log_debug("waitpid failed: %s",
strerror(errno));
}
}
} else if (!client_attached) {
if (sig == SIGTERM || sig == SIGHUP)
proc_exit(client_proc);
} else {
Expand Down
2 changes: 1 addition & 1 deletion cmd-find.c
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,7 @@ cmd_find_get_pane_with_window(struct cmd_find_state *fs, const char *pane)

/* Try special characters. */
if (strcmp(pane, "!") == 0) {
fs->wp = fs->w->last;
fs->wp = TAILQ_FIRST(&fs->w->last_panes);
if (fs->wp == NULL)
return (-1);
return (0);
Expand Down
6 changes: 5 additions & 1 deletion cmd-select-pane.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,11 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
struct options_entry *o;

if (entry == &cmd_last_pane_entry || args_has(args, 'l')) {
lastwp = w->last;
/*
* Check for no last pane found in case the other pane was
* spawned without being visited (for example split-window -d).
*/
lastwp = TAILQ_FIRST(&w->last_panes);
if (lastwp == NULL && window_count_panes(w) == 2) {
lastwp = TAILQ_PREV(w->active, window_panes, entry);
if (lastwp == NULL)
Expand Down
6 changes: 2 additions & 4 deletions cmd-swap-pane.c
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,8 @@ cmd_swap_pane_exec(struct cmd *self, struct cmdq_item *item)
window_set_active_pane(dst_w, src_wp, 1);
}
if (src_w != dst_w) {
if (src_w->last == src_wp)
src_w->last = NULL;
if (dst_w->last == dst_wp)
dst_w->last = NULL;
window_pane_stack_remove(&src_w->last_panes, src_wp);
window_pane_stack_remove(&dst_w->last_panes, dst_wp);
colour_palette_from_option(&src_wp->palette, src_wp->options);
colour_palette_from_option(&dst_wp->palette, dst_wp->options);
}
Expand Down
2 changes: 1 addition & 1 deletion format.c
Original file line number Diff line number Diff line change
Expand Up @@ -1902,7 +1902,7 @@ static void *
format_cb_pane_last(struct format_tree *ft)
{
if (ft->wp != NULL) {
if (ft->wp == ft->wp->window->last)
if (ft->wp == TAILQ_FIRST(&ft->wp->window->last_panes))
return (xstrdup("1"));
return (xstrdup("0"));
}
Expand Down
1 change: 1 addition & 0 deletions spawn.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ spawn_window(struct spawn_context *sc, char **cause)
window_pane_resize(sc->wp0, w->sx, w->sy);

layout_init(w, sc->wp0);
w->active = NULL;
window_set_active_pane(w, sc->wp0, 0);
}

Expand Down
12 changes: 9 additions & 3 deletions tmux.h
Original file line number Diff line number Diff line change
Expand Up @@ -1042,7 +1042,7 @@ struct window_pane {
#define PANE_REDRAW 0x1
#define PANE_DROP 0x2
#define PANE_FOCUSED 0x4
/* 0x8 unused */
#define PANE_VISITED 0x8
/* 0x10 unused */
/* 0x20 unused */
#define PANE_INPUTOFF 0x40
Expand Down Expand Up @@ -1097,7 +1097,8 @@ struct window_pane {
int border_gc_set;
struct grid_cell border_gc;

TAILQ_ENTRY(window_pane) entry;
TAILQ_ENTRY(window_pane) entry; /* link in list of all panes */
TAILQ_ENTRY(window_pane) sentry; /* link in list of last visited */
RB_ENTRY(window_pane) tree_entry;
};
TAILQ_HEAD(window_panes, window_pane);
Expand All @@ -1118,7 +1119,7 @@ struct window {
struct timeval activity_time;

struct window_pane *active;
struct window_pane *last;
struct window_panes last_panes;
struct window_panes panes;

int lastlayout;
Expand Down Expand Up @@ -1171,6 +1172,7 @@ struct winlink {
#define WINLINK_ACTIVITY 0x2
#define WINLINK_SILENCE 0x4
#define WINLINK_ALERTFLAGS (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_SILENCE)
#define WINLINK_VISITED 0x8

RB_ENTRY(winlink) entry;
TAILQ_ENTRY(winlink) wentry;
Expand Down Expand Up @@ -3046,6 +3048,10 @@ struct window_pane *window_pane_find_up(struct window_pane *);
struct window_pane *window_pane_find_down(struct window_pane *);
struct window_pane *window_pane_find_left(struct window_pane *);
struct window_pane *window_pane_find_right(struct window_pane *);
void window_pane_stack_push(struct window_panes *,
struct window_pane *);
void window_pane_stack_remove(struct window_panes *,
struct window_pane *);
void window_set_name(struct window *, const char *);
void window_add_ref(struct window *, const char *);
void window_remove_ref(struct window *, const char *);
Expand Down
56 changes: 40 additions & 16 deletions window.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,21 +246,15 @@ winlink_stack_push(struct winlink_stack *stack, struct winlink *wl)

winlink_stack_remove(stack, wl);
TAILQ_INSERT_HEAD(stack, wl, sentry);
wl->flags |= WINLINK_VISITED;
}

void
winlink_stack_remove(struct winlink_stack *stack, struct winlink *wl)
{
struct winlink *wl2;

if (wl == NULL)
return;

TAILQ_FOREACH(wl2, stack, sentry) {
if (wl2 == wl) {
TAILQ_REMOVE(stack, wl, sentry);
return;
}
if (wl != NULL && (wl->flags & WINLINK_VISITED)) {
TAILQ_REMOVE(stack, wl, sentry);
wl->flags &= ~WINLINK_VISITED;
}
}

Expand Down Expand Up @@ -310,6 +304,7 @@ window_create(u_int sx, u_int sy, u_int xpixel, u_int ypixel)
w->flags = 0;

TAILQ_INIT(&w->panes);
TAILQ_INIT(&w->last_panes);
w->active = NULL;

w->lastlayout = -1;
Expand Down Expand Up @@ -519,18 +514,23 @@ window_pane_update_focus(struct window_pane *wp)
int
window_set_active_pane(struct window *w, struct window_pane *wp, int notify)
{
struct window_pane *lastwp;

log_debug("%s: pane %%%u", __func__, wp->id);

if (wp == w->active)
return (0);
w->last = w->active;
lastwp = w->active;

window_pane_stack_remove(&w->last_panes, wp);
window_pane_stack_push(&w->last_panes, lastwp);

w->active = wp;
w->active->active_point = next_active_point++;
w->active->flags |= PANE_CHANGED;

if (options_get_number(global_options, "focus-events")) {
window_pane_update_focus(w->last);
window_pane_update_focus(lastwp);
window_pane_update_focus(w->active);
}

Expand Down Expand Up @@ -753,21 +753,21 @@ window_lost_pane(struct window *w, struct window_pane *wp)
if (wp == marked_pane.wp)
server_clear_marked();

window_pane_stack_remove(&w->last_panes, wp);
if (wp == w->active) {
w->active = w->last;
w->last = NULL;
w->active = TAILQ_FIRST(&w->last_panes);
if (w->active == NULL) {
w->active = TAILQ_PREV(wp, window_panes, entry);
if (w->active == NULL)
w->active = TAILQ_NEXT(wp, entry);
}
if (w->active != NULL) {
window_pane_stack_remove(&w->last_panes, w->active);
w->active->flags |= PANE_CHANGED;
notify_window("window-pane-changed", w);
window_update_focus(w);
}
} else if (wp == w->last)
w->last = NULL;
}
}

void
Expand Down Expand Up @@ -851,6 +851,11 @@ window_destroy_panes(struct window *w)
{
struct window_pane *wp;

while (!TAILQ_EMPTY(&w->last_panes)) {
wp = TAILQ_FIRST(&w->last_panes);
window_pane_stack_remove(&w->last_panes, wp);
}

while (!TAILQ_EMPTY(&w->panes)) {
wp = TAILQ_FIRST(&w->panes);
TAILQ_REMOVE(&w->panes, wp, entry);
Expand Down Expand Up @@ -1488,6 +1493,25 @@ window_pane_find_right(struct window_pane *wp)
return (best);
}

void
window_pane_stack_push(struct window_panes *stack, struct window_pane *wp)
{
if (wp != NULL) {
window_pane_stack_remove(stack, wp);
TAILQ_INSERT_HEAD(stack, wp, sentry);
wp->flags |= PANE_VISITED;
}
}

void
window_pane_stack_remove(struct window_panes *stack, struct window_pane *wp)
{
if (wp != NULL && (wp->flags & PANE_VISITED)) {
TAILQ_REMOVE(stack, wp, sentry);
wp->flags &= ~PANE_VISITED;
}
}

/* Clear alert flags for a winlink */
void
winlink_clear_flags(struct winlink *wl)
Expand Down

0 comments on commit 269dab4

Please sign in to comment.