diff options
author | Thomas Adam <thomas@xteddy.org> | 2019-05-07 13:02:27 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2019-05-07 13:02:27 +0100 |
commit | d9767b81123cc8913c63c42cc754cccbf34ccb6c (patch) | |
tree | 94e0a8cdb822db6145080c02907ad626c0d0fa89 /server-client.c | |
parent | eac30a86d78879f2dec802b0d246eba0afa79b3e (diff) | |
parent | 85a9c2f52b8855560fa9fdaa033d1c7bca738429 (diff) | |
download | rtmux-d9767b81123cc8913c63c42cc754cccbf34ccb6c.tar.gz rtmux-d9767b81123cc8913c63c42cc754cccbf34ccb6c.tar.bz2 rtmux-d9767b81123cc8913c63c42cc754cccbf34ccb6c.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/server-client.c b/server-client.c index b6d450a0..9ff86671 100644 --- a/server-client.c +++ b/server-client.c @@ -984,7 +984,7 @@ server_client_assume_paste(struct session *s) * 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 +static enum cmd_retval server_client_key_callback(struct cmdq_item *item, void *data) { struct client *c = item->client; @@ -1204,6 +1204,44 @@ out: 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. */ void server_client_loop(void) |