e_input: fix issue failed to load keymap 16/315916/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 9 Aug 2024 08:14:22 +0000 (17:14 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 9 Aug 2024 10:27:02 +0000 (19:27 +0900)
Change-Id: I65155224b4050ad4e8004c4ed0c990132f1fe07e
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_comp_screen.c
src/bin/inputmgr/e_comp_input.c
src/bin/inputmgr/e_comp_input_intern.h
src/bin/inputmgr/e_devicemgr_input.c
src/bin/inputmgr/e_devicemgr_inputgen.c
src/bin/inputmgr/e_input_backend.c
src/bin/inputmgr/e_keyrouter.c
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_input.c

index 0fded29f5b727ab1840a1ca7bdece42912c6d781..d2a84dabcb14542ffb15042d388fae459ebed118 100644 (file)
@@ -613,12 +613,9 @@ e_comp_screen_init()
    /* FIXME: This is just for testing at the moment....
     * happens to jive with what drm does */
 
-   if (!e_input_thread_mode_get())
-     {
-        e_main_ts_begin("\tE_Comp_WL Keymap Init");
-        e_comp_wl_input_keymap_init();
-        e_main_ts_begin("\tE_Comp_WL Keymap Init Done");
-     }
+   e_main_ts_begin("\tE_Comp_WL Keymap Init");
+   e_comp_wl_input_keymap_init();
+   e_main_ts_begin("\tE_Comp_WL Keymap Init Done");
 
    e_main_ts_begin("\tDBUS Init");
    dbus_init_done_handler = NULL;
index 8107159c3529095e078aa8d5d71c3c37de756c40..e7a3612c1b42f8751b5b2ebbef2198e3bffaa1ae 100644 (file)
@@ -18,6 +18,8 @@ e_comp_input_init(void)
         return;
      }
 
+   g_rec_mutex_init(&e_comp_input_key->xkb.keymap_mutex);
+
    e_comp_input = E_NEW(E_Comp_Input, 1);
    if (!e_comp_input)
      {
@@ -39,6 +41,7 @@ e_comp_input_shutdown(void)
         if (e_comp_input_key->xkb.fd >= 0) close(e_comp_input_key->xkb.fd);
 
         /* unreference any existing keyboard state */
+        g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
         if (e_comp_input_key->xkb.state)
           xkb_state_unref(e_comp_input_key->xkb.state);
 
@@ -46,10 +49,14 @@ e_comp_input_shutdown(void)
         if (e_comp_input_key->xkb.keymap)
           xkb_map_unref(e_comp_input_key->xkb.keymap);
 
+        g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
         /* unreference any existing context */
         if (e_comp_input_key->xkb.context)
           xkb_context_unref(e_comp_input_key->xkb.context);
 
+        g_rec_mutex_clear(&e_comp_input_key->xkb.keymap_mutex);
+
         E_FREE(e_comp_input_key);
      }
 
index 6240e130b6fba2008951809882aed07304b7d228..a4d6c242461bb12be477b15c894cd47f58d66ff4 100644 (file)
@@ -26,6 +26,7 @@ struct _E_Comp_Input_Key_Data
         int fd;
         size_t size;
         char *area;
+        GRecMutex keymap_mutex;
      } xkb;
 
    struct
index 05f066e331df9c86085826ecfe73d1abad124531..53fd7d5666bc5022c67ca9dc0bc92b1b85c79167 100644 (file)
@@ -186,7 +186,9 @@ _e_devicemgr_input_mouse_button_remap(Ecore_Event_Mouse_Button *ev, Eina_Bool pr
    E_Keyrouter_Event_Data *key_data;
    struct xkb_keymap *keymap = NULL;
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    keymap = e_comp_input_key->xkb.keymap;
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(keymap, ECORE_CALLBACK_PASS_ON);
    EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
index a91e1a9298f0624085b83e1c8bd07e9f617dcc6d..ffd94cd753f1f0bd7a063b146ba1013f51490bac 100644 (file)
@@ -1079,6 +1079,7 @@ e_devicemgr_inputgen_generate_key(struct wl_client *client, struct wl_resource *
    char *name, *identifier = NULL;
    Eina_Stringshare *name_data;
    int ret;
+   struct xkb_keymap *keymap = NULL;
 
    name = _e_devicemgr_inputgen_name_get(resource);
 
@@ -1088,7 +1089,11 @@ e_devicemgr_inputgen_generate_key(struct wl_client *client, struct wl_resource *
         return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
      }
 
-   if (!e_comp_input_key->xkb.keymap)
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
+   keymap = e_comp_input_key->xkb.keymap;
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
+   if (!keymap)
      {
         DMWRN("keymap is not ready\n");
         return TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER;
index 356d98b699ee66f22e17f92dd2dead7f5e871b0c..b6c026b8dbea68e03ee51c08d1319c9ac8d4abc4 100644 (file)
@@ -1113,24 +1113,13 @@ input_thread_start(void *data, Ecore_Thread *th)
    InputEventSource *input_event_source = NULL;
    GIOChannel *_pipe_iochannel = NULL;
    GSource *pipe_source = NULL;
-   E_Keyrouter_Config_Data *kconfig = NULL;
 
    if (!(input = data)) return;
 
    eina_thread_name_set(eina_thread_self(), "input-thread");
 
-   kconfig = krt->conf;
-
    e_input_backend_libinput_context_create(input);
 
-   e_comp_wl_input_keymap_init();
-   e_keyrouter_conf_init(kconfig);
-
-   krt->pictureoff_disabled = !!kconfig->conf->pictureoff_disabled;
-   krt->composition_key.waiting_time = kconfig->conf->composition_key_wait_time;
-
-   e_keyrouter_query_tizen_key_table();
-
    if (e_config->create_wm_ready)
      e_main_create_wm_ready();
 
index 6ead6b0032abebb9d12fbf64c51c9175d53dbfe9..72e248dedde9521c9b5ed091e83ad2fdd621b449 100644 (file)
@@ -446,7 +446,9 @@ e_keyrouter_query_tizen_key_table(void)
           {
              if (krt->HardKeys[data->keycode].repeat == EINA_FALSE)
                {
+                  g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
                   res = xkb_keymap_key_set_repeats(e_comp_input_key->xkb.keymap, data->keycode, 0);
+                  g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
                   if (!res)
                     {
                        KLWRN("Failed to set repeat key(%d), value(%d)", data->keycode, 0);
@@ -654,22 +656,16 @@ e_keyrouter_init(void)
    EINA_SAFETY_ON_NULL_GOTO(kconfig, err);
    krt->conf = kconfig;
 
-   if (!e_input_thread_mode_get())
-     {
-        e_keyrouter_conf_init(kconfig);
-        EINA_SAFETY_ON_NULL_GOTO(kconfig->conf, err);
-        krt->conf = kconfig;
-        krt->pictureoff_disabled = !!kconfig->conf->pictureoff_disabled;
+   e_keyrouter_conf_init(kconfig);
+   EINA_SAFETY_ON_NULL_GOTO(kconfig->conf, err);
+   krt->conf = kconfig;
+   krt->pictureoff_disabled = !!kconfig->conf->pictureoff_disabled;
 
-        krt->composition_key.waiting_time = kconfig->conf->composition_key_wait_time;
-     }
+   krt->composition_key.waiting_time = kconfig->conf->composition_key_wait_time;
 
    /* Get keyname and keycode pair from Tizen Key Layout file */
-   if (!e_input_thread_mode_get())
-     {
-        res = e_keyrouter_query_tizen_key_table();
-        EINA_SAFETY_ON_FALSE_GOTO(res, err);
-     }
+   res = e_keyrouter_query_tizen_key_table();
+   EINA_SAFETY_ON_FALSE_GOTO(res, err);
 
    //ecore handler add for power callback registration
 //   if (!krt->pictureoff_disabled)
index c3c914336aa1dd12cbf430a8b9b308f8ebb77c04..094bcb2bd5ff1a56593462c3301eeb6817caf05b 100644 (file)
@@ -4820,7 +4820,9 @@ e_comp_wl_key_cancel(E_Client *ec, int keycode, Ecore_Device *dev, uint32_t time
    EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, EINA_FALSE);
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    keymap = e_comp_input_key->xkb.keymap;
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
    EINA_SAFETY_ON_NULL_RETURN_VAL(keymap, EINA_FALSE);
 
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
index 349d2a84574f036fde115fdaeb2b41814ef712d1..736b3237d5d3ee47bbd6cbe1c2eff12384d5ebec 100644 (file)
@@ -1481,15 +1481,19 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
    Eina_List *l;
 
    /* unreference any existing keymap */
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    if (e_comp_input_key->xkb.keymap)
      xkb_map_unref(e_comp_input_key->xkb.keymap);
 
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
    /* unmap any existing keyboard area */
    if (e_comp_input_key->xkb.area)
      munmap(e_comp_input_key->xkb.area, e_comp_input_key->xkb.size);
    if (e_comp_input_key->xkb.fd >= 0) close(e_comp_input_key->xkb.fd);
 
    /* unreference any existing keyboard state */
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    if (e_comp_input_key->xkb.state)
      {
         latched =
@@ -1509,6 +1513,7 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
 
    if (!e_comp_input_key->xkb.state)
      {
+        g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
         return;
      }
 
@@ -1518,6 +1523,7 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat
 
    /* increment keymap reference */
    e_comp_input_key->xkb.keymap = keymap;
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
 
    /* fetch updated modifiers */
    e_comp_input_key->kbd.mod_shift =
@@ -1790,27 +1796,41 @@ e_comp_wl_input_keyboard_modifiers_serialize(void)
    xkb_mod_mask_t mod_depressed, mod_latched, mod_locked;
    xkb_layout_index_t mod_group;
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
+
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_DEPRESSED);
+
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
    mod_depressed = atomic_load(&e_comp_input_key->kbd.mod_depressed);
    changed |= mod != mod_depressed;
    atomic_store(&e_comp_input_key->kbd.mod_depressed, mod);
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_MODS_LATCHED);
 
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
    mod_latched = atomic_load(&e_comp_input_key->kbd.mod_latched);
    changed |= mod != mod_latched;
    atomic_store(&e_comp_input_key->kbd.mod_latched, mod);
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    mod = xkb_state_serialize_mods(e_comp_input_key->xkb.state,
                               XKB_STATE_MODS_LOCKED);
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
    mod_locked = atomic_load(&e_comp_input_key->kbd.mod_locked);
    changed |= mod != mod_locked;
    atomic_store(&e_comp_input_key->kbd.mod_locked, mod);
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    grp = xkb_state_serialize_layout(e_comp_input_key->xkb.state,
                                 XKB_STATE_LAYOUT_EFFECTIVE);
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
+
    mod_group = atomic_load(&e_comp_input_key->kbd.mod_group);
    changed |= grp != mod_group;
    atomic_store(&e_comp_input_key->kbd.mod_group, grp);
@@ -1938,6 +1958,7 @@ e_comp_wl_input_keymap_compile(struct xkb_context *ctx, struct xkb_rule_names na
         /* fetch new keymap based on names */
         keymap = xkb_map_new_from_names(ctx, &names, 0);
         use_cache_keymap = EINA_FALSE;
+        INF("Completed to load Keymap.\n");
      }
    else
      {
@@ -1945,15 +1966,17 @@ e_comp_wl_input_keymap_compile(struct xkb_context *ctx, struct xkb_rule_names na
         keymap = xkb_map_new_from_file(ctx, file, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
         if (!keymap)
           {
-             WRN("Keymap file is exist (%s) but it is invaild file. Generate keymap using rmlvo\n", cache_path);
+             WRN("Keymap file is exist (%s) but it is invalid file. Generate keymap using rmlvo\n", cache_path);
              fclose(file);
              if (remove(cache_path) != 0)
                WRN("Failed to remove keymap file: %s (errno: %d)", cache_path, errno);
              keymap = xkb_map_new_from_names(ctx, &names, 0);
              use_cache_keymap = EINA_FALSE;
+             INF("Completed to load Keymap.\n");
           }
         else
           {
+             INF("Completed to load Keymap (%s).\n", cache_path);
              eina_stringshare_del(cache_path);
              cache_path = NULL;
              fclose(file);
@@ -2233,7 +2256,9 @@ e_comp_wl_input_keymap_keyname_to_keycode(const char * name)
    EINA_SAFETY_ON_NULL_RETURN_VAL(name, 0);
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, 0);
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    keymap = e_comp_input_key->xkb.keymap;
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
    EINA_SAFETY_ON_NULL_GOTO(keymap, finish);
 
    keysym = xkb_keysym_from_name(name, XKB_KEYSYM_NO_FLAGS);
@@ -2253,7 +2278,9 @@ e_comp_wl_input_keymap_keyname_to_keycode(const char * name)
           goto finish;
      }
 
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    keycode = _e_comp_wl_input_keymap_keysym_to_keycode(keymap, keysym);
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
 
    return keycode;
 
@@ -2270,14 +2297,17 @@ e_comp_wl_input_keymap_keycode_to_keyname(int keycode)
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL(8 <= keycode, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp_wl, NULL);
+   g_rec_mutex_lock(&e_comp_input_key->xkb.keymap_mutex);
    if (!e_comp_input_key->xkb.state)
      {
+        g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
         return NULL;
      }
 
    state = e_comp_input_key->xkb.state;
 
    sym = xkb_state_key_get_one_sym(state, keycode);
+   g_rec_mutex_unlock(&e_comp_input_key->xkb.keymap_mutex);
 
    if (sym == XKB_KEY_NoSymbol)
      {