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:
+21
-21
@@ -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) &&
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user