From dd32044bd57973a80561ddafeb2e788d07daa609 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 3 Mar 2013 02:23:16 +0000 Subject: Added alt-backspace support --- src/ui/inputwin.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) 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: -- cgit 1.4.1-2-gfad0