From 97359b155550948d7e6aaa2b6acdd1977458768e Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Wed, 21 Feb 2024 14:59:53 +0900 Subject: [PATCH] e_input: Fix build error due to deprecate Change-Id: Ibe6f8d76945516c9271861e22964b561fa5a2f39 Signed-off-by: Jihoon Kim --- src/bin/e_comp_wl_input.c | 115 +++++++++++++++++++++++++++++++++++++++++++++- src/include/e_comp_wl.h | 4 +- 2 files changed, 116 insertions(+), 3 deletions(-) diff --git a/src/bin/e_comp_wl_input.c b/src/bin/e_comp_wl_input.c index a64fe78..d6b9c4c 100644 --- a/src/bin/e_comp_wl_input.c +++ b/src/bin/e_comp_wl_input.c @@ -1293,6 +1293,94 @@ _e_comp_wl_input_keymap_fd_get(off_t size) } static void +_e_comp_wl_keymap_update(struct xkb_keymap *keymap, const char *keymap_path) +{ + /* FIXME: will be deprecated after migration */ + char *tmp; + xkb_mod_mask_t latched = 0, locked = 0, group = 0; + + /* unreference any existing keymap */ + if (e_comp_wl->xkb.keymap) + xkb_map_unref(e_comp_wl->xkb.keymap); + + /* unmap any existing keyboard area */ + if (e_comp_wl->xkb.area) + munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size); + if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd); + + /* unreference any existing keyboard state */ + if (e_comp_wl->xkb.state) + { + latched = + xkb_state_serialize_mods(e_comp_wl->xkb.state, + XKB_STATE_MODS_LATCHED); + locked = + xkb_state_serialize_mods(e_comp_wl->xkb.state, + XKB_STATE_MODS_LOCKED); + group = + xkb_state_serialize_layout(e_comp_wl->xkb.state, + XKB_STATE_LAYOUT_EFFECTIVE); + xkb_state_unref(e_comp_wl->xkb.state); + } + + /* create a new xkb state */ + e_comp_wl->xkb.state = xkb_state_new(keymap); + + if (!e_comp_wl->xkb.state) + { + return; + } + + if ((latched) || (locked) || (group)) + xkb_state_update_mask(e_comp_wl->xkb.state, 0, + latched, locked, 0, 0, group); + + /* increment keymap reference */ + e_comp_wl->xkb.keymap = keymap; + + /* fetch updated modifiers */ + e_comp_wl->kbd.mod_shift = + xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT); + e_comp_wl->kbd.mod_caps = + xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CAPS); + e_comp_wl->kbd.mod_ctrl = + xkb_map_mod_get_index(keymap, XKB_MOD_NAME_CTRL); + e_comp_wl->kbd.mod_alt = + xkb_map_mod_get_index(keymap, XKB_MOD_NAME_ALT); + e_comp_wl->kbd.mod_super = + xkb_map_mod_get_index(keymap, XKB_MOD_NAME_LOGO); + + if (!(tmp = xkb_map_get_as_string(keymap))) + { + ERR("Could not get keymap string"); + return; + } + + e_comp_wl->xkb.size = strlen(tmp) + 1; + e_comp_wl->xkb.fd = + _e_comp_wl_input_keymap_fd_get(e_comp_wl->xkb.size); + if (e_comp_wl->xkb.fd < 0) + { + ERR("Could not create keymap file"); + free(tmp); + return; + } + + e_comp_wl->xkb.area = + mmap(NULL, e_comp_wl->xkb.size, (PROT_READ | PROT_WRITE), + MAP_SHARED, e_comp_wl->xkb.fd, 0); + if (e_comp_wl->xkb.area == MAP_FAILED) + { + ERR("Failed to mmap keymap area: %m"); + free(tmp); + return; + } + + strncpy(e_comp_wl->xkb.area, tmp, e_comp_wl->xkb.size); + free(tmp); +} + +static void _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_path) { char *tmp; @@ -1382,6 +1470,8 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap, const char *keymap_pat strncpy(e_comp_input_key->xkb.area, tmp, e_comp_input_key->xkb.size); free(tmp); + _e_comp_wl_keymap_update(keymap, keymap_path); + /* send updated keymap */ TRACE_INPUT_BEGIN(wl_keyboard_send_keymap_update); g_mutex_lock(&e_comp_wl->kbd.resource_mutex); @@ -1414,6 +1504,9 @@ e_comp_wl_input_init(void) g_mutex_init(&e_comp_wl->kbd.repeat_delay_mutex); g_mutex_init(&e_comp_wl->kbd.repeat_rate_mutex); + g_mutex_init(&e_comp_wl->xkb.keymap_mutex); + g_mutex_init(&e_comp_wl->xkb.state_mutex); + /* get default keyboard repeat delay from configuration */ atomic_store(&e_comp_wl->kbd.repeat_delay, e_config->keyboard.repeat_delay); /* check for valid repeat_delay */ @@ -1547,6 +1640,23 @@ e_comp_wl_input_shutdown(void) wl_array_release(&e_comp_wl->kbd.routed_keys); + /* unmap any existing keyboard area */ + if (e_comp_wl->xkb.area) + munmap(e_comp_wl->xkb.area, e_comp_wl->xkb.size); + if (e_comp_wl->xkb.fd >= 0) close(e_comp_wl->xkb.fd); + + /* unreference any existing keyboard state */ + if (e_comp_wl->xkb.state) + xkb_state_unref(e_comp_wl->xkb.state); + + /* unreference any existing keymap */ + if (e_comp_wl->xkb.keymap) + xkb_map_unref(e_comp_wl->xkb.keymap); + + /* unreference any existing context */ + if (e_comp_wl->xkb.context) + xkb_context_unref(e_comp_wl->xkb.context); + e_comp_input_shutdown(); /* destroy the global relative pointer resource */ @@ -1567,6 +1677,9 @@ e_comp_wl_input_shutdown(void) dont_set_e_input_keymap = EINA_FALSE; dont_use_xkb_cache = EINA_FALSE; + g_mutex_clear(&e_comp_wl->xkb.keymap_mutex); + g_mutex_clear(&e_comp_wl->xkb.state_mutex); + g_mutex_clear(&e_comp_wl->kbd.keys_mutex); g_mutex_clear(&e_comp_wl->kbd.repeat_delay_mutex); g_mutex_clear(&e_comp_wl->kbd.repeat_rate_mutex); @@ -2179,4 +2292,4 @@ e_comp_wl_input_keymap_init(void) e_comp_wl_input_keymap_default_variant_get(), e_comp_wl_input_keymap_default_options_get(), ctx, map); -} \ No newline at end of file +} diff --git a/src/include/e_comp_wl.h b/src/include/e_comp_wl.h index 1785256..226408a 100644 --- a/src/include/e_comp_wl.h +++ b/src/include/e_comp_wl.h @@ -344,7 +344,7 @@ struct _E_Comp_Wl_Data uint32_t edges; } resize; - EINA_DEPRECATED struct + struct { struct xkb_keymap *keymap; struct xkb_context *context; @@ -354,7 +354,7 @@ struct _E_Comp_Wl_Data char *area; GMutex keymap_mutex; GMutex state_mutex; - } xkb; + } xkb; /* FIXME: will be deprecated after migration */ struct { -- 2.7.4