From: Jaakko Heinonen Date: Mon, 1 Aug 2005 07:58:22 +0000 (+0000) Subject: - handle terminal preparation more elegantly X-Git-Tag: upstream/0.6.1~2^2~189 X-Git-Url: https://git.deb.at/w?a=commitdiff_plain;h=9d3c228a31b33038c69861f59e50b2c2de1e825a;p=pkg%2Fabook.git - handle terminal preparation more elegantly - warn about old or non-GNU readline - #error if readline headers are not found --- diff --git a/abook_rl.c b/abook_rl.c index c09b4bb..7e51aa1 100644 --- a/abook_rl.c +++ b/abook_rl.c @@ -12,9 +12,6 @@ #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 @@ -23,12 +20,18 @@ # include #elif defined(HAVE_READLINE_H) # include +#else +# error "You don't seem to have readhline.h" +# error "No HAVE_READLINE_READLINE_H or HAVE_READLINE_H defined" #endif #if defined(HAVE_READLINE_HISTORY_H) # include #elif defined(HAVE_HISTORY_H) # include +#else +# error "You don't seem to have history.h" +# error "No HAVE_READLINE_HISTORY_H or HAVE_HISTORY_H defined" #endif #ifdef HANDLE_MULTIBYTE @@ -45,7 +48,7 @@ static bool rl_cancelled; static void rl_refresh() { - /*refresh();*/ + /* refresh(); */ wrefresh(rl_win); } @@ -59,13 +62,13 @@ rline_calc_point() 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, rl_line_buffer + (1 + real_point - COLS), @@ -85,6 +88,34 @@ rline_compdisp(char **matches, int n, int max_len) /* dummy */ } +static void +rline_prep_terminal(int dummy) +{ +#if (RL_VERSION_MAJOR == 4 && RL_VERSION_MINOR > 2) || (RL_VERSION_MAJOR > 4) + /* nothing */ +#else +# warning "You seem to have rather old readline version or non-GNU \ +version of the readline. If you have problems please use \ +GNU readline 4.3 or newer. \ +GNU readline versions 4.0, 4.1 and 4.2 should be OK despite \ +of this warning." + /* + * this kludge avoids older readline libraries to print a newline + */ + extern int readline_echoing_p; + readline_echoing_p = 0; +#endif + raw(); + keypad(rl_win, FALSE); +} + +static void +rline_deprep_terminal(void) +{ + cbreak(); + keypad(rl_win, TRUE); +} + static int rl_cancel(int dummy1, int dummy2) { @@ -99,19 +130,22 @@ static void 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_erase_empty_line = 0; + rl_redisplay_function = rline_update; rl_completion_display_matches_hook = rline_compdisp; + rl_prep_term_function = rline_prep_terminal; + rl_deprep_term_function = rline_deprep_terminal; 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 { @@ -124,7 +158,7 @@ abook_rl_init(bool use_completion) clear_history(); rl_cancelled = FALSE; -} +} char * abook_readline(WINDOW *w, int y, int x, char *s, int limit, bool use_completion) @@ -138,20 +172,8 @@ abook_readline(WINDOW *w, int y, int x, char *s, int limit, bool use_completion) 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);