1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-29 22:36:38 +02:00

buflist: add hotlist format options (for color according to hotlist priority)

This commit is contained in:
Sébastien Helleu
2017-03-08 21:57:16 +01:00
parent c18be9da21
commit da0fea8a60
5 changed files with 202 additions and 51 deletions
+133 -43
View File
@@ -25,28 +25,40 @@
#include "../weechat-plugin.h"
#include "buflist.h"
#include "buflist-bar-item.h"
#include "buflist-config.h"
struct t_gui_bar_item *buflist_bar_item_buflist = NULL;
struct t_hashtable *buflist_hashtable_pointers = NULL;
struct t_hashtable *buflist_hashtable_extra_vars = NULL;
struct t_hashtable *buflist_hashtable_options = NULL;
/*
* Returns content of bar item "buffer_plugin": bar item with buffer plugin.
*/
char *
buflist_bar_item_buflist (const void *pointer, void *data,
struct t_gui_bar_item *item,
struct t_gui_window *window,
struct t_gui_buffer *buffer,
struct t_hashtable *extra_info)
buflist_bar_item_buflist_cb (const void *pointer, void *data,
struct t_gui_bar_item *item,
struct t_gui_window *window,
struct t_gui_buffer *buffer,
struct t_hashtable *extra_info)
{
struct t_hdata *hdata_buffer;
struct t_hdata *hdata_buffer, *hdata_hotlist;
struct t_gui_buffer *ptr_buffer, *ptr_next_buffer, *ptr_current_buffer;
struct t_gui_buffer *ptr_buffer_hotlist;
struct t_gui_hotlist *ptr_hotlist;
char **buflist, *str_buflist;
char str_format_number[32], str_format_number_empty[32];
char str_number[32], str_indent_name[4], *line;
const char *ptr_format, *ptr_format_current, *ptr_name, *ptr_type;
int length_max_number, current_buffer, number, prev_number;
struct t_hashtable *pointers, *extra_vars;
const char *ptr_hotlist_format, *ptr_hotlist_priority;
const char *hotlist_priority_none = "none";
const char *hotlist_priority[4] = { "low", "message", "private",
"highlight" };
int length_max_number, current_buffer, number, prev_number, priority, rc;
/* make C compiler happy */
(void) pointer;
@@ -58,24 +70,6 @@ buflist_bar_item_buflist (const void *pointer, void *data,
prev_number = -1;
pointers = weechat_hashtable_new (8,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_POINTER,
NULL,
NULL);
if (!pointers)
return NULL;
extra_vars = weechat_hashtable_new (32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_POINTER,
NULL,
NULL);
if (!extra_vars)
{
weechat_hashtable_free (pointers);
return NULL;
}
buflist = weechat_string_dyn_alloc (1);
ptr_format = weechat_config_string (buflist_config_format_buffer);
@@ -86,6 +80,8 @@ buflist_bar_item_buflist (const void *pointer, void *data,
hdata_buffer = weechat_hdata_get ("buffer");
ptr_buffer = weechat_hdata_get_list (hdata_buffer, "last_gui_buffer");
hdata_hotlist = weechat_hdata_get ("hotlist");
length_max_number = snprintf (
str_number, sizeof (str_number),
"%d", weechat_hdata_integer (hdata_buffer, ptr_buffer, "number"));
@@ -102,6 +98,19 @@ buflist_bar_item_buflist (const void *pointer, void *data,
current_buffer = (ptr_buffer == ptr_current_buffer);
/* search hotlist for this buffer (level and counts) */
ptr_hotlist = weechat_hdata_get_list (hdata_hotlist, "gui_hotlist");
while (ptr_hotlist)
{
ptr_buffer_hotlist = weechat_hdata_pointer (hdata_hotlist,
ptr_hotlist,
"buffer");
if (ptr_buffer_hotlist == ptr_buffer)
break;
ptr_hotlist = weechat_hdata_move (hdata_hotlist, ptr_hotlist, 1);
}
ptr_name = weechat_hdata_string (hdata_buffer, ptr_buffer,
"short_name");
if (!ptr_name)
@@ -138,31 +147,51 @@ buflist_bar_item_buflist (const void *pointer, void *data,
}
/* set pointers */
weechat_hashtable_set (pointers, "buffer", ptr_buffer);
weechat_hashtable_set (buflist_hashtable_pointers,
"buffer", ptr_buffer);
/* set extra variables */
weechat_hashtable_set (extra_vars, "number", str_number);
weechat_hashtable_set (extra_vars, "indent", str_indent_name);
weechat_hashtable_set (extra_vars, "name", ptr_name);
weechat_hashtable_set (buflist_hashtable_extra_vars,
"number", str_number);
weechat_hashtable_set (buflist_hashtable_extra_vars,
"indent", str_indent_name);
weechat_hashtable_set (buflist_hashtable_extra_vars,
"name", ptr_name);
ptr_hotlist_format = weechat_config_string (buflist_config_format_hotlist_none);
ptr_hotlist_priority = hotlist_priority_none;
if (ptr_hotlist)
{
priority = weechat_hdata_integer (hdata_hotlist, ptr_hotlist,
"priority");
if ((priority >= 0) && (priority < 4))
{
ptr_hotlist_format = weechat_config_string (
buflist_config_format_hotlist[priority]);
ptr_hotlist_priority = hotlist_priority[priority];
}
}
weechat_hashtable_set (buflist_hashtable_extra_vars,
"color_hotlist", ptr_hotlist_format);
weechat_hashtable_set (buflist_hashtable_extra_vars,
"hotlist_priority", ptr_hotlist_priority);
/* build string */
line = weechat_string_eval_expression (
(current_buffer) ? ptr_format_current : ptr_format,
pointers, extra_vars, NULL);
if (!weechat_string_dyn_concat (buflist, line))
{
free (line);
weechat_hashtable_free (extra_vars);
return NULL;
}
buflist_hashtable_pointers,
buflist_hashtable_extra_vars,
buflist_hashtable_options);
/* concatenate string */
rc = weechat_string_dyn_concat (buflist, line);
free (line);
if (!rc)
return NULL;
ptr_buffer = ptr_next_buffer;
}
weechat_hashtable_free (pointers);
weechat_hashtable_free (extra_vars);
str_buflist = *buflist;
weechat_string_dyn_free (buflist, 0);
@@ -171,11 +200,72 @@ buflist_bar_item_buflist (const void *pointer, void *data,
/*
* Initializes buflist bar items.
*
* Returns:
* 1: OK
* 0: error
*/
int
buflist_bar_item_init ()
{
/* create hashtable used by the bar item callback */
buflist_hashtable_pointers = weechat_hashtable_new (
8,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_POINTER,
NULL,
NULL);
if (!buflist_hashtable_pointers)
return 0;
buflist_hashtable_extra_vars = weechat_hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_POINTER,
NULL,
NULL);
if (!buflist_hashtable_extra_vars)
{
weechat_hashtable_free (buflist_hashtable_pointers);
return 0;
}
buflist_hashtable_options = weechat_hashtable_new (
8,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL,
NULL);
if (!buflist_hashtable_options)
{
weechat_hashtable_free (buflist_hashtable_pointers);
weechat_hashtable_free (buflist_hashtable_extra_vars);
return 0;
}
weechat_hashtable_set (buflist_hashtable_options, "extra", "eval");
/* bar items */
buflist_bar_item_buflist = weechat_bar_item_new (
BUFLIST_BAR_ITEM_NAME,
&buflist_bar_item_buflist_cb, NULL, NULL);
return 1;
}
/*
* Ends buflist bar items.
*/
void
buflist_bar_item_init ()
buflist_bar_item_end ()
{
weechat_bar_item_new ("buflist",
&buflist_bar_item_buflist, NULL, NULL);
weechat_bar_item_remove (buflist_bar_item_buflist);
weechat_hashtable_free (buflist_hashtable_pointers);
buflist_hashtable_pointers = NULL;
weechat_hashtable_free (buflist_hashtable_extra_vars);
buflist_hashtable_extra_vars = NULL;
weechat_hashtable_free (buflist_hashtable_options);
buflist_hashtable_options = NULL;
}
+2 -1
View File
@@ -22,6 +22,7 @@
#define BUFLIST_BAR_ITEM_NAME "buflist"
extern void buflist_bar_item_init ();
extern int buflist_bar_item_init ();
extern void buflist_bar_item_end ();
#endif /* WEECHAT_BUFLIST_BAR_ITEM_H */
+56 -3
View File
@@ -24,6 +24,7 @@
#include "../weechat-plugin.h"
#include "buflist.h"
#include "buflist-config.h"
#include "buflist-bar-item.h"
struct t_config_file *buflist_config_file = NULL;
@@ -32,6 +33,8 @@ struct t_config_file *buflist_config_file = NULL;
struct t_config_option *buflist_config_format_buffer;
struct t_config_option *buflist_config_format_buffer_current;
struct t_config_option *buflist_config_format_hotlist[4];
struct t_config_option *buflist_config_format_hotlist_none;
/*
@@ -47,7 +50,7 @@ buflist_config_change_buflist (const void *pointer, void *data,
(void) data;
(void) option;
weechat_bar_item_update ("buflist");
weechat_bar_item_update (BUFLIST_BAR_ITEM_NAME);
}
/*
@@ -87,7 +90,7 @@ buflist_config_init ()
"buffer", "string",
N_("format of each line with a buffer"),
NULL, 0, 0,
"${color:green}${number}.${indent}${color:default}${name}",
"${color:green}${number}.${indent}${color_hotlist}${name}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
@@ -97,7 +100,57 @@ buflist_config_init ()
"buffer_current", "string",
N_("format for the line with current buffer"),
NULL, 0, 0,
"${color:lightgreen,blue}${number}.${indent}${color:*white}${name}",
"${color:lightgreen,blue}${number}.${indent}${color_hotlist}${name}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
NULL, NULL, NULL);
buflist_config_format_hotlist[0] = weechat_config_new_option (
buflist_config_file, ptr_section,
"hotlist_low", "string",
N_("format for a buffer with hotlist level \"low\""),
NULL, 0, 0,
"${color:white}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
NULL, NULL, NULL);
buflist_config_format_hotlist[1] = weechat_config_new_option (
buflist_config_file, ptr_section,
"hotlist_message", "string",
N_("format for a buffer with hotlist level \"message\""),
NULL, 0, 0,
"${color:brown}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
NULL, NULL, NULL);
buflist_config_format_hotlist[2] = weechat_config_new_option (
buflist_config_file, ptr_section,
"hotlist_private", "string",
N_("format for a buffer with hotlist level \"private\""),
NULL, 0, 0,
"${color:green}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
NULL, NULL, NULL);
buflist_config_format_hotlist[3] = weechat_config_new_option (
buflist_config_file, ptr_section,
"hotlist_highlight", "string",
N_("format for a buffer with hotlist level \"highlight\""),
NULL, 0, 0,
"${color:magenta}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
NULL, NULL, NULL);
buflist_config_format_hotlist_none = weechat_config_new_option (
buflist_config_file, ptr_section,
"hotlist_none", "string",
N_("format for a buffer not in hotlist"),
NULL, 0, 0,
"${color:default}",
NULL, 0,
NULL, NULL, NULL,
&buflist_config_change_buflist, NULL, NULL,
+2
View File
@@ -26,6 +26,8 @@ extern struct t_config_file *buflist_config_file;
extern struct t_config_option *buflist_config_format_buffer;
extern struct t_config_option *buflist_config_format_buffer_current;
extern struct t_config_option *buflist_config_format_hotlist[4];
extern struct t_config_option *buflist_config_format_hotlist_none;
extern int buflist_config_init ();
extern int buflist_config_read ();
+9 -4
View File
@@ -53,7 +53,7 @@ buflist_signal_buffer_cb (const void *pointer, void *data,
(void) type_data;
(void) signal_data;
weechat_bar_item_update ("buflist");
weechat_bar_item_update (BUFLIST_BAR_ITEM_NAME);
return WEECHAT_RC_OK;
}
@@ -69,7 +69,7 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
{ "buffer_opened", "buffer_closed", "buffer_merged", "buffer_unmerged",
"buffer_moved", "buffer_renamed", "buffer_switch", "buffer_hidden",
"buffer_unhidden", "buffer_localvar_added", "buffer_localvar_changed",
"window_switch", NULL
"window_switch", "hotlist_changed", NULL
};
int i;
@@ -84,6 +84,9 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
buflist_config_read ();
if (!buflist_bar_item_init ())
return WEECHAT_RC_ERROR;
/* hook some signals */
for (i = 0; signals_buffers[i]; i++)
{
@@ -91,13 +94,13 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
&buflist_signal_buffer_cb, NULL, NULL);
}
buflist_bar_item_init ();
weechat_bar_new (BUFLIST_BAR_NAME, "off", "0", "root", "", "left",
"columns_vertical", "vertical", "0", "0",
"default", "default", "default", "on",
BUFLIST_BAR_ITEM_NAME);
weechat_bar_item_update (BUFLIST_BAR_ITEM_NAME);
return WEECHAT_RC_OK;
}
@@ -111,6 +114,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
/* make C compiler happy */
(void) plugin;
buflist_bar_item_end ();
buflist_config_write ();
buflist_config_free ();