diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2011-07-29 19:46:02 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2011-07-29 19:46:02 +0200 |
commit | 54a6f42de539e176517be5cce0c6792b5530c459 (patch) | |
tree | 2b61929928cefb576b2f4cb2d83d794f6f108ce3 /src | |
parent | dfd7ed5457cc4df7c75e9f9e61efeaea50b26a75 (diff) | |
download | weechat-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.c | 284 | ||||
-rw-r--r-- | src/core/wee-completion.c | 31 | ||||
-rw-r--r-- | src/core/wee-hook.c | 14 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-key.c | 45 | ||||
-rw-r--r-- | src/gui/gui-bar-item.c | 31 | ||||
-rw-r--r-- | src/gui/gui-bar-item.h | 1 | ||||
-rw-r--r-- | src/gui/gui-bar.c | 25 | ||||
-rw-r--r-- | src/gui/gui-bar.h | 3 | ||||
-rw-r--r-- | src/gui/gui-buffer.h | 2 | ||||
-rw-r--r-- | src/gui/gui-window.c | 59 | ||||
-rw-r--r-- | src/gui/gui-window.h | 4 |
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); |