2 * $Id: abook_rl.c,v 1.11 2004/02/18 19:41:37 jheinonen Exp $
4 * by JH <jheinonen@users.sourceforge.net>
6 * Copyright (C) Jaakko Heinonen
11 #include <sys/types.h>
15 #define KEYPAD_HACK 1 /* enable keypad hack */
16 #define CBREAK_HACK 1 /* enable cbreak hack */
22 #if defined(HAVE_READLINE_READLINE_H)
23 # include <readline/readline.h>
24 #elif defined(HAVE_READLINE_H)
25 # include <readline.h>
28 #if defined(HAVE_READLINE_HISTORY_H)
29 # include <readline/history.h>
30 #elif defined(HAVE_HISTORY_H)
34 #ifdef HANDLE_MULTIBYTE
35 # include <mbswidth.h>
38 #define RL_READLINE_NAME "Abook"
40 static int rl_x, rl_y;
41 static WINDOW *rl_win;
43 static bool rl_cancelled;
52 #ifdef HANDLE_MULTIBYTE
56 return (int)mbsnwidth(rl_line_buffer, rl_point, 0);
63 #ifdef HANDLE_MULTIBYTE
64 int real_point = rline_calc_point() + rl_x;
66 int real_point = rl_point + rl_x;
69 if(real_point > (COLS - 1))
70 mvwaddnstr(rl_win, rl_y, rl_x,
71 rl_line_buffer + (1 + real_point - COLS),
74 mvwaddnstr(rl_win, rl_y, rl_x, rl_line_buffer, rl_end);
77 wmove(rl_win, rl_y, min(real_point, COLS - 1));
83 rline_compdisp(char **matches, int n, int max_len)
89 rl_cancel(int dummy1, int dummy2)
99 abook_rl_init(bool use_completion)
101 rl_readline_name = RL_READLINE_NAME;
103 #if RL_VERSION_MAJOR >= 4
104 rl_already_prompted = 1;
106 rl_catch_sigwinch = 0;
108 rl_redisplay_function = rline_update;
109 rl_completion_display_matches_hook = rline_compdisp;
111 rl_unbind_function_in_map(rl_clear_screen, rl_get_keymap());
112 rl_unbind_function_in_map(rl_reverse_search_history, rl_get_keymap());
113 rl_unbind_function_in_map(rl_re_read_init_file, rl_get_keymap());
116 rl_bind_key('\t', rl_menu_complete);
118 rl_unbind_function_in_map(rl_complete, rl_get_keymap());
119 rl_unbind_function_in_map(rl_menu_complete, rl_get_keymap());
122 rl_bind_key('g' & 31, rl_cancel); /* C-g */
126 rl_cancelled = FALSE;
130 abook_readline(WINDOW *w, int y, int x, char *s, int limit, bool use_completion)
134 abook_rl_init(use_completion);
136 wmove(rl_win = w, rl_y = y, rl_x = x);
148 ret = readline(NULL);
156 if(rl_cancelled && ret) {