summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/buflist/CMakeLists.txt3
-rw-r--r--src/plugins/buflist/Makefile.am4
-rw-r--r--src/plugins/buflist/buflist-bar-item.c14
-rw-r--r--src/plugins/buflist/buflist-bar-item.h2
-rw-r--r--src/plugins/buflist/buflist-config.c29
-rw-r--r--src/plugins/buflist/buflist-config.h3
-rw-r--r--src/plugins/buflist/buflist-mouse.c302
-rw-r--r--src/plugins/buflist/buflist-mouse.h28
-rw-r--r--src/plugins/buflist/buflist.c5
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 ();