X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook_rl.c;h=c09b4bb6dc4866e8402bfb4b1f37c0a6b58459b4;hb=75633ffa7a52aec7958b5cf4e0f3375683851c65;hp=0cd591e9dc7c2a4861b52dbdd54a9aa0abaa21f0;hpb=548845673bdbe52a3cb2d7c6c2818d3202fffcba;p=pkg%2Fabook.git diff --git a/abook_rl.c b/abook_rl.c index 0cd591e..c09b4bb 100644 --- a/abook_rl.c +++ b/abook_rl.c @@ -6,13 +6,15 @@ * Copyright (C) Jaakko Heinonen */ - #include #include #include #include "abook.h" #include "abook_rl.h" +#define KEYPAD_HACK 1 /* enable keypad hack */ +#define CBREAK_HACK 1 /* enable cbreak hack */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -29,11 +31,17 @@ # include #endif +#ifdef HANDLE_MULTIBYTE +# include +#endif + #define RL_READLINE_NAME "Abook" static int rl_x, rl_y; static WINDOW *rl_win; +static bool rl_cancelled; + static void rl_refresh() { @@ -41,10 +49,22 @@ rl_refresh() wrefresh(rl_win); } +#ifdef HANDLE_MULTIBYTE +static int +rline_calc_point() +{ + return (int)mbsnwidth(rl_line_buffer, rl_point, 0); +} +#endif + static void rline_update() { +#ifdef HANDLE_MULTIBYTE + int real_point = rline_calc_point() + rl_x; +#else int real_point = rl_point + rl_x; +#endif if(real_point > (COLS - 1)) mvwaddnstr(rl_win, rl_y, rl_x, @@ -59,49 +79,85 @@ 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; +#if RL_VERSION_MAJOR >= 4 rl_already_prompted = 1; +#endif + 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()); - if(use_completion) + 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); - else + } else { rl_unbind_function_in_map(rl_complete, rl_get_keymap()); + 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; } +