1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

core: create config options for all keys that can be managed with /set and /fset commands

This commit is contained in:
Sébastien Helleu
2023-03-02 20:40:46 +01:00
parent c82df8f22e
commit ccc649d06c
10 changed files with 744 additions and 196 deletions
+37 -25
View File
@@ -3812,8 +3812,10 @@ command_key_display_list (const char *message_no_key,
struct t_gui_key *ptr_key;
if (keys_count == 0)
{
gui_chat_printf (NULL, message_no_key,
gui_key_context_string[context]);
}
else
{
gui_chat_printf (NULL, "");
@@ -3997,7 +3999,7 @@ command_key_reset (int context, const char *key)
COMMAND_CALLBACK(key)
{
struct t_gui_key *ptr_new_key;
int old_keys_count, keys_added, i, context, rc;
int old_keys_count, keys_added, context, rc;
/* make C compiler happy */
(void) pointer;
@@ -4007,17 +4009,20 @@ COMMAND_CALLBACK(key)
/* display all key bindings (current keys) */
if ((argc == 1) || (string_strcmp (argv[1], "list") == 0))
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if ((argc < 3)
|| (string_strcmp (argv[2], gui_key_context_string[i]) == 0))
|| (string_strcmp (argv[2],
gui_key_context_string[context]) == 0))
{
command_key_display_list (_("No key binding defined for "
"context \"%s\""),
/* TRANSLATORS: first "%d" is number of keys */
_("%d key bindings for context "
"\"%s\":"),
i, gui_keys[i], gui_keys_count[i]);
context,
gui_keys[context],
gui_keys_count[context]);
}
}
return WEECHAT_RC_OK;
@@ -4026,12 +4031,13 @@ COMMAND_CALLBACK(key)
/* display redefined or key bindings added */
if (string_strcmp (argv[1], "listdiff") == 0)
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if ((argc < 3)
|| (string_strcmp (argv[2], gui_key_context_string[i]) == 0))
|| (string_strcmp (argv[2],
gui_key_context_string[context]) == 0))
{
command_key_display_listdiff (i);
command_key_display_listdiff (context);
}
}
return WEECHAT_RC_OK;
@@ -4040,19 +4046,20 @@ COMMAND_CALLBACK(key)
/* display default key bindings */
if (string_strcmp (argv[1], "listdefault") == 0)
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if ((argc < 3)
|| (string_strcmp (argv[2], gui_key_context_string[i]) == 0))
|| (string_strcmp (argv[2],
gui_key_context_string[context]) == 0))
{
command_key_display_list (_("No default key binding for "
"context \"%s\""),
/* TRANSLATORS: first "%d" is number of keys */
_("%d default key bindings for "
"context \"%s\":"),
i,
gui_default_keys[i],
gui_default_keys_count[i]);
context,
gui_default_keys[context],
gui_default_keys_count[context]);
}
}
return WEECHAT_RC_OK;
@@ -4258,18 +4265,22 @@ COMMAND_CALLBACK(key)
{
if ((argc >= 3) && (string_strcmp (argv[2], "-yes") == 0))
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if ((argc < 4)
|| (string_strcmp (argv[3], gui_key_context_string[i]) == 0))
|| (string_strcmp (argv[3],
gui_key_context_string[context]) == 0))
{
gui_key_free_all (&gui_keys[i], &last_gui_key[i],
&gui_keys_count[i]);
gui_key_default_bindings (i);
gui_key_free_all (context,
&gui_keys[context],
&last_gui_key[context],
&gui_keys_count[context],
1);
gui_key_default_bindings (context, 1);
gui_chat_printf (NULL,
_("Default key bindings restored for "
"context \"%s\""),
gui_key_context_string[i]);
gui_key_context_string[context]);
}
}
}
@@ -4287,22 +4298,23 @@ COMMAND_CALLBACK(key)
/* add missing keys */
if (string_strcmp (argv[1], "missing") == 0)
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if ((argc < 3)
|| (string_strcmp (argv[2], gui_key_context_string[i]) == 0))
|| (string_strcmp (argv[2],
gui_key_context_string[context]) == 0))
{
old_keys_count = gui_keys_count[i];
old_keys_count = gui_keys_count[context];
gui_key_verbose = 1;
gui_key_default_bindings (i);
gui_key_default_bindings (context, 1);
gui_key_verbose = 0;
keys_added = (gui_keys_count[i] > old_keys_count) ?
gui_keys_count[i] - old_keys_count : 0;
keys_added = (gui_keys_count[context] > old_keys_count) ?
gui_keys_count[context] - old_keys_count : 0;
gui_chat_printf (NULL,
NG_("%d new key added", "%d new keys added "
"(context: \"%s\")", keys_added),
keys_added,
gui_key_context_string[i]);
gui_key_context_string[context]);
}
}
return WEECHAT_RC_OK;
+14 -12
View File
@@ -1648,7 +1648,7 @@ completion_list_add_keys_contexts_cb (const void *pointer, void *data,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion)
{
int i;
int context;
/* make C compiler happy */
(void) pointer;
@@ -1656,9 +1656,9 @@ completion_list_add_keys_contexts_cb (const void *pointer, void *data,
(void) completion_item;
(void) buffer;
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
gui_completion_list_add (completion, gui_key_context_string[i],
gui_completion_list_add (completion, gui_key_context_string[context],
0, WEECHAT_LIST_POS_END);
}
@@ -1675,7 +1675,7 @@ completion_list_add_keys_codes_cb (const void *pointer, void *data,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion)
{
int i;
int context;
struct t_gui_key *ptr_key;
/* make C compiler happy */
@@ -1684,9 +1684,9 @@ completion_list_add_keys_codes_cb (const void *pointer, void *data,
(void) completion_item;
(void) buffer;
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
{
gui_completion_list_add (completion, ptr_key->key,
0, WEECHAT_LIST_POS_SORT);
@@ -1707,7 +1707,7 @@ completion_list_add_keys_codes_for_reset_cb (const void *pointer, void *data,
struct t_gui_buffer *buffer,
struct t_gui_completion *completion)
{
int i;
int context;
struct t_gui_key *ptr_key, *ptr_default_key;
/* make C compiler happy */
@@ -1716,12 +1716,13 @@ completion_list_add_keys_codes_for_reset_cb (const void *pointer, void *data,
(void) completion_item;
(void) buffer;
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
/* keys added or redefined */
for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
{
ptr_default_key = gui_key_search (gui_default_keys[i], ptr_key->key);
ptr_default_key = gui_key_search (gui_default_keys[context],
ptr_key->key);
if (!ptr_default_key
|| (strcmp (ptr_default_key->command, ptr_key->command) != 0))
{
@@ -1731,10 +1732,11 @@ completion_list_add_keys_codes_for_reset_cb (const void *pointer, void *data,
}
/* keys deleted */
for (ptr_default_key = gui_default_keys[i]; ptr_default_key;
for (ptr_default_key = gui_default_keys[context]; ptr_default_key;
ptr_default_key = ptr_default_key->next_key)
{
ptr_key = gui_key_search (gui_keys[i], ptr_default_key->key);
ptr_key = gui_key_search (gui_keys[context],
ptr_default_key->key);
if (!ptr_key)
{
gui_completion_list_add (completion, ptr_default_key->key,
+76 -73
View File
@@ -73,6 +73,9 @@ struct t_config_section *weechat_config_section_proxy = NULL;
struct t_config_section *weechat_config_section_bar = NULL;
struct t_config_section *weechat_config_section_custom_bar_item = NULL;
struct t_config_section *weechat_config_section_notify = NULL;
struct t_config_section *weechat_config_section_key[GUI_KEY_NUM_CONTEXTS] = {
NULL, NULL, NULL, NULL,
};
/* config, startup section */
@@ -1454,7 +1457,7 @@ config_day_change_timer_cb (const void *pointer, void *data,
void
config_weechat_init_after_read ()
{
int i;
int context;
util_setrlimit ();
@@ -1480,10 +1483,10 @@ config_weechat_init_after_read ()
gui_bar_item_custom_use_temp_items ();
/* if no key was found configuration file, then we use default bindings */
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if (!gui_keys[i])
gui_key_default_bindings (i);
if (!gui_keys[context])
gui_key_default_bindings (context, 1);
}
/* apply filters on all buffers */
@@ -1578,17 +1581,20 @@ int
config_weechat_reload_cb (const void *pointer, void *data,
struct t_config_file *config_file)
{
int i, rc;
int context, rc;
/* make C compiler happy */
(void) pointer;
(void) data;
/* remove all keys */
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
gui_key_free_all (&gui_keys[i], &last_gui_key[i],
&gui_keys_count[i]);
gui_key_free_all (context,
&gui_keys[context],
&last_gui_key[context],
&gui_keys_count[context],
1);
}
/* remove all proxies */
@@ -1778,7 +1784,6 @@ config_weechat_palette_change_cb (const void *pointer, void *data,
/* make C compiler happy */
(void) pointer;
(void) data;
(void) option;
error = NULL;
number = (int)strtol (option->name, &error, 10);
@@ -2602,87 +2607,82 @@ config_weechat_filter_write_cb (const void *pointer, void *data,
}
/*
* Reads a key option in WeeChat configuration file.
* Searches key context with the section pointer.
*
* Returns key context, -1 if not found.
*/
int
config_weechat_key_read_cb (const void *pointer, void *data,
struct t_config_file *config_file,
struct t_config_section *section,
const char *option_name, const char *value)
config_weechat_get_key_context (struct t_config_section *section)
{
int context;
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
if (section == weechat_config_section_key[context])
return context;
}
/* this should never happen */
return -1;
}
/*
* Callback called when an option is created in one of these sections:
* key
* key_search
* key_cursor
* key_mouse
*/
int
config_weechat_key_create_option_cb (const void *pointer, void *data,
struct t_config_file *config_file,
struct t_config_section *section,
const char *option_name,
const char *value)
{
int context;
char *pos;
/* make C compiler happy */
(void) pointer;
(void) data;
(void) config_file;
if (option_name)
{
context = GUI_KEY_CONTEXT_DEFAULT;
pos = strchr (section->name, '_');
if (pos)
{
context = gui_key_search_context (pos + 1);
if (context < 0)
context = GUI_KEY_CONTEXT_DEFAULT;
}
if (!value)
return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE;
if (value && value[0])
{
/* bind key (overwrite any binding with same key) */
gui_key_bind (NULL, context, option_name, value);
}
else
{
/* unbind key if no value given */
gui_key_unbind (NULL, context, option_name);
}
}
context = config_weechat_get_key_context (section);
gui_key_bind (NULL, context, option_name, value);
return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE;
}
/*
* Writes section "key" in WeeChat configuration file.
* Callback called when an option is deleted in one of these sections:
* key
* key_search
* key_cursor
* key_mouse
*/
int
config_weechat_key_write_cb (const void *pointer, void *data,
struct t_config_file *config_file,
const char *section_name)
config_weechat_key_delete_option_cb (const void *pointer, void *data,
struct t_config_file *config_file,
struct t_config_section *section,
struct t_config_option *option)
{
struct t_gui_key *ptr_key;
char *pos;
int context;
/* make C compiler happy */
(void) pointer;
(void) data;
(void) config_file;
if (!config_file_write_line (config_file, section_name, NULL))
return WEECHAT_CONFIG_WRITE_ERROR;
context = config_weechat_get_key_context (section);
gui_key_unbind (NULL, context, option->name);
context = GUI_KEY_CONTEXT_DEFAULT;
pos = strchr (section_name, '_');
if (pos)
{
context = gui_key_search_context (pos + 1);
if (context < 0)
context = GUI_KEY_CONTEXT_DEFAULT;
}
for (ptr_key = gui_keys[context]; ptr_key; ptr_key = ptr_key->next_key)
{
if (!config_file_write_line (config_file, ptr_key->key,
"\"%s\"", ptr_key->command))
{
return WEECHAT_CONFIG_WRITE_ERROR;
}
}
return WEECHAT_CONFIG_WRITE_OK;
return WEECHAT_CONFIG_OPTION_UNSET_OK_REMOVED;
}
/*
@@ -2697,7 +2697,7 @@ int
config_weechat_init_options ()
{
struct t_config_section *ptr_section;
int i;
int context;
char section_name[128];
weechat_config_file = config_file_new (
@@ -4946,26 +4946,29 @@ config_weechat_init_options ()
}
/* keys */
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
snprintf (section_name, sizeof (section_name),
"key%s%s",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
snprintf (
section_name, sizeof (section_name),
"key%s%s",
(context == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(context == GUI_KEY_CONTEXT_DEFAULT) ?
"" : gui_key_context_string[context]);
ptr_section = config_file_new_section (
weechat_config_file, section_name,
0, 0,
&config_weechat_key_read_cb, NULL, NULL,
&config_weechat_key_write_cb, NULL, NULL,
&config_weechat_key_write_cb, NULL, NULL,
1, 1,
NULL, NULL, NULL,
NULL, NULL, NULL);
NULL, NULL, NULL,
NULL, NULL, NULL,
&config_weechat_key_create_option_cb, NULL, NULL,
&config_weechat_key_delete_option_cb, NULL, NULL);
if (!ptr_section)
{
config_file_free (weechat_config_file);
weechat_config_file = NULL;
return 0;
}
weechat_config_section_key[context] = ptr_section;
}
return 1;
+2
View File
@@ -132,6 +132,7 @@ extern struct t_config_section *weechat_config_section_proxy;
extern struct t_config_section *weechat_config_section_bar;
extern struct t_config_section *weechat_config_section_custom_bar_item;
extern struct t_config_section *weechat_config_section_notify;
extern struct t_config_section *weechat_config_section_key[];
extern struct t_config_option *config_startup_command_after_plugins;
extern struct t_config_option *config_startup_command_before_plugins;
@@ -387,6 +388,7 @@ extern void config_weechat_debug_set_all ();
extern int config_weechat_notify_set (struct t_gui_buffer *buffer,
const char *notify);
extern void config_get_item_time (char *text_time, int max_length);
extern int config_weechat_get_key_context (struct t_config_section *section);
extern int config_weechat_init ();
extern int config_weechat_read ();
extern int config_weechat_write ();
+9 -4
View File
@@ -45,7 +45,8 @@
#include "../gui-window.h"
#include "gui-curses.h"
#define BIND(key, command) gui_key_default_bind(context, key, command)
#define BIND(key, command) \
gui_key_default_bind(context, key, command, create_option)
/*
@@ -53,21 +54,25 @@
*/
void
gui_key_default_bind (int context, const char *key, const char *command)
gui_key_default_bind (int context, const char *key, const char *command,
int create_option)
{
struct t_gui_key *ptr_key;
ptr_key = gui_key_search (gui_keys[context], key);
if (!ptr_key)
gui_key_new (NULL, context, key, command);
gui_key_new (NULL, context, key, command, create_option);
}
/*
* Creates default key bindings for a given context.
*
* If create_option == 1, config options are created, otherwise keys are just
* added to linked list (gui_keys[]).
*/
void
gui_key_default_bindings (int context)
gui_key_default_bindings (int context, int create_option)
{
int i;
char key_str[32], command[32];
+1 -1
View File
@@ -104,7 +104,7 @@ extern void gui_chat_calculate_line_diff (struct t_gui_window *window,
int *line_pos, int difference);
/* key functions */
extern void gui_key_default_bindings (int context);
extern void gui_key_default_bindings (int context, int create_option);
extern int gui_key_read_cb (const void *pointer, void *data, int fd);
/* window functions */
+7 -5
View File
@@ -2384,11 +2384,13 @@ gui_buffer_set (struct t_gui_buffer *buffer, const char *property,
{
if (strcmp (property + 11, "*") == 0)
{
gui_key_free_all (&buffer->keys, &buffer->last_key,
&buffer->keys_count);
gui_key_free_all (-1, &buffer->keys, &buffer->last_key,
&buffer->keys_count, 0);
}
else
gui_key_unbind (buffer, 0, property + 11);
{
gui_key_unbind (buffer, -1, property + 11);
}
}
else if (strcmp (property, "input") == 0)
{
@@ -3128,8 +3130,8 @@ gui_buffer_close (struct t_gui_buffer *buffer)
gui_nicklist_remove_group (buffer, buffer->nicklist_root);
if (buffer->hotlist_max_level_nicks)
hashtable_free (buffer->hotlist_max_level_nicks);
gui_key_free_all (&buffer->keys, &buffer->last_key,
&buffer->keys_count);
gui_key_free_all (-1, &buffer->keys, &buffer->last_key,
&buffer->keys_count, 0);
gui_buffer_local_var_remove_all (buffer);
hashtable_free (buffer->local_variables);
if (buffer->plugin_name_for_upgrade)
+273 -66
View File
@@ -31,6 +31,7 @@
#include "../core/weechat.h"
#include "../core/wee-config.h"
#include "../core/wee-config-file.h"
#include "../core/wee-eval.h"
#include "../core/wee-hashtable.h"
#include "../core/wee-hdata.h"
@@ -112,7 +113,7 @@ time_t gui_key_last_activity_time = 0; /* last activity time (key) */
void
gui_key_init ()
{
int i;
int context;
gui_key_combo_buffer[0] = '\0';
gui_key_grab = 0;
@@ -120,21 +121,21 @@ gui_key_init ()
gui_key_last_activity_time = time (NULL);
/* create default keys and save them in a separate list */
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
gui_keys[i] = NULL;
last_gui_key[i] = NULL;
gui_default_keys[i] = NULL;
last_gui_default_key[i] = NULL;
gui_keys_count[i] = 0;
gui_default_keys_count[i] = 0;
gui_key_default_bindings (i);
gui_default_keys[i] = gui_keys[i];
last_gui_default_key[i] = last_gui_key[i];
gui_default_keys_count[i] = gui_keys_count[i];
gui_keys[i] = NULL;
last_gui_key[i] = NULL;
gui_keys_count[i] = 0;
gui_keys[context] = NULL;
last_gui_key[context] = NULL;
gui_default_keys[context] = NULL;
last_gui_default_key[context] = NULL;
gui_keys_count[context] = 0;
gui_default_keys_count[context] = 0;
gui_key_default_bindings (context, 0);
gui_default_keys[context] = gui_keys[context];
last_gui_default_key[context] = last_gui_key[context];
gui_default_keys_count[context] = gui_keys_count[context];
gui_keys[context] = NULL;
last_gui_key[context] = NULL;
gui_keys_count[context] = 0;
}
}
@@ -878,6 +879,71 @@ gui_key_legacy_to_alias (const char *key)
return key_name_alias;
}
/*
* Amends key: transform upper case ctrl keys to lower case and replace " "
* by "space".
*
* Examples:
* "ctrl-a" => "ctrl-a" (unchanged)
* "meta-A" => "meta-A" (unchanged)
* 'return" => "return" (unchanged)
* "ctrl-G" => "ctrl-g"
* "ctrl-C,b" => "ctrl-c,b"
* " " => "space"
* "meta- " => "meta-space"
*
* Note: result must be freed after use.
*/
char *
gui_key_amend (const char *key)
{
char **result, str_key[2];
const char *ptr_key;
int length;
if (!key)
return NULL;
if ((key[0] == '@') && strchr (key, ':'))
return strdup (key);
result = string_dyn_alloc (strlen (key) + 1);
if (!result)
return NULL;
ptr_key = key;
while (ptr_key && ptr_key[0])
{
if (ptr_key[0] == ' ')
{
string_dyn_concat (result, "space", -1);
ptr_key++;
}
else if (strncmp (ptr_key, "ctrl-", 5) == 0)
{
string_dyn_concat (result, ptr_key, 5);
ptr_key += 5;
if (ptr_key[0])
{
str_key[0] = ((ptr_key[0] >= 'A') && (ptr_key[0] <= 'Z')) ?
ptr_key[0] + ('a' - 'A') : ptr_key[0];
str_key[1] = '\0';
string_dyn_concat (result, str_key, -1);
ptr_key++;
}
}
else
{
length = utf8_char_size (ptr_key);
string_dyn_concat (result, ptr_key, length);
ptr_key += length;
}
}
return string_dyn_free (result, 0);
}
/*
* Searches for position of a key (to keep keys sorted).
*/
@@ -1151,30 +1217,129 @@ gui_key_is_safe (int context, const char *key)
return 0;
}
/*
* Callback for changes on a key option.
*/
void
gui_key_option_change_cb (const void *pointer, void *data,
struct t_config_option *option)
{
struct t_gui_key *ptr_key;
int context;
/* make C compiler happy */
(void) pointer;
(void) data;
context = config_weechat_get_key_context (option->section);
if (context < 0)
return;
ptr_key = gui_key_search (gui_keys[context], option->name);
if (!ptr_key)
return;
if (ptr_key->command)
free (ptr_key->command);
ptr_key->command = strdup (CONFIG_STRING(option));
}
/*
* Creates a new key option.
*
* Returns pointer to existing or new option.
*/
struct t_config_option *
gui_key_new_option (int context, const char *name, const char *value)
{
struct t_config_option *ptr_option;
struct t_gui_key *ptr_key;
char str_description[1024];
if (!name || !value)
return NULL;
ptr_option = config_file_search_option (weechat_config_file,
weechat_config_section_key[context],
name);
if (ptr_option)
{
config_file_option_set (ptr_option, value, 1);
}
else
{
snprintf (str_description, sizeof (str_description),
_("key \"%s\" in context \"%s\""),
name,
gui_key_context_string[context]);
ptr_key = gui_key_search (gui_default_keys[context], name);
ptr_option = config_file_new_option (
weechat_config_file, weechat_config_section_key[context],
name, "string",
str_description,
NULL, 0, 0,
(ptr_key) ? ptr_key->command : "",
value,
0,
NULL, NULL, NULL,
&gui_key_option_change_cb, NULL, NULL,
NULL, NULL, NULL);
}
return ptr_option;
}
/*
* Adds a new key in keys list.
*
* If buffer is not null, then key is specific to buffer, otherwise it's general
* key (for most keys).
*
* If create_option == 1, a config option is created as well.
*
* Returns pointer to new key, NULL if error.
*/
struct t_gui_key *
gui_key_new (struct t_gui_buffer *buffer, int context, const char *key,
const char *command)
const char *command, int create_option)
{
char *key_amended;
struct t_config_option *ptr_option;
struct t_gui_key *new_key;
if (!key || !command)
return NULL;
new_key = malloc (sizeof (*new_key));
if (!new_key)
key_amended = gui_key_amend (key);
if (!key_amended)
return NULL;
new_key->key = strdup (key);
new_key->chunks = string_split (key, ",", NULL, 0, 0,
ptr_option = NULL;
if (!buffer && create_option)
{
ptr_option = gui_key_new_option (context, key_amended, command);
if (!ptr_option)
{
free (key_amended);
return NULL;
}
}
new_key = malloc (sizeof (*new_key));
if (!new_key)
{
if (ptr_option)
config_file_option_free (ptr_option, 0);
free (key_amended);
return NULL;
}
new_key->key = key_amended;
new_key->chunks = string_split (key_amended, ",", NULL, 0, 0,
&new_key->chunks_count);
new_key->command = strdup (command);
gui_key_set_areas (new_key);
@@ -1182,14 +1347,17 @@ gui_key_new (struct t_gui_buffer *buffer, int context, const char *key,
if (buffer)
{
gui_key_insert_sorted (&buffer->keys, &buffer->last_key,
&buffer->keys_count, new_key);
gui_key_insert_sorted (&buffer->keys,
&buffer->last_key,
&buffer->keys_count,
new_key);
}
else
{
gui_key_insert_sorted (&gui_keys[context],
&last_gui_key[context],
&gui_keys_count[context], new_key);
&gui_keys_count[context],
new_key);
}
if (gui_key_verbose)
@@ -1345,7 +1513,7 @@ gui_key_bind (struct t_gui_buffer *buffer, int context, const char *key,
gui_key_unbind (buffer, context, key);
return gui_key_new (buffer, context, key, command);
return gui_key_new (buffer, context, key, command, 1);
}
/*
@@ -1374,7 +1542,7 @@ gui_key_bind_plugin_hashtable_map_cb (void *data,
ptr_key = gui_key_search (gui_keys[user_data[0]], key);
if (!ptr_key)
{
if (gui_key_new (NULL, user_data[0], key, value))
if (gui_key_new (NULL, user_data[0], key, value, 1))
user_data[1]++;
}
}
@@ -1422,17 +1590,25 @@ gui_key_bind_plugin (const char *context, struct t_hashtable *keys)
int
gui_key_unbind (struct t_gui_buffer *buffer, int context, const char *key)
{
char *key_amended;
struct t_gui_key *ptr_key;
ptr_key = gui_key_search ((buffer) ? buffer->keys : gui_keys[context],
key);
if (!ptr_key)
key_amended = gui_key_amend (key);
if (!key_amended)
return 0;
ptr_key = gui_key_search ((buffer) ? buffer->keys : gui_keys[context],
key_amended);
if (!ptr_key)
{
free (key_amended);
return 0;
}
if (buffer)
{
gui_key_free (&buffer->keys, &buffer->last_key,
&buffer->keys_count, ptr_key);
gui_key_free (-1, &buffer->keys, &buffer->last_key,
&buffer->keys_count, ptr_key, 0);
}
else
{
@@ -1440,15 +1616,17 @@ gui_key_unbind (struct t_gui_buffer *buffer, int context, const char *key)
{
gui_chat_printf (NULL,
_("Key \"%s\" unbound (context: \"%s\")"),
key,
key_amended,
gui_key_context_string[context]);
}
gui_key_free (&gui_keys[context], &last_gui_key[context],
&gui_keys_count[context], ptr_key);
gui_key_free (context, &gui_keys[context], &last_gui_key[context],
&gui_keys_count[context], ptr_key, 1);
}
(void) hook_signal_send ("key_unbind",
WEECHAT_HOOK_SIGNAL_STRING, (char *)key);
WEECHAT_HOOK_SIGNAL_STRING, key_amended);
free (key_amended);
return 1;
}
@@ -2070,17 +2248,31 @@ end:
/*
* Deletes a key binding.
*
* If delete_option == 1, the config option is deleted.
*/
void
gui_key_free (struct t_gui_key **keys, struct t_gui_key **last_key,
int *keys_count, struct t_gui_key *key)
gui_key_free (int context,
struct t_gui_key **keys, struct t_gui_key **last_key,
int *keys_count, struct t_gui_key *key, int delete_option)
{
struct t_config_option *ptr_option;
int i;
if (!key)
return;
if (delete_option)
{
ptr_option = config_file_search_option (
weechat_config_file,
weechat_config_section_key[context],
key->key);
if (ptr_option)
config_file_option_free (ptr_option, 1);
}
/* free memory */
if (key->key)
free (key->key);
@@ -2113,15 +2305,19 @@ gui_key_free (struct t_gui_key **keys, struct t_gui_key **last_key,
/*
* Deletes all key bindings.
*
* If delete_option == 1, the config options are deleted.
*/
void
gui_key_free_all (struct t_gui_key **keys, struct t_gui_key **last_key,
int *keys_count)
gui_key_free_all (int context, struct t_gui_key **keys,
struct t_gui_key **last_key,
int *keys_count, int delete_option)
{
while (*keys)
{
gui_key_free (keys, last_key, keys_count, *keys);
gui_key_free (context, keys, last_key, keys_count, *keys,
delete_option);
}
}
@@ -2501,20 +2697,26 @@ gui_key_paste_cancel ()
void
gui_key_end ()
{
int i;
int context;
/* free key buffer */
if (gui_key_buffer)
free (gui_key_buffer);
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
/* free keys */
gui_key_free_all (&gui_keys[i], &last_gui_key[i],
&gui_keys_count[i]);
gui_key_free_all (context,
&gui_keys[context],
&last_gui_key[context],
&gui_keys_count[context],
0);
/* free default keys */
gui_key_free_all (&gui_default_keys[i], &last_gui_default_key[i],
&gui_default_keys_count[i]);
gui_key_free_all (context,
&gui_default_keys[context],
&last_gui_default_key[context],
&gui_default_keys_count[context],
0);
}
}
@@ -2527,7 +2729,7 @@ gui_key_hdata_key_cb (const void *pointer, void *data,
const char *hdata_name)
{
struct t_hdata *hdata;
int i;
int context;
char str_list[128];
/* make C compiler happy */
@@ -2546,28 +2748,32 @@ gui_key_hdata_key_cb (const void *pointer, void *data,
HDATA_VAR(struct t_gui_key, score, INTEGER, 0, NULL, NULL);
HDATA_VAR(struct t_gui_key, prev_key, POINTER, 0, NULL, hdata_name);
HDATA_VAR(struct t_gui_key, next_key, POINTER, 0, NULL, hdata_name);
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
snprintf (str_list, sizeof (str_list),
"gui_keys%s%s",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
hdata_new_list (hdata, str_list, &gui_keys[i], 0);
(context == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(context == GUI_KEY_CONTEXT_DEFAULT) ?
"" : gui_key_context_string[context]);
hdata_new_list (hdata, str_list, &gui_keys[context], 0);
snprintf (str_list, sizeof (str_list),
"last_gui_key%s%s",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
hdata_new_list (hdata, str_list, &last_gui_key[i], 0);
(context == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(context == GUI_KEY_CONTEXT_DEFAULT) ?
"" : gui_key_context_string[context]);
hdata_new_list (hdata, str_list, &last_gui_key[context], 0);
snprintf (str_list, sizeof (str_list),
"gui_default_keys%s%s",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
hdata_new_list (hdata, str_list, &gui_default_keys[i], 0);
(context == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(context == GUI_KEY_CONTEXT_DEFAULT) ?
"" : gui_key_context_string[context]);
hdata_new_list (hdata, str_list, &gui_default_keys[context], 0);
snprintf (str_list, sizeof (str_list),
"last_gui_default_key%s%s",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(i == GUI_KEY_CONTEXT_DEFAULT) ? "" : gui_key_context_string[i]);
hdata_new_list (hdata, str_list, &last_gui_default_key[i], 0);
(context == GUI_KEY_CONTEXT_DEFAULT) ? "" : "_",
(context == GUI_KEY_CONTEXT_DEFAULT) ?
"" : gui_key_context_string[context]);
hdata_new_list (hdata, str_list, &last_gui_default_key[context], 0);
}
}
return hdata;
@@ -2647,7 +2853,7 @@ void
gui_key_print_log (struct t_gui_buffer *buffer)
{
struct t_gui_key *ptr_key;
int i;
int context;
if (buffer)
{
@@ -2662,15 +2868,16 @@ gui_key_print_log (struct t_gui_buffer *buffer)
}
else
{
for (i = 0; i < GUI_KEY_NUM_CONTEXTS; i++)
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
log_printf ("");
log_printf ("[keys for context: %s]", gui_key_context_string[i]);
log_printf (" keys . . . . . . . . : 0x%lx", gui_keys[i]);
log_printf (" last_key . . . . . . : 0x%lx", last_gui_key[i]);
log_printf (" keys_count . . . . . : %d", gui_keys_count[i]);
log_printf ("[keys for context: %s]", gui_key_context_string[context]);
log_printf (" keys . . . . . . . . : 0x%lx", gui_keys[context]);
log_printf (" last_key . . . . . . : 0x%lx", last_gui_key[context]);
log_printf (" keys_count . . . . . : %d", gui_keys_count[context]);
for (ptr_key = gui_keys[i]; ptr_key; ptr_key = ptr_key->next_key)
for (ptr_key = gui_keys[context]; ptr_key;
ptr_key = ptr_key->next_key)
{
log_printf ("");
gui_key_print_log_key (ptr_key, "");
+11 -6
View File
@@ -99,7 +99,8 @@ extern int gui_key_is_safe (int context, const char *key);
extern struct t_gui_key *gui_key_new (struct t_gui_buffer *buffer,
int context,
const char *key,
const char *command);
const char *command,
int create_option);
extern struct t_gui_key *gui_key_search (struct t_gui_key *keys,
const char *key);
extern struct t_gui_key *gui_key_bind (struct t_gui_buffer *buffer,
@@ -112,13 +113,17 @@ extern int gui_key_unbind (struct t_gui_buffer *buffer, int context,
extern int gui_key_unbind_plugin (const char *context, const char *key);
extern int gui_key_focus (const char *key, int context);
extern int gui_key_pressed (const char *key_str);
extern void gui_key_free (struct t_gui_key **keys,
extern void gui_key_free (int context,
struct t_gui_key **keys,
struct t_gui_key **last_key,
int *keys_count,
struct t_gui_key *key);
extern void gui_key_free_all (struct t_gui_key **keys,
struct t_gui_key *key,
int delete_option);
extern void gui_key_free_all (int context,
struct t_gui_key **keys,
struct t_gui_key **last_key,
int *keys_count);
int *keys_count,
int delete_option);
extern void gui_key_buffer_reset ();
extern void gui_key_buffer_add (unsigned char key);
extern int gui_key_buffer_search (int start_index, int max_index,
@@ -145,6 +150,6 @@ extern void gui_key_print_log (struct t_gui_buffer *buffer);
/* key functions (GUI dependent) */
extern void gui_key_default_bindings (int context);
extern void gui_key_default_bindings (int context, int create_option);
#endif /* WEECHAT_GUI_KEY_H */
+314 -4
View File
@@ -25,9 +25,24 @@
extern "C"
{
#include "src/core/wee-config.h"
#include "src/core/wee-input.h"
#include "src/core/wee-string.h"
#include "src/gui/gui-buffer.h"
#include "src/gui/gui-key.h"
extern int gui_key_get_current_context ();
extern char *gui_key_legacy_internal_code (const char *key);
extern char *gui_key_amend (const char *key);
extern struct t_config_option *gui_key_new_option (int context,
const char *name,
const char *value);
extern int gui_key_compare_chunks (const char **chunks, int chunks_count,
const char **key_chunks, int key_chunks_count);
extern struct t_gui_key *gui_key_search_part (struct t_gui_buffer *buffer, int context,
const char **chunks1, int chunks1_count,
const char **chunks2, int chunks2_count,
int *exact_match);
}
#define WEE_CHECK_EXP_KEY(__rc, __key_name, __key_name_alias, __key) \
@@ -94,7 +109,19 @@ TEST(GuiKey, SearchContext)
TEST(GuiKey, GetCurrentContext)
{
/* TODO: write tests */
LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ());
input_data (gui_buffers, "/cursor", NULL);
LONGS_EQUAL(GUI_KEY_CONTEXT_CURSOR, gui_key_get_current_context ());
input_data (gui_buffers, "/cursor stop", NULL);
LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ());
input_data (gui_buffers, "/input search_text_here", NULL);
LONGS_EQUAL(GUI_KEY_CONTEXT_SEARCH, gui_key_get_current_context ());
input_data (gui_buffers, "/input search_stop", NULL);
LONGS_EQUAL(GUI_KEY_CONTEXT_DEFAULT, gui_key_get_current_context ());
}
/*
@@ -834,6 +861,33 @@ TEST(GuiKey, LegacyToAlias)
WEE_TEST_STR("meta-w,comma,meta-u,p", gui_key_legacy_to_alias ("meta-w,meta-up"));
}
/*
* Tests functions:
* gui_key_amend
*/
TEST(GuiKey, Amend)
{
char *str;
WEE_TEST_STR(NULL, gui_key_amend (NULL));
/* no changes */
WEE_TEST_STR("", gui_key_amend (""));
WEE_TEST_STR("a", gui_key_amend ("a"));
WEE_TEST_STR("@chat:button1", gui_key_amend ("@chat:button1"));
WEE_TEST_STR("meta-A", gui_key_amend ("meta-A"));
WEE_TEST_STR("ctrl-a", gui_key_amend ("ctrl-a"));
WEE_TEST_STR("return", gui_key_amend ("return"));
/* changes */
WEE_TEST_STR("ctrl-a", gui_key_amend ("ctrl-A"));
WEE_TEST_STR("ctrl-c,b", gui_key_amend ("ctrl-C,b"));
WEE_TEST_STR("ctrl-c,ctrl-b,A", gui_key_amend ("ctrl-C,ctrl-B,A"));
WEE_TEST_STR("space", gui_key_amend (" "));
WEE_TEST_STR("meta-space", gui_key_amend ("meta- "));
}
/*
* Tests functions:
* gui_key_find_pos
@@ -980,6 +1034,53 @@ TEST(GuiKey, IsSafe)
LONGS_EQUAL(1, gui_key_is_safe (GUI_KEY_CONTEXT_MOUSE, "@"));
}
/*
* Tests functions:
* gui_key_option_change_cb
*/
TEST(GuiKey, OptionChangeCb)
{
/* TODO: write tests */
}
/*
* Tests functions:
* gui_key_new_option
*/
TEST(GuiKey, NewOption)
{
struct t_config_option *ptr_option;
int context;
POINTERS_EQUAL(NULL, gui_key_new_option (GUI_KEY_CONTEXT_DEFAULT,
NULL, NULL));
POINTERS_EQUAL(NULL, gui_key_new_option (GUI_KEY_CONTEXT_DEFAULT,
"meta-a,meta-b,meta-c", NULL));
POINTERS_EQUAL(NULL, gui_key_new_option (GUI_KEY_CONTEXT_DEFAULT,
NULL, "/mute"));
for (context = 0; context < GUI_KEY_NUM_CONTEXTS; context++)
{
POINTERS_EQUAL(NULL,
config_file_search_option (
weechat_config_file,
weechat_config_section_key[context],
"meta-a,meta-b,meta-c"));
ptr_option = gui_key_new_option (context,
"meta-a,meta-b,meta-c", "/mute");
CHECK(ptr_option);
POINTERS_EQUAL(ptr_option,
config_file_search_option (
weechat_config_file,
weechat_config_section_key[context],
"meta-a,meta-b,meta-c"));
STRCMP_EQUAL("/mute", CONFIG_STRING(ptr_option));
config_file_option_free (ptr_option, 0);
}
}
/*
* Tests functions:
* gui_key_new
@@ -987,7 +1088,88 @@ TEST(GuiKey, IsSafe)
TEST(GuiKey, New)
{
/* TODO: write tests */
struct t_gui_key *ptr_key;
POINTERS_EQUAL(NULL, gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, NULL, 1));
POINTERS_EQUAL(NULL, gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT,
"meta-a,meta-b,meta-c", NULL, 1));
POINTERS_EQUAL(NULL, gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, "/mute", 1));
ptr_key = gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT,
"meta-a,meta-b,meta-c", "/mute", 1);
CHECK(ptr_key);
STRCMP_EQUAL("meta-a,meta-b,meta-c", ptr_key->key);
LONGS_EQUAL(3, ptr_key->chunks_count);
STRCMP_EQUAL("meta-a", ptr_key->chunks[0]);
STRCMP_EQUAL("meta-b", ptr_key->chunks[1]);
STRCMP_EQUAL("meta-c", ptr_key->chunks[2]);
LONGS_EQUAL(GUI_KEY_FOCUS_ANY, ptr_key->area_type[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_ANY, ptr_key->area_type[1]);
POINTERS_EQUAL(NULL, ptr_key->area_key);
STRCMP_EQUAL("/mute", ptr_key->command);
LONGS_EQUAL(0, ptr_key->score);
gui_key_free (GUI_KEY_CONTEXT_DEFAULT,
&gui_keys[GUI_KEY_CONTEXT_DEFAULT],
&last_gui_key[GUI_KEY_CONTEXT_DEFAULT],
&gui_keys_count[GUI_KEY_CONTEXT_DEFAULT],
ptr_key,
1);
ptr_key = gui_key_new (NULL, GUI_KEY_CONTEXT_CURSOR,
"@chat:z", "/print z", 1);
CHECK(ptr_key);
STRCMP_EQUAL("@chat:z", ptr_key->key);
LONGS_EQUAL(1, ptr_key->chunks_count);
STRCMP_EQUAL("@chat:z", ptr_key->chunks[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_CHAT, ptr_key->area_type[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_ANY, ptr_key->area_type[1]);
STRCMP_EQUAL("z", ptr_key->area_key);
STRCMP_EQUAL("/print z", ptr_key->command);
LONGS_EQUAL(368, ptr_key->score);
gui_key_free (GUI_KEY_CONTEXT_CURSOR,
&gui_keys[GUI_KEY_CONTEXT_CURSOR],
&last_gui_key[GUI_KEY_CONTEXT_CURSOR],
&gui_keys_count[GUI_KEY_CONTEXT_CURSOR],
ptr_key,
1);
ptr_key = gui_key_new (NULL, GUI_KEY_CONTEXT_MOUSE,
"@chat:wheelup", "/print wheelup", 1);
CHECK(ptr_key);
STRCMP_EQUAL("@chat:wheelup", ptr_key->key);
LONGS_EQUAL(1, ptr_key->chunks_count);
STRCMP_EQUAL("@chat:wheelup", ptr_key->chunks[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_CHAT, ptr_key->area_type[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_ANY, ptr_key->area_type[1]);
STRCMP_EQUAL("wheelup", ptr_key->area_key);
STRCMP_EQUAL("/print wheelup", ptr_key->command);
LONGS_EQUAL(368, ptr_key->score);
gui_key_free (GUI_KEY_CONTEXT_MOUSE,
&gui_keys[GUI_KEY_CONTEXT_MOUSE],
&last_gui_key[GUI_KEY_CONTEXT_MOUSE],
&gui_keys_count[GUI_KEY_CONTEXT_MOUSE],
ptr_key,
1);
ptr_key = gui_key_new (NULL, GUI_KEY_CONTEXT_MOUSE,
"@bar(nicklist)>chat:button1", "/print button1", 1);
CHECK(ptr_key);
STRCMP_EQUAL("@bar(nicklist)>chat:button1", ptr_key->key);
LONGS_EQUAL(1, ptr_key->chunks_count);
STRCMP_EQUAL("@bar(nicklist)>chat:button1", ptr_key->chunks[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_BAR, ptr_key->area_type[0]);
LONGS_EQUAL(GUI_KEY_FOCUS_CHAT, ptr_key->area_type[1]);
STRCMP_EQUAL("button1", ptr_key->area_key);
STRCMP_EQUAL("/print button1", ptr_key->command);
LONGS_EQUAL(272, ptr_key->score);
gui_key_free (GUI_KEY_CONTEXT_MOUSE,
&gui_keys[GUI_KEY_CONTEXT_MOUSE],
&last_gui_key[GUI_KEY_CONTEXT_MOUSE],
&gui_keys_count[GUI_KEY_CONTEXT_MOUSE],
ptr_key,
1);
}
/*
@@ -997,7 +1179,79 @@ TEST(GuiKey, New)
TEST(GuiKey, Search)
{
/* TODO: write tests */
struct t_gui_key *ptr_key;
POINTERS_EQUAL(NULL, gui_key_search (NULL, NULL));
POINTERS_EQUAL(NULL, gui_key_search (NULL, "meta-a"));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_DEFAULT], NULL));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_DEFAULT], ""));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-"));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_DEFAULT], "unknown"));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_SEARCH], "meta-a"));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_CURSOR], "meta-a"));
POINTERS_EQUAL(NULL,
gui_key_search (
gui_keys[GUI_KEY_CONTEXT_MOUSE], "meta-a"));
ptr_key = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-a");
CHECK(ptr_key);
STRCMP_EQUAL("meta-a", ptr_key->key);
STRCMP_EQUAL("/buffer jump smart", ptr_key->command);
ptr_key = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT],
"meta-w,meta-up");
CHECK(ptr_key);
STRCMP_EQUAL("meta-w,meta-up", ptr_key->key);
STRCMP_EQUAL("/window up", ptr_key->command);
}
/*
* Tests functions:
* gui_key_compare_chunks
*/
TEST(GuiKey, CompareChunks)
{
struct t_gui_key *ptr_key1, *ptr_key2;
ptr_key1 = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-a");
ptr_key2 = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-w,meta-down");
LONGS_EQUAL(0,
gui_key_compare_chunks (
(const char **)ptr_key1->chunks, ptr_key1->chunks_count,
(const char **)ptr_key2->chunks, ptr_key2->chunks_count));
ptr_key1 = gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT, "meta-w", "/mute", 1);
ptr_key2 = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-w,meta-down");
LONGS_EQUAL(1,
gui_key_compare_chunks (
(const char **)ptr_key1->chunks, ptr_key1->chunks_count,
(const char **)ptr_key2->chunks, ptr_key2->chunks_count));
gui_key_free (GUI_KEY_CONTEXT_MOUSE,
&gui_keys[GUI_KEY_CONTEXT_MOUSE],
&last_gui_key[GUI_KEY_CONTEXT_MOUSE],
&gui_keys_count[GUI_KEY_CONTEXT_MOUSE],
ptr_key1,
1);
ptr_key1 = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-w,meta-down");
ptr_key2 = gui_key_search (gui_keys[GUI_KEY_CONTEXT_DEFAULT], "meta-w,meta-down");
LONGS_EQUAL(2,
gui_key_compare_chunks (
(const char **)ptr_key1->chunks, ptr_key1->chunks_count,
(const char **)ptr_key2->chunks, ptr_key2->chunks_count));
}
/*
@@ -1007,7 +1261,63 @@ TEST(GuiKey, Search)
TEST(GuiKey, SearchPart)
{
/* TODO: write tests */
struct t_gui_key *new_key, *ptr_key;
char **chunks1, **chunks2;
int chunks1_count, chunks2_count, exact_match;
chunks1 = string_split ("meta-a", ",", NULL, 0, 0, &chunks1_count);
chunks2 = string_split ("meta-w", ",", NULL, 0, 0, &chunks2_count);
POINTERS_EQUAL(NULL, gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, 0, NULL, 0, NULL));
POINTERS_EQUAL(NULL, gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
(const char **)chunks1, 0,
NULL, 0,
NULL));
POINTERS_EQUAL(NULL, gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, 0,
(const char **)chunks2, 0,
NULL));
POINTERS_EQUAL(NULL, gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
(const char **)chunks1, 0,
(const char **)chunks2, 0,
NULL));
exact_match = -1;
ptr_key = gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
(const char **)chunks1, chunks1_count,
NULL, 0,
&exact_match);
CHECK(ptr_key);
STRCMP_EQUAL("meta-a", ptr_key->key);
LONGS_EQUAL(1, exact_match);
exact_match = -1;
ptr_key = gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, 0,
(const char **)chunks2, chunks2_count,
&exact_match);
CHECK(ptr_key);
STRCMP_EQUAL("meta-w,meta-b", ptr_key->key);
LONGS_EQUAL(0, exact_match);
new_key = gui_key_new (NULL, GUI_KEY_CONTEXT_DEFAULT, "meta-w", "/mute", 1);
exact_match = -1;
ptr_key = gui_key_search_part (NULL, GUI_KEY_CONTEXT_DEFAULT,
NULL, 0,
(const char **)chunks2, chunks2_count,
&exact_match);
CHECK(ptr_key);
STRCMP_EQUAL("meta-w", ptr_key->key);
LONGS_EQUAL(1, exact_match);
gui_key_free (GUI_KEY_CONTEXT_DEFAULT,
&gui_keys[GUI_KEY_CONTEXT_DEFAULT],
&last_gui_key[GUI_KEY_CONTEXT_DEFAULT],
&gui_keys_count[GUI_KEY_CONTEXT_DEFAULT],
new_key,
1);
}
/*