summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Bouthenot <kolter@openics.org>2005-07-12 10:06:10 +0000
committerEmmanuel Bouthenot <kolter@openics.org>2005-07-12 10:06:10 +0000
commit505b43d15b2828a2eb40ed358753f444411e9985 (patch)
treeaf481c152f2f5d48c7e458f8d46f32e8565100aa
parent07a820ced621563370f027081c4d2ccade7cd77f (diff)
downloadweechat-505b43d15b2828a2eb40ed358753f444411e9985.zip
add some gui_input features : clipboard and a 'translate_chars' function
-rw-r--r--src/gui/curses/gui-display.c7
-rw-r--r--src/gui/curses/gui-input.c2
-rw-r--r--src/gui/gui-common.c79
-rw-r--r--src/gui/gui-keyboard.c4
-rw-r--r--src/gui/gui.h4
-rw-r--r--weechat/src/gui/curses/gui-display.c7
-rw-r--r--weechat/src/gui/curses/gui-input.c2
-rw-r--r--weechat/src/gui/gui-common.c79
-rw-r--r--weechat/src/gui/gui-keyboard.c4
-rw-r--r--weechat/src/gui/gui.h4
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 ();