Support to deliver caps lock and num lock 11/88511/4
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 19 Sep 2016 11:18:59 +0000 (20:18 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Tue, 20 Sep 2016 02:03:18 +0000 (11:03 +0900)
Change-Id: Ia491f081e4e893c2fb9a84240f3e6d53a047860f
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
ism/demos/isf_layout_efl.cpp
ism/extras/wayland_immodule/wayland_imcontext.c
ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp

index d046f24..fd51d84 100644 (file)
@@ -149,6 +149,7 @@ _key_down_cb (void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
     Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *)event_info;
     LOGD ("[evas key down] keyname : '%s', key : '%s', string : '%s', compose : '%s'\n", ev->keyname, ev->key, ev->string, ev->compose);
+    LOGD ("[evas key down] capslock : %d, num lock : %d\n", evas_key_lock_is_set(ev->locks, "Caps_Lock"), evas_key_lock_is_set(ev->locks, "Num_Lock"));
 }
 
 static void
@@ -156,6 +157,7 @@ _key_up_cb (void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
     Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info;
     LOGD ("[evas key up] keyname : '%s', key : '%s', string : '%s', compose : '%s'\n", ev->keyname, ev->key, ev->string, ev->compose);
+    LOGD ("[evas key up] capslock : %d, num lock : %d\n", evas_key_lock_is_set(ev->locks, "Caps_Lock"), evas_key_lock_is_set(ev->locks, "Num_Lock"));
 }
 
 #ifndef WAYLAND
index 6350b2c..f039145 100644 (file)
 #define WAIT_FOR_FILTER_DONE_SECOND 2
 
 #define MOD_SHIFT_MASK      0x01
-#define MOD_ALT_MASK        0x02
+#define MOD_CAPS_MASK       0x02
 #define MOD_CONTROL_MASK    0x04
+#define MOD_ALT_MASK        0x08
+#define MOD_NUM_MASK        0x80
 #define MOD_Mod5_MASK       0x80
 
 static Eina_Bool _clear_hide_timer();
@@ -116,6 +118,8 @@ struct _WaylandIMContext
     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;
 
     uint32_t serial;
     uint32_t content_purpose;
@@ -1145,6 +1149,8 @@ text_input_modifiers_map(void                 *data,
     imcontext->shift_mask = modifiers_get_mask(map, "Shift");
     imcontext->control_mask = modifiers_get_mask(map, "Control");
     imcontext->alt_mask = modifiers_get_mask(map, "Mod1");
+    imcontext->caps_mask = modifiers_get_mask(map, "Lock");
+    imcontext->num_mask = modifiers_get_mask(map, "Mod2");
 }
 
 static void
@@ -1204,6 +1210,12 @@ text_input_keysym(void                 *data,
     if (modifiers & MOD_Mod5_MASK)
         e->modifiers |= MOD_Mod5_MASK;
 
+    if (modifiers & imcontext->caps_mask)
+        e->modifiers |= ECORE_EVENT_LOCK_CAPS;
+
+    if (modifiers & imcontext->num_mask)
+        e->modifiers |= ECORE_EVENT_LOCK_NUM;
+
     //Save "wl_text_input::keysym" keysym to list if list is not empty,
     //if not, send keysym to ecore loop as key event.
     //This code let key event which will be filtered by IME one by one.
@@ -1629,9 +1641,12 @@ wayland_im_context_add(Ecore_IMF_Context *ctx)
     imcontext->ctx = ctx;
     imcontext->input_panel_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL;
     imcontext->keysym_list = NULL;
+
     imcontext->shift_mask = MOD_SHIFT_MASK;
     imcontext->control_mask = MOD_CONTROL_MASK;
     imcontext->alt_mask = MOD_ALT_MASK;
+    imcontext->caps_mask = MOD_CAPS_MASK;
+    imcontext->num_mask = MOD_NUM_MASK;
 
     imcontext->text_input =
         wl_text_input_manager_create_text_input(imcontext->text_input_manager);
@@ -2014,8 +2029,12 @@ wayland_im_context_filter_event(Ecore_IMF_Context    *ctx,
                 modifiers |= imcontext->control_mask;
             if (ecore_key_ev.modifiers & ECORE_EVENT_MODIFIER_ALT)
                 modifiers |= imcontext->alt_mask;
+            if (ecore_key_ev.modifiers & ECORE_EVENT_LOCK_CAPS)
+                modifiers |= imcontext->caps_mask;
+            if (ecore_key_ev.modifiers & ECORE_EVENT_LOCK_NUM)
+                modifiers |= imcontext->num_mask;
 
-            LOGD ("ev:modifiers=%d, modifiers=%d, shift_mask=%d, control_mask=%d, alt_mask=%d", ecore_key_ev.modifiers, modifiers, imcontext->shift_mask, imcontext->control_mask, imcontext->alt_mask);
+            SECURE_LOGD ("ev:modifiers=0x%x, modifiers=0x%x, shift_mask=0x%x, control_mask=0x%0x, alt_mask=0x%x, caps_mask=0x%x, num_mask=0x%x", ecore_key_ev.modifiers, modifiers, imcontext->shift_mask, imcontext->control_mask, imcontext->alt_mask, imcontext->caps_mask, imcontext->num_mask);
             //Send key event to IME.
             wl_text_input_filter_key_event(imcontext->text_input, serial, ecore_key_ev.timestamp, ecore_key_ev.key,
                                            type == ECORE_IMF_EVENT_KEY_UP? WL_KEYBOARD_KEY_STATE_RELEASED : WL_KEYBOARD_KEY_STATE_PRESSED,
index 3c70949..3c282c4 100755 (executable)
@@ -266,8 +266,10 @@ static Ecore_Timer                                     *_resource_check_timer
 #define WAYLAND_MODULE_CLIENT_ID (0)
 
 #define MOD_SHIFT_MASK      0x01
-#define MOD_ALT_MASK        0x02
+#define MOD_CAPS_MASK       0x02
 #define MOD_CONTROL_MASK    0x04
+#define MOD_ALT_MASK        0x08
+#define MOD_NUM_MASK        0x80
 #define MOD_Mod5_MASK       0x80
 
 //////////////////////////////wayland_panel_agent_module begin//////////////////////////////////////////////////
@@ -1883,6 +1885,11 @@ isf_wsc_context_filter_key_event (WSCContextISF* wsc_ctx,
     if (modifiers & MOD_CONTROL_MASK)
         key.mask |= SCIM_KEY_ControlMask;
 
+    if (modifiers & MOD_CAPS_MASK)
+        key.mask |= SCIM_KEY_CapsLockMask;
+    if (modifiers & MOD_NUM_MASK)
+        key.mask |= SCIM_KEY_NumLockMask;
+
     if (!press) {
         key.mask |= SCIM_KEY_ReleaseMask;
     } else {