=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-client.c,v retrieving revision 1.275 retrieving revision 1.276 diff -c -r1.275 -r1.276 *** src/usr.bin/tmux/server-client.c 2019/04/18 10:11:52 1.275 --- src/usr.bin/tmux/server-client.c 2019/05/03 14:51:30 1.276 *************** *** 1,4 **** ! /* $OpenBSD: server-client.c,v 1.275 2019/04/18 10:11:52 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: server-client.c,v 1.276 2019/05/03 14:51:30 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 35,41 **** static void server_client_free(int, short, void *); static void server_client_check_focus(struct window_pane *); static void server_client_check_resize(struct window_pane *); ! static key_code server_client_check_mouse(struct client *); static void server_client_repeat_timer(int, short, void *); static void server_client_click_timer(int, short, void *); static void server_client_check_exit(struct client *); --- 35,41 ---- static void server_client_free(int, short, void *); static void server_client_check_focus(struct window_pane *); static void server_client_check_resize(struct window_pane *); ! static key_code server_client_check_mouse(struct client *, struct key_event *); static void server_client_repeat_timer(int, short, void *); static void server_client_click_timer(int, short, void *); static void server_client_check_exit(struct client *); *************** *** 407,416 **** /* Check for mouse keys. */ static key_code ! server_client_check_mouse(struct client *c) { struct session *s = c->session; - struct mouse_event *m = &c->tty.mouse; struct winlink *wl; struct window_pane *wp; u_int x, y, b, sx, sy, px, py; --- 407,416 ---- /* Check for mouse keys. */ static key_code ! server_client_check_mouse(struct client *c, struct key_event *event) { + struct mouse_event *m = &event->m; struct session *s = c->session; struct winlink *wl; struct window_pane *wp; u_int x, y, b, sx, sy, px, py; *************** *** 419,425 **** struct timeval tv; struct style_range *sr; enum { NOTYPE, MOVE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type; ! enum { NOWHERE, PANE, STATUS, STATUS_LEFT, STATUS_RIGHT, STATUS_DEFAULT, BORDER } where; type = NOTYPE; where = NOWHERE; --- 419,431 ---- struct timeval tv; struct style_range *sr; enum { NOTYPE, MOVE, DOWN, UP, DRAG, WHEEL, DOUBLE, TRIPLE } type; ! enum { NOWHERE, ! PANE, ! STATUS, ! STATUS_LEFT, ! STATUS_RIGHT, ! STATUS_DEFAULT, ! BORDER } where; type = NOTYPE; where = NOWHERE; *************** *** 976,986 **** return (0); } ! /* Handle data key input from client. */ ! void ! server_client_handle_key(struct client *c, key_code key) { ! struct mouse_event *m = &c->tty.mouse; struct session *s = c->session; struct winlink *wl; struct window *w; --- 982,998 ---- return (0); } ! /* ! * Handle data key input from client. This owns and can modify the key event it ! * is given and is responsible for freeing it. ! */ ! enum cmd_retval ! server_client_key_callback(struct cmdq_item *item, void *data) { ! struct client *c = item->client; ! struct key_event *event = data; ! key_code key = event->key; ! struct mouse_event *m = &event->m; struct session *s = c->session; struct winlink *wl; struct window *w; *************** *** 995,1001 **** /* Check the client is good to accept input. */ if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) ! return; wl = s->curw; w = wl->window; --- 1007,1013 ---- /* Check the client is good to accept input. */ if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) ! goto out; wl = s->curw; w = wl->window; *************** *** 1007,1017 **** /* Number keys jump to pane in identify mode. */ if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') { if (c->flags & CLIENT_READONLY) ! return; window_unzoom(w); wp = window_pane_at_index(w, key - '0'); server_client_clear_identify(c, wp); ! return; } /* Handle status line. */ --- 1019,1029 ---- /* Number keys jump to pane in identify mode. */ if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') { if (c->flags & CLIENT_READONLY) ! goto out; window_unzoom(w); wp = window_pane_at_index(w, key - '0'); server_client_clear_identify(c, wp); ! goto out; } /* Handle status line. */ *************** *** 1021,1039 **** } if (c->prompt_string != NULL) { if (c->flags & CLIENT_READONLY) ! return; if (status_prompt_key(c, key) == 0) ! return; } /* Check for mouse keys. */ m->valid = 0; if (key == KEYC_MOUSE) { if (c->flags & CLIENT_READONLY) ! return; ! key = server_client_check_mouse(c); if (key == KEYC_UNKNOWN) ! return; m->valid = 1; m->key = key; --- 1033,1051 ---- } if (c->prompt_string != NULL) { if (c->flags & CLIENT_READONLY) ! goto out; if (status_prompt_key(c, key) == 0) ! goto out; } /* Check for mouse keys. */ m->valid = 0; if (key == KEYC_MOUSE) { if (c->flags & CLIENT_READONLY) ! goto out; ! key = server_client_check_mouse(c, event); if (key == KEYC_UNKNOWN) ! goto out; m->valid = 1; m->key = key; *************** *** 1044,1053 **** */ if (key == KEYC_DRAGGING) { c->tty.mouse_drag_update(c, m); ! return; } ! } else ! m->valid = 0; /* Find affected pane. */ if (!KEYC_IS_MOUSE(key) || cmd_find_from_mouse(&fs, m, 0) != 0) --- 1056,1064 ---- */ if (key == KEYC_DRAGGING) { c->tty.mouse_drag_update(c, m); ! goto out; } ! } /* Find affected pane. */ if (!KEYC_IS_MOUSE(key) || cmd_find_from_mouse(&fs, m, 0) != 0) *************** *** 1086,1092 **** strcmp(table->name, "prefix") != 0) { server_client_set_key_table(c, "prefix"); server_status_client(c); ! return; } flags = c->flags; --- 1097,1103 ---- strcmp(table->name, "prefix") != 0) { server_client_set_key_table(c, "prefix"); server_status_client(c); ! goto out; } flags = c->flags; *************** *** 1144,1152 **** server_status_client(c); /* Execute the key binding. */ ! key_bindings_dispatch(bd, NULL, c, m, &fs); key_bindings_unref_table(table); ! return; } /* --- 1155,1163 ---- server_status_client(c); /* Execute the key binding. */ ! key_bindings_dispatch(bd, item, c, m, &fs); key_bindings_unref_table(table); ! goto out; } /* *************** *** 1181,1194 **** if (first != table && (~flags & CLIENT_REPEAT)) { server_client_set_key_table(c, NULL); server_status_client(c); ! return; } forward_key: if (c->flags & CLIENT_READONLY) ! return; if (wp != NULL) window_pane_key(wp, c, s, wl, key, m); } /* Client functions that need to happen every loop. */ --- 1192,1209 ---- if (first != table && (~flags & CLIENT_REPEAT)) { server_client_set_key_table(c, NULL); server_status_client(c); ! goto out; } forward_key: if (c->flags & CLIENT_READONLY) ! goto out; if (wp != NULL) window_pane_key(wp, c, s, wl, key, m); + + out: + free(event); + return (CMD_RETURN_NORMAL); } /* Client functions that need to happen every loop. */