X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=interactive.c;h=c34a0f6eb3c5ff3fd6fcb0e85546a180d21fd880;hp=a568d3c5c82fb065eaaff9c86aeed02ff5310094;hb=16b889fa03e8e9e97ed89370ad40fea4ee9b3e3a;hpb=586eb1abb437420e5b7678890abb82fdbd1f7c45 diff --git a/interactive.c b/interactive.c index a568d3c5..c34a0f6e 100644 --- a/interactive.c +++ b/interactive.c @@ -38,6 +38,7 @@ struct i9e_private { bool caught_sigterm; Keymap standard_km; Keymap bare_km; + int fd_flags[2]; }; static struct i9e_private i9e_private, *i9ep = &i9e_private; @@ -254,6 +255,8 @@ void i9e_close(void) if (hf) write_history(hf); wipe_bottom_line(); + fcntl(i9ep->ici->fds[0], F_SETFL, i9ep->fd_flags[0]); + fcntl(i9ep->ici->fds[1], F_SETFL, i9ep->fd_flags[1]); } static void clear_bottom_line(void) @@ -437,6 +440,9 @@ static int dispatch_key(__a_unused int count, __a_unused int key) { int i, ret; +again: + if (i9ep->key_sequence_length == 0) + return 0; for (i = i9ep->num_key_bindings - 1; i >= 0; i--) { if (strcmp(i9ep->key_sequence, i9ep->ici->bound_keyseqs[i])) continue; @@ -445,7 +451,15 @@ static int dispatch_key(__a_unused int count, __a_unused int key) ret = i9ep->ici->key_handler(i); return ret < 0? ret : 0; } - assert(0); + PARA_WARNING_LOG("ignoring key %d\n", i9ep->key_sequence[0]); + /* + * We received an undefined key sequence. Throw away the first byte, + * and try to parse the remainder. + */ + memmove(i9ep->key_sequence, i9ep->key_sequence + 1, + i9ep->key_sequence_length); /* move also terminating zero byte */ + i9ep->key_sequence_length--; + goto again; } /** @@ -465,6 +479,14 @@ int i9e_open(struct i9e_client_info *ici, struct sched *s) memset(i9ep, 0, sizeof(struct i9e_private)); if (!isatty(ici->fds[0])) return -E_I9E_SETUPTERM; + ret = fcntl(ici->fds[0], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[0] = ret; + ret = fcntl(ici->fds[1], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[1] = ret; ret = mark_fd_nonblocking(ici->fds[0]); if (ret < 0) return ret;