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

core: optimize search of key bindings in contexts default/search/cursor

This commit is contained in:
Sébastien Helleu
2023-02-04 10:45:57 +01:00
parent 587e2882ac
commit 6d4471b6db
2 changed files with 21 additions and 69 deletions
+21 -21
View File
@@ -752,42 +752,31 @@ gui_key_search (struct t_gui_key *keys, const char *key)
}
/*
* Compares two keys.
*/
int
gui_key_cmp (const char *key, const char *search, int context)
{
if (context == GUI_KEY_CONTEXT_MOUSE)
return (string_match (key, search, 1)) ? 0 : 1;
return string_strncmp (key, search, utf8_strlen (search));
}
/*
* Searches for a key (maybe part of string).
* Searches for a key (maybe part of string) for context default, search or
* cursor (not for mouse).
*
* Returns pointer to key found, NULL if not found.
*/
struct t_gui_key *
gui_key_search_part (struct t_gui_buffer *buffer, int context,
const char *key)
gui_key_search_part (struct t_gui_buffer *buffer, int context, const char *key)
{
struct t_gui_key *ptr_key;
int length_key;
if (!key)
return NULL;
length_key = utf8_strlen (key);
for (ptr_key = (buffer) ? buffer->keys : gui_keys[context]; ptr_key;
ptr_key = ptr_key->next_key)
{
if (ptr_key->key
&& (((context != GUI_KEY_CONTEXT_CURSOR)
&& (context != GUI_KEY_CONTEXT_MOUSE))
&& ((context != GUI_KEY_CONTEXT_CURSOR)
|| (ptr_key->key[0] != '@')))
{
if (gui_key_cmp (ptr_key->key, key, context) == 0)
if (string_strncmp (ptr_key->key, key, length_key) == 0)
return ptr_key;
}
}
@@ -1116,9 +1105,20 @@ gui_key_focus_command (const char *key, int context,
if (strcmp (ptr_key->command, "-") == 0)
continue;
/* ignore key if key for area is not matching */
if (gui_key_cmp (key, ptr_key->area_key, context) != 0)
/* ignore key if key for area is not matching (context: cursor) */
if ((context == GUI_KEY_CONTEXT_CURSOR)
&& (string_strncmp (key, ptr_key->area_key,
utf8_strlen (ptr_key->area_key)) != 0))
{
continue;
}
/* ignore key if key for area is not matching (context: mouse) */
if ((context == GUI_KEY_CONTEXT_MOUSE)
&& !string_match (key, ptr_key->area_key, 1))
{
continue;
}
/* ignore mouse event if not explicit requested */
if ((context == GUI_KEY_CONTEXT_MOUSE) &&
-48
View File
@@ -26,8 +26,6 @@
extern "C"
{
#include "src/gui/gui-key.h"
extern int gui_key_cmp (const char *key, const char *search, int context);
}
TEST_GROUP(GuiKey)
@@ -228,52 +226,6 @@ TEST(GuiKey, Search)
/* TODO: write tests */
}
/*
* Tests functions:
* gui_key_cmp
*/
TEST(GuiKey, Cmp)
{
LONGS_EQUAL(0, gui_key_cmp ("", "", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(0, gui_key_cmp ("a", "", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(-97, gui_key_cmp ("", "a", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(0, gui_key_cmp ("a", "a", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(32, gui_key_cmp ("meta-a", "meta-A", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(-99, gui_key_cmp ("meta-a", "meta-ac", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(0, gui_key_cmp ("meta-ac", "meta-a", GUI_KEY_CONTEXT_DEFAULT));
LONGS_EQUAL(0, gui_key_cmp ("", "", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(0, gui_key_cmp ("a", "", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(-97, gui_key_cmp ("", "a", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(0, gui_key_cmp ("a", "a", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(32, gui_key_cmp ("meta-a", "meta-A", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(-99, gui_key_cmp ("meta-a", "meta-ac", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(0, gui_key_cmp ("meta-ac", "meta-a", GUI_KEY_CONTEXT_SEARCH));
LONGS_EQUAL(0, gui_key_cmp ("", "", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(0, gui_key_cmp ("a", "", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(-97, gui_key_cmp ("", "a", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(0, gui_key_cmp ("a", "a", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(32, gui_key_cmp ("meta-a", "meta-A", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(-99, gui_key_cmp ("meta-a", "meta-ac", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(0, gui_key_cmp ("meta-ac", "meta-a", GUI_KEY_CONTEXT_CURSOR));
LONGS_EQUAL(1, gui_key_cmp ("", "", GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(1, gui_key_cmp ("a", "", GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(1, gui_key_cmp ("", "a", GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(0, gui_key_cmp ("a", "a", GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(0, gui_key_cmp ("@chat(fset.fset):button2",
"@chat(fset.fset):button2",
GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(0, gui_key_cmp ("@chat(fset.fset):button2-gesture-right",
"@chat(fset.fset):button2*",
GUI_KEY_CONTEXT_MOUSE));
LONGS_EQUAL(1, gui_key_cmp ("@chat(Fset.fset):button2-gesture-right",
"@chat(fset.fset):button2*",
GUI_KEY_CONTEXT_MOUSE));
}
/*
* Tests functions:
* gui_key_search_part