diff --git a/src/lib/elput/Elput.h b/src/lib/elput/Elput.h index f64943f853..4595f58e61 100644 --- a/src/lib/elput/Elput.h +++ b/src/lib/elput/Elput.h @@ -390,6 +390,17 @@ EAPI Eina_Bool elput_input_key_remap_set(Elput_Manager *manager, int *from_keys, */ EAPI void elput_input_keyboard_cached_context_set(Elput_Manager *manager, void *context); +/** + * Set a cached keymap to be used for keyboards + * + * @param manager + * @param keymap + * + * @ingroup Elput_Input_Group + * @since 1.18 + */ +EAPI void elput_input_keyboard_cached_keymap_set(Elput_Manager *manager, void *keymap); + # endif # undef EAPI diff --git a/src/lib/elput/elput_evdev.c b/src/lib/elput/elput_evdev.c index 79386af902..8704a2ee9b 100644 --- a/src/lib/elput/elput_evdev.c +++ b/src/lib/elput/elput_evdev.c @@ -165,9 +165,10 @@ _keyboard_info_destroy(Elput_Keyboard_Info *info, Eina_Bool external) { if (--info->refs > 0) return; + xkb_keymap_unref(info->keymap.map); + if (!external) { - xkb_keymap_unref(info->keymap.map); if (info->keymap.area) munmap(info->keymap.area, info->keymap.size); if (info->keymap.fd >= 0) close(info->keymap.fd); } diff --git a/src/lib/elput/elput_input.c b/src/lib/elput/elput_input.c index 464f69f226..1918216565 100644 --- a/src/lib/elput/elput_input.c +++ b/src/lib/elput/elput_input.c @@ -585,3 +585,12 @@ elput_input_keyboard_cached_context_set(Elput_Manager *manager, void *context) if ((context) && (manager->cached.context == context)) return; manager->cached.context = context; } + +EAPI void +elput_input_keyboard_cached_keymap_set(Elput_Manager *manager, void *keymap) +{ + EINA_SAFETY_ON_NULL_RETURN(manager); + + if ((keymap) && (manager->cached.keymap == keymap)) return; + manager->cached.keymap = keymap; +} diff --git a/src/lib/elput/elput_private.h b/src/lib/elput/elput_private.h index 7a57e2f159..cda235e49d 100644 --- a/src/lib/elput/elput_private.h +++ b/src/lib/elput/elput_private.h @@ -249,6 +249,7 @@ struct _Elput_Manager struct { + struct xkb_keymap *keymap; struct xkb_context *context; } cached;