mirror of
https://github.com/weechat/weechat.git
synced 2026-07-01 07:16:37 +02:00
add some gui_input features : clipboard and a 'translate_chars' function
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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';
|
||||
@@ -1018,6 +1033,70 @@ gui_input_delete_line ()
|
||||
gui_current_window->buffer->completion.position = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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';
|
||||
@@ -1018,6 +1033,70 @@ gui_input_delete_line ()
|
||||
gui_current_window->buffer->completion.position = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
Reference in New Issue
Block a user