Similar to how we deal with modifiers, also add LED handling to the core input code, with a callout into the backends to update them when they change.
Signed-off-by: Daniel Stone <[email protected]> --- src/compositor.c | 22 ++++++++++++++++++++++ src/compositor.h | 12 ++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/compositor.c b/src/compositor.c index e310ceb..d00a25c 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1735,6 +1735,7 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state) { uint32_t mods_depressed, mods_latched, mods_locked, group; uint32_t mods_lookup; + enum weston_led leds = 0; int ret = 0; /* First update the XKB state object with the keypress. */ @@ -1773,6 +1774,20 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state) if ((mods_lookup & seat->compositor->xkb_info.super_mod)) seat->modifier_state |= MODIFIER_SUPER; + /* Finally, notify the compositor that LEDs have changed. */ + if (xkb_state_led_index_is_active(seat->xkb_state.state, + seat->compositor->xkb_info.num_led)) + leds |= LED_NUM_LOCK; + if (xkb_state_led_index_is_active(seat->xkb_state.state, + seat->compositor->xkb_info.caps_led)) + leds |= LED_CAPS_LOCK; + if (xkb_state_led_index_is_active(seat->xkb_state.state, + seat->compositor->xkb_info.scroll_led)) + leds |= LED_SCROLL_LOCK; + if (leds != seat->xkb_state.leds && seat->led_update) + seat->led_update(seat, seat->xkb_state.leds); + seat->xkb_state.leds = leds; + return ret; } @@ -2239,6 +2254,13 @@ static int weston_compositor_xkb_init(struct weston_compositor *ec, ec->xkb_info.super_mod = xkb_map_mod_get_index(ec->xkb_info.keymap, XKB_MOD_NAME_LOGO); + ec->xkb_info.num_led = xkb_map_led_get_index(ec->xkb_info.keymap, + XKB_LED_NAME_NUM); + ec->xkb_info.caps_led = xkb_map_led_get_index(ec->xkb_info.keymap, + XKB_LED_NAME_CAPS); + ec->xkb_info.scroll_led = xkb_map_led_get_index(ec->xkb_info.keymap, + XKB_LED_NAME_SCROLL); + return 0; } diff --git a/src/compositor.h b/src/compositor.h index 57a49de..12ee49d 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -54,6 +54,12 @@ enum weston_keyboard_modifier { MODIFIER_SUPER = (1 << 2), }; +enum weston_led { + LED_NUM_LOCK = (1 << 0), + LED_CAPS_LOCK = (1 << 1), + LED_SCROLL_LOCK = (1 << 2), +}; + struct weston_mode { uint32_t flags; int32_t width, height; @@ -175,12 +181,15 @@ struct weston_seat { struct wl_listener new_drag_icon_listener; + void (*led_update)(struct weston_seat *ws, enum weston_led leds); + struct { struct xkb_state *state; uint32_t mods_depressed; uint32_t mods_latched; uint32_t mods_locked; uint32_t group; + enum weston_led leds; } xkb_state; }; @@ -303,6 +312,9 @@ struct weston_compositor { xkb_mod_index_t ctrl_mod; xkb_mod_index_t alt_mod; xkb_mod_index_t super_mod; + xkb_led_index_t num_led; + xkb_led_index_t caps_led; + xkb_led_index_t scroll_led; } xkb_info; }; -- 1.7.10 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
