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

core: add function gui_buffer_new_props (issue #1759)

This function allows to create a buffer and set properties via a hashtable,
before the signal "buffer_opened" is sent.
This commit is contained in:
Sébastien Helleu
2022-03-07 21:37:25 +01:00
parent 310b4dd2a0
commit fbbed9fbf7
7 changed files with 165 additions and 50 deletions
+1 -1
View File
@@ -71,7 +71,7 @@ hook_line (struct t_weechat_plugin *plugin, const char *buffer_type,
new_hook->hook_data = new_hook_line;
new_hook_line->callback = callback;
if (!buffer_type || !buffer_type[0])
new_hook_line->buffer_type = GUI_BUFFER_TYPE_FORMATTED;
new_hook_line->buffer_type = GUI_BUFFER_TYPE_DEFAULT;
else if (strcmp (buffer_type, "*") == 0)
new_hook_line->buffer_type = -1;
else
+6 -6
View File
@@ -628,9 +628,9 @@ COMMAND_CALLBACK(buffer)
ptr_buffer = gui_buffer_search_by_name (PLUGIN_CORE, argv[arg_name]);
if (!ptr_buffer)
{
ptr_buffer = gui_buffer_new_user (argv[arg_name]);
if (ptr_buffer && type_free)
gui_buffer_set (ptr_buffer, "type", "free");
ptr_buffer = gui_buffer_new_user (
argv[arg_name],
(type_free) ? GUI_BUFFER_TYPE_FREE : GUI_BUFFER_TYPE_DEFAULT);
}
if (ptr_buffer && switch_to_buffer)
gui_window_switch_to_buffer (gui_current_window, ptr_buffer, 1);
@@ -5137,9 +5137,9 @@ COMMAND_CALLBACK(print)
argv[arg_new_buffer_name]);
if (!ptr_buffer)
{
ptr_buffer = gui_buffer_new_user (argv[arg_new_buffer_name]);
if (ptr_buffer && new_buffer_type_free)
gui_buffer_set (ptr_buffer, "type", "free");
ptr_buffer = gui_buffer_new_user (
argv[arg_new_buffer_name],
(new_buffer_type_free) ? GUI_BUFFER_TYPE_FREE : GUI_BUFFER_TYPE_DEFAULT);
}
}
else
+24 -9
View File
@@ -204,20 +204,35 @@ secure_buffer_assign ()
void
secure_buffer_open ()
{
struct t_hashtable *properties;
if (!secure_buffer)
{
secure_buffer = gui_buffer_new (NULL, SECURE_BUFFER_NAME,
&secure_buffer_input_cb, NULL, NULL,
&secure_buffer_close_cb, NULL, NULL);
if (secure_buffer)
properties = hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (properties)
{
if (!secure_buffer->short_name)
secure_buffer->short_name = strdup (SECURE_BUFFER_NAME);
gui_buffer_set (secure_buffer, "type", "free");
gui_buffer_set (secure_buffer, "localvar_set_no_log", "1");
gui_buffer_set (secure_buffer, "key_bind_meta-v", "/secure toggle_values");
hashtable_set (properties, "type", "free");
hashtable_set (properties, "localvar_set_no_log", "1");
hashtable_set (properties,
"key_bind_meta-v", "/secure toggle_values");
}
secure_buffer = gui_buffer_new_props (
NULL, SECURE_BUFFER_NAME, properties,
&secure_buffer_input_cb, NULL, NULL,
&secure_buffer_close_cb, NULL, NULL);
if (secure_buffer && !secure_buffer->short_name)
secure_buffer->short_name = strdup (SECURE_BUFFER_NAME);
secure_buffer_display_values = 0;
if (properties)
hashtable_free (properties);
}
if (!secure_buffer)
+22 -10
View File
@@ -1257,20 +1257,32 @@ gui_color_buffer_assign ()
void
gui_color_buffer_open ()
{
struct t_hashtable *properties;
if (!gui_color_buffer)
{
gui_color_buffer = gui_buffer_new (
NULL, GUI_COLOR_BUFFER_NAME,
properties = hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (properties)
{
hashtable_set (properties, "type", "free");
hashtable_set (properties, "localvar_set_no_log", "1");
hashtable_set (properties, "key_bind_meta-c", "/color switch");
}
gui_color_buffer = gui_buffer_new_props (
NULL, GUI_COLOR_BUFFER_NAME, properties,
&gui_color_buffer_input_cb, NULL, NULL,
&gui_color_buffer_close_cb, NULL, NULL);
if (gui_color_buffer)
{
if (!gui_color_buffer->short_name)
gui_color_buffer->short_name = strdup (GUI_COLOR_BUFFER_NAME);
gui_buffer_set (gui_color_buffer, "type", "free");
gui_buffer_set (gui_color_buffer, "localvar_set_no_log", "1");
gui_buffer_set (gui_color_buffer, "key_bind_meta-c", "/color switch");
}
if (gui_color_buffer && !gui_color_buffer->short_name)
gui_color_buffer->short_name = strdup (GUI_COLOR_BUFFER_NAME);
if (properties)
hashtable_free (properties);
}
if (!gui_color_buffer)
+92 -21
View File
@@ -79,6 +79,9 @@ char *gui_buffer_reserved_names[] =
NULL
};
int gui_buffer_set_signals = 1; /* 0 to disable signals sent in */
/* function gui_buffer_set */
char *gui_buffer_type_string[GUI_BUFFER_NUM_TYPES] =
{ "formatted", "free" };
@@ -630,25 +633,43 @@ gui_buffer_is_reserved_name (const char *name)
}
/*
* Creates a new buffer in current window.
* Applies buffer properties (callback of hashtable_map).
*/
void
gui_buffer_apply_properties_cb (void *data,
struct t_hashtable *hashtable,
const void *key, const void *value)
{
/* make C compiler happy */
(void) hashtable;
gui_buffer_set ((struct t_gui_buffer *)data,
(const char *)key,
(const char *)value);
}
/*
* Creates a new buffer in current window with some optional properties.
*
* Returns pointer to new buffer, NULL if error.
*/
struct t_gui_buffer *
gui_buffer_new (struct t_weechat_plugin *plugin,
const char *name,
int (*input_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer,
const char *input_data),
const void *input_callback_pointer,
void *input_callback_data,
int (*close_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer),
const void *close_callback_pointer,
void *close_callback_data)
gui_buffer_new_props (struct t_weechat_plugin *plugin,
const char *name,
struct t_hashtable *properties,
int (*input_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer,
const char *input_data),
const void *input_callback_pointer,
void *input_callback_data,
int (*close_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer),
const void *close_callback_pointer,
void *close_callback_data)
{
struct t_gui_buffer *new_buffer;
int first_buffer_creation;
@@ -694,7 +715,7 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
new_buffer->old_full_name = NULL;
gui_buffer_build_full_name (new_buffer);
new_buffer->short_name = NULL;
new_buffer->type = GUI_BUFFER_TYPE_FORMATTED;
new_buffer->type = GUI_BUFFER_TYPE_DEFAULT;
new_buffer->notify = CONFIG_INTEGER(config_look_buffer_notify_default);
new_buffer->num_displayed = 0;
new_buffer->active = 1;
@@ -823,6 +844,10 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
/* assign this buffer to windows of layout */
gui_layout_window_assign_buffer (new_buffer);
/* apply properties */
if (properties)
hashtable_map (properties, &gui_buffer_apply_properties_cb, new_buffer);
if (first_buffer_creation)
{
gui_buffer_visited_add (new_buffer);
@@ -836,6 +861,35 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
return new_buffer;
}
/*
* Creates a new buffer in current window.
*
* Returns pointer to new buffer, NULL if error.
*/
struct t_gui_buffer *
gui_buffer_new (struct t_weechat_plugin *plugin,
const char *name,
int (*input_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer,
const char *input_data),
const void *input_callback_pointer,
void *input_callback_data,
int (*close_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer),
const void *close_callback_pointer,
void *close_callback_data)
{
return gui_buffer_new_props (
plugin,
name,
NULL, /* properties */
input_callback, input_callback_pointer, input_callback_data,
close_callback, close_callback_pointer, close_callback_data);
}
/*
* Input callback for user buffers.
*/
@@ -863,15 +917,32 @@ gui_buffer_user_input_cb (const void *pointer, void *data,
*/
struct t_gui_buffer *
gui_buffer_new_user (const char *name)
gui_buffer_new_user (const char *name, enum t_gui_buffer_type buffer_type)
{
struct t_hashtable *properties;
struct t_gui_buffer *new_buffer;
new_buffer = gui_buffer_new (NULL, name,
&gui_buffer_user_input_cb, NULL, NULL,
NULL, NULL, NULL);
if (new_buffer)
gui_buffer_set (new_buffer, "localvar_set_type", "user");
properties = hashtable_new (
32,
WEECHAT_HASHTABLE_STRING,
WEECHAT_HASHTABLE_STRING,
NULL, NULL);
if (properties)
{
if (buffer_type != GUI_BUFFER_TYPE_DEFAULT)
{
hashtable_set (properties,
"type", gui_buffer_type_string[buffer_type]);
}
hashtable_set (properties, "localvar_set_type", "user");
}
new_buffer = gui_buffer_new_props (NULL, name, properties,
&gui_buffer_user_input_cb, NULL, NULL,
NULL, NULL, NULL);
if (properties)
hashtable_free (properties);
return new_buffer;
}
+18 -1
View File
@@ -45,6 +45,8 @@ enum t_gui_buffer_notify
GUI_BUFFER_NUM_NOTIFY,
};
#define GUI_BUFFER_TYPE_DEFAULT GUI_BUFFER_TYPE_FORMATTED
#define GUI_BUFFER_MAIN "weechat"
#define GUI_BUFFERS_MAX 10000
@@ -264,6 +266,20 @@ extern void gui_buffer_local_var_remove (struct t_gui_buffer *buffer,
extern void gui_buffer_notify_set_all ();
extern void gui_buffer_input_buffer_init (struct t_gui_buffer *buffer);
extern int gui_buffer_is_reserved_name (const char *name);
extern struct t_gui_buffer *gui_buffer_new_props (struct t_weechat_plugin *plugin,
const char *name,
struct t_hashtable *properties,
int (*input_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer,
const char *input_data),
const void *input_callback_pointer,
void *input_callback_data,
int (*close_callback)(const void *pointer,
void *data,
struct t_gui_buffer *buffer),
const void *close_callback_pointer,
void *close_callback_data);
extern struct t_gui_buffer *gui_buffer_new (struct t_weechat_plugin *plugin,
const char *name,
int (*input_callback)(const void *pointer,
@@ -277,7 +293,8 @@ extern struct t_gui_buffer *gui_buffer_new (struct t_weechat_plugin *plugin,
struct t_gui_buffer *buffer),
const void *close_callback_pointer,
void *close_callback_data);
extern struct t_gui_buffer *gui_buffer_new_user (const char *name);
extern struct t_gui_buffer *gui_buffer_new_user (const char *name,
enum t_gui_buffer_type buffer_type);
extern void gui_buffer_user_set_callbacks ();
extern int gui_buffer_valid (struct t_gui_buffer *buffer);
extern char *gui_buffer_string_replace_local_var (struct t_gui_buffer *buffer,
+2 -2
View File
@@ -690,8 +690,8 @@ gui_input_search_switch_where (struct t_gui_buffer *buffer)
window = gui_window_search_with_buffer (buffer);
if (window && (window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED))
{
/* it's not possible to change that in a buffer with free content */
if (window->buffer->type == GUI_BUFFER_TYPE_FREE)
/* it's not possible to change that in a buffer not "formatted" */
if (window->buffer->type != GUI_BUFFER_TYPE_FORMATTED)
return;
if (window->buffer->text_search_where == GUI_TEXT_SEARCH_IN_MESSAGE)