swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

commit 493a5c10fe60f4a19d7b6f0a03daa9ac09806f04
parent caabeb3170640881a7a9153613535b4afd20d702
Author: Michael Forney <mforney@mforney.org>
Date:   Fri,  6 Dec 2013 00:32:24 -0800

Introduce modifier state struct

Diffstat:
Mlibswc/keyboard.c | 65++++++++++++++++++++++++++++++++++++-----------------------------
Mlibswc/keyboard.h | 18+++++++++++-------
2 files changed, 47 insertions(+), 36 deletions(-)

diff --git a/libswc/keyboard.c b/libswc/keyboard.c @@ -75,6 +75,7 @@ bool swc_keyboard_initialize(struct swc_keyboard * keyboard) goto error1; wl_array_init(&keyboard->keys); + keyboard->modifier_state = (struct swc_keyboard_modifier_state) { 0 }; keyboard->modifiers = 0; keyboard->focus_handler.enter = &enter; keyboard->focus_handler.leave = &leave; @@ -133,7 +134,7 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time, uint32_t key, uint32_t state) { uint32_t * pressed_key; - uint32_t mods_depressed, mods_latched, mods_locked, mods_active, group; + struct swc_keyboard_modifier_state modifier_state; struct wl_display * display; uint32_t serial; enum xkb_key_direction direction; @@ -184,39 +185,45 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time, : XKB_KEY_UP; xkb_state_update_key(xkb->state, XKB_KEY(key), direction); - mods_depressed = xkb_state_serialize_mods(xkb->state, XKB_STATE_DEPRESSED); - mods_latched = xkb_state_serialize_mods(xkb->state, XKB_STATE_LATCHED); - mods_locked = xkb_state_serialize_mods(xkb->state, XKB_STATE_LOCKED); - mods_active = mods_depressed | mods_latched; - group = xkb_state_serialize_layout(xkb->state, XKB_STATE_LAYOUT_EFFECTIVE); - - if (mods_depressed != keyboard->mods_depressed - || mods_latched != keyboard->mods_latched - || mods_locked != keyboard->mods_locked - || group != keyboard->group) + modifier_state.depressed + = xkb_state_serialize_mods(xkb->state, XKB_STATE_DEPRESSED); + modifier_state.latched + = xkb_state_serialize_mods(xkb->state, XKB_STATE_LATCHED); + modifier_state.locked + = xkb_state_serialize_mods(xkb->state, XKB_STATE_LOCKED); + modifier_state.group + = xkb_state_serialize_layout(xkb->state, XKB_STATE_LAYOUT_EFFECTIVE); + + if (modifier_state.depressed != keyboard->modifier_state.depressed + || modifier_state.latched != keyboard->modifier_state.latched + || modifier_state.locked != keyboard->modifier_state.locked + || modifier_state.group != keyboard->modifier_state.group) { + uint32_t mods_active = modifier_state.depressed + | modifier_state.latched; + + /* Update keyboard modifier state. */ + keyboard->modifier_state = modifier_state; + if (keyboard->focus.resource) { serial = wl_display_next_serial(display); - wl_keyboard_send_modifiers(keyboard->focus.resource, - serial, mods_depressed, mods_latched, - mods_locked, group); + wl_keyboard_send_modifiers + (keyboard->focus.resource, serial, modifier_state.depressed, + modifier_state.latched, modifier_state.locked, + modifier_state.group); } - } - 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; - keyboard->group = group; + + 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; + } } diff --git a/libswc/keyboard.h b/libswc/keyboard.h @@ -33,13 +33,20 @@ struct swc_keyboard; struct wl_client; +struct swc_keyboard_modifier_state +{ + uint32_t depressed; + uint32_t latched; + uint32_t locked; + uint32_t group; +}; + struct swc_keyboard_handler { bool (* key)(struct swc_keyboard * keyboard, uint32_t time, uint32_t key, uint32_t state); - bool (* modifiers)(struct swc_keyboard * keyboard, uint32_t serial, - uint32_t mods_depressed, uint32_t mods_latched, - uint32_t mods_locked, uint32_t group); + bool (* modifiers)(struct swc_keyboard * keyboard, + const struct swc_keyboard_modifier_state * state); }; struct swc_keyboard @@ -52,10 +59,7 @@ struct swc_keyboard struct swc_xkb xkb; struct wl_array keys; - uint32_t mods_depressed; - uint32_t mods_latched; - uint32_t mods_locked; - uint32_t group; + struct swc_keyboard_modifier_state modifier_state; uint32_t modifiers; };