diff options
author | Emmanuel Bouthenot <kolter@openics.org> | 2005-07-12 10:06:10 +0000 |
---|---|---|
committer | Emmanuel Bouthenot <kolter@openics.org> | 2005-07-12 10:06:10 +0000 |
commit | 505b43d15b2828a2eb40ed358753f444411e9985 (patch) | |
tree | af481c152f2f5d48c7e458f8d46f32e8565100aa | |
parent | 07a820ced621563370f027081c4d2ccade7cd77f (diff) | |
download | weechat-505b43d15b2828a2eb40ed358753f444411e9985.zip |
add some gui_input features : clipboard and a 'translate_chars' function
-rw-r--r-- | src/gui/curses/gui-display.c | 7 | ||||
-rw-r--r-- | src/gui/curses/gui-input.c | 2 | ||||
-rw-r--r-- | src/gui/gui-common.c | 79 | ||||
-rw-r--r-- | src/gui/gui-keyboard.c | 4 | ||||
-rw-r--r-- | src/gui/gui.h | 4 | ||||
-rw-r--r-- | weechat/src/gui/curses/gui-display.c | 7 | ||||
-rw-r--r-- | weechat/src/gui/curses/gui-input.c | 2 | ||||
-rw-r--r-- | weechat/src/gui/gui-common.c | 79 | ||||
-rw-r--r-- | weechat/src/gui/gui-keyboard.c | 4 | ||||
-rw-r--r-- | weechat/src/gui/gui.h | 4 |
10 files changed, 192 insertions, 0 deletions
diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index 6bfef6c0c..ed553b682 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -2421,6 +2421,9 @@ gui_init () refresh (); + /* init clipboard buffer */ + gui_input_clipboard = NULL; + /* create new window/buffer */ if (gui_window_new (0, 0, COLS, LINES)) { @@ -2445,6 +2448,10 @@ gui_end () { t_gui_window *ptr_win; + /* free clipboard buffer */ + if (gui_input_clipboard) + free(gui_input_clipboard); + /* delete all windows */ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index 565850091..965ad71b4 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -62,6 +62,8 @@ gui_input_default_key_bindings () gui_key_bind ( /* ^K */ "ctrl-K", "delete_end_line"); gui_key_bind ( /* ^U */ "ctrl-U", "delete_beginning_line"); gui_key_bind ( /* ^W */ "ctrl-W", "delete_previous_word"); + gui_key_bind ( /* ^Y */ "ctrl-Y", "clipboard_paste"); + gui_key_bind ( /* ^T */ "ctrl-T", "transpose_chars"); gui_key_bind ( /* home */ "meta2-1~", "home"); gui_key_bind ( /* home */ "meta2-H", "home"); gui_key_bind ( /* home */ "meta2-7~", "home"); diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index f3fb838fe..4bebe6427 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -56,6 +56,7 @@ t_gui_buffer *last_gui_buffer = NULL; /* pointer to last buffer */ t_gui_buffer *buffer_before_dcc = NULL; /* buffer before dcc switch */ t_gui_infobar *gui_infobar; /* pointer to infobar content */ +char *gui_input_clipboard = NULL; /* buffer to store clipboard content */ /* * gui_window_new: create a new window @@ -921,6 +922,10 @@ gui_input_delete_previous_word () 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] = @@ -953,6 +958,9 @@ gui_input_delete_next_word () 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] = @@ -974,6 +982,9 @@ gui_input_delete_begin_of_line () { 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] = @@ -995,6 +1006,10 @@ 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-1); + 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'; @@ -1019,6 +1034,70 @@ gui_input_delete_line () } /* + * gui_input_transpose_chars: transpose chars (on lth left) at cursor pos + */ + +void +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 (gui_input_clipboard != NULL) + free(gui_input_clipboard); + + gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard)); + + if (gui_input_clipboard) + { + memcpy(gui_input_clipboard, buffer, size); + gui_input_clipboard[size] = '\0'; + } +} + +/* * gui_input_home: home key */ diff --git a/src/gui/gui-keyboard.c b/src/gui/gui-keyboard.c index 79bc44c79..ed3e6fc4f 100644 --- a/src/gui/gui-keyboard.c +++ b/src/gui/gui-keyboard.c @@ -57,6 +57,10 @@ 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, + N_("paste current clipboard content") }, + { "transpose_chars", gui_input_transpose_chars, + N_("transpose chars") }, { "home", gui_input_home, N_("go to beginning of line") }, { "end", gui_input_end, diff --git a/src/gui/gui.h b/src/gui/gui.h index f2f4219b1..235842672 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -291,6 +291,7 @@ 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_input_clipboard; /* GUI independent functions: windows & buffers */ @@ -304,6 +305,8 @@ 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_insert_char (); extern void gui_input_return (); extern void gui_input_tab (); @@ -314,6 +317,7 @@ extern void gui_input_delete_next_word (); extern void gui_input_delete_begin_of_line (); extern void gui_input_delete_end_of_line (); extern void gui_input_delete_line (); +extern void gui_input_transpose_chars (); extern void gui_input_home (); extern void gui_input_end (); extern void gui_input_left (); diff --git a/weechat/src/gui/curses/gui-display.c b/weechat/src/gui/curses/gui-display.c index 6bfef6c0c..ed553b682 100644 --- a/weechat/src/gui/curses/gui-display.c +++ b/weechat/src/gui/curses/gui-display.c @@ -2421,6 +2421,9 @@ gui_init () refresh (); + /* init clipboard buffer */ + gui_input_clipboard = NULL; + /* create new window/buffer */ if (gui_window_new (0, 0, COLS, LINES)) { @@ -2445,6 +2448,10 @@ gui_end () { t_gui_window *ptr_win; + /* free clipboard buffer */ + if (gui_input_clipboard) + free(gui_input_clipboard); + /* delete all windows */ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { diff --git a/weechat/src/gui/curses/gui-input.c b/weechat/src/gui/curses/gui-input.c index 565850091..965ad71b4 100644 --- a/weechat/src/gui/curses/gui-input.c +++ b/weechat/src/gui/curses/gui-input.c @@ -62,6 +62,8 @@ gui_input_default_key_bindings () gui_key_bind ( /* ^K */ "ctrl-K", "delete_end_line"); gui_key_bind ( /* ^U */ "ctrl-U", "delete_beginning_line"); gui_key_bind ( /* ^W */ "ctrl-W", "delete_previous_word"); + gui_key_bind ( /* ^Y */ "ctrl-Y", "clipboard_paste"); + gui_key_bind ( /* ^T */ "ctrl-T", "transpose_chars"); gui_key_bind ( /* home */ "meta2-1~", "home"); gui_key_bind ( /* home */ "meta2-H", "home"); gui_key_bind ( /* home */ "meta2-7~", "home"); diff --git a/weechat/src/gui/gui-common.c b/weechat/src/gui/gui-common.c index f3fb838fe..4bebe6427 100644 --- a/weechat/src/gui/gui-common.c +++ b/weechat/src/gui/gui-common.c @@ -56,6 +56,7 @@ t_gui_buffer *last_gui_buffer = NULL; /* pointer to last buffer */ t_gui_buffer *buffer_before_dcc = NULL; /* buffer before dcc switch */ t_gui_infobar *gui_infobar; /* pointer to infobar content */ +char *gui_input_clipboard = NULL; /* buffer to store clipboard content */ /* * gui_window_new: create a new window @@ -921,6 +922,10 @@ gui_input_delete_previous_word () 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] = @@ -953,6 +958,9 @@ gui_input_delete_next_word () 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] = @@ -974,6 +982,9 @@ gui_input_delete_begin_of_line () { 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] = @@ -995,6 +1006,10 @@ 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-1); + 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'; @@ -1019,6 +1034,70 @@ gui_input_delete_line () } /* + * gui_input_transpose_chars: transpose chars (on lth left) at cursor pos + */ + +void +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 (gui_input_clipboard != NULL) + free(gui_input_clipboard); + + gui_input_clipboard = (char *) malloc( (size + 1) * sizeof(*gui_input_clipboard)); + + if (gui_input_clipboard) + { + memcpy(gui_input_clipboard, buffer, size); + gui_input_clipboard[size] = '\0'; + } +} + +/* * gui_input_home: home key */ diff --git a/weechat/src/gui/gui-keyboard.c b/weechat/src/gui/gui-keyboard.c index 79bc44c79..ed3e6fc4f 100644 --- a/weechat/src/gui/gui-keyboard.c +++ b/weechat/src/gui/gui-keyboard.c @@ -57,6 +57,10 @@ 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, + N_("paste current clipboard content") }, + { "transpose_chars", gui_input_transpose_chars, + N_("transpose chars") }, { "home", gui_input_home, N_("go to beginning of line") }, { "end", gui_input_end, diff --git a/weechat/src/gui/gui.h b/weechat/src/gui/gui.h index f2f4219b1..235842672 100644 --- a/weechat/src/gui/gui.h +++ b/weechat/src/gui/gui.h @@ -291,6 +291,7 @@ 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_input_clipboard; /* GUI independent functions: windows & buffers */ @@ -304,6 +305,8 @@ 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_insert_char (); extern void gui_input_return (); extern void gui_input_tab (); @@ -314,6 +317,7 @@ extern void gui_input_delete_next_word (); extern void gui_input_delete_begin_of_line (); extern void gui_input_delete_end_of_line (); extern void gui_input_delete_line (); +extern void gui_input_transpose_chars (); extern void gui_input_home (); extern void gui_input_end (); extern void gui_input_left (); |