]> git.deb.at Git - pkg/abook.git/blobdiff - abook_rl.c
wide character support
[pkg/abook.git] / abook_rl.c
index f5d05ca69662ced96589f565702da2d8a77191ed..f9ebba6529f32c7e4a3675e4aa4c75e0df1bec38 100644 (file)
@@ -12,6 +12,9 @@
 #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;
@@ -42,10 +49,42 @@ 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,
@@ -118,7 +157,19 @@ 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);