X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook_rl.c;h=f6877f10625b1ebd75c37692f0d0e019c8fd7d40;hb=9db7ae25d79b4deeac62b3a757be789ad9dad12b;hp=be8ac908b0062f436bc9b12afb2a9c282fade5fb;hpb=baf6a3ad577ffd7a320f8c736b5e37e9858bac3d;p=pkg%2Fabook.git diff --git a/abook_rl.c b/abook_rl.c index be8ac90..f6877f1 100644 --- a/abook_rl.c +++ b/abook_rl.c @@ -33,6 +33,8 @@ static int rl_x, rl_y; static WINDOW *rl_win; +static bool rl_cancelled; + static void rl_refresh() { @@ -58,26 +60,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 +98,34 @@ 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); + nocbreak(); ret = readline(NULL); + cbreak(); + + if(rl_cancelled && ret) { + free(ret); + ret = NULL; + } return ret; }