diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2005-07-16 11:14:47 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2005-07-16 11:14:47 +0000 |
commit | a68a1f81928d4a252b4fd8ed5a3b35fc198b68f8 (patch) | |
tree | 8b5d2fafe218633bf2b9b49ceab00d89ce857a0c /src | |
parent | 930c40eae14219e0f8f39967aa079889d2fb623f (diff) | |
download | weechat-a68a1f81928d4a252b4fd8ed5a3b35fc198b68f8.zip |
Added alt-k key to grab a key and insert result into input buffer
Diffstat (limited to 'src')
-rw-r--r-- | src/common/completion.c | 3 | ||||
-rw-r--r-- | src/common/fifo.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-input.c | 43 | ||||
-rw-r--r-- | src/gui/gui-common.c | 450 | ||||
-rw-r--r-- | src/gui/gui-keyboard.c | 35 | ||||
-rw-r--r-- | src/gui/gui.h | 12 |
6 files changed, 333 insertions, 212 deletions
diff --git a/src/common/completion.c b/src/common/completion.c index 6bb452d20..a27605f6f 100644 --- a/src/common/completion.c +++ b/src/common/completion.c @@ -206,9 +206,6 @@ completion_build_list (t_completion *completion, void *channel) { weelist_add (&completion->completion_list, &completion->last_completion, - "bind"); - weelist_add (&completion->completion_list, - &completion->last_completion, "unbind"); weelist_add (&completion->completion_list, &completion->last_completion, diff --git a/src/common/fifo.c b/src/common/fifo.c index ec9ff701e..440f52536 100644 --- a/src/common/fifo.c +++ b/src/common/fifo.c @@ -112,7 +112,7 @@ fifo_exec (char *text) if (text[0] == '*') { pos_msg = text + 1; - ptr_buffer = (gui_current_window->buffer->dcc) ? gui_buffers : gui_current_window->buffer; + ptr_buffer = (gui_current_window->buffer->has_input) ? gui_current_window->buffer : gui_buffers; ptr_server = SERVER(ptr_buffer); } else diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index 965ad71b4..7f4d932cd 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -92,9 +92,10 @@ gui_input_default_key_bindings () gui_key_bind ( /* ^right */ "meta-Oc", "next_word"); gui_key_bind ( /* m-h */ "meta-h", "hotlist_clear"); gui_key_bind ( /* m-j,m-d */ "meta-jmeta-d", "jump_dcc"); - gui_key_bind ( /* m-r */ "meta-r", "delete_line"); gui_key_bind ( /* m-j,m-s */ "meta-jmeta-s", "jump_server"); gui_key_bind ( /* m-j,m-x */ "meta-jmeta-x", "jump_next_server"); + gui_key_bind ( /* m-k */ "meta-k", "grab_key"); + gui_key_bind ( /* m-r */ "meta-r", "delete_line"); /* keys binded with commands */ gui_key_bind ( /* m-left */ "meta-meta2-D", "/buffer -1"); @@ -124,6 +125,35 @@ gui_input_default_key_bindings () } /* + * gui_input_grab_end: insert grabbed key in input buffer + */ + +void +gui_input_grab_end () +{ + char *expanded_key; + + /* get expanded name (for example: ^U => ctrl-u) */ + expanded_key = gui_key_get_expanded_name (gui_key_buffer); + + if (expanded_key) + { + if (gui_current_window->buffer->has_input) + { + gui_input_insert_string (expanded_key, -1); + gui_current_window->buffer->input_buffer_pos += strlen (expanded_key); + gui_draw_buffer_input (gui_current_window->buffer, 1); + } + free (expanded_key); + } + + /* end grab mode */ + gui_key_grab = 0; + gui_key_grab_count = 0; + gui_key_buffer[0] = '\0'; +} + +/* * gui_input_read: read keyboard chars */ @@ -138,10 +168,17 @@ gui_input_read () to read also socket & co */ while (i < 8) { + if (gui_key_grab && (gui_key_grab_count > 10)) + gui_input_grab_end (); + key = getch (); if (key == ERR) + { + if (gui_key_grab && (gui_key_grab_count > 0)) + gui_input_grab_end (); break; + } if (key == KEY_RESIZE) { @@ -176,11 +213,11 @@ gui_input_read () } } - if (strcmp (key_str, "^") == 0) + /*if (strcmp (key_str, "^") == 0) { key_str[1] = '^'; key_str[2] = '\0'; - } + }*/ /*gui_printf (gui_current_window->buffer, "gui_input_read: key = %s (%d)\n", key_str, key);*/ diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index 0d28ae824..78d898608 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -201,9 +201,15 @@ gui_buffer_new (t_gui_window *window, void *server, void *channel, int dcc, log_start (new_buffer); /* init input buffer */ - new_buffer->input_buffer_alloc = INPUT_BUFFER_BLOCK_SIZE; - new_buffer->input_buffer = (char *) malloc (INPUT_BUFFER_BLOCK_SIZE); - new_buffer->input_buffer[0] = '\0'; + new_buffer->has_input = (new_buffer->dcc) ? 0 : 1; + if (new_buffer->has_input) + { + new_buffer->input_buffer_alloc = INPUT_BUFFER_BLOCK_SIZE; + new_buffer->input_buffer = (char *) malloc (INPUT_BUFFER_BLOCK_SIZE); + new_buffer->input_buffer[0] = '\0'; + } + else + new_buffer->input_buffer = NULL; new_buffer->input_buffer_size = 0; new_buffer->input_buffer_pos = 0; new_buffer->input_buffer_1st_display = 0; @@ -565,40 +571,88 @@ gui_input_optimize_buffer_size (t_gui_buffer *buffer) { int optimal_size; - optimal_size = ((buffer->input_buffer_size / INPUT_BUFFER_BLOCK_SIZE) * - INPUT_BUFFER_BLOCK_SIZE) + INPUT_BUFFER_BLOCK_SIZE; - if (buffer->input_buffer_alloc != optimal_size) + if (buffer->has_input) { - buffer->input_buffer_alloc = optimal_size; - buffer->input_buffer = realloc (buffer->input_buffer, optimal_size); + optimal_size = ((buffer->input_buffer_size / INPUT_BUFFER_BLOCK_SIZE) * + INPUT_BUFFER_BLOCK_SIZE) + INPUT_BUFFER_BLOCK_SIZE; + if (buffer->input_buffer_alloc != optimal_size) + { + buffer->input_buffer_alloc = optimal_size; + buffer->input_buffer = realloc (buffer->input_buffer, optimal_size); + } } } /* - * gui_input_insert_string: insert a string into the input buffer + * gui_input_clipboard_copy: copy string into clipboard */ void -gui_input_insert_string (char *string, int pos) +gui_input_clipboard_copy (char *buffer, int size) { - int i, start, end, length; + if (size <= 0) + return; - length = strlen (string); + if (gui_input_clipboard != NULL) + free(gui_input_clipboard); - /* increase buffer size */ - gui_current_window->buffer->input_buffer_size += length; - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard)); - /* move end of string to the right */ - start = pos + length; - end = gui_current_window->buffer->input_buffer_size - 1; - for (i = end; i >= start; i--) - gui_current_window->buffer->input_buffer[i] = - gui_current_window->buffer->input_buffer[i - length]; + if (gui_input_clipboard) + { + memcpy(gui_input_clipboard, buffer, size); + gui_input_clipboard[size] = '\0'; + } +} + +/* + * gui_input_clipboard_paste: paste clipboard at cursor pos in input line + */ + +void +gui_input_clipboard_paste () +{ + if (gui_current_window->buffer->has_input && gui_input_clipboard) + { + gui_input_insert_string (gui_input_clipboard, gui_current_window->buffer->input_buffer_pos); + gui_current_window->buffer->input_buffer_pos += strlen (gui_input_clipboard); + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_current_window->buffer->completion.position = -1; + } +} + +/* + * gui_input_insert_string: insert a string into the input buffer + * if pos == -1, string is inserted at cursor position + */ + +void +gui_input_insert_string (char *string, int pos) +{ + int i, start, end, length; - /* insert new string */ - strncpy (gui_current_window->buffer->input_buffer + pos, string, length); + if (gui_current_window->buffer->has_input) + { + if (pos == -1) + pos = gui_current_window->buffer->input_buffer_pos; + + length = strlen (string); + + /* increase buffer size */ + gui_current_window->buffer->input_buffer_size += length; + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + + /* move end of string to the right */ + start = pos + length; + end = gui_current_window->buffer->input_buffer_size - 1; + for (i = end; i >= start; i--) + gui_current_window->buffer->input_buffer[i] = + gui_current_window->buffer->input_buffer[i - length]; + + /* insert new string */ + strncpy (gui_current_window->buffer->input_buffer + pos, string, length); + } } /* @@ -683,7 +737,7 @@ gui_input_insert_char (int key) break; } } - else + else if (gui_current_window->buffer->has_input) { /*gui_printf (gui_current_window->buffer, "[Debug] key pressed = %d, hex = %02X, octal = %o\n", key, key, key);*/ @@ -707,7 +761,7 @@ gui_input_return () { t_gui_buffer *ptr_buffer; - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_size > 0) { @@ -740,7 +794,7 @@ gui_input_tab () { int i; - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { completion_search (&(gui_current_window->buffer->completion), CHANNEL(gui_current_window->buffer), @@ -837,7 +891,7 @@ gui_input_backspace () { int i; - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos > 0) { @@ -867,7 +921,7 @@ gui_input_delete () { int i; - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos < gui_current_window->buffer->input_buffer_size) @@ -897,46 +951,49 @@ gui_input_delete_previous_word () { int i, j, num_char_deleted, num_char_end; - if (gui_current_window->buffer->input_buffer_pos > 0) + if (gui_current_window->buffer->has_input) { - i = gui_current_window->buffer->input_buffer_pos - 1; - while ((i >= 0) && - (gui_current_window->buffer->input_buffer[i] == ' ')) - i--; - if (i >= 0) + if (gui_current_window->buffer->input_buffer_pos > 0) { + i = gui_current_window->buffer->input_buffer_pos - 1; while ((i >= 0) && - (gui_current_window->buffer->input_buffer[i] != ' ')) + (gui_current_window->buffer->input_buffer[i] == ' ')) i--; if (i >= 0) { while ((i >= 0) && - (gui_current_window->buffer->input_buffer[i] == ' ')) + (gui_current_window->buffer->input_buffer[i] != ' ')) i--; + if (i >= 0) + { + while ((i >= 0) && + (gui_current_window->buffer->input_buffer[i] == ' ')) + i--; + } } - } - - if (i >= 0) + + if (i >= 0) + i++; i++; - i++; - num_char_deleted = gui_current_window->buffer->input_buffer_pos - i; - num_char_end = gui_current_window->buffer->input_buffer_size - - gui_current_window->buffer->input_buffer_pos; - - gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + - gui_current_window->buffer->input_buffer_pos - num_char_deleted, - num_char_deleted); - - for (j = 0; j < num_char_end; j++) - gui_current_window->buffer->input_buffer[i + j] = - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos + j]; - - gui_current_window->buffer->input_buffer_size -= num_char_deleted; - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; - gui_current_window->buffer->input_buffer_pos = i; - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->completion.position = -1; + num_char_deleted = gui_current_window->buffer->input_buffer_pos - i; + num_char_end = gui_current_window->buffer->input_buffer_size - + gui_current_window->buffer->input_buffer_pos; + + gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + + gui_current_window->buffer->input_buffer_pos - num_char_deleted, + num_char_deleted); + + for (j = 0; j < num_char_end; j++) + gui_current_window->buffer->input_buffer[i + j] = + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos + j]; + + gui_current_window->buffer->input_buffer_size -= num_char_deleted; + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + gui_current_window->buffer->input_buffer_pos = i; + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->completion.position = -1; + } } } @@ -949,28 +1006,31 @@ gui_input_delete_next_word () { int i, j, num_char_deleted; - i = gui_current_window->buffer->input_buffer_pos; - while (i < gui_current_window->buffer->input_buffer_size) + if (gui_current_window->buffer->has_input) { - if ((gui_current_window->buffer->input_buffer[i] == ' ') - && i != gui_current_window->buffer->input_buffer_pos) - break; - i++; + i = gui_current_window->buffer->input_buffer_pos; + while (i < gui_current_window->buffer->input_buffer_size) + { + if ((gui_current_window->buffer->input_buffer[i] == ' ') + && i != gui_current_window->buffer->input_buffer_pos) + break; + i++; + } + num_char_deleted = i - gui_current_window->buffer->input_buffer_pos; + + gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + + gui_current_window->buffer->input_buffer_pos, num_char_deleted); + + for (j = i; j < gui_current_window->buffer->input_buffer_size; j++) + gui_current_window->buffer->input_buffer[j - num_char_deleted] = + gui_current_window->buffer->input_buffer[j]; + + gui_current_window->buffer->input_buffer_size -= num_char_deleted; + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->completion.position = -1; } - num_char_deleted = i - gui_current_window->buffer->input_buffer_pos; - - gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + - gui_current_window->buffer->input_buffer_pos, num_char_deleted); - - for (j = i; j < gui_current_window->buffer->input_buffer_size; j++) - gui_current_window->buffer->input_buffer[j - num_char_deleted] = - gui_current_window->buffer->input_buffer[j]; - - gui_current_window->buffer->input_buffer_size -= num_char_deleted; - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->completion.position = -1; } /* @@ -980,25 +1040,28 @@ gui_input_delete_next_word () void gui_input_delete_begin_of_line () { - if (gui_current_window->buffer->input_buffer_pos > 0) + int i; + + if (gui_current_window->buffer->has_input) { - int i; - - gui_input_clipboard_copy(gui_current_window->buffer->input_buffer, - gui_current_window->buffer->input_buffer_pos); - - for (i = gui_current_window->buffer->input_buffer_pos; - i < gui_current_window->buffer->input_buffer_size; i++) - gui_current_window->buffer->input_buffer[i - gui_current_window->buffer->input_buffer_pos] = - gui_current_window->buffer->input_buffer[i]; - - gui_current_window->buffer->input_buffer_size -= - gui_current_window->buffer->input_buffer_pos; - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; - gui_current_window->buffer->input_buffer_pos = 0; - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->completion.position = -1; + if (gui_current_window->buffer->input_buffer_pos > 0) + { + gui_input_clipboard_copy (gui_current_window->buffer->input_buffer, + gui_current_window->buffer->input_buffer_pos); + + for (i = gui_current_window->buffer->input_buffer_pos; + i < gui_current_window->buffer->input_buffer_size; i++) + gui_current_window->buffer->input_buffer[i - gui_current_window->buffer->input_buffer_pos] = + gui_current_window->buffer->input_buffer[i]; + + gui_current_window->buffer->input_buffer_size -= + gui_current_window->buffer->input_buffer_pos; + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + gui_current_window->buffer->input_buffer_pos = 0; + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->completion.position = -1; + } } } @@ -1009,16 +1072,19 @@ gui_input_delete_begin_of_line () void gui_input_delete_end_of_line () { - gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + - gui_current_window->buffer->input_buffer_pos, - gui_current_window->buffer->input_buffer_size - - gui_current_window->buffer->input_buffer_pos); - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] = ' '; - gui_current_window->buffer->input_buffer_size = gui_current_window->buffer->input_buffer_pos ; - gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->completion.position = -1; + if (gui_current_window->buffer->has_input) + { + gui_input_clipboard_copy(gui_current_window->buffer->input_buffer + + gui_current_window->buffer->input_buffer_pos, + gui_current_window->buffer->input_buffer_size - + gui_current_window->buffer->input_buffer_pos); + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_pos] = ' '; + gui_current_window->buffer->input_buffer_size = gui_current_window->buffer->input_buffer_pos ; + gui_current_window->buffer->input_buffer[gui_current_window->buffer->input_buffer_size] = '\0'; + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->completion.position = -1; + } } /* @@ -1028,12 +1094,15 @@ gui_input_delete_end_of_line () void gui_input_delete_line () { - gui_current_window->buffer->input_buffer[0] = '\0'; - gui_current_window->buffer->input_buffer_size = 0; - gui_current_window->buffer->input_buffer_pos = 0; - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_input_optimize_buffer_size (gui_current_window->buffer); - gui_current_window->buffer->completion.position = -1; + if (gui_current_window->buffer->has_input) + { + gui_current_window->buffer->input_buffer[0] = '\0'; + gui_current_window->buffer->input_buffer_size = 0; + gui_current_window->buffer->input_buffer_pos = 0; + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_input_optimize_buffer_size (gui_current_window->buffer); + gui_current_window->buffer->completion.position = -1; + } } /* @@ -1046,59 +1115,24 @@ gui_input_transpose_chars () char buf; int curpos; - if (gui_current_window->buffer->input_buffer_pos > 0) - { - curpos = gui_current_window->buffer->input_buffer_pos; - if (curpos == gui_current_window->buffer->input_buffer_size) - curpos--; - else - gui_current_window->buffer->input_buffer_pos++; - - buf = gui_current_window->buffer->input_buffer[curpos]; - gui_current_window->buffer->input_buffer[curpos] = - gui_current_window->buffer->input_buffer[curpos-1]; - gui_current_window->buffer->input_buffer[curpos-1] = buf; - - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_current_window->buffer->completion.position = -1; - } -} - -/* - * gui_input_clipboard_paste: paste clipboard at cursor pos in input line - */ - -void -gui_input_clipboard_paste () -{ - if (gui_input_clipboard) - { - gui_input_insert_string(gui_input_clipboard, gui_current_window->buffer->input_buffer_pos); - gui_current_window->buffer->input_buffer_pos += strlen(gui_input_clipboard); - gui_draw_buffer_input (gui_current_window->buffer, 0); - gui_current_window->buffer->completion.position = -1; - } -} - -/* - * gui_input_clipboard_copy: copy string into clipboard - */ - -void -gui_input_clipboard_copy (char *buffer, int size) -{ - if (size <= 0) - return; - - if (gui_input_clipboard != NULL) - free(gui_input_clipboard); - - gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard)); - - if (gui_input_clipboard) + if (gui_current_window->buffer->has_input) { - memcpy(gui_input_clipboard, buffer, size); - gui_input_clipboard[size] = '\0'; + if (gui_current_window->buffer->input_buffer_pos > 0) + { + curpos = gui_current_window->buffer->input_buffer_pos; + if (curpos == gui_current_window->buffer->input_buffer_size) + curpos--; + else + gui_current_window->buffer->input_buffer_pos++; + + buf = gui_current_window->buffer->input_buffer[curpos]; + gui_current_window->buffer->input_buffer[curpos] = + gui_current_window->buffer->input_buffer[curpos-1]; + gui_current_window->buffer->input_buffer[curpos-1] = buf; + + gui_draw_buffer_input (gui_current_window->buffer, 0); + gui_current_window->buffer->completion.position = -1; + } } } @@ -1109,7 +1143,7 @@ gui_input_clipboard_copy (char *buffer, int size) void gui_input_home () { - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos > 0) { @@ -1126,7 +1160,7 @@ gui_input_home () void gui_input_end () { - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos < gui_current_window->buffer->input_buffer_size) @@ -1145,7 +1179,7 @@ gui_input_end () void gui_input_left () { - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos > 0) { @@ -1164,22 +1198,25 @@ gui_input_previous_word () { int i; - if (gui_current_window->buffer->input_buffer_pos > 0) + if (gui_current_window->buffer->has_input) { - i = gui_current_window->buffer->input_buffer_pos - 1; - while ((i >= 0) && - (gui_current_window->buffer->input_buffer[i] == ' ')) - i--; - if (i < 0) - gui_current_window->buffer->input_buffer_pos = 0; - else + if (gui_current_window->buffer->input_buffer_pos > 0) { + i = gui_current_window->buffer->input_buffer_pos - 1; while ((i >= 0) && - (gui_current_window->buffer->input_buffer[i] != ' ')) + (gui_current_window->buffer->input_buffer[i] == ' ')) i--; - gui_current_window->buffer->input_buffer_pos = i + 1; + if (i < 0) + gui_current_window->buffer->input_buffer_pos = 0; + else + { + while ((i >= 0) && + (gui_current_window->buffer->input_buffer[i] != ' ')) + i--; + gui_current_window->buffer->input_buffer_pos = i + 1; + } + gui_draw_buffer_input (gui_current_window->buffer, 0); } - gui_draw_buffer_input (gui_current_window->buffer, 0); } } @@ -1190,7 +1227,7 @@ gui_input_previous_word () void gui_input_right () { - if (!gui_current_window->buffer->dcc) + if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->input_buffer_pos < gui_current_window->buffer->input_buffer_size) @@ -1210,28 +1247,31 @@ gui_input_next_word () { int i; - if (gui_current_window->buffer->input_buffer_pos < - gui_current_window->buffer->input_buffer_size + 1) + if (gui_current_window->buffer->has_input) { - i = gui_current_window->buffer->input_buffer_pos; - while ((i <= gui_current_window->buffer->input_buffer_size) && - (gui_current_window->buffer->input_buffer[i] == ' ')) - i++; - if (i > gui_current_window->buffer->input_buffer_size) - gui_current_window->buffer->input_buffer_pos = i - 1; - else + if (gui_current_window->buffer->input_buffer_pos < + gui_current_window->buffer->input_buffer_size + 1) { + i = gui_current_window->buffer->input_buffer_pos; while ((i <= gui_current_window->buffer->input_buffer_size) && - (gui_current_window->buffer->input_buffer[i] != ' ')) + (gui_current_window->buffer->input_buffer[i] == ' ')) i++; if (i > gui_current_window->buffer->input_buffer_size) - gui_current_window->buffer->input_buffer_pos = - gui_current_window->buffer->input_buffer_size; + gui_current_window->buffer->input_buffer_pos = i - 1; else - gui_current_window->buffer->input_buffer_pos = i; - + { + while ((i <= gui_current_window->buffer->input_buffer_size) && + (gui_current_window->buffer->input_buffer[i] != ' ')) + i++; + if (i > gui_current_window->buffer->input_buffer_size) + gui_current_window->buffer->input_buffer_pos = + gui_current_window->buffer->input_buffer_size; + else + gui_current_window->buffer->input_buffer_pos = i; + + } + gui_draw_buffer_input (gui_current_window->buffer, 0); } - gui_draw_buffer_input (gui_current_window->buffer, 0); } } @@ -1260,7 +1300,7 @@ gui_input_up () } } } - else + else if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->ptr_history) { @@ -1323,7 +1363,7 @@ gui_input_down () } } } - else + else if (gui_current_window->buffer->has_input) { if (gui_current_window->buffer->ptr_history) { @@ -1400,7 +1440,7 @@ gui_input_jump_dcc () void gui_input_jump_server () { - if (!gui_current_window->buffer->dcc) + if (SERVER(gui_current_window->buffer)) { if (SERVER(gui_current_window->buffer)->buffer != gui_current_window->buffer) @@ -1422,7 +1462,7 @@ gui_input_jump_next_server () t_irc_server *ptr_server; t_gui_buffer *ptr_buffer; - if (!gui_current_window->buffer->dcc) + if (SERVER(gui_current_window->buffer)) { ptr_server = SERVER(gui_current_window->buffer)->next_server; if (!ptr_server) @@ -1471,6 +1511,17 @@ gui_input_infobar_clear () } /* + * gui_input_grab_key: init "grab key mode" (next key will be inserted into input buffer) + */ + +void +gui_input_grab_key () +{ + if (gui_current_window->buffer->has_input) + gui_key_init_grab (); +} + +/* * gui_switch_to_previous_buffer: switch to previous buffer */ @@ -1740,6 +1791,7 @@ gui_buffer_print_log (t_gui_buffer *buffer) wee_log_printf (" notify_level . . . . : %d\n", buffer->notify_level); wee_log_printf (" log_filename . . . . : '%s'\n", buffer->log_filename); wee_log_printf (" log_file . . . . . . : 0x%X\n", buffer->log_file); + wee_log_printf (" has_input. . . . . . : %d\n", buffer->has_input); wee_log_printf (" input_buffer . . . . : '%s'\n", buffer->input_buffer); wee_log_printf (" input_buffer_alloc . : %d\n", buffer->input_buffer_alloc); wee_log_printf (" input_buffer_size. . : %d\n", buffer->input_buffer_size); diff --git a/src/gui/gui-keyboard.c b/src/gui/gui-keyboard.c index ed3e6fc4f..b6cd3bac7 100644 --- a/src/gui/gui-keyboard.c +++ b/src/gui/gui-keyboard.c @@ -37,6 +37,8 @@ t_gui_key *gui_keys = NULL; t_gui_key *last_gui_key = NULL; char gui_key_buffer[128]; +int gui_key_grab = 0; +int gui_key_grab_count = 0; t_gui_key_function gui_key_functions[] = { { "return", gui_input_return, @@ -57,9 +59,9 @@ t_gui_key_function gui_key_functions[] = N_("delete previous word") }, { "delete_next_word", gui_input_delete_next_word, N_("delete next word") }, - { "clipboard_paste", gui_input_clipboard_paste, + { "clipboard_paste", gui_input_clipboard_paste, N_("paste current clipboard content") }, - { "transpose_chars", gui_input_transpose_chars, + { "transpose_chars", gui_input_transpose_chars, N_("transpose chars") }, { "home", gui_input_home, N_("go to beginning of line") }, @@ -103,6 +105,8 @@ t_gui_key_function gui_key_functions[] = N_("jump to next server") }, { "hotlist_clear", gui_input_hotlist_clear, N_("clear hotlist") }, + { "grab_key", gui_input_grab_key, + N_("grab a key") }, { NULL, NULL, NULL } }; @@ -115,11 +119,24 @@ void gui_key_init () { gui_key_buffer[0] = '\0'; + gui_key_grab = 0; + gui_key_grab_count = 0; gui_input_default_key_bindings (); } /* + * gui_key_init_show: init "show mode" + */ + +void +gui_key_init_grab () +{ + gui_key_grab = 1; + gui_key_grab_count = 0; +} + +/* * gui_key_get_internal_code: get internal code from user key name * for example: return "^R" for "ctrl-R" */ @@ -187,7 +204,7 @@ gui_key_get_expanded_name (char *key) strcat (result, "meta-"); key += 2; } - else if (key[0] == '^') + else if ((key[0] == '^') && (key[1])) { strcat (result, "ctrl-"); key++; @@ -466,8 +483,18 @@ gui_key_pressed (char *key_str) int first_key; t_gui_key *ptr_key; + /* add key to buffer */ first_key = (gui_key_buffer[0] == '\0'); strcat (gui_key_buffer, key_str); + + /* if we are in "show mode", increase counter and return */ + if (gui_key_grab) + { + gui_key_grab_count++; + return 0; + } + + /* look for key combo in key table */ ptr_key = gui_key_search_part (gui_key_buffer); if (ptr_key) { @@ -482,8 +509,6 @@ gui_key_pressed (char *key_str) else (void)(ptr_key->function)(); } - //else - // gui_printf (gui_current_window->buffer, "partial key found\n"); return 0; } diff --git a/src/gui/gui.h b/src/gui/gui.h index 5050979f6..953522e66 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -104,6 +104,9 @@ #define NOTIFY_LEVEL_MAX 3 #define NOTIFY_LEVEL_DEFAULT NOTIFY_LEVEL_MAX +#define KEY_SHOW_MODE_DISPLAY 1 +#define KEY_SHOW_MODE_BIND 2 + typedef struct t_gui_message t_gui_message; struct t_gui_message @@ -180,6 +183,7 @@ struct t_gui_buffer FILE *log_file; /* for logging buffer to file */ /* inupt buffer */ + int has_input; /* = 1 if buffer has input (DCC has not)*/ char *input_buffer; /* input buffer */ int input_buffer_alloc; /* input buffer: allocated size in mem */ int input_buffer_size; /* buffer size (user input length) */ @@ -292,6 +296,9 @@ extern t_gui_infobar *gui_infobar; extern t_gui_key *gui_keys; extern t_gui_key *last_gui_key; extern t_gui_key_function gui_key_functions[]; +extern char gui_key_buffer[128]; +extern int gui_key_grab; +extern int gui_key_grab_count; extern char *gui_input_clipboard; /* GUI independent functions: windows & buffers */ @@ -306,8 +313,9 @@ extern void gui_infobar_remove (); extern void gui_buffer_free (t_gui_buffer *, int); extern t_gui_line *gui_new_line (t_gui_buffer *); extern t_gui_message *gui_new_message (t_gui_buffer *); -extern void gui_input_clipboard_paste (); extern void gui_input_clipboard_copy (char *, int); +extern void gui_input_clipboard_paste (); +extern void gui_input_insert_string (char *, int); extern void gui_input_insert_char (); extern void gui_input_return (); extern void gui_input_tab (); @@ -333,6 +341,7 @@ extern void gui_input_jump_server (); extern void gui_input_jump_next_server (); extern void gui_input_hotlist_clear (); extern void gui_input_infobar_clear (); +extern void gui_input_grab_key (); extern void gui_switch_to_previous_buffer (); extern void gui_switch_to_next_buffer (); extern void gui_switch_to_previous_window (); @@ -345,6 +354,7 @@ extern void gui_buffer_print_log (t_gui_buffer *); /* GUI independent functions: keys */ extern void gui_key_init (); +extern void gui_key_init_grab (); extern char *gui_key_get_internal_code (char *); extern char *gui_key_get_expanded_name (char *); extern void *gui_key_function_search_by_name (char *); |