libuwac: Add UwacKeyboardModifiersEvent
author0140454 <s1994928@yahoo.com.tw>
Thu, 4 Feb 2021 12:23:02 +0000 (20:23 +0800)
committerakallabeth <akallabeth@users.noreply.github.com>
Thu, 25 Feb 2021 08:51:41 +0000 (09:51 +0100)
(cherry picked from commit b4ffc2f8b3792f9781559ebe4a094511c3b46170)

uwac/include/uwac/uwac.h
uwac/libuwac/uwac-input.c
uwac/libuwac/uwac-priv.h

index ae3452e..8197961 100644 (file)
@@ -62,6 +62,8 @@ enum
        UWAC_MOD_SHIFT_MASK = 0x01,
        UWAC_MOD_ALT_MASK = 0x02,
        UWAC_MOD_CONTROL_MASK = 0x04,
+       UWAC_MOD_CAPS_MASK = 0x08,
+       UWAC_MOD_NUM_MASK = 0x10,
 };
 
 /** @brief a position */
@@ -91,6 +93,7 @@ enum
        UWAC_EVENT_POINTER_BUTTONS,
        UWAC_EVENT_POINTER_AXIS,
        UWAC_EVENT_KEYBOARD_ENTER,
+       UWAC_EVENT_KEYBOARD_MODIFIERS,
        UWAC_EVENT_KEY,
        UWAC_EVENT_TOUCH_FRAME_BEGIN,
        UWAC_EVENT_TOUCH_UP,
@@ -145,6 +148,13 @@ struct uwac_keyboard_enter_event
 };
 typedef struct uwac_keyboard_enter_event UwacKeyboardEnterLeaveEvent;
 
+struct uwac_keyboard_modifiers_event
+{
+       int type;
+       uint32_t modifiers;
+};
+typedef struct uwac_keyboard_modifiers_event UwacKeyboardModifiersEvent;
+
 struct uwac_pointer_enter_event
 {
        int type;
@@ -277,6 +287,7 @@ union uwac_event {
        UwacPointerButtonEvent mouse_button;
        UwacPointerAxisEvent mouse_axis;
        UwacKeyboardEnterLeaveEvent keyboard_enter_leave;
+       UwacKeyboardModifiersEvent keyboard_modifiers;
        UwacClipboardEvent clipboard;
        UwacKeyEvent key;
        UwacTouchFrameBegin touchFrameBegin;
index 7a15e2e..20af1e5 100644 (file)
@@ -231,6 +231,8 @@ static void keyboard_handle_keymap(void* data, struct wl_keyboard* keyboard, uin
        input->xkb.control_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Control");
        input->xkb.alt_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Mod1");
        input->xkb.shift_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Shift");
+       input->xkb.caps_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Lock");
+       input->xkb.num_mask = 1 << xkb_keymap_mod_get_index(input->xkb.keymap, "Mod2");
 }
 
 static void keyboard_handle_key(void* data, struct wl_keyboard* keyboard, uint32_t serial,
@@ -425,6 +427,7 @@ static void keyboard_handle_modifiers(void* data, struct wl_keyboard* keyboard,
                                       uint32_t mods_locked, uint32_t group)
 {
        UwacSeat* input = data;
+       UwacKeyboardModifiersEvent *event;
        xkb_mod_mask_t mask;
 
        /* If we're not using a keymap, then we don't handle PC-style modifiers */
@@ -433,7 +436,7 @@ static void keyboard_handle_modifiers(void* data, struct wl_keyboard* keyboard,
 
        xkb_state_update_mask(input->xkb.state, mods_depressed, mods_latched, mods_locked, 0, 0, group);
        mask = xkb_state_serialize_mods(input->xkb.state,
-                                       XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
+                                       XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED | XKB_STATE_MODS_LOCKED);
        input->modifiers = 0;
        if (mask & input->xkb.control_mask)
                input->modifiers |= UWAC_MOD_CONTROL_MASK;
@@ -441,6 +444,17 @@ static void keyboard_handle_modifiers(void* data, struct wl_keyboard* keyboard,
                input->modifiers |= UWAC_MOD_ALT_MASK;
        if (mask & input->xkb.shift_mask)
                input->modifiers |= UWAC_MOD_SHIFT_MASK;
+       if (mask & input->xkb.caps_mask)
+               input->modifiers |= UWAC_MOD_CAPS_MASK;
+       if (mask & input->xkb.num_mask)
+               input->modifiers |= UWAC_MOD_NUM_MASK;
+
+       event = (UwacKeyboardModifiersEvent*)UwacDisplayNewEvent(input->display,
+                                                                UWAC_EVENT_KEYBOARD_MODIFIERS);
+       if (!event)
+               return;
+
+       event->modifiers = input->modifiers;
 }
 
 static void set_repeat_info(UwacSeat* input, int32_t rate, int32_t delay)
index 2ef073d..aed3898 100644 (file)
@@ -180,6 +180,8 @@ struct uwac_seat
                xkb_mod_mask_t control_mask;
                xkb_mod_mask_t alt_mask;
                xkb_mod_mask_t shift_mask;
+               xkb_mod_mask_t caps_mask;
+               xkb_mod_mask_t num_mask;
        } xkb;
        uint32_t modifiers;
        int32_t repeat_rate_sec, repeat_rate_nsec;