=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-client.c,v retrieving revision 1.279 retrieving revision 1.280 diff -c -r1.279 -r1.280 *** src/usr.bin/tmux/server-client.c 2019/05/03 20:44:24 1.279 --- src/usr.bin/tmux/server-client.c 2019/05/07 11:24:03 1.280 *************** *** 1,4 **** ! /* $OpenBSD: server-client.c,v 1.279 2019/05/03 20:44:24 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: server-client.c,v 1.280 2019/05/07 11:24:03 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 986,992 **** * 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; --- 986,992 ---- * Handle data key input from client. This owns and can modify the key event it * is given and is responsible for freeing it. */ ! static enum cmd_retval server_client_key_callback(struct cmdq_item *item, void *data) { struct client *c = item->client; *************** *** 1204,1209 **** --- 1204,1247 ---- out: free(event); return (CMD_RETURN_NORMAL); + } + + /* Handle a key event. */ + int + server_client_handle_key(struct client *c, struct key_event *event) + { + struct session *s = c->session; + struct window *w; + struct window_pane *wp = NULL; + struct cmdq_item *item; + + /* Check the client is good to accept input. */ + if (s == NULL || (c->flags & (CLIENT_DEAD|CLIENT_SUSPENDED)) != 0) + return (0); + w = s->curw->window; + + /* + * Key presses in identify mode are a special case. The queue might be + * blocked so they need to be processed immediately rather than queued. + */ + if (c->flags & CLIENT_IDENTIFY) { + if (c->flags & CLIENT_READONLY) + return (0); + if (event->key >= '0' && event->key <= '9') { + window_unzoom(w); + wp = window_pane_at_index(w, event->key - '0'); + } + server_client_clear_identify(c, wp); + return (0); + } + + /* + * Add the key to the queue so it happens after any commands queued by + * previous keys. + */ + item = cmdq_get_callback(server_client_key_callback, event); + cmdq_append(c, item); + return (1); } /* Client functions that need to happen every loop. */