=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/control.c,v retrieving revision 1.32 retrieving revision 1.33 diff -c -r1.32 -r1.33 *** src/usr.bin/tmux/control.c 2020/05/22 11:07:04 1.32 --- src/usr.bin/tmux/control.c 2020/05/24 09:40:17 1.33 *************** *** 1,4 **** ! /* $OpenBSD: control.c,v 1.32 2020/05/22 11:07:04 nicm Exp $ */ /* * Copyright (c) 2012 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: control.c,v 1.33 2020/05/24 09:40:17 nicm Exp $ */ /* * Copyright (c) 2012 Nicholas Marriott *************** *** 38,43 **** --- 38,48 ---- }; RB_HEAD(control_offsets, control_offset); + /* Control state. */ + struct control_state { + struct control_offsets offsets; + }; + /* Compare client offsets. */ static int control_offset_cmp(struct control_offset *co1, struct control_offset *co2) *************** *** 54,84 **** static struct control_offset * control_get_offset(struct client *c, struct window_pane *wp) { ! struct control_offset co = { .pane = wp->id }; ! if (c->offsets == NULL) ! return (NULL); ! return (RB_FIND(control_offsets, c->offsets, &co)); } /* Add pane offsets for this client. */ static struct control_offset * control_add_offset(struct client *c, struct window_pane *wp) { struct control_offset *co; co = control_get_offset(c, wp); if (co != NULL) return (co); - if (c->offsets == NULL) { - c->offsets = xmalloc(sizeof *c->offsets); - RB_INIT(c->offsets); - } - co = xcalloc(1, sizeof *co); co->pane = wp->id; ! RB_INSERT(control_offsets, c->offsets, co); memcpy(&co->offset, &wp->offset, sizeof co->offset); return (co); } --- 59,84 ---- static struct control_offset * control_get_offset(struct client *c, struct window_pane *wp) { ! struct control_state *cs = c->control_state; ! struct control_offset co = { .pane = wp->id }; ! return (RB_FIND(control_offsets, &cs->offsets, &co)); } /* Add pane offsets for this client. */ static struct control_offset * control_add_offset(struct client *c, struct window_pane *wp) { + struct control_state *cs = c->control_state; struct control_offset *co; co = control_get_offset(c, wp); if (co != NULL) return (co); co = xcalloc(1, sizeof *co); co->pane = wp->id; ! RB_INSERT(control_offsets, &cs->offsets, co); memcpy(&co->offset, &wp->offset, sizeof co->offset); return (co); } *************** *** 87,101 **** void control_free_offsets(struct client *c) { struct control_offset *co, *co1; ! if (c->offsets == NULL) ! return; ! RB_FOREACH_SAFE(co, control_offsets, c->offsets, co1) { ! RB_REMOVE(control_offsets, c->offsets, co); free(co); } - free(c->offsets); } /* Get offsets for client. */ --- 87,99 ---- void control_free_offsets(struct client *c) { + struct control_state *cs = c->control_state; struct control_offset *co, *co1; ! RB_FOREACH_SAFE(co, control_offsets, &cs->offsets, co1) { ! RB_REMOVE(control_offsets, &cs->offsets, co); free(co); } } /* Get offsets for client. */ *************** *** 255,262 **** --- 253,275 ---- void control_start(struct client *c) { + struct control_state *cs; + + cs = c->control_state = xcalloc(1, sizeof *cs); + RB_INIT(&cs->offsets); + file_read(c, "-", control_callback, c); if (c->flags & CLIENT_CONTROLCONTROL) file_print(c, "\033P1000p"); + } + + /* Stop control mode. */ + void + control_stop(struct client *c) + { + struct control_state *cs = c->control_state; + + control_free_offsets(c); + free(cs); }