struct i9e_client_info *ici;
FILE *stderr_stream;
int num_columns;
+ int num_key_bindings;
char empty_line[1000];
struct task *task;
struct btr_node *stdout_btrn;
bool last_write_was_status;
- bool line_handler_running;
bool input_eof;
bool caught_sigint;
bool caught_sigterm;
i9ep->empty_line[i9ep->num_columns] = '\0';
}
-/**
- * Defined key sequences are mapped to keys starting with this offset. I.e.
- * pressing the first defined key sequence yields the key number \p KEY_OFFSET.
- */
-#define KEY_OFFSET 64
-
-static int dispatch_key(__a_unused int count, int key)
+static int dispatch_key(__a_unused int count, __a_unused int key)
{
- int ret;
+ int i, ret;
- assert(key >= KEY_OFFSET);
- ret = i9ep->ici->key_handler(key - KEY_OFFSET);
- return ret < 0? ret : 0;
+ for (i = i9ep->num_key_bindings - 1; i >= 0; i--) {
+ if (strcmp(rl_executing_keyseq, i9ep->ici->bound_keyseqs[i]))
+ continue;
+ ret = i9ep->ici->key_handler(i);
+ return ret < 0? ret : 0;
+ }
+ assert(0);
}
/**
{
int ret;
+ memset(i9ep, 0, sizeof(struct i9e_private));
if (!isatty(ici->fds[0]))
return -E_I9E_SETUPTERM;
ret = mark_fd_nonblocking(ici->fds[0]);
if (ici->bound_keyseqs) {
char *seq;
int i;
- /* FIXME: This is an arbitrary constant. */
- for (i = 0; i < 32 && (seq = ici->bound_keyseqs[i]); i++) {
- char buf[2] = {KEY_OFFSET + i, '\0'};
- /* readline needs an allocated buffer for the macro */
- rl_generic_bind(ISMACR, seq, para_strdup(buf), i9ep->bare_km);
- rl_bind_key_in_map(KEY_OFFSET + i, dispatch_key, i9ep->bare_km);
- }
+ /* bind each key sequence to the our dispatcher */
+ for (i = 0; (seq = ici->bound_keyseqs[i]); i++)
+ rl_generic_bind(ISFUNC, seq, (char *)dispatch_key,
+ i9ep->bare_km);
+ i9ep->num_key_bindings = i;
}
if (ici->history_file)
read_history(ici->history_file);
if (ici->producer) {
rl_callback_handler_install("", i9e_line_handler);
i9e_attach_to_stdout(ici->producer);
- rl_set_keymap(i9ep->bare_km);
} else
rl_callback_handler_install(i9ep->ici->prompt, i9e_line_handler);
return 1;
* Tell i9e that the caller received a signal.
*
* \param sig_num The number of the signal received.
- *
- * Currently the function only cares about \p SIGINT, but this may change.
*/
void i9e_signal_dispatch(int sig_num)
{