about summary refs log tree commit diff stats
path: root/src/ui
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-01-27 22:13:09 +0000
committerJames Booth <boothj5@gmail.com>2015-01-27 22:13:09 +0000
commit2cdbfc7eb7d90ed286c6c5f432990166cdec0b93 (patch)
tree678c2bcd6edae1c335e428103bb2af9b7471b8a2 /src/ui
parent25d31101bfb365c8224ef09f84a92794a89e975f (diff)
downloadprofani-tty-2cdbfc7eb7d90ed286c6c5f432990166cdec0b93.tar.gz
Added gnu readline
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/core.c6
-rw-r--r--src/ui/inputwin.c80
-rw-r--r--src/ui/inputwin.h1
-rw-r--r--src/ui/keyhandlers.c55
-rw-r--r--src/ui/keyhandlers.h5
-rw-r--r--src/ui/ui.h1
6 files changed, 102 insertions, 46 deletions
diff --git a/src/ui/core.c b/src/ui/core.c
index e295a3ad..efebdb5e 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -177,6 +177,12 @@ ui_close(void)
     endwin();
 }
 
+void
+ui_write(char *line, int offset)
+{
+    inp_write(line, offset);
+}
+
 char*
 ui_readline(void)
 {
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index 7b5c33d0..64c65a96 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -131,6 +131,43 @@ inp_win_resize(void)
     _inp_win_update_virtual();
 }
 
+static int
+offset_to_col(char *str, int offset)
+{
+    int i = 0;
+    int col = 0;
+    mbstate_t internal;
+
+    while (i != offset && str[i] != '\n') {
+        gunichar uni = g_utf8_get_char(&str[i]);
+        size_t ch_len = mbrlen(&str[i], 4, &internal);
+        i += ch_len;
+        col++;
+        if (g_unichar_iswide(uni)) {
+            col++;
+        }
+    }
+
+    return col;
+}
+
+void
+inp_write(char *line, int offset)
+{
+    int col = offset_to_col(line, offset);
+
+    cons_debug("LEN BYTES: %d", strlen(line));
+    cons_debug("LEN UTF8 : %d", g_utf8_strlen(line, -1));
+    cons_debug("OFFSET   : %d", offset);
+    cons_debug("COL      : %d", col);
+    cons_debug("");
+
+    werase(inp_win);
+    waddstr(inp_win, line);
+    wmove(inp_win, 0, col);
+    _inp_win_update_virtual();
+}
+
 void
 inp_non_block(gint timeout)
 {
@@ -174,8 +211,8 @@ inp_read(int *key_type, wint_t *ch)
             }
 
             int col = getcurx(inp_win);
-            int wcols = getmaxx(stdscr);
-            key_printable(line, &line_utf8_pos, &col, &pad_start, *ch, wcols);
+            int maxx = getmaxx(stdscr);
+            key_printable(line, &line_utf8_pos, &col, &pad_start, *ch, maxx);
 
             werase(inp_win);
             waddstr(inp_win, line);
@@ -265,44 +302,9 @@ _handle_edit(int key_type, const wint_t ch)
         return 1;
 
     // CTRL-RIGHT
-    } else if (line_utf8_pos < utf8_len && _is_ctrl_right(key_type, ch)) {
-        gchar *curr_ch = g_utf8_offset_to_pointer(line, line_utf8_pos);
-        gunichar curr_uni = g_utf8_get_char(curr_ch);
-
-        // find next word if in whitespace
-        while (g_unichar_isspace(curr_uni)) {
-            col++;
-            line_utf8_pos++;
-            curr_ch = g_utf8_find_next_char(curr_ch, NULL);
-            if (!curr_ch) {
-                break;
-            }
-            curr_uni = g_utf8_get_char(curr_ch);
-        }
-
-        if (curr_ch) {
-            while (!g_unichar_isspace(curr_uni)) {
-                line_utf8_pos++;
-                col++;
-                if (g_unichar_iswide(curr_uni)) {
-                    col++;
-                }
-                curr_ch = g_utf8_find_next_char(curr_ch, NULL);
-                if (!curr_ch || line_utf8_pos >= utf8_len) {
-                    break;
-                }
-                curr_uni = g_utf8_get_char(curr_ch);
-            }
-        }
-
+    } else if (_is_ctrl_right(key_type, ch)) {
+        key_ctrl_right(line, &line_utf8_pos, &col, &pad_start, wcols);
         wmove(inp_win, 0, col);
-
-        // if gone off screen to right, jump right (half a screen worth)
-        if (col > pad_start + wcols) {
-            pad_start = pad_start + (wcols / 2);
-            _inp_win_update_virtual();
-        }
-
         return 1;
 
     // ALT-LEFT
diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h
index a4de16f0..d27bfef7 100644
--- a/src/ui/inputwin.h
+++ b/src/ui/inputwin.h
@@ -48,5 +48,6 @@ void inp_non_block(gint);
 void inp_block(void);
 void inp_get_password(char *passwd);
 void inp_history_append(char *inp);
+void inp_write(char *line, int offset);
 
 #endif
diff --git a/src/ui/keyhandlers.c b/src/ui/keyhandlers.c
index d7c3c616..0836737b 100644
--- a/src/ui/keyhandlers.c
+++ b/src/ui/keyhandlers.c
@@ -42,7 +42,7 @@
 #include "common.h"
 
 void
-key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int wcols)
+key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int maxx)
 {
     int utf8_len = g_utf8_strlen(line, -1);
 
@@ -65,7 +65,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
         free(new_line);
 
         gunichar uni = g_utf8_get_char(bytes);
-        if (*col == (*pad_start + wcols)) {
+        if (*col == (*pad_start + maxx)) {
             (*pad_start)++;
             if (g_unichar_iswide(uni)) {
                 (*pad_start)++;
@@ -101,7 +101,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
                 (*col)++;
             }
 
-            if (*col - *pad_start > wcols-1) {
+            if (*col - *pad_start > maxx-1) {
                 (*pad_start)++;
                 if (g_unichar_iswide(uni)) {
                     (*pad_start)++;
@@ -112,7 +112,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
 }
 
 void
-key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols)
+key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx)
 {
     if (*line_utf8_pos == 0) {
         return;
@@ -120,6 +120,7 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co
 
     gchar *curr_ch = g_utf8_offset_to_pointer(line, *line_utf8_pos);
     gunichar curr_uni = g_utf8_get_char(curr_ch);
+
     (*line_utf8_pos)--;
     (*col)--;
     if (g_unichar_iswide(curr_uni)) {
@@ -145,7 +146,7 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co
                 prev_uni = g_utf8_get_char(prev_ch);
                 (*line_utf8_pos)--;
                 (*col)--;
-                if (g_unichar_iswide(prev_uni)) {
+                if (g_unichar_iswide(curr_uni)) {
                     (*col)--;
                 }
                 if (g_unichar_isspace(prev_uni)) {
@@ -169,3 +170,47 @@ key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const co
         *pad_start = *col;
     }
 }
+
+void
+key_ctrl_right(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx)
+{
+    int utf8_len = g_utf8_strlen(line, -1);
+    if (*line_utf8_pos >= utf8_len) {
+        return;
+    }
+
+    gchar *curr_ch = g_utf8_offset_to_pointer(line, *line_utf8_pos);
+    gunichar curr_uni = g_utf8_get_char(curr_ch);
+
+    // find next word if in whitespace
+    while (g_unichar_isspace(curr_uni)) {
+        (*col)++;
+        (*line_utf8_pos)++;
+        curr_ch = g_utf8_find_next_char(curr_ch, NULL);
+        if (!curr_ch) {
+            break;
+        }
+        curr_uni = g_utf8_get_char(curr_ch);
+    }
+
+    if (curr_ch) {
+        while (!g_unichar_isspace(curr_uni)) {
+            (*line_utf8_pos)++;
+            (*col)++;
+            if (g_unichar_iswide(curr_uni)) {
+                (*col)++;
+            }
+            curr_ch = g_utf8_find_next_char(curr_ch, NULL);
+            if (!curr_ch || *line_utf8_pos >= utf8_len) {
+                break;
+            }
+            curr_uni = g_utf8_get_char(curr_ch);
+        }
+    }
+
+    // if gone off screen to right, jump right (half a screen worth)
+//    if (col > pad_start + wcols) {
+//        pad_start = pad_start + (wcols / 2);
+//        _inp_win_update_virtual();
+//    }
+}
diff --git a/src/ui/keyhandlers.h b/src/ui/keyhandlers.h
index d8153356..62a2c0d6 100644
--- a/src/ui/keyhandlers.h
+++ b/src/ui/keyhandlers.h
@@ -37,8 +37,9 @@
 
 #include <wchar.h>
 
-void key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int wcols);
+void key_printable(char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const wint_t ch, const int maxx);
 
-void key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols);
+void key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx);
+void key_ctrl_right(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int maxx);
 
 #endif
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 99e73b4a..23315af9 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -230,6 +230,7 @@ void ui_statusbar_new(const int win);
 char * ui_readline(void);
 void ui_input_clear(void);
 void ui_input_nonblocking(gboolean);
+void ui_write(char *line, int offset);
 
 void ui_invalid_command_usage(const char * const usage, void (*setting_func)(void));