summaryrefslogtreecommitdiff
path: root/src/gui/gui-action.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/gui-action.c')
-rw-r--r--src/gui/gui-action.c1075
1 files changed, 1075 insertions, 0 deletions
diff --git a/src/gui/gui-action.c b/src/gui/gui-action.c
new file mode 100644
index 000000000..69e4f3a7a
--- /dev/null
+++ b/src/gui/gui-action.c
@@ -0,0 +1,1075 @@
+/*
+ * Copyright (c) 2003-2005 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* gui-common.c: display functions, used by all GUI */
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <time.h>
+
+#include "../common/weechat.h"
+#include "gui.h"
+#include "../common/command.h"
+#include "../common/weeconfig.h"
+#include "../common/history.h"
+#include "../common/hotlist.h"
+#include "../common/log.h"
+#include "../common/utf8.h"
+#include "../irc/irc.h"
+
+
+/*
+ * gui_action_clipboard_copy: copy string into clipboard
+ */
+
+void
+gui_action_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)
+ {
+ memcpy (gui_input_clipboard, buffer, size);
+ gui_input_clipboard[size] = '\0';
+ }
+}
+
+/*
+ * gui_action_clipboard_paste: paste clipboard at cursor pos in input line
+ */
+
+void
+gui_action_clipboard_paste (t_gui_window *window)
+{
+ if (window->buffer->has_input && gui_input_clipboard)
+ {
+ gui_insert_string_input (window, gui_input_clipboard, -1);
+ window->buffer->input_buffer_pos += utf8_strlen (gui_input_clipboard);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+}
+
+/*
+ * gui_action_return: terminate line (return pressed)
+ */
+
+void
+gui_action_return (t_gui_window *window)
+{
+ t_gui_buffer *ptr_buffer;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_size > 0)
+ {
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ history_add (window->buffer, window->buffer->input_buffer);
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ window->buffer->input_buffer_pos = 0;
+ window->buffer->input_buffer_1st_display = 0;
+ window->buffer->completion.position = -1;
+ window->buffer->ptr_history = NULL;
+ ptr_buffer = window->buffer;
+ user_command (SERVER(window->buffer),
+ window->buffer,
+ window->buffer->input_buffer);
+ if (ptr_buffer == window->buffer)
+ {
+ ptr_buffer->input_buffer[0] = '\0';
+ gui_draw_buffer_input (ptr_buffer, 0);
+ }
+ }
+ }
+}
+
+/*
+ * gui_action_tab: tab key => completion
+ */
+
+void
+gui_action_tab (t_gui_window *window)
+{
+ int i;
+
+ if (window->buffer->has_input)
+ {
+ completion_search (&(window->buffer->completion),
+ CHANNEL(window->buffer),
+ window->buffer->input_buffer,
+ window->buffer->input_buffer_size,
+ utf8_real_pos (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos));
+
+ if (window->buffer->completion.word_found)
+ {
+ /* replace word with new completed word into input buffer */
+ if (window->buffer->completion.diff_size > 0)
+ {
+ window->buffer->input_buffer_size +=
+ window->buffer->completion.diff_size;
+ window->buffer->input_buffer_length +=
+ window->buffer->completion.diff_length;
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ for (i = window->buffer->input_buffer_size - 1;
+ i >= window->buffer->completion.position_replace +
+ (int)strlen (window->buffer->completion.word_found); i--)
+ window->buffer->input_buffer[i] =
+ window->buffer->input_buffer[i - window->buffer->completion.diff_size];
+ }
+ else
+ {
+ for (i = window->buffer->completion.position_replace +
+ strlen (window->buffer->completion.word_found);
+ i < window->buffer->input_buffer_size; i++)
+ window->buffer->input_buffer[i] =
+ window->buffer->input_buffer[i - window->buffer->completion.diff_size];
+ window->buffer->input_buffer_size +=
+ window->buffer->completion.diff_size;
+ window->buffer->input_buffer_length +=
+ window->buffer->completion.diff_length;
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ }
+
+ strncpy (window->buffer->input_buffer + window->buffer->completion.position_replace,
+ window->buffer->completion.word_found,
+ strlen (window->buffer->completion.word_found));
+ window->buffer->input_buffer_pos =
+ utf8_pos (window->buffer->input_buffer,
+ window->buffer->completion.position_replace) +
+ utf8_strlen (window->buffer->completion.word_found);
+
+ /* position is < 0 this means only one word was found to complete,
+ so reinit to stop completion */
+ if (window->buffer->completion.position >= 0)
+ window->buffer->completion.position =
+ utf8_real_pos (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+
+ /* add space or completor to the end of completion, if needed */
+ if ((window->buffer->completion.context == COMPLETION_COMMAND)
+ || (window->buffer->completion.context == COMPLETION_COMMAND_ARG))
+ {
+ if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos)] != ' ')
+ gui_insert_string_input (window, " ",
+ window->buffer->input_buffer_pos);
+ if (window->buffer->completion.position >= 0)
+ window->buffer->completion.position++;
+ window->buffer->input_buffer_pos++;
+ }
+ else
+ {
+ /* add nick completor if position 0 and completing nick */
+ if ((window->buffer->completion.base_word_pos == 0)
+ && (window->buffer->completion.context == COMPLETION_NICK))
+ {
+ if (strncmp (utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos),
+ cfg_look_completor, strlen (cfg_look_completor)) != 0)
+ gui_insert_string_input (window, cfg_look_completor,
+ window->buffer->input_buffer_pos);
+ if (window->buffer->completion.position >= 0)
+ window->buffer->completion.position += strlen (cfg_look_completor);
+ window->buffer->input_buffer_pos += utf8_strlen (cfg_look_completor);
+ if (window->buffer->input_buffer[utf8_real_pos (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos)] != ' ')
+ gui_insert_string_input (window, " ",
+ window->buffer->input_buffer_pos);
+ if (window->buffer->completion.position >= 0)
+ window->buffer->completion.position++;
+ window->buffer->input_buffer_pos++;
+ }
+ }
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_backspace: backspace key
+ */
+
+void
+gui_action_backspace (t_gui_window *window)
+{
+ char *pos, *pos_last;
+ int char_size, size_to_move;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ pos = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ pos_last = utf8_prev_char (window->buffer->input_buffer, pos);
+ char_size = pos - pos_last;
+ size_to_move = strlen (pos);
+ memmove (pos_last, pos, size_to_move);
+ window->buffer->input_buffer_size -= char_size;
+ window->buffer->input_buffer_length--;
+ window->buffer->input_buffer_pos--;
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+ }
+}
+
+/*
+ * gui_action_delete: delete key
+ */
+
+void
+gui_action_delete (t_gui_window *window)
+{
+ char *pos, *pos_next;
+ int char_size, size_to_move;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos <
+ window->buffer->input_buffer_length)
+ {
+ pos = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ pos_next = utf8_next_char (pos);
+ char_size = pos_next - pos;
+ size_to_move = strlen (pos_next);
+ memmove (pos, pos_next, size_to_move);
+ window->buffer->input_buffer_size -= char_size;
+ window->buffer->input_buffer_length--;
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+ }
+}
+
+/*
+ * gui_action_delete_previous_word: delete previous word
+ */
+
+void
+gui_action_delete_previous_word (t_gui_window *window)
+{
+ int length_deleted, size_deleted;
+ char *start, *string;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ start = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos - 1);
+ string = start;
+ while (string && (string[0] == ' '))
+ {
+ string = utf8_prev_char (window->buffer->input_buffer, string);
+ }
+ if (string)
+ {
+ while (string && (string[0] != ' '))
+ {
+ string = utf8_prev_char (window->buffer->input_buffer, string);
+ }
+ if (string)
+ {
+ while (string && (string[0] == ' '))
+ {
+ string = utf8_prev_char (window->buffer->input_buffer, string);
+ }
+ }
+ }
+
+ if (string)
+ string = utf8_next_char (utf8_next_char (string));
+ else
+ string = window->buffer->input_buffer;
+
+ size_deleted = utf8_next_char (start) - string;
+ length_deleted = utf8_strnlen (string, size_deleted);
+
+ gui_action_clipboard_copy (string, size_deleted);
+
+ memmove (string, string + size_deleted, size_deleted);
+
+ window->buffer->input_buffer_size -= size_deleted;
+ window->buffer->input_buffer_length -= length_deleted;
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ window->buffer->input_buffer_pos -= length_deleted;
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+ }
+}
+
+/*
+ * gui_action_delete_next_word: delete next word
+ */
+
+void
+gui_action_delete_next_word (t_gui_window *window)
+{
+ int size_deleted, length_deleted;
+ char *start, *string;
+
+ if (window->buffer->has_input)
+ {
+ start = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ string = start;
+ length_deleted = 0;
+ while (string[0])
+ {
+ if ((string[0] == ' ') && (string > start))
+ break;
+ string = utf8_next_char (string);
+ length_deleted++;
+ }
+ size_deleted = string - start;
+
+ gui_action_clipboard_copy(start, size_deleted);
+
+ memmove (start, string, strlen (string));
+
+ window->buffer->input_buffer_size -= size_deleted;
+ window->buffer->input_buffer_length -= length_deleted;
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+}
+
+/*
+ * gui_action_delete_begin_of_line: delete all from cursor pos to beginning of line
+ */
+
+void
+gui_action_delete_begin_of_line (t_gui_window *window)
+{
+ int length_deleted, size_deleted;
+ char *start;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ start = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ size_deleted = start - window->buffer->input_buffer;
+ length_deleted = utf8_strnlen (window->buffer->input_buffer, size_deleted);
+ gui_action_clipboard_copy (window->buffer->input_buffer,
+ start - window->buffer->input_buffer);
+
+ memmove (window->buffer->input_buffer, start, strlen (start));
+
+ window->buffer->input_buffer_size -= size_deleted;
+ window->buffer->input_buffer_length -= length_deleted;
+ window->buffer->input_buffer[window->buffer->input_buffer_size] = '\0';
+ window->buffer->input_buffer_pos = 0;
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+ }
+}
+
+/*
+ * gui_action_delete_end_of_line: delete all from cursor pos to end of line
+ */
+
+void
+gui_action_delete_end_of_line (t_gui_window *window)
+{
+ char *start;
+ int size_deleted, length_deleted;
+
+ if (window->buffer->has_input)
+ {
+ start = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ size_deleted = strlen (start);
+ length_deleted = utf8_strlen (start);
+ gui_action_clipboard_copy (start, size_deleted);
+ start[0] = '\0';
+ window->buffer->input_buffer_size = strlen (window->buffer->input_buffer);
+ window->buffer->input_buffer_length = utf8_strlen (window->buffer->input_buffer);
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+}
+
+/*
+ * gui_action_delete_line: delete entire line
+ */
+
+void
+gui_action_delete_line (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ window->buffer->input_buffer[0] = '\0';
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ window->buffer->input_buffer_pos = 0;
+ gui_optimize_input_buffer_size (window->buffer);
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+}
+
+/*
+ * gui_action_transpose_chars: transpose chars (on lth left) at cursor pos
+ */
+
+void
+gui_action_transpose_chars (t_gui_window *window)
+{
+ char *start, *prev_char, saved_char[4];
+ int size_current_char;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ if (window->buffer->input_buffer_pos == window->buffer->input_buffer_length)
+ window->buffer->input_buffer_pos--;
+
+ start = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ prev_char = utf8_prev_char (window->buffer->input_buffer,
+ start);
+ size_current_char = start - prev_char;
+ memcpy (saved_char, prev_char, size_current_char);
+ memcpy (prev_char, start, utf8_char_size (start));
+ start = utf8_next_char (prev_char);
+ memcpy (start, saved_char, size_current_char);
+
+ window->buffer->input_buffer_pos++;
+
+ gui_draw_buffer_input (window->buffer, 0);
+ window->buffer->completion.position = -1;
+ }
+ }
+}
+
+/*
+ * gui_action_home: home key
+ */
+
+void
+gui_action_home (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ window->buffer->input_buffer_pos = 0;
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_end: end key
+ */
+
+void
+gui_action_end (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos <
+ window->buffer->input_buffer_length)
+ {
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_left: move to previous char
+ */
+
+void
+gui_action_left (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ window->buffer->input_buffer_pos--;
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_previous_word: move to beginning of previous word
+ */
+
+void
+gui_action_previous_word (t_gui_window *window)
+{
+ char *pos;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos > 0)
+ {
+ pos = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos - 1);
+ while (pos && (pos[0] == ' '))
+ {
+ pos = utf8_prev_char (window->buffer->input_buffer, pos);
+ }
+ if (pos)
+ {
+ while (pos && (pos[0] != ' '))
+ {
+ pos = utf8_prev_char (window->buffer->input_buffer, pos);
+ }
+ if (pos)
+ pos = utf8_next_char (pos);
+ else
+ pos = window->buffer->input_buffer;
+ window->buffer->input_buffer_pos = utf8_pos (window->buffer->input_buffer,
+ pos - window->buffer->input_buffer);
+ }
+ else
+ window->buffer->input_buffer_pos = 0;
+
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_right: move to previous char
+ */
+
+void
+gui_action_right (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos <
+ window->buffer->input_buffer_length)
+ {
+ window->buffer->input_buffer_pos++;
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_next_word: move to the end of next
+ */
+
+void
+gui_action_next_word (t_gui_window *window)
+{
+ char *pos;
+
+ if (window->buffer->has_input)
+ {
+ if (window->buffer->input_buffer_pos <
+ window->buffer->input_buffer_length)
+ {
+ pos = utf8_add_offset (window->buffer->input_buffer,
+ window->buffer->input_buffer_pos);
+ while (pos[0] && (pos[0] == ' '))
+ {
+ pos = utf8_next_char (pos);
+ }
+ if (pos[0])
+ {
+ while (pos[0] && (pos[0] != ' '))
+ {
+ pos = utf8_next_char (pos);
+ }
+ if (pos[0])
+ window->buffer->input_buffer_pos =
+ utf8_pos (window->buffer->input_buffer,
+ pos - window->buffer->input_buffer);
+ else
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ }
+ else
+ window->buffer->input_buffer_pos =
+ utf8_pos (window->buffer->input_buffer,
+ utf8_prev_char (window->buffer->input_buffer, pos) - window->buffer->input_buffer);
+
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_up: recall last command or move to previous DCC in list
+ */
+
+void
+gui_action_up (t_gui_window *window)
+{
+ if (window->buffer->dcc)
+ {
+ if (dcc_list)
+ {
+ if (window->dcc_selected
+ && ((t_irc_dcc *)(window->dcc_selected))->prev_dcc)
+ {
+ if (window->dcc_selected ==
+ window->dcc_first)
+ window->dcc_first =
+ ((t_irc_dcc *)(window->dcc_first))->prev_dcc;
+ window->dcc_selected =
+ ((t_irc_dcc *)(window->dcc_selected))->prev_dcc;
+ gui_draw_buffer_chat (window->buffer, 1);
+ gui_draw_buffer_input (window->buffer, 1);
+ }
+ }
+ }
+ else if (window->buffer->has_input)
+ {
+ if (window->buffer->ptr_history)
+ {
+ window->buffer->ptr_history =
+ window->buffer->ptr_history->next_history;
+ if (!window->buffer->ptr_history)
+ window->buffer->ptr_history =
+ window->buffer->history;
+ }
+ else
+ window->buffer->ptr_history =
+ window->buffer->history;
+ if (window->buffer->ptr_history)
+ {
+ window->buffer->input_buffer_size =
+ strlen (window->buffer->ptr_history->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen (window->buffer->ptr_history->text);
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ strcpy (window->buffer->input_buffer,
+ window->buffer->ptr_history->text);
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_up_global: recall last command in global history
+ */
+
+void
+gui_action_up_global (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (history_global_ptr)
+ {
+ history_global_ptr = history_global_ptr->next_history;
+ if (!history_global_ptr)
+ history_global_ptr = history_global;
+ }
+ else
+ history_global_ptr = history_global;
+ if (history_global_ptr)
+ {
+ window->buffer->input_buffer_size =
+ strlen (history_global_ptr->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen (history_global_ptr->text);
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ strcpy (window->buffer->input_buffer,
+ history_global_ptr->text);
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_down: recall next command or move to next DCC in list
+ */
+
+void
+gui_action_down (t_gui_window *window)
+{
+ if (window->buffer->dcc)
+ {
+ if (dcc_list)
+ {
+ if (!window->dcc_selected
+ || ((t_irc_dcc *)(window->dcc_selected))->next_dcc)
+ {
+ if (window->dcc_last_displayed
+ && (window->dcc_selected ==
+ window->dcc_last_displayed))
+ {
+ if (window->dcc_first)
+ window->dcc_first =
+ ((t_irc_dcc *)(window->dcc_first))->next_dcc;
+ else
+ window->dcc_first =
+ dcc_list->next_dcc;
+ }
+ if (window->dcc_selected)
+ window->dcc_selected =
+ ((t_irc_dcc *)(window->dcc_selected))->next_dcc;
+ else
+ window->dcc_selected =
+ dcc_list->next_dcc;
+ gui_draw_buffer_chat (window->buffer, 1);
+ gui_draw_buffer_input (window->buffer, 1);
+ }
+ }
+ }
+ else if (window->buffer->has_input)
+ {
+ if (window->buffer->ptr_history)
+ {
+ window->buffer->ptr_history =
+ window->buffer->ptr_history->prev_history;
+ if (window->buffer->ptr_history)
+ {
+ window->buffer->input_buffer_size =
+ strlen (window->buffer->ptr_history->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen (window->buffer->ptr_history->text);
+ }
+ else
+ {
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ }
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ if (window->buffer->ptr_history)
+ strcpy (window->buffer->input_buffer,
+ window->buffer->ptr_history->text);
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_down_global: recall next command in global history
+ */
+
+void
+gui_action_down_global (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ {
+ if (history_global_ptr)
+ {
+ history_global_ptr = history_global_ptr->prev_history;
+ if (history_global_ptr)
+ {
+ window->buffer->input_buffer_size =
+ strlen (history_global_ptr->text);
+ window->buffer->input_buffer_length =
+ utf8_strlen (history_global_ptr->text);
+ }
+ else
+ {
+ window->buffer->input_buffer_size = 0;
+ window->buffer->input_buffer_length = 0;
+ }
+ gui_optimize_input_buffer_size (window->buffer);
+ window->buffer->input_buffer_pos =
+ window->buffer->input_buffer_length;
+ if (history_global_ptr)
+ strcpy (window->buffer->input_buffer,
+ history_global_ptr->text);
+ gui_draw_buffer_input (window->buffer, 0);
+ }
+ }
+}
+
+/*
+ * gui_action_page_up: display previous page on buffer
+ */
+
+void
+gui_action_page_up (t_gui_window *window)
+{
+ gui_window_page_up (window);
+}
+
+/*
+ * gui_action_page_down: display next page on buffer
+ */
+
+void
+gui_action_page_down (t_gui_window *window)
+{
+ gui_window_page_down (window);
+}
+
+/*
+ * gui_action_nick_beginning: go to beginning of nicklist
+ */
+
+void
+gui_action_nick_beginning (t_gui_window *window)
+{
+ gui_window_nick_beginning (window);
+}
+
+/*
+ * gui_action_nick_end: go to the end of nicklist
+ */
+
+void
+gui_action_nick_end (t_gui_window *window)
+{
+ gui_window_nick_end (window);
+}
+
+/*
+ * gui_action_nick_page_up: scroll one page up in nicklist
+ */
+
+void
+gui_action_nick_page_up (t_gui_window *window)
+{
+ gui_window_nick_page_up (window);
+}
+
+/*
+ * gui_action_nick_page_down: scroll one page down in nicklist
+ */
+
+void
+gui_action_nick_page_down (t_gui_window *window)
+{
+ gui_window_nick_page_down (window);
+}
+
+/*
+ * gui_action_jump_smart: jump to buffer with activity (alt-A by default)
+ */
+
+void
+gui_action_jump_smart (t_gui_window *window)
+{
+ if (hotlist)
+ {
+ if (!hotlist_initial_buffer)
+ hotlist_initial_buffer = window->buffer;
+ gui_switch_to_buffer (window, hotlist->buffer);
+ gui_redraw_buffer (window->buffer);
+ }
+ else
+ {
+ if (hotlist_initial_buffer)
+ {
+ gui_switch_to_buffer (window, hotlist_initial_buffer);
+ gui_redraw_buffer (window->buffer);
+ hotlist_initial_buffer = NULL;
+ }
+ }
+}
+
+/*
+ * gui_action_jump_dcc: jump to DCC buffer
+ */
+
+void
+gui_action_jump_dcc (t_gui_window *window)
+{
+ if (window->buffer->dcc)
+ {
+ if (buffer_before_dcc)
+ {
+ gui_switch_to_buffer (window,
+ buffer_before_dcc);
+ gui_redraw_buffer (window->buffer);
+ }
+ }
+ else
+ {
+ buffer_before_dcc = window->buffer;
+ gui_switch_to_dcc_buffer (window);
+ }
+}
+
+/*
+ * gui_action_jump_last_buffer: jump to last buffer
+ */
+
+void
+gui_action_jump_last_buffer (t_gui_window *window)
+{
+ if (last_gui_buffer)
+ gui_switch_to_buffer_by_number (window, last_gui_buffer->number);
+}
+
+/*
+ * gui_action_jump_server: jump to server buffer
+ */
+
+void
+gui_action_jump_server (t_gui_window *window)
+{
+ if (SERVER(window->buffer))
+ {
+ if (SERVER(window->buffer)->buffer !=
+ window->buffer)
+ {
+ gui_switch_to_buffer (window,
+ SERVER(window->buffer)->buffer);
+ gui_redraw_buffer (window->buffer);
+ }
+ }
+}
+
+/*
+ * gui_action_jump_next_server: jump to next server
+ */
+
+void
+gui_action_jump_next_server (t_gui_window *window)
+{
+ t_irc_server *ptr_server;
+ t_gui_buffer *ptr_buffer;
+
+ if (SERVER(window->buffer))
+ {
+ ptr_server = SERVER(window->buffer)->next_server;
+ if (!ptr_server)
+ ptr_server = irc_servers;
+ while (ptr_server != SERVER(window->buffer))
+ {
+ if (ptr_server->buffer)
+ break;
+ ptr_server = (ptr_server->next_server) ?
+ ptr_server->next_server : irc_servers;
+ }
+ if (ptr_server != SERVER(window->buffer))
+ {
+ /* save current buffer */
+ SERVER(window->buffer)->buffer->old_channel_buffer =
+ window->buffer;
+
+ /* come back to memorized chan if found */
+ if (ptr_server->buffer->old_channel_buffer)
+ ptr_buffer = ptr_server->buffer->old_channel_buffer;
+ else
+ ptr_buffer = (ptr_server->channels) ?
+ ptr_server->channels->buffer : ptr_server->buffer;
+ gui_switch_to_buffer (window, ptr_buffer);
+ gui_redraw_buffer (window->buffer);
+ }
+ }
+}
+
+/*
+ * gui_action_switch_server: switch server on servers buffer
+ * (if same buffer is used for all buffers)
+ */
+
+void
+gui_action_switch_server (t_gui_window *window)
+{
+ gui_window_switch_server (window);
+}
+
+/*
+ * gui_action_hotlist_clear: clear hotlist
+ */
+
+void
+gui_action_hotlist_clear (t_gui_window *window)
+{
+ if (hotlist)
+ {
+ hotlist_free_all ();
+ gui_redraw_buffer (window->buffer);
+ }
+ hotlist_initial_buffer = window->buffer;
+}
+
+/*
+ * gui_action_infobar_clear: clear infobar
+ */
+
+void
+gui_action_infobar_clear (t_gui_window *window)
+{
+ gui_infobar_remove ();
+ gui_draw_buffer_infobar (window->buffer, 1);
+}
+
+/*
+ * gui_action_refresh: refresh screen
+ */
+
+void
+gui_action_refresh_screen (t_gui_window *window)
+{
+ /* make gcc happy */
+ (void) window;
+
+ gui_refresh_screen ();
+}
+
+/*
+ * gui_action_grab_key: init "grab key mode" (next key will be inserted into input buffer)
+ */
+
+void
+gui_action_grab_key (t_gui_window *window)
+{
+ if (window->buffer->has_input)
+ gui_key_init_grab ();
+}