about summary refs log tree commit diff stats
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/inputwin.c68
-rw-r--r--src/ui/keyhandlers.c90
-rw-r--r--src/ui/keyhandlers.h2
3 files changed, 77 insertions, 83 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index 59292482..7b5c33d0 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -256,67 +256,12 @@ _handle_edit(int key_type, const wint_t ch)
 {
     int col = getcurx(inp_win);
     int utf8_len = g_utf8_strlen(line, -1);
+    int wcols = getmaxx(stdscr);
 
     // CTRL-LEFT
-    if (line_utf8_pos > 0 && _is_ctrl_left(key_type, ch)) {
-        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)) {
-            col--;
-        }
-
-        curr_ch = g_utf8_find_prev_char(line, curr_ch);
-
-        gchar *prev_ch;
-        gunichar prev_uni;
-        while (curr_ch != NULL) {
-            curr_uni = g_utf8_get_char(curr_ch);
-            if (g_unichar_isspace(curr_uni)) {
-                curr_ch = g_utf8_find_prev_char(line, curr_ch);
-                line_utf8_pos--;
-                col--;
-            } else {
-                prev_ch = g_utf8_find_prev_char(line, curr_ch);
-                if (prev_ch == NULL) {
-                    curr_ch = NULL;
-                    break;
-                } else {
-                    prev_uni = g_utf8_get_char(prev_ch);
-                    line_utf8_pos--;
-                    col--;
-                    if (g_unichar_iswide(prev_uni)) {
-                        col--;
-                    }
-                    if (g_unichar_isspace(prev_uni)) {
-                        break;
-                    } else {
-                        curr_ch = prev_ch;
-                    }
-                }
-            }
-        }
-
-        if (curr_ch == NULL) {
-            col = 0;
-            wmove(inp_win, 0, col);
-        } else {
-            col++;
-            line_utf8_pos++;
-            wmove(inp_win, 0, col);
-        }
-
-        // if gone off screen to left, jump left (half a screen worth)
-        int wcols = getmaxx(stdscr);
-        if (col <= pad_start) {
-            pad_start = pad_start - (wcols / 2);
-            if (pad_start < 0) {
-                pad_start = 0;
-            }
-
-            _inp_win_update_virtual();
-        }
+    if (_is_ctrl_left(key_type, ch)) {
+        key_ctrl_left(line, &line_utf8_pos, &col, &pad_start, wcols);
+        wmove(inp_win, 0, col);
         return 1;
 
     // CTRL-RIGHT
@@ -353,7 +298,6 @@ _handle_edit(int key_type, const wint_t ch)
         wmove(inp_win, 0, col);
 
         // if gone off screen to right, jump right (half a screen worth)
-        int wcols = getmaxx(stdscr);
         if (col > pad_start + wcols) {
             pad_start = pad_start + (wcols / 2);
             _inp_win_update_virtual();
@@ -464,7 +408,7 @@ _handle_edit(int key_type, const wint_t ch)
                 line_utf8_pos--;
 
                 // current position off screen to left
-                if (col - 1 < pad_start) {
+                if (col < pad_start) {
                     pad_start--;
                     _inp_win_update_virtual();
                 }
@@ -490,7 +434,7 @@ _handle_edit(int key_type, const wint_t ch)
 
                 // current position off screen to right
                 int wcols = getmaxx(stdscr);
-                if ((col + 1 - pad_start) >= wcols) {
+                if ((col - pad_start) >= wcols) {
                     pad_start++;
                     _inp_win_update_virtual();
                 }
diff --git a/src/ui/keyhandlers.c b/src/ui/keyhandlers.c
index 513997ef..d7c3c616 100644
--- a/src/ui/keyhandlers.c
+++ b/src/ui/keyhandlers.c
@@ -48,7 +48,6 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
 
     // handle insert if not at end of input
     if (*line_utf8_pos < utf8_len) {
-        // create new line
         char bytes[MB_CUR_MAX];
         size_t utf8_ch_len = wcrtomb(bytes, ch, NULL);
         bytes[utf8_ch_len] = '\0';
@@ -62,35 +61,29 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
         g_free(end);
         g_string_free(new_line_str, FALSE);
 
-        // replace old line
         strncpy(line, new_line, INP_WIN_MAX);
         free(new_line);
 
-        // set utf8 position
+        gunichar uni = g_utf8_get_char(bytes);
+        if (*col == (*pad_start + wcols)) {
+            (*pad_start)++;
+            if (g_unichar_iswide(uni)) {
+                (*pad_start)++;
+            }
+        }
+
         (*line_utf8_pos)++;
 
-        // set col position
         (*col)++;
-        gunichar uni = g_utf8_get_char(bytes);
         if (g_unichar_iswide(uni)) {
             (*col)++;
         }
 
-        // set pad_start
-        int display_len = utf8_display_len(line);
-        (*pad_start) = 0;
-        if (display_len > wcols-2) {
-            (*pad_start) = display_len - wcols + 1;
-        }
-
     // otherwise just append
     } else {
         char bytes[MB_CUR_MAX+1];
         size_t utf8_ch_len = wcrtomb(bytes, ch, NULL);
-
-        // wcrtomb can return (size_t) -1
         if (utf8_ch_len < MB_CUR_MAX) {
-            // update old line
             int i;
             int bytes_len = strlen(line);
 
@@ -99,10 +92,8 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
             }
             line[bytes_len] = '\0';
 
-            // set utf8 position
             (*line_utf8_pos)++;
 
-            // set col position
             (*col)++;
             bytes[utf8_ch_len] = '\0';
             gunichar uni = g_utf8_get_char(bytes);
@@ -110,9 +101,7 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
                 (*col)++;
             }
 
-            // set pad_start
-            // if gone over screen size follow input
-            if (*col - *pad_start > wcols-2) {
+            if (*col - *pad_start > wcols-1) {
                 (*pad_start)++;
                 if (g_unichar_iswide(uni)) {
                     (*pad_start)++;
@@ -120,4 +109,63 @@ key_printable(char * const line, int * const line_utf8_pos, int * const col, int
             }
         }
     }
-}
\ No newline at end of file
+}
+
+void
+key_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols)
+{
+    if (*line_utf8_pos == 0) {
+        return;
+    }
+
+    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)) {
+        (*col)--;
+    }
+
+    curr_ch = g_utf8_find_prev_char(line, curr_ch);
+
+    gchar *prev_ch;
+    gunichar prev_uni;
+    while (curr_ch != NULL) {
+        curr_uni = g_utf8_get_char(curr_ch);
+        if (g_unichar_isspace(curr_uni)) {
+            curr_ch = g_utf8_find_prev_char(line, curr_ch);
+            (*line_utf8_pos)--;
+            (*col)--;
+        } else {
+            prev_ch = g_utf8_find_prev_char(line, curr_ch);
+            if (prev_ch == NULL) {
+                curr_ch = NULL;
+                break;
+            } else {
+                prev_uni = g_utf8_get_char(prev_ch);
+                (*line_utf8_pos)--;
+                (*col)--;
+                if (g_unichar_iswide(prev_uni)) {
+                    (*col)--;
+                }
+                if (g_unichar_isspace(prev_uni)) {
+                    break;
+                } else {
+                    curr_ch = prev_ch;
+                }
+            }
+        }
+    }
+
+    if (curr_ch == NULL) {
+        (*col) = 0;
+        (*line_utf8_pos) = 0;
+    } else {
+        (*col)++;
+        (*line_utf8_pos)++;
+    }
+
+    if (*col < *pad_start) {
+        *pad_start = *col;
+    }
+}
diff --git a/src/ui/keyhandlers.h b/src/ui/keyhandlers.h
index cb1b14d8..d8153356 100644
--- a/src/ui/keyhandlers.h
+++ b/src/ui/keyhandlers.h
@@ -39,4 +39,6 @@
 
 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_ctrl_left(const char * const line, int * const line_utf8_pos, int * const col, int * const pad_start, const int wcols);
+
 #endif