Add core LED handling
authorDaniel Stone <daniel@fooishbar.org>
Wed, 30 May 2012 15:31:45 +0000 (16:31 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 31 May 2012 19:38:50 +0000 (15:38 -0400)
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 <daniel@fooishbar.org>
src/compositor.c
src/compositor.h

index b76cd39..eb3d474 100644 (file)
@@ -1733,6 +1733,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. */
@@ -1771,6 +1772,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;
 }
 
@@ -2237,6 +2252,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;
 }
 
index 4c037c9..08dcd77 100644 (file)
@@ -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;
@@ -180,12 +186,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;
 };
 
@@ -308,6 +317,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;
 };