summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2011-07-29 19:46:02 +0200
committerSebastien Helleu <flashcode@flashtux.org>2011-07-29 19:46:02 +0200
commit54a6f42de539e176517be5cce0c6792b5530c459 (patch)
tree2b61929928cefb576b2f4cb2d83d794f6f108ce3 /src
parentdfd7ed5457cc4df7c75e9f9e61efeaea50b26a75 (diff)
downloadweechat-54a6f42de539e176517be5cce0c6792b5530c459.zip
core: add number in windows, improve mouse/cursor actions when screen is split
Diffstat (limited to 'src')
-rw-r--r--src/core/wee-command.c284
-rw-r--r--src/core/wee-completion.c31
-rw-r--r--src/core/wee-hook.c14
-rw-r--r--src/gui/curses/gui-curses-key.c45
-rw-r--r--src/gui/gui-bar-item.c31
-rw-r--r--src/gui/gui-bar-item.h1
-rw-r--r--src/gui/gui-bar.c25
-rw-r--r--src/gui/gui-bar.h3
-rw-r--r--src/gui/gui-buffer.h2
-rw-r--r--src/gui/gui-window.c59
-rw-r--r--src/gui/gui-window.h4
11 files changed, 348 insertions, 151 deletions
diff --git a/src/core/wee-command.c b/src/core/wee-command.c
index d5dc38ed2..c7268dbe9 100644
--- a/src/core/wee-command.c
+++ b/src/core/wee-command.c
@@ -155,14 +155,15 @@ command_bar_list (int full)
COMMAND_CALLBACK(bar)
{
- int i, type, position;
+ int i, type, position, number;
char *error, *str_type, *pos_condition;
struct t_gui_bar *ptr_bar;
struct t_gui_bar_item *ptr_item;
- struct t_gui_buffer *ptr_buffer;
+ struct t_gui_window *ptr_window;
/* make C compiler happy */
(void) data;
+ (void) buffer;
/* list of bars */
if ((argc == 1)
@@ -432,17 +433,23 @@ COMMAND_CALLBACK(bar)
if (ptr_bar)
{
if (strcmp (argv[3], "*") == 0)
- ptr_buffer = buffer;
+ ptr_window = gui_current_window;
else
- ptr_buffer = gui_buffer_search_by_full_name (argv[3]);
- if (!ptr_buffer)
+ {
+ ptr_window = NULL;
+ error = NULL;
+ number = (int)strtol (argv[3], &error, 10);
+ if (error && !error[0])
+ ptr_window = gui_window_search_by_number (number);
+ }
+ if (!ptr_window)
{
gui_chat_printf (NULL,
- _("%sError: buffer not found for \"%s\" command"),
+ _("%sError: window not found for \"%s\" command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], "bar");
return WEECHAT_RC_OK;
}
- if (!gui_bar_scroll (ptr_bar, ptr_buffer, argv_eol[4]))
+ if (!gui_bar_scroll (ptr_bar, ptr_window, argv_eol[4]))
{
gui_chat_printf (NULL,
_("%sError: unable to scroll bar \"%s\""),
@@ -4695,9 +4702,9 @@ COMMAND_CALLBACK(wait)
COMMAND_CALLBACK(window)
{
struct t_gui_window *ptr_win;
- int i;
char *error;
long number;
+ int win_args;
/* make C compiler happy */
(void) data;
@@ -4711,13 +4718,12 @@ COMMAND_CALLBACK(window)
gui_chat_printf (NULL, "");
gui_chat_printf (NULL, _("Windows list:"));
- i = 1;
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
gui_chat_printf (NULL, "%s[%s%d%s] (%s%d:%d%s;%s%dx%d%s) ",
GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS),
GUI_COLOR(GUI_COLOR_CHAT),
- i,
+ ptr_win->number,
GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS),
GUI_COLOR(GUI_COLOR_CHAT),
ptr_win->win_x,
@@ -4727,173 +4733,201 @@ COMMAND_CALLBACK(window)
ptr_win->win_width,
ptr_win->win_height,
GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS));
- i++;
}
-
+
+ return WEECHAT_RC_OK;
+ }
+
+ /* refresh screen */
+ if (string_strcasecmp (argv[1], "refresh") == 0)
+ {
+ gui_window_ask_refresh (2);
+ return WEECHAT_RC_OK;
+ }
+
+ /* balance windows */
+ if (string_strcasecmp (argv[1], "balance") == 0)
+ {
+ if (gui_window_balance (gui_windows_tree))
+ gui_window_ask_refresh (1);
+ return WEECHAT_RC_OK;
+ }
+
+ /*
+ * search window, for actions related to a given window
+ * (default is current window if no number is given)
+ */
+ ptr_win = gui_current_window;
+ win_args = 2;
+ if ((argc > 3) && (string_strcasecmp (argv[2], "-window") == 0))
+ {
+ error = NULL;
+ number = strtol (argv[3], &error, 10);
+ if (error && !error[0])
+ ptr_win = gui_window_search_by_number (number);
+ else
+ ptr_win = NULL;
+ win_args = 4;
+ }
+ if (!ptr_win)
+ {
+ /* invalid number */
+ gui_chat_printf (NULL,
+ _("%sError: incorrect window number"),
+ gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
return WEECHAT_RC_OK;
}
- /* page up in current window */
+ /* page up */
if (string_strcasecmp (argv[1], "page_up") == 0)
{
- gui_window_page_up (gui_current_window);
+ gui_window_page_up (ptr_win);
return WEECHAT_RC_OK;
}
- /* page down in current window */
+ /* page down */
if (string_strcasecmp (argv[1], "page_down") == 0)
{
- gui_window_page_down (gui_current_window);
+ gui_window_page_down (ptr_win);
return WEECHAT_RC_OK;
}
- /* vertical scroll in window */
+ /* vertical scroll */
if (string_strcasecmp (argv[1], "scroll") == 0)
{
- if (argc > 2)
- gui_window_scroll (gui_current_window, argv[2]);
+ if (argc > win_args)
+ gui_window_scroll (ptr_win, argv[win_args]);
return WEECHAT_RC_OK;
}
/* horizontal scroll in window (for buffers with free content) */
if (string_strcasecmp (argv[1], "scroll_horiz") == 0)
{
- if ((argc > 2)
- && (gui_current_window->buffer->type == GUI_BUFFER_TYPE_FREE))
+ if ((argc > win_args)
+ && (ptr_win->buffer->type == GUI_BUFFER_TYPE_FREE))
{
- gui_window_scroll_horiz (gui_current_window, argv[2]);
+ gui_window_scroll_horiz (ptr_win, argv[win_args]);
}
return WEECHAT_RC_OK;
}
- /* scroll up current window */
+ /* scroll up */
if (string_strcasecmp (argv[1], "scroll_up") == 0)
{
- gui_window_scroll_up (gui_current_window);
+ gui_window_scroll_up (ptr_win);
return WEECHAT_RC_OK;
}
- /* scroll down current window */
+ /* scroll down */
if (string_strcasecmp (argv[1], "scroll_down") == 0)
{
- gui_window_scroll_down (gui_current_window);
+ gui_window_scroll_down (ptr_win);
return WEECHAT_RC_OK;
}
- /* scroll to top of current window */
+ /* scroll to top of window */
if (string_strcasecmp (argv[1], "scroll_top") == 0)
{
- gui_window_scroll_top (gui_current_window);
+ gui_window_scroll_top (ptr_win);
return WEECHAT_RC_OK;
}
- /* scroll to bottom of current window */
+ /* scroll to bottom of window */
if (string_strcasecmp (argv[1], "scroll_bottom") == 0)
{
- gui_window_scroll_bottom (gui_current_window);
+ gui_window_scroll_bottom (ptr_win);
return WEECHAT_RC_OK;
}
- /* scroll to previous highlight of current window */
+ /* scroll to previous highlight */
if (string_strcasecmp (argv[1], "scroll_previous_highlight") == 0)
{
- gui_window_scroll_previous_highlight (gui_current_window);
+ gui_window_scroll_previous_highlight (ptr_win);
return WEECHAT_RC_OK;
}
- /* scroll to next highlight of current window */
+ /* scroll to next highlight */
if (string_strcasecmp (argv[1], "scroll_next_highlight") == 0)
{
- gui_window_scroll_next_highlight (gui_current_window);
- return WEECHAT_RC_OK;
- }
-
- /* refresh screen */
- if (string_strcasecmp (argv[1], "refresh") == 0)
- {
- gui_window_ask_refresh (2);
+ gui_window_scroll_next_highlight (ptr_win);
return WEECHAT_RC_OK;
}
/* split window horizontally */
if (string_strcasecmp (argv[1], "splith") == 0)
{
- if (argc > 2)
+ if (argc > win_args)
{
error = NULL;
- number = strtol (argv[2], &error, 10);
+ number = strtol (argv[win_args], &error, 10);
if (error && !error[0]
&& (number > 0) && (number < 100))
- gui_window_split_horizontal (gui_current_window, number);
+ {
+ gui_window_split_horizontal (ptr_win, number);
+ }
}
else
- gui_window_split_horizontal (gui_current_window, 50);
-
+ gui_window_split_horizontal (ptr_win, 50);
+
return WEECHAT_RC_OK;
}
/* split window vertically */
if (string_strcasecmp (argv[1], "splitv") == 0)
{
- if (argc > 2)
+ if (argc > win_args)
{
error = NULL;
- number = strtol (argv[2], &error, 10);
+ number = strtol (argv[win_args], &error, 10);
if (error && !error[0]
&& (number > 0) && (number < 100))
- gui_window_split_vertical (gui_current_window, number);
+ {
+ gui_window_split_vertical (ptr_win, number);
+ }
}
else
- gui_window_split_vertical (gui_current_window, 50);
-
+ gui_window_split_vertical (ptr_win, 50);
+
return WEECHAT_RC_OK;
}
/* resize window */
if (string_strcasecmp (argv[1], "resize") == 0)
{
- if (argc > 2)
+ if (argc > win_args)
{
- if ((argv[2][0] == '+') || (argv[2][0] == '-'))
+ if ((argv[win_args][0] == '+') || (argv[win_args][0] == '-'))
{
error = NULL;
- number = strtol (argv[2] + 1, &error, 10);
+ number = strtol (argv[win_args] + 1, &error, 10);
if (error && !error[0])
{
- if (argv[2][0] == '-')
+ if (argv[win_args][0] == '-')
number *= -1;
- gui_window_resize_delta (gui_current_window, number);
+ gui_window_resize_delta (ptr_win, number);
}
}
else
{
error = NULL;
- number = strtol (argv[2], &error, 10);
+ number = strtol (argv[win_args], &error, 10);
if (error && !error[0]
&& (number > 0) && (number < 100))
{
- gui_window_resize (gui_current_window, number);
+ gui_window_resize (ptr_win, number);
}
}
}
return WEECHAT_RC_OK;
}
- /* balance windows */
- if (string_strcasecmp (argv[1], "balance") == 0)
- {
- if (gui_window_balance (gui_windows_tree))
- gui_window_ask_refresh (1);
- return WEECHAT_RC_OK;
- }
-
/* merge windows */
if (string_strcasecmp (argv[1], "merge") == 0)
{
- if (argc > 2)
+ if (argc > win_args)
{
- if (string_strcasecmp (argv[2], "all") == 0)
- gui_window_merge_all (gui_current_window);
+ if (string_strcasecmp (argv[win_args], "all") == 0)
+ gui_window_merge_all (ptr_win);
else
{
gui_chat_printf (NULL,
@@ -4906,7 +4940,7 @@ COMMAND_CALLBACK(window)
}
else
{
- if (!gui_window_merge (gui_current_window))
+ if (!gui_window_merge (ptr_win))
{
gui_chat_printf (NULL,
_("%sError: can not merge windows, "
@@ -4922,58 +4956,58 @@ COMMAND_CALLBACK(window)
/* switch to previous window */
if (string_strcasecmp (argv[1], "-1") == 0)
{
- gui_window_switch_previous (gui_current_window);
+ gui_window_switch_previous (ptr_win);
return WEECHAT_RC_OK;
}
/* switch to next window */
if (string_strcasecmp (argv[1], "+1") == 0)
{
- gui_window_switch_next (gui_current_window);
+ gui_window_switch_next (ptr_win);
return WEECHAT_RC_OK;
}
/* switch to window above */
if (string_strcasecmp (argv[1], "up") == 0)
{
- gui_window_switch_up (gui_current_window);
+ gui_window_switch_up (ptr_win);
return WEECHAT_RC_OK;
}
/* switch to window below */
if (string_strcasecmp (argv[1], "down") == 0)
{
- gui_window_switch_down (gui_current_window);
+ gui_window_switch_down (ptr_win);
return WEECHAT_RC_OK;
}
/* switch to window on the left */
if (string_strcasecmp (argv[1], "left") == 0)
{
- gui_window_switch_left (gui_current_window);
+ gui_window_switch_left (ptr_win);
return WEECHAT_RC_OK;
}
/* switch to window on the right */
if (string_strcasecmp (argv[1], "right") == 0)
{
- gui_window_switch_right (gui_current_window);
+ gui_window_switch_right (ptr_win);
return WEECHAT_RC_OK;
}
/* swap windows */
if (string_strcasecmp (argv[1], "swap") == 0)
{
- if (argc > 2)
+ if (argc > win_args)
{
- if (string_strcasecmp (argv[2], "up") == 0)
- gui_window_swap (gui_current_window, 1);
- else if (string_strcasecmp (argv[2], "down") == 0)
- gui_window_swap (gui_current_window, 3);
- else if (string_strcasecmp (argv[2], "left") == 0)
- gui_window_swap (gui_current_window, 4);
- else if (string_strcasecmp (argv[2], "right") == 0)
- gui_window_swap (gui_current_window, 2);
+ if (string_strcasecmp (argv[win_args], "up") == 0)
+ gui_window_swap (ptr_win, 1);
+ else if (string_strcasecmp (argv[win_args], "down") == 0)
+ gui_window_swap (ptr_win, 3);
+ else if (string_strcasecmp (argv[win_args], "left") == 0)
+ gui_window_swap (ptr_win, 4);
+ else if (string_strcasecmp (argv[win_args], "right") == 0)
+ gui_window_swap (ptr_win, 2);
else
{
gui_chat_printf (NULL,
@@ -4986,7 +5020,7 @@ COMMAND_CALLBACK(window)
}
else
{
- gui_window_swap (gui_current_window, 0);
+ gui_window_swap (ptr_win, 0);
}
return WEECHAT_RC_OK;
}
@@ -4994,7 +5028,7 @@ COMMAND_CALLBACK(window)
/* zoom window */
if (string_strcasecmp (argv[1], "zoom") == 0)
{
- gui_window_zoom (gui_current_window);
+ gui_window_zoom (ptr_win);
return WEECHAT_RC_OK;
}
@@ -5005,11 +5039,20 @@ COMMAND_CALLBACK(window)
number = strtol (argv[1] + 1, &error, 10);
if (error && !error[0])
{
- gui_window_switch_by_buffer (gui_current_window, number);
+ gui_window_switch_by_buffer (ptr_win, number);
return WEECHAT_RC_OK;
}
}
+ /* jump to window by number */
+ error = NULL;
+ number = strtol (argv[1], &error, 10);
+ if (error && !error[0])
+ {
+ gui_window_switch_by_number (number);
+ return WEECHAT_RC_OK;
+ }
+
gui_chat_printf (NULL,
_("%sError: unknown option for \"%s\" "
"command"),
@@ -5042,7 +5085,7 @@ command_init ()
" || del <name>|-all"
" || set <name> <option> <value>"
" || hide|show|toggle <name>"
- " || scroll <name> <buffer> <scroll_value>"),
+ " || scroll <name> <window> <scroll_value>"),
N_(" list: list all bars\n"
" listfull: list all bars (verbose)\n"
" listitems: list all bar items\n"
@@ -5074,8 +5117,8 @@ command_init ()
" show: show an hidden bar\n"
" toggle: hide/show a bar\n"
" scroll: scroll bar\n"
- " buffer: name of buffer to scroll ('*' "
- "means current buffer, you should use '*' for root bars)\n"
+ " window: window number (use '*' for current window "
+ "or for root bars)\n"
" scroll_value: value for scroll: 'x' or 'y' (optional), "
"followed by '+', '-', 'b' (beginning) or 'e' (end), "
"value (for +/-), and optional % (to scroll by % of "
@@ -5101,7 +5144,7 @@ command_init ()
" || hide %(bars_names)"
" || show %(bars_names)"
" || toggle %(bars_names)"
- " || scroll %(bars_names) %(buffers_plugins_names)|*",
+ " || scroll %(bars_names) %(windows_numbers)|*",
&command_bar, NULL);
hook_command (NULL, "buffer",
N_("manage buffers"),
@@ -5749,20 +5792,21 @@ command_init ()
hook_command (NULL, "window",
N_("manage windows"),
N_("list"
- " || -1|+1|b#|up|down|left|right"
- " || splith|splitv [<pct>]"
- " || resize [+/-]<pct>"
+ " || -1|+1|b#|up|down|left|right [-window <number>]"
+ " || <number>"
+ " || splith|splitv [-window <number>] [<pct>]"
+ " || resize [-window <number>] [+/-]<pct>"
" || balance"
- " || merge [all]"
- " || page_up|page_down"
+ " || merge [-window <number>] [all]"
+ " || page_up|page_down [-window <number>]"
" || refresh"
- " || scroll [+/-]<value>[s|m|h|d|M|y]"
- " || scroll_horiz [+/-]<value>[%]"
+ " || scroll [-window <number>] [+/-]<value>[s|m|h|d|M|y]"
+ " || scroll_horiz [-window <number>] [+/-]<value>[%]"
" || scroll_up|scroll_down|scroll_top|"
"scroll_bottom|scroll_previous_highlight|"
- "scroll_next_highlight"
- " || swap [up|down|left|right]"
- " || zoom"),
+ "scroll_next_highlight [-window <number>]"
+ " || swap [-window <number>] [up|down|left|right]"
+ " || zoom[-window <number>]"),
N_(" list: list opened windows (without argument, "
"this list is displayed)\n"
" -1: jump to previous window\n"
@@ -5772,6 +5816,7 @@ command_init ()
" down: switch to window below current one\n"
" left: switch to window on the left\n"
" right: switch to window on the right\n"
+ " number: window number (see /window list)\n"
" splith: split current window horizontally\n"
" splitv: split current window vertically\n"
" resize: resize window size, new size is <pct> "
@@ -5808,13 +5853,34 @@ command_init ()
" scroll 2 days up:\n"
" /window scroll -2d\n"
" scroll to beginning of current day:\n"
- " /window scroll -d"),
- "list || -1 || +1 || up || down || left || right"
- " || splith || splitv || resize || balance || page_up"
- " || page_down || refresh || scroll || scroll_horiz"
- " || scroll_up || scroll_down || scroll_top || scroll_bottom"
- " || scroll_previous_highlight || scroll_next_highlight"
- " || swap up|down|left|right || zoom || merge all",
+ " /window scroll -d\n"
+ " zoom on window #2:\n"
+ " /window zoom -window 2"),
+ "list"
+ " || -1 -window %(windows_numbers)"
+ " || +1 -window %(windows_numbers)"
+ " || up -window %(windows_numbers)"
+ " || down -window %(windows_numbers)"
+ " || left -window %(windows_numbers)"
+ " || right -window %(windows_numbers)"
+ " || splith -window %(windows_numbers)"
+ " || splitv -window %(windows_numbers)"
+ " || resize -window %(windows_numbers)"
+ " || balance"
+ " || page_up -window %(windows_numbers)"
+ " || page_down -window %(windows_numbers)"
+ " || refresh"
+ " || scroll -window"
+ " || scroll_horiz -window %(windows_numbers)"
+ " || scroll_up -window %(windows_numbers)"
+ " || scroll_down -window %(windows_numbers)"
+ " || scroll_top -window %(windows_numbers)"
+ " || scroll_bottom -window %(windows_numbers)"
+ " || scroll_previous_highlight -window %(windows_numbers)"
+ " || scroll_next_highlight -window %(windows_numbers)"
+ " || swap up|down|left|right|-window %(windows_numbers)"
+ " || zoom -window %(windows_numbers)"
+ " || merge all|-window %(windows_numbers)",
&command_window, NULL);
}
diff --git a/src/core/wee-completion.c b/src/core/wee-completion.c
index 7879fa4da..15ccc05e5 100644
--- a/src/core/wee-completion.c
+++ b/src/core/wee-completion.c
@@ -263,6 +263,34 @@ completion_list_add_buffer_properties_get_cb (void *data,
}
/*
+ * completion_list_add_windows_numbers_cb: add windows numbers to completion list
+ */
+
+int
+completion_list_add_windows_numbers_cb (void *data,
+ const char *completion_item,
+ struct t_gui_buffer *buffer,
+ struct t_gui_completion *completion)
+{
+ struct t_gui_window *ptr_win;
+ char str_number[32];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) completion_item;
+ (void) buffer;
+
+ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
+ {
+ snprintf (str_number, sizeof (str_number), "%d", ptr_win->number);
+ gui_completion_list_add (completion, str_number,
+ 0, WEECHAT_LIST_POS_END);
+ }
+
+ return WEECHAT_RC_OK;
+}
+
+/*
* completion_list_map_add_palette_color_cb: add palette color in completion
*/
@@ -1290,6 +1318,9 @@ completion_init ()
hook_completion (NULL, "buffer_properties_get",
N_("properties that can be read on a buffer"),
&completion_list_add_buffer_properties_get_cb, NULL);
+ hook_completion (NULL, "windows_numbers",
+ N_("numbers of windows"),
+ &completion_list_add_windows_numbers_cb, NULL);
hook_completion (NULL, "palette_colors",
N_("palette colors"),
&completion_list_add_palette_colors_cb, NULL);
diff --git a/src/core/wee-hook.c b/src/core/wee-hook.c
index 89005dea7..88b656ac4 100644
--- a/src/core/wee-hook.c
+++ b/src/core/wee-hook.c
@@ -51,6 +51,7 @@
#include "../gui/gui-chat.h"
#include "../gui/gui-bar.h"
#include "../gui/gui-bar-window.h"
+#include "../gui/gui-buffer.h"
#include "../gui/gui-color.h"
#include "../gui/gui-completion.h"
#include "../gui/gui-cursor.h"
@@ -2839,6 +2840,19 @@ hook_focus_get_data (struct t_gui_cursor_info *cursor_info)
(cursor_info->window) ?
(long unsigned int)((cursor_info->window)->buffer) : 0);
hashtable_set (hash_info, "_buffer", str_value);
+ if (cursor_info->window)
+ {
+ snprintf (str_value, sizeof (str_value), "%d",
+ (cursor_info->window)->number);
+ hashtable_set (hash_info, "_window_number", str_value);
+ snprintf (str_value, sizeof (str_value), "%d",
+ ((cursor_info->window)->buffer)->number);
+ hashtable_set (hash_info, "_buffer_number", str_value);
+ hashtable_set (hash_info, "_buffer_plugin",
+ plugin_get_name (((cursor_info->window)->buffer)->plugin));
+ hashtable_set (hash_info, "_buffer_name",
+ ((cursor_info->window)->buffer)->name);
+ }
hashtable_set (hash_info, "_bar_name",
(cursor_info->bar_window) ?
((cursor_info->bar_window)->bar)->name : NULL);
diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c
index 6edc6d797..ce19de112 100644
--- a/src/gui/curses/gui-curses-key.c
+++ b/src/gui/curses/gui-curses-key.c
@@ -237,34 +237,35 @@ gui_key_default_bindings (int context)
BIND(/* m-left */ "meta2-1;3D", "/cursor move area_left");
BIND(/* m-right */ "meta-meta2-C", "/cursor move area_right");
BIND(/* m-right */ "meta2-1;3C", "/cursor move area_right");
- BIND(/* b */ "@item(buffer_nicklist):b", "/ban ${nick}");
- BIND(/* k */ "@item(buffer_nicklist):k", "/kick ${nick}");
- BIND(/* K */ "@item(buffer_nicklist):K", "/kickban ${nick}");
- BIND(/* q */ "@item(buffer_nicklist):q", "/query ${nick};/cursor stop");
- BIND(/* w */ "@item(buffer_nicklist):w", "/whois ${nick}");
+ BIND(/* b */ "@item(buffer_nicklist):b", "/window ${_window_number};/ban ${nick}");
+ BIND(/* k */ "@item(buffer_nicklist):k", "/window ${_window_number};/kick ${nick}");
+ BIND(/* K */ "@item(buffer_nicklist):K", "/window ${_window_number};/kickban ${nick}");
+ BIND(/* q */ "@item(buffer_nicklist):q", "/window ${_window_number};/query ${nick};/cursor stop");
+ BIND(/* w */ "@item(buffer_nicklist):w", "/window ${_window_number};/whois ${nick}");
}
else if (context == GUI_KEY_CONTEXT_MOUSE)
{
/* mouse events on chat area */
- BIND("@chat:button1-gesture-left", "/buffer -1");
- BIND("@chat:button1-gesture-right", "/buffer +1");
- BIND("@chat:button1-gesture-left-long", "/buffer 1");
- BIND("@chat:button1-gesture-right-long", "/input jump_last_buffer");
- BIND("@chat:wheelup", "/window scroll_up");
- BIND("@chat:wheeldown", "/window scroll_down");
+ BIND("@chat:button1", "/window ${_window_number}");
+ BIND("@chat:button1-gesture-left", "/window ${_window_number};/buffer -1");
+ BIND("@chat:button1-gesture-right", "/window ${_window_number};/buffer +1");
+ BIND("@chat:button1-gesture-left-long", "/window ${_window_number};/buffer 1");
+ BIND("@chat:button1-gesture-right-long", "/window ${_window_number};/input jump_last_buffer");
+ BIND("@chat:wheelup", "/window scroll_up -window ${_window_number}");
+ BIND("@chat:wheeldown", "/window scroll_down -window ${_window_number}");
/* mouse events on nicklist */
- BIND("@bar(nicklist):button1-gesture-up", "/bar scroll nicklist * -100%");
- BIND("@bar(nicklist):button1-gesture-down", "/bar scroll nicklist * +100%");
- BIND("@bar(nicklist):button1-gesture-up-long", "/bar scroll nicklist * b");
- BIND("@bar(nicklist):button1-gesture-down-long", "/bar scroll nicklist * e");
- BIND("@item(buffer_nicklist):button1", "/query ${nick}");
- BIND("@item(buffer_nicklist):button2", "/whois ${nick}");
- BIND("@item(buffer_nicklist):button1-gesture-left", "/kick ${nick}");
- BIND("@item(buffer_nicklist):button1-gesture-left-long", "/kickban ${nick}");
- BIND("@item(buffer_nicklist):button2-gesture-left", "/ban ${nick}");
+ BIND("@bar(nicklist):button1-gesture-up", "/bar scroll nicklist ${_window_number} -100%");
+ BIND("@bar(nicklist):button1-gesture-down", "/bar scroll nicklist ${_window_number} +100%");
+ BIND("@bar(nicklist):button1-gesture-up-long", "/bar scroll nicklist ${_window_number} b");
+ BIND("@bar(nicklist):button1-gesture-down-long", "/bar scroll nicklist ${_window_number} e");
+ BIND("@item(buffer_nicklist):button1", "/window ${_window_number};/query ${nick}");
+ BIND("@item(buffer_nicklist):button2", "/window ${_window_number};/whois ${nick}");
+ BIND("@item(buffer_nicklist):button1-gesture-left", "/window ${_window_number};/kick ${nick}");
+ BIND("@item(buffer_nicklist):button1-gesture-left-long", "/window ${_window_number};/kickban ${nick}");
+ BIND("@item(buffer_nicklist):button2-gesture-left", "/window ${_window_number};/ban ${nick}");
/* mouse wheel on any bar */
- BIND("@bar(*):wheelup", "/bar scroll ${_bar_name} * -10%");
- BIND("@bar(*):wheeldown", "/bar scroll ${_bar_name} * +10%");
+ BIND("@bar(*):wheelup", "/bar scroll ${_bar_name} ${_window_number} -10%");
+ BIND("@bar(*):wheeldown", "/bar scroll ${_bar_name} ${_window_number} +10%");
/* middle click to enable cursor mode at position */
BIND("@*:button3", "/cursor go ${_x},${_y}");
}
diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c
index 35d07a073..b3873f94b 100644
--- a/src/gui/gui-bar-item.c
+++ b/src/gui/gui-bar-item.c
@@ -62,7 +62,7 @@ char *gui_bar_item_names[GUI_BAR_NUM_ITEMS] =
{ "input_paste", "input_prompt", "input_search", "input_text", "time",
"buffer_count", "buffer_plugin", "buffer_number", "buffer_name",
"buffer_filter", "buffer_nicklist_count", "scroll", "hotlist", "completion",
- "buffer_title", "buffer_nicklist"
+ "buffer_title", "buffer_nicklist", "window_number"
};
char *gui_bar_items_default_for_bars[][2] =
{ { GUI_BAR_DEFAULT_NAME_INPUT,
@@ -1422,6 +1422,28 @@ gui_bar_item_default_buffer_nicklist (void *data, struct t_gui_bar_item *item,
}
/*
+ * gui_bar_item_default_window_number: default item for number of window
+ */
+
+char *
+gui_bar_item_default_window_number (void *data, struct t_gui_bar_item *item,
+ struct t_gui_window *window)
+{
+ char buf[64];
+
+ /* make C compiler happy */
+ (void) data;
+ (void) item;
+
+ if (!window)
+ window = gui_current_window;
+
+ snprintf (buf, sizeof (buf), "%d", window->number);
+
+ return strdup (buf);
+}
+
+/*
* gui_bar_item_focus_buffer_nicklist: focus on nicklist
*/
@@ -1717,6 +1739,13 @@ gui_bar_item_init ()
gui_bar_item_names[GUI_BAR_ITEM_BUFFER_NICKLIST]);
hook_focus (NULL, gui_bar_item_names[GUI_BAR_ITEM_BUFFER_NICKLIST],
&gui_bar_item_focus_buffer_nicklist, NULL);
+
+ /* window number */
+ gui_bar_item_new (NULL,
+ gui_bar_item_names[GUI_BAR_ITEM_WINDOW_NUMBER],
+ &gui_bar_item_default_window_number, NULL);
+ gui_bar_item_hook_signal ("window_closed",
+ gui_bar_item_names[GUI_BAR_ITEM_WINDOW_NUMBER]);
}
/*
diff --git a/src/gui/gui-bar-item.h b/src/gui/gui-bar-item.h
index bcc7b134b..cb4c3c642 100644
--- a/src/gui/gui-bar-item.h
+++ b/src/gui/gui-bar-item.h
@@ -38,6 +38,7 @@ enum t_gui_bar_item_weechat
GUI_BAR_ITEM_COMPLETION,
GUI_BAR_ITEM_BUFFER_TITLE,
GUI_BAR_ITEM_BUFFER_NICKLIST,
+ GUI_BAR_ITEM_WINDOW_NUMBER,
/* number of bar items */
GUI_BAR_NUM_ITEMS,
};
diff --git a/src/gui/gui-bar.c b/src/gui/gui-bar.c
index 74da7e499..baf9a5502 100644
--- a/src/gui/gui-bar.c
+++ b/src/gui/gui-bar.c
@@ -2022,15 +2022,14 @@ gui_bar_update (const char *name)
}
/*
- * gui_bar_scroll: scroll a bar for a buffer
+ * gui_bar_scroll: scroll a bar
* return 1 if scroll is ok, 0 if error
*/
int
-gui_bar_scroll (struct t_gui_bar *bar, struct t_gui_buffer *buffer,
+gui_bar_scroll (struct t_gui_bar *bar, struct t_gui_window *window,
const char *scroll)
{
- struct t_gui_window *ptr_win;
struct t_gui_bar_window *ptr_bar_win;
long number;
char *str, *error;
@@ -2118,22 +2117,16 @@ gui_bar_scroll (struct t_gui_bar *bar, struct t_gui_buffer *buffer,
add_x, scroll_beginning, scroll_end,
add, percent, number);
}
- else
+ else if (window)
{
- for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
+ for (ptr_bar_win = window->bar_windows; ptr_bar_win;
+ ptr_bar_win = ptr_bar_win->next_bar_window)
{
- if (ptr_win->buffer == buffer)
+ if (ptr_bar_win->bar == bar)
{
- for (ptr_bar_win = ptr_win->bar_windows; ptr_bar_win;
- ptr_bar_win = ptr_bar_win->next_bar_window)
- {
- if (ptr_bar_win->bar == bar)
- {
- gui_bar_window_scroll (ptr_bar_win, ptr_win,
- add_x, scroll_beginning, scroll_end,
- add, percent, number);
- }
- }
+ gui_bar_window_scroll (ptr_bar_win, window,
+ add_x, scroll_beginning, scroll_end,
+ add, percent, number);
}
}
}
diff --git a/src/gui/gui-bar.h b/src/gui/gui-bar.h
index cb5e8b8d8..76e141b14 100644
--- a/src/gui/gui-bar.h
+++ b/src/gui/gui-bar.h
@@ -23,7 +23,6 @@
struct t_infolist;
struct t_weechat_plugin;
struct t_gui_window;
-struct t_gui_buffer;
#define GUI_BAR_DEFAULT_NAME_INPUT "input"
#define GUI_BAR_DEFAULT_NAME_TITLE "title"
@@ -151,7 +150,7 @@ extern void gui_bar_create_default_status ();
extern void gui_bar_create_default_nicklist ();
extern void gui_bar_create_default ();
extern void gui_bar_update (const char *name);
-extern int gui_bar_scroll (struct t_gui_bar *bar, struct t_gui_buffer *buffer,
+extern int gui_bar_scroll (struct t_gui_bar *bar, struct t_gui_window *window,
const char *scroll);
extern void gui_bar_free (struct t_gui_bar *bar);
extern void gui_bar_free_all ();
diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h
index 7f54005a5..eae31a665 100644
--- a/src/gui/gui-buffer.h
+++ b/src/gui/gui-buffer.h
@@ -79,7 +79,7 @@ struct t_gui_buffer
*/
struct t_gui_buffer *merge_for_upgrade;
- int number; /* buffer number (for jump/switch) */
+ int number; /* buffer number (first is 1) */
int layout_number; /* the number of buffer saved in */
/* layout */
int layout_applied; /* used when applying layout, to */
diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c
index 34102870e..2f5b342cd 100644
--- a/src/gui/gui-window.c
+++ b/src/gui/gui-window.c
@@ -75,6 +75,25 @@ int gui_window_cursor_y = 0; /* cursor pos on screen */
/*
+ * gui_window_search_by_number: search a window by number
+ */
+
+struct t_gui_window *
+gui_window_search_by_number (int number)
+{
+ struct t_gui_window *ptr_win;
+
+ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
+ {
+ if (ptr_win->number == number)
+ return ptr_win;
+ }
+
+ /* window not found */
+ return NULL;
+}
+
+/*
* gui_window_search_by_xy: get pointer of window displayed at (x,y)
* return NULL if no window is found
*/
@@ -432,6 +451,9 @@ gui_window_new (struct t_gui_window *parent_window, struct t_gui_buffer *buffer,
return NULL;
}
+ /* number */
+ new_window->number = (last_gui_window) ? last_gui_window->number + 1 : 1;
+
/* position & size */
new_window->win_x = x;
new_window->win_y = y;
@@ -555,6 +577,8 @@ gui_window_get_integer (struct t_gui_window *window, const char *property)
{
if (window && property)
{
+ if (string_strcasecmp (property, "number") == 0)
+ return window->number;
if (string_strcasecmp (property, "win_x") == 0)
return window->win_x;
if (string_strcasecmp (property, "win_y") == 0)
@@ -665,6 +689,11 @@ gui_window_set_layout_buffer_name (struct t_gui_window *window,
void
gui_window_free (struct t_gui_window *window)
{
+ struct t_gui_window *ptr_win;
+ int i;
+
+ hook_signal_send ("window_closing", WEECHAT_HOOK_SIGNAL_POINTER, window);
+
if (window->buffer)
gui_buffer_add_value_num_displayed (window->buffer, -1);
@@ -703,6 +732,15 @@ gui_window_free (struct t_gui_window *window)
if (gui_current_window == window)
gui_current_window = gui_windows;
+ i = 1;
+ for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
+ {
+ ptr_win->number = i;
+ i++;
+ }
+
+ hook_signal_send ("window_closed", WEECHAT_HOOK_SIGNAL_POINTER, window);
+
free (window);
}
@@ -735,6 +773,23 @@ gui_window_switch_next (struct t_gui_window *window)
}
/*
+ * gui_window_switch_by_number: switch to window by number
+ */
+
+void
+gui_window_switch_by_number (int number)
+{
+ struct t_gui_window *ptr_win;
+
+ if (!gui_ok)
+ return;
+
+ ptr_win = gui_window_search_by_number (number);
+ if (ptr_win)
+ gui_window_switch (ptr_win);
+}
+
+/*
* gui_window_switch_by_buffer: switch to next window displaying a buffer
*/
@@ -1308,6 +1363,7 @@ gui_window_hdata_window_cb (void *data, const char *hdata_name)
hdata = hdata_new (NULL, hdata_name, "prev_window", "next_window");
if (hdata)
{
+ HDATA_VAR(struct t_gui_window, number, INTEGER, NULL);
HDATA_VAR(struct t_gui_window, win_x, INTEGER, NULL);
HDATA_VAR(struct t_gui_window, win_y, INTEGER, NULL);
HDATA_VAR(struct t_gui_window, win_width, INTEGER, NULL);
@@ -1413,6 +1469,8 @@ gui_window_add_to_infolist (struct t_infolist *infolist,
if (!infolist_new_var_pointer (ptr_item, "pointer", window))
return 0;
+ if (!infolist_new_var_integer (ptr_item, "number", window->number))
+ return 0;
if (!infolist_new_var_integer (ptr_item, "x", window->win_x))
return 0;
if (!infolist_new_var_integer (ptr_item, "y", window->win_y))
@@ -1466,6 +1524,7 @@ gui_window_print_log ()
{
log_printf ("");
log_printf ("[window (addr:0x%lx)]", ptr_window);
+ log_printf (" number. . . . . . . : %d", ptr_window->number);
log_printf (" win_x . . . . . . . : %d", ptr_window->win_x);
log_printf (" win_y . . . . . . . : %d", ptr_window->win_y);
log_printf (" win_width . . . . . : %d", ptr_window->win_width);
diff --git a/src/gui/gui-window.h b/src/gui/gui-window.h
index 9bb76623a..54b405a9a 100644
--- a/src/gui/gui-window.h
+++ b/src/gui/gui-window.h
@@ -38,6 +38,8 @@ extern int gui_window_cursor_x, gui_window_cursor_y;
struct t_gui_window
{
+ int number; /* window number (first is 1) */
+
/* global position & size */
int win_x, win_y; /* position of window */
int win_width, win_height; /* window geometry */
@@ -119,6 +121,7 @@ extern struct t_gui_window_tree *gui_windows_tree;
/* window functions */
+extern struct t_gui_window *gui_window_search_by_number (int number);
extern struct t_gui_window *gui_window_search_by_xy (int x, int y);
extern void gui_window_ask_refresh (int refresh);
extern int gui_window_tree_init (struct t_gui_window *window);
@@ -148,6 +151,7 @@ extern void gui_window_set_layout_buffer_name (struct t_gui_window *window,
extern void gui_window_free (struct t_gui_window *window);
extern void gui_window_switch_previous (struct t_gui_window *window);
extern void gui_window_switch_next (struct t_gui_window *window);
+extern void gui_window_switch_by_number (int number);
extern void gui_window_switch_by_buffer (struct t_gui_window *window,
int buffer_number);
extern void gui_window_scroll (struct t_gui_window *window, char *scroll);