commit a4ca660359f412b7761edf1262b7db8eaf57613b
parent 1f848d1cbea3cf6bde85a85d592bc550a13ed012
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 24 Nov 2013 02:19:49 -0800
Compute modifier state in keyboard.c
Diffstat:
3 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/libswc/binding.c b/libswc/binding.c
@@ -52,31 +52,13 @@ static bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
wl_array_for_each(binding, &key_bindings)
{
- if (binding->value == keysym)
+ if (binding->value == keysym
+ && (binding->modifiers == keyboard->modifiers
+ || binding->modifiers == SWC_MOD_ANY))
{
- xkb_mod_mask_t mod_mask;
- uint32_t modifiers = 0;
- mod_mask = xkb_state_serialize_mods(keyboard->xkb.state,
- XKB_STATE_MODS_EFFECTIVE);
- mod_mask = xkb_state_mod_mask_remove_consumed(keyboard->xkb.state, key + 8,
- mod_mask);
-
- if (mod_mask & (1 << keyboard->xkb.indices.ctrl))
- modifiers |= SWC_MOD_CTRL;
- if (mod_mask & (1 << keyboard->xkb.indices.alt))
- modifiers |= SWC_MOD_ALT;
- if (mod_mask & (1 << keyboard->xkb.indices.super))
- modifiers |= SWC_MOD_LOGO;
- if (mod_mask & (1 << keyboard->xkb.indices.shift))
- modifiers |= SWC_MOD_SHIFT;
-
- if (binding->modifiers == SWC_MOD_ANY
- || binding->modifiers == modifiers)
- {
- binding->handler(time, keysym, binding->data);
- printf("\t-> handled\n");
- return true;
- }
+ binding->handler(time, keysym, binding->data);
+ printf("\t-> handled\n");
+ return true;
}
}
}
diff --git a/libswc/keyboard.c b/libswc/keyboard.c
@@ -1,3 +1,4 @@
+#include "swc.h"
#include "keyboard.h"
#include "util.h"
@@ -47,7 +48,7 @@ bool swc_keyboard_initialize(struct swc_keyboard * keyboard)
goto error1;
wl_array_init(&keyboard->keys);
-
+ keyboard->modifiers = 0;
keyboard->focus_handler.enter = &enter;
keyboard->focus_handler.leave = &leave;
@@ -176,6 +177,16 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time,
}
}
+ keyboard->modifiers = 0;
+ if (mods_active & (1 << keyboard->xkb.indices.ctrl))
+ keyboard->modifiers |= SWC_MOD_CTRL;
+ if (mods_active & (1 << keyboard->xkb.indices.alt))
+ keyboard->modifiers |= SWC_MOD_ALT;
+ if (mods_active & (1 << keyboard->xkb.indices.super))
+ keyboard->modifiers |= SWC_MOD_LOGO;
+ if (mods_active & (1 << keyboard->xkb.indices.shift))
+ keyboard->modifiers |= SWC_MOD_SHIFT;
+
keyboard->mods_depressed = mods_depressed;
keyboard->mods_latched = mods_latched;
keyboard->mods_locked = mods_locked;
diff --git a/libswc/keyboard.h b/libswc/keyboard.h
@@ -34,6 +34,8 @@ struct swc_keyboard
uint32_t mods_latched;
uint32_t mods_locked;
uint32_t group;
+
+ uint32_t modifiers;
};
bool swc_keyboard_initialize(struct swc_keyboard * keyboard);