X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=abook_rl.c;fp=abook_rl.c;h=b450d94874e376c022826469c95751c5a4813fcb;hb=c5d8ef5198f2bfd02f678b7a709b6538ef83cd44;hp=0000000000000000000000000000000000000000;hpb=7dca83329bb3ce545d6d03e10754999b9a82ca01;p=pkg%2Fabook.git diff --git a/abook_rl.c b/abook_rl.c new file mode 100644 index 0000000..b450d94 --- /dev/null +++ b/abook_rl.c @@ -0,0 +1,163 @@ +/* + * $Id: abook_rl.c,v 1.11 2004/02/18 19:41:37 jheinonen Exp $ + * + * by JH + * + * 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 + +#if defined(HAVE_READLINE_READLINE_H) +# include +#elif defined(HAVE_READLINE_H) +# include +#endif + +#if defined(HAVE_READLINE_HISTORY_H) +# include +#elif defined(HAVE_HISTORY_H) +# 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() +{ + /*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, + rl_line_buffer + (1 + real_point - COLS), + COLS - rl_x - 1); + else + mvwaddnstr(rl_win, rl_y, rl_x, rl_line_buffer, rl_end); + + wclrtoeol(rl_win); + wmove(rl_win, rl_y, min(real_point, COLS - 1)); + + rl_refresh(); +} + +static void +rline_compdisp(char **matches, int n, int max_len) +{ + /* dummy */ +} + +static int +rl_cancel(int dummy1, int dummy2) +{ + rl_cancelled = TRUE; + + rl_done = 1; + + return 0; +} + +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_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); + } 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, bool use_completion) +{ + char *ret; + + abook_rl_init(use_completion); + + 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; +} +