Skip to content

Commit

Permalink
bindings: Add a way to override an existing binding
Browse files Browse the repository at this point in the history
Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
  • Loading branch information
sardemff7 committed Sep 25, 2023
1 parent 584477a commit 72bd7fb
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 4 deletions.
7 changes: 6 additions & 1 deletion bindings/include/nkutils-bindings.h
Expand Up @@ -31,6 +31,11 @@
typedef struct _NkBindings NkBindings;
typedef struct _NkBindingsSeat NkBindingsSeat;

typedef enum {
NK_BINDINGS_ADD_FLAG_NONE = 0,
NK_BINDINGS_ADD_FLAG_ALLOW_OVERRIDE = (1 << 1),
} NkBindingsAddFlags;

typedef enum {
NK_BINDINGS_KEY_STATE_PRESS,
NK_BINDINGS_KEY_STATE_PRESSED,
Expand Down Expand Up @@ -72,7 +77,7 @@ void nk_bindings_free(NkBindings *bindings);
#define NK_BINDINGS_BINDING_NOT_TRIGGERED FALSE
typedef gboolean (*NkBindingsCheckCallback)(guint64 scope, gpointer target, gpointer user_data);
typedef void (*NkBindingsTriggerCallback)(guint64 scope, gpointer target, gpointer user_data);
gboolean nk_bindings_add_binding(NkBindings *bindings, guint64 scope, const gchar *string, NkBindingsCheckCallback check_callback, NkBindingsTriggerCallback trigger_callback, gpointer user_data, GDestroyNotify notify, GError **error);
gboolean nk_bindings_add_binding(NkBindings *bindings, guint64 scope, const gchar *string, NkBindingsCheckCallback check_callback, NkBindingsTriggerCallback trigger_callback, gpointer user_data, GDestroyNotify notify, NkBindingsAddFlags flags, GError **error);
void nk_bindings_reset_bindings(NkBindings *bindings);

NkBindingsSeat *nk_bindings_seat_new(NkBindings *bindings, enum xkb_context_flags flags);
Expand Down
13 changes: 11 additions & 2 deletions bindings/src/bindings.c
Expand Up @@ -65,6 +65,14 @@
* In the future, touch-based input may be supported, as well as sequences (Emacs-style keyboard bindings).
*/

/**
* NkBindingsAddFlags:
* @NK_BINDINGS_ADD_FLAG_NONE: No flags
* @NK_BINDINGS_ADD_FLAG_ALLOW_OVERRIDE: Allow for overriding
*
* Flags which modify bindings addition.
*/

/**
* NkBindingsKeyState:
* @NK_BINDINGS_KEY_STATE_PRESS: the key is being pressed
Expand Down Expand Up @@ -486,6 +494,7 @@ _nk_bindings_parse_modifier(const gchar *string, xkb_mod_mask_t *mask)
* @trigger_callback: the callback to call when the binding is triggered
* @user_data: user_data for @callback
* @notify: (nullable): function to call to free @user_data when freeing the binding
* @flags: #NkBindingsAddFlags to modify addition behaviour
* @error: return location for a #GError, or %NULL
*
* Adds a binding to the @bindings context.
Expand All @@ -497,7 +506,7 @@ _nk_bindings_parse_modifier(const gchar *string, xkb_mod_mask_t *mask)
* Returns: %TRUE on success, %FALSE on error
*/
NK_EXPORT gboolean
nk_bindings_add_binding(NkBindings *self, guint64 scope_id, const gchar *string, NkBindingsCheckCallback check_callback, NkBindingsTriggerCallback trigger_callback, gpointer user_data, GDestroyNotify notify, GError **error)
nk_bindings_add_binding(NkBindings *self, guint64 scope_id, const gchar *string, NkBindingsCheckCallback check_callback, NkBindingsTriggerCallback trigger_callback, gpointer user_data, GDestroyNotify notify, NkBindingsAddFlags flags, GError **error)
{
g_return_val_if_fail(self != NULL, FALSE);
g_return_val_if_fail(string != NULL, FALSE);
Expand Down Expand Up @@ -761,7 +770,7 @@ nk_bindings_add_binding(NkBindings *self, guint64 scope_id, const gchar *string,

NkBindingsBindingBase *base = on_release ? &binding->release.base : &binding->press.base;

if ( base->trigger_callback != NULL )
if( ( base->trigger_callback != NULL ) && ( !( flags & NK_BINDINGS_ADD_FLAG_ALLOW_OVERRIDE ) ) )
{
g_set_error(error, NK_BINDINGS_ERROR, NK_BINDINGS_ERROR_ALREADY_REGISTERED, "There is already a binding matching '%s'", string);
return FALSE;
Expand Down
22 changes: 21 additions & 1 deletion bindings/tests/bindings.c
Expand Up @@ -49,6 +49,7 @@ typedef struct {
guint64 scope;
const gchar *binding;
guint64 trigger;
NkBindingsAddFlags flags;
} NkBindingsTestBinding;

typedef struct {
Expand Down Expand Up @@ -126,6 +127,25 @@ static const struct {
},
}
},
{
.testpath = "/nkutils/bindings/press/key/overridden",
.data = {
.bindings = {
{ .binding = "s", .trigger = 1 },
{ .binding = "s", .trigger = 2, .flags = NK_BINDINGS_ADD_FLAG_ALLOW_OVERRIDE },
{ .binding = NULL }
},
.keys = {
{ .key = KEYCODE_A, .text = "a" },
{ .key = KEYCODE_A, .state = NK_BINDINGS_KEY_STATE_RELEASE },
{ .key = KEYCODE_S, .triggered = 2 },
{ .key = KEYCODE_S, .state = NK_BINDINGS_KEY_STATE_RELEASE },
{ .key = KEYCODE_D, .text = "d" },
{ .key = KEYCODE_D, .state = NK_BINDINGS_KEY_STATE_RELEASE },
{ .key = KEYCODE_NONE }
},
}
},
{
.testpath = "/nkutils/bindings/press/key/not-found/modified",
.data = {
Expand Down Expand Up @@ -516,7 +536,7 @@ _nk_bindings_tests_func(NkBindingsTestFixture *fixture, gconstpointer user_data)
slice->fixture = fixture;
slice->scope = binding->scope;
slice->trigger = binding->trigger;
ret = nk_bindings_add_binding(fixture->bindings, binding->scope, binding->binding, _nk_bindings_tests_check_callback, _nk_bindings_tests_trigger_callback, slice++, NULL, &error);
ret = nk_bindings_add_binding(fixture->bindings, binding->scope, binding->binding, _nk_bindings_tests_check_callback, _nk_bindings_tests_trigger_callback, slice++, NULL, binding->flags, &error);

g_assert_true(ret);
g_assert_no_error(error);
Expand Down

0 comments on commit 72bd7fb

Please sign in to comment.