X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook_rl.c;h=ff59db4685b9e3e4d18526597192bcda54c14f39;hb=d221d25b88339fca6be0d015555aa2eb14321195;hp=be8ac908b0062f436bc9b12afb2a9c282fade5fb;hpb=baf6a3ad577ffd7a320f8c736b5e37e9858bac3d;p=pkg%2Fabook.git diff --git a/abook_rl.c b/abook_rl.c index be8ac90..ff59db4 100644 --- a/abook_rl.c +++ b/abook_rl.c @@ -12,6 +12,9 @@ #include "abook.h" #include "abook_rl.h" +#define KEYPAD_HACK 1 /* enable a keypad hack */ +#define CBREAK_HACK 1 /* enable cbreak hack */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -33,6 +36,8 @@ static int rl_x, rl_y; static WINDOW *rl_win; +static bool rl_cancelled; + static void rl_refresh() { @@ -58,26 +63,36 @@ rline_update() rl_refresh(); } -void +static void rline_compdisp(char **matches, int n, int max_len) { - /* - * dummy - */ + /* dummy */ +} + +static int +rl_cancel(int dummy1, int dummy2) +{ + rl_cancelled = TRUE; + + rl_done = 1; + + return 0; } static void -abook_rl_init(int use_completion) +abook_rl_init(bool use_completion) { rl_readline_name = RL_READLINE_NAME; rl_already_prompted = 1; + rl_catch_sigwinch = 0; rl_redisplay_function = rline_update; rl_completion_display_matches_hook = rline_compdisp; - + rl_unbind_function_in_map(rl_clear_screen, rl_get_keymap()); rl_unbind_function_in_map(rl_reverse_search_history, rl_get_keymap()); + rl_unbind_function_in_map(rl_re_read_init_file, rl_get_keymap()); if(use_completion) { rl_bind_key('\t', rl_menu_complete); @@ -86,24 +101,44 @@ abook_rl_init(int use_completion) rl_unbind_function_in_map(rl_menu_complete, rl_get_keymap()); } + rl_bind_key('g' & 31, rl_cancel); /* C-g */ + clear_history(); + + rl_cancelled = FALSE; } char * -abook_readline(WINDOW *w, int y, int x, char *s, int limit, int use_completion) +abook_readline(WINDOW *w, int y, int x, char *s, int limit, bool use_completion) { - char *ret = NULL; + char *ret; - rl_win = w; abook_rl_init(use_completion); - wmove(rl_win, rl_y = y, rl_x = x); + wmove(rl_win = w, rl_y = y, rl_x = x); rl_refresh(); if(s && *s) add_history(s); +#ifdef KEYPAD_HACK + keypad(w, FALSE); +#endif +#ifdef CBREAK_HACK + nocbreak(); +#endif ret = readline(NULL); +#ifdef CBREAK_HACK + cbreak(); +#endif +#ifdef KEYPAD_HACK + keypad(w, TRUE); +#endif + + if(rl_cancelled && ret) { + free(ret); + ret = NULL; + } return ret; }