#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
# include <history.h>
#endif
+#ifdef HANDLE_MULTIBYTE
+# include <wchar.h>
+#endif
+
#define RL_READLINE_NAME "Abook"
static int rl_x, rl_y;
static WINDOW *rl_win;
+static bool rl_cancelled;
+
static void
rl_refresh()
{
wrefresh(rl_win);
}
+#ifdef HANDLE_MULTIBYTE
+static int
+rline_calc_point()
+{
+ char *p;
+ int ret = 0;
+
+ mbtowc(NULL, NULL, 0);
+ for(p = rl_line_buffer;(p - rl_line_buffer) < rl_point;) {
+ int a, l;
+ wchar_t wc;
+
+ if((a = mbtowc(&wc, p, MB_CUR_MAX)) == 0)
+ break;
+ else if (a == -1)
+ return rl_point; /* fall back */
+ else
+ p += a;
+
+ l = wcwidth(wc);
+ if(l > 0)
+ ret += l;
+ }
+
+ return ret;
+}
+#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_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());
- 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;
}