about summary refs log tree commit diff stats
path: root/src/ui
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2013-03-03 02:23:16 +0000
committerJames Booth <boothj5@gmail.com>2013-03-03 02:23:16 +0000
commitdd32044bd57973a80561ddafeb2e788d07daa609 (patch)
tree777921c5205f06d1dd71ac5e1d00fc0c3cafef02 /src/ui
parent35f905e304a05af0e1660832086e73ebb68c4b99 (diff)
downloadprofani-tty-dd32044bd57973a80561ddafeb2e788d07daa609.tar.gz
Added alt-backspace support
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/inputwin.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index 42cb0619..47556476 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -516,6 +516,9 @@ _handle_edit(int result, const wint_t ch, char *input, int *size)
 static int
 _handle_alt_key(char *input, int *size, int key)
 {
+    int end_del = getcurx(inp_win);
+    int start_del = end_del;
+
     switch (key)
     {
         case '1':
@@ -549,7 +552,69 @@ _handle_alt_key(char *input, int *size, int key)
             ui_switch_win(9);
             break;
         case 127:
-            cons_debug("PRESSED ALT BACKSPACE");
+            input[*size] = '\0';
+            gchar *curr_ch = g_utf8_offset_to_pointer(input, end_del);
+            curr_ch = g_utf8_find_prev_char(input, curr_ch);
+            gchar *prev_ch;
+            gunichar curr_uni;
+            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(input, curr_ch);
+                } else {
+                    prev_ch = g_utf8_find_prev_char(input, curr_ch);
+                    if (prev_ch == NULL) {
+                        curr_ch = NULL;
+                        break;
+                    } else {
+                        prev_uni = g_utf8_get_char(prev_ch);
+                        if (g_unichar_isspace(prev_uni)) {
+                            break;
+                        } else {
+                            curr_ch = prev_ch;
+                        }
+                    }
+                }
+            }
+
+            if (curr_ch == NULL) {
+                start_del = 0;
+            } else {
+                start_del = g_utf8_pointer_to_offset(input, curr_ch);
+            }
+
+            gint len = g_utf8_strlen(input, -1);
+            gchar *start_string = g_utf8_substring(input, 0, start_del);
+            gchar *end_string = g_utf8_substring(input, end_del, len);
+
+            int i;
+            for (i = 0; i < strlen(start_string); i++) {
+                input[i] = start_string[i];
+            }
+            for (i = 0; i < strlen(end_string); i++) {
+                input[strlen(start_string)+i] = end_string[i];
+            }
+
+            *size = strlen(start_string)+i;
+            input[*size] = '\0';
+
+            _clear_input();
+            waddstr(inp_win, input);
+            wmove(inp_win, 0, start_del);
+
+            // if gone off screen to left, jump left (half a screen worth)
+            if (start_del <= pad_start) {
+                pad_start = pad_start - (cols / 2);
+                if (pad_start < 0) {
+                    pad_start = 0;
+                }
+
+                _inp_win_refresh();
+            }
+
             return 1;
             break;
         default: