Commit 54335f5e authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Sort hotkeys per key code and use binary search

parent 64651009
...@@ -27,6 +27,17 @@ ...@@ -27,6 +27,17 @@
#include "../libvlc.h" #include "../libvlc.h"
#include <vlc_keys.h> #include <vlc_keys.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h>
static int keycmp (const void *a, const void *b)
{
const struct hotkey *ka = a, *kb = b;
#if (INT_MAX >= 0x7fffffff)
return ka->i_key - kb->i_key;
#else
return (ka->i_key < kb->i_key) ? -1 : (ka->i_key > kb->i_key) ? +1 : 0;
#endif
}
/** /**
* Get the action associated with a VLC key code, if any. * Get the action associated with a VLC key code, if any.
...@@ -34,15 +45,12 @@ ...@@ -34,15 +45,12 @@
static static
vlc_key_t vlc_TranslateKey (const vlc_object_t *obj, uint_fast32_t keycode) vlc_key_t vlc_TranslateKey (const vlc_object_t *obj, uint_fast32_t keycode)
{ {
/* TODO: search should be O(log n), not O(n) */ struct hotkey k = { .psz_action = NULL, .i_key = keycode, .i_action = 0 };
for (const struct hotkey *key = obj->p_libvlc->p_hotkeys; const struct hotkey *key;
key->psz_action != NULL;
key++) key = bsearch (&k, obj->p_libvlc->p_hotkeys, libvlc_actions_count,
{ sizeof (*key), keycmp);
if (key->i_key == keycode) return (key != NULL) ? key->i_action : ACTIONID_NONE;
return key->i_action;
}
return ACTIONID_NONE;
} }
static int vlc_key_to_action (vlc_object_t *libvlc, const char *varname, static int vlc_key_to_action (vlc_object_t *libvlc, const char *varname,
...@@ -89,6 +97,8 @@ int vlc_InitActions (libvlc_int_t *libvlc) ...@@ -89,6 +97,8 @@ int vlc_InitActions (libvlc_int_t *libvlc)
} }
#endif #endif
} }
qsort (keys, libvlc_actions_count, sizeof (*keys), keycmp);
keys[libvlc_actions_count].psz_action = NULL; keys[libvlc_actions_count].psz_action = NULL;
keys[libvlc_actions_count].i_key = 0; keys[libvlc_actions_count].i_key = 0;
keys[libvlc_actions_count].i_action = 0; keys[libvlc_actions_count].i_action = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment