diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2017-03-30 20:39:37 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2017-03-30 20:39:37 +0200 |
commit | f0c8da2f05a4b463cbc7d03341ee8a7a6db45f61 (patch) | |
tree | 956d53fc5887b18b917b4857b06bc3eaffd8585e /src | |
parent | 467f482ea6653127d49ea7b6c487f9d51929d232 (diff) | |
download | weechat-f0c8da2f05a4b463cbc7d03341ee8a7a6db45f61.zip |
buflist: add mouse support
New options:
- buflist.look.mouse_jump_visited_buffer
- buflist.look.mouse_move_buffer
- buflist.look.mouse_wheel
New keys added by buflist plugin:
- @item(buflist):button1* => hsignal:buflist_mouse
- @item(buflist):button2* => hsignal:buflist_mouse
- @bar(buflist):ctrl-wheelup => hsignal:buflist_mouse
- @bar(buflist):ctrl-wheeldown => hsignal:buflist_mouse
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/buflist/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/plugins/buflist/Makefile.am | 4 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-bar-item.c | 14 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-bar-item.h | 2 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-config.c | 29 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-config.h | 3 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-mouse.c | 302 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-mouse.h | 28 | ||||
-rw-r--r-- | src/plugins/buflist/buflist.c | 5 |
9 files changed, 388 insertions, 2 deletions
diff --git a/src/plugins/buflist/CMakeLists.txt b/src/plugins/buflist/CMakeLists.txt index f19e425b7..21d6f0e00 100644 --- a/src/plugins/buflist/CMakeLists.txt +++ b/src/plugins/buflist/CMakeLists.txt @@ -21,7 +21,8 @@ add_library(buflist MODULE buflist.c buflist.h buflist-bar-item.c buflist-bar-item.h buflist-command.c buflist-command.h -buflist-config.c buflist-config.h) +buflist-config.c buflist-config.h +buflist-mouse.c buflist-mouse.h) set_target_properties(buflist PROPERTIES PREFIX "") target_link_libraries(buflist) diff --git a/src/plugins/buflist/Makefile.am b/src/plugins/buflist/Makefile.am index dabf9c70d..2cc5a3944 100644 --- a/src/plugins/buflist/Makefile.am +++ b/src/plugins/buflist/Makefile.am @@ -30,7 +30,9 @@ buflist_la_SOURCES = buflist.c \ buflist-command.c \ buflist-command.h \ buflist-config.c \ - buflist-config.h + buflist-config.h \ + buflist-mouse.c \ + buflist-mouse.h buflist_la_LDFLAGS = -module -no-undefined buflist_la_LIBADD = $(BUFLIST_LFLAGS) diff --git a/src/plugins/buflist/buflist-bar-item.c b/src/plugins/buflist/buflist-bar-item.c index 4a492b649..069aed700 100644 --- a/src/plugins/buflist/buflist-bar-item.c +++ b/src/plugins/buflist/buflist-bar-item.c @@ -34,6 +34,7 @@ struct t_hashtable *buflist_hashtable_pointers = NULL; struct t_hashtable *buflist_hashtable_extra_vars = NULL; struct t_hashtable *buflist_hashtable_options = NULL; struct t_hashtable *buflist_hashtable_options_conditions = NULL; +struct t_arraylist *buflist_list_buffers = NULL; /* @@ -92,6 +93,11 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, snprintf (str_format_number_empty, sizeof (str_format_number_empty), "%%-%ds", length_max_number); + if (buflist_list_buffers) + weechat_arraylist_free (buflist_list_buffers); + buflist_list_buffers = weechat_arraylist_new (16, 0, 1, + NULL, NULL, NULL, NULL); + buffers = buflist_sort_buffers (); for (i = 0; i < weechat_arraylist_size (buffers); i++) @@ -114,6 +120,8 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, if (!rc) continue; + weechat_arraylist_add (buflist_list_buffers, ptr_buffer); + current_buffer = (ptr_buffer == ptr_current_buffer); ptr_hotlist = weechat_hdata_pointer (buflist_hdata_buffer, @@ -373,4 +381,10 @@ buflist_bar_item_end () weechat_hashtable_free (buflist_hashtable_options_conditions); buflist_hashtable_options_conditions = NULL; + + if (buflist_list_buffers) + { + weechat_arraylist_free (buflist_list_buffers); + buflist_list_buffers = NULL; + } } diff --git a/src/plugins/buflist/buflist-bar-item.h b/src/plugins/buflist/buflist-bar-item.h index caf861f62..c015e87ad 100644 --- a/src/plugins/buflist/buflist-bar-item.h +++ b/src/plugins/buflist/buflist-bar-item.h @@ -22,6 +22,8 @@ #define BUFLIST_BAR_ITEM_NAME "buflist" +extern struct t_arraylist *buflist_list_buffers; + extern int buflist_bar_item_init (); extern void buflist_bar_item_end (); diff --git a/src/plugins/buflist/buflist-config.c b/src/plugins/buflist/buflist-config.c index 76f7bdf7e..8c814fc9c 100644 --- a/src/plugins/buflist/buflist-config.c +++ b/src/plugins/buflist/buflist-config.c @@ -32,6 +32,9 @@ struct t_config_file *buflist_config_file = NULL; /* buflist config, look section */ struct t_config_option *buflist_config_look_display_conditions; +struct t_config_option *buflist_config_look_mouse_jump_visited_buffer; +struct t_config_option *buflist_config_look_mouse_move_buffer; +struct t_config_option *buflist_config_look_mouse_wheel; struct t_config_option *buflist_config_look_signals_refresh; struct t_config_option *buflist_config_look_sort; @@ -218,6 +221,32 @@ buflist_config_init () NULL, NULL, NULL, &buflist_config_change_signals_refresh, NULL, NULL, NULL, NULL, NULL); + buflist_config_look_mouse_jump_visited_buffer = weechat_config_new_option ( + buflist_config_file, ptr_section, + "mouse_jump_visited_buffer", "boolean", + N_("if enabled, clicks with left/right buttons on the line with " + "current buffer jump to previous/next visited buffer"), + NULL, 0, 0, "off", NULL, 0, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL); + buflist_config_look_mouse_move_buffer = weechat_config_new_option ( + buflist_config_file, ptr_section, + "mouse_move_buffer", "boolean", + N_("if enabled, mouse gestures (drag & drop) move buffers in list"), + NULL, 0, 0, "on", NULL, 0, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL); + buflist_config_look_mouse_wheel = weechat_config_new_option ( + buflist_config_file, ptr_section, + "mouse_wheel", "boolean", + N_("if enabled, mouse wheel up/down actions jump to previous/next " + "buffer in list"), + NULL, 0, 0, "on", NULL, 0, + NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL); buflist_config_look_signals_refresh = weechat_config_new_option ( buflist_config_file, ptr_section, "signals_refresh", "string", diff --git a/src/plugins/buflist/buflist-config.h b/src/plugins/buflist/buflist-config.h index e0c89ff8f..027bcd98a 100644 --- a/src/plugins/buflist/buflist-config.h +++ b/src/plugins/buflist/buflist-config.h @@ -25,6 +25,9 @@ extern struct t_config_file *buflist_config_file; extern struct t_config_option *buflist_config_look_display_conditions; +extern struct t_config_option *buflist_config_look_mouse_jump_visited_buffer; +extern struct t_config_option *buflist_config_look_mouse_move_buffer; +extern struct t_config_option *buflist_config_look_mouse_wheel; extern struct t_config_option *buflist_config_look_signals_refresh; extern struct t_config_option *buflist_config_look_sort; diff --git a/src/plugins/buflist/buflist-mouse.c b/src/plugins/buflist/buflist-mouse.c new file mode 100644 index 000000000..28318d1aa --- /dev/null +++ b/src/plugins/buflist/buflist-mouse.c @@ -0,0 +1,302 @@ +/* + * buflist-mouse.c - mouse actions for buflist + * + * Copyright (C) 2003-2017 Sébastien Helleu <flashcode@flashtux.org> + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat 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 3 of the License, or + * (at your option) any later version. + * + * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "../weechat-plugin.h" +#include "buflist.h" +#include "buflist-mouse.h" +#include "buflist-bar-item.h" +#include "buflist-config.h" + + +/* + * Callback called when a mouse action occurs in buflist bar item. + */ + +struct t_hashtable * +buflist_focus_cb (const void *pointer, void *data, struct t_hashtable *info) +{ + const char *ptr_bar_item_name, *ptr_bar_item_line; + long item_line; + char *error, str_pointer[128], str_number[32]; + struct t_gui_buffer *ptr_buffer; + struct t_hdata *ptr_hdata; + + /* make C compiler happy */ + (void) pointer; + (void) data; + + if (!buflist_list_buffers) + goto error; + + /* check bar item name */ + ptr_bar_item_name = weechat_hashtable_get (info, "_bar_item_name"); + if (strcmp (ptr_bar_item_name, BUFLIST_BAR_ITEM_NAME) != 0) + goto error; + + /* check bar item line */ + ptr_bar_item_line = weechat_hashtable_get (info, "_bar_item_line"); + if (!ptr_bar_item_line) + goto error; + item_line = strtol (ptr_bar_item_line, &error, 10); + if (!error || error[0]) + goto error; + if ((item_line < 0) + || (item_line >= weechat_arraylist_size (buflist_list_buffers))) + { + goto error; + } + + /* check if buffer pointer is still valid */ + ptr_buffer = weechat_arraylist_get (buflist_list_buffers, item_line); + if (!ptr_buffer) + goto error; + ptr_hdata = weechat_hdata_get ("buffer"); + if (!weechat_hdata_check_pointer ( + ptr_hdata, + weechat_hdata_get_list (ptr_hdata, "gui_buffers"), + ptr_buffer)) + { + goto error; + } + + snprintf (str_pointer, sizeof (str_pointer), + "0x%lx", (long unsigned int)ptr_buffer); + snprintf (str_number, sizeof (str_number), "%d", + weechat_buffer_get_integer (ptr_buffer, "number")); + + weechat_hashtable_set (info, "pointer", str_pointer); + weechat_hashtable_set (info, "number", str_number); + weechat_hashtable_set (info, "full_name", + weechat_buffer_get_string (ptr_buffer, "full_name")); + + return info; + +error: + weechat_hashtable_set (info, "pointer", ""); + weechat_hashtable_set (info, "number", "-1"); + weechat_hashtable_set (info, "full_name", ""); + + return info; +} + +/* + * Moves a buffer after a mouse gesture in buflist bar. + */ + +void +buflist_mouse_move_buffer (const char *key, struct t_gui_buffer *buffer, + int number2) +{ + struct t_hdata *ptr_hdata; + struct t_gui_buffer *ptr_last_gui_buffer; + char str_command[128]; + + if (!weechat_config_boolean (buflist_config_look_mouse_move_buffer)) + return; + + if (number2 < 0) + { + /* + * if number is now known (end of gesture outside buflist), + * then set it according to mouse gesture + */ + number2 = 1; + if (weechat_string_match (key, "*gesture-right", 1) + || weechat_string_match (key, "*gesture-down", 1)) + { + number2 = 999999; + ptr_hdata = weechat_hdata_get ("buffer"); + ptr_last_gui_buffer = weechat_hdata_get_list (ptr_hdata, + "last_gui_buffer"); + if (ptr_last_gui_buffer) + { + number2 = weechat_hdata_integer (ptr_hdata, + ptr_last_gui_buffer, + "number") + 1; + } + } + } + + snprintf (str_command, sizeof (str_command), + "/buffer move %d", number2); + weechat_command (buffer, str_command); +} + +/* + * Callback called when a mouse action occurs in buflist bar or bar item. + */ + +int +buflist_hsignal_cb (const void *pointer, void *data, const char *signal, + struct t_hashtable *hashtable) +{ + const char *ptr_key, *ptr_pointer, *ptr_number, *ptr_number2; + const char *ptr_full_name; + struct t_gui_buffer *ptr_buffer; + char *error, str_command[1024]; + long number, number2; + long unsigned int value; + int rc, current_buffer_number; + + /* make C compiler happy */ + (void) pointer; + (void) data; + (void) signal; + + ptr_key = weechat_hashtable_get (hashtable, "_key"); + ptr_pointer = weechat_hashtable_get (hashtable, "pointer"); + ptr_number = weechat_hashtable_get (hashtable, "number"); + ptr_number2 = weechat_hashtable_get (hashtable, "number2"); + ptr_full_name = weechat_hashtable_get (hashtable, "full_name"); + + if (!ptr_key || !ptr_pointer || !ptr_number || !ptr_number2 + || !ptr_full_name) + { + return WEECHAT_RC_OK; + } + + rc = sscanf (ptr_pointer, "%lx", &value); + if ((rc == EOF) || (rc == 0)) + return WEECHAT_RC_OK; + ptr_buffer = (struct t_gui_buffer *)value; + + number = strtol (ptr_number, &error, 10); + if (!error || error[0]) + return WEECHAT_RC_OK; + number2 = strtol (ptr_number2, &error, 10); + if (!error || error[0]) + return WEECHAT_RC_OK; + + current_buffer_number = weechat_buffer_get_integer ( + weechat_current_buffer (), "number"); + + if (strcmp (ptr_key, "button1") == 0) + { + /* left mouse button */ + if (number == number2) + { + if (weechat_config_boolean ( + buflist_config_look_mouse_jump_visited_buffer) + && (current_buffer_number == number)) + { + weechat_command (NULL, "/input jump_previously_visited_buffer"); + } + else + { + snprintf (str_command, sizeof (str_command), + "/buffer %s", ptr_full_name); + weechat_command (NULL, str_command); + } + } + else + { + /* move buffer */ + buflist_mouse_move_buffer (ptr_key, ptr_buffer, number2); + } + } + else if (strcmp (ptr_key, "button2") == 0) + { + if (weechat_config_boolean ( + buflist_config_look_mouse_jump_visited_buffer) + && (current_buffer_number == number)) + { + weechat_command (NULL, "/input jump_next_visited_buffer"); + } + } + else if (weechat_string_match (ptr_key, "*wheelup", 1)) + { + if (weechat_config_boolean (buflist_config_look_mouse_wheel)) + { + weechat_command (NULL, "/buffer -1"); + } + } + else if (weechat_string_match (ptr_key, "*wheeldown", 1)) + { + if (weechat_config_boolean (buflist_config_look_mouse_wheel)) + { + weechat_command (NULL, "/buffer +1"); + } + } + else + { + /* move buffer */ + buflist_mouse_move_buffer (ptr_key, ptr_buffer, number2); + } + + return WEECHAT_RC_OK; +} + +/* + * Initializes mouse. + * + * Returns: + * 1: OK + * 0: error + */ + +int +buflist_mouse_init () +{ + struct t_hashtable *keys; + + keys = weechat_hashtable_new (4, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, NULL); + if (!keys) + return 0; + + weechat_hook_focus (BUFLIST_BAR_ITEM_NAME, &buflist_focus_cb, NULL, NULL); + + weechat_hook_hsignal(BUFLIST_MOUSE_HSIGNAL, + &buflist_hsignal_cb, NULL, NULL); + + weechat_hashtable_set (keys, + "@item(" BUFLIST_BAR_ITEM_NAME "):button1*", + "hsignal:" BUFLIST_MOUSE_HSIGNAL); + weechat_hashtable_set (keys, + "@item(" BUFLIST_BAR_ITEM_NAME "):button2*", + "hsignal:" BUFLIST_MOUSE_HSIGNAL); + weechat_hashtable_set (keys, + "@bar(" BUFLIST_BAR_NAME "):ctrl-wheelup", + "hsignal:" BUFLIST_MOUSE_HSIGNAL); + weechat_hashtable_set (keys, + "@bar(" BUFLIST_BAR_NAME "):ctrl-wheeldown", + "hsignal:" BUFLIST_MOUSE_HSIGNAL); + weechat_key_bind ("mouse", keys); + + weechat_hashtable_free (keys); + + return 1; +} + +/* + * Ends mouse. + */ + +void +buflist_mouse_end () +{ +} diff --git a/src/plugins/buflist/buflist-mouse.h b/src/plugins/buflist/buflist-mouse.h new file mode 100644 index 000000000..df4c4e393 --- /dev/null +++ b/src/plugins/buflist/buflist-mouse.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2003-2017 Sébastien Helleu <flashcode@flashtux.org> + * + * This file is part of WeeChat, the extensible chat client. + * + * WeeChat 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 3 of the License, or + * (at your option) any later version. + * + * WeeChat 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 WeeChat. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef WEECHAT_BUFLIST_MOUSE_H +#define WEECHAT_BUFLIST_MOUSE_H 1 + +#define BUFLIST_MOUSE_HSIGNAL "buflist_mouse" + +extern int buflist_mouse_init (); +extern void buflist_mouse_end (); + +#endif /* WEECHAT_BUFLIST_MOUSE_H */ diff --git a/src/plugins/buflist/buflist.c b/src/plugins/buflist/buflist.c index 4918d2917..08d2889ff 100644 --- a/src/plugins/buflist/buflist.c +++ b/src/plugins/buflist/buflist.c @@ -27,6 +27,7 @@ #include "buflist-bar-item.h" #include "buflist-command.h" #include "buflist-config.h" +#include "buflist-mouse.h" WEECHAT_PLUGIN_NAME(BUFLIST_PLUGIN_NAME); @@ -253,6 +254,8 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) weechat_bar_item_update (BUFLIST_BAR_ITEM_NAME); + buflist_mouse_init (); + return WEECHAT_RC_OK; } @@ -266,6 +269,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin) /* make C compiler happy */ (void) plugin; + buflist_mouse_end (); + buflist_bar_item_end (); buflist_config_write (); |