bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=d1e700cb68d66f5f7cc9a9ce322a11a51fd785d5
commit d1e700cb68d66f5f7cc9a9ce322a11a51fd785d5 Author: Marcel Hollerbach <marcel-hollerb...@t-online.de> Date: Thu Jun 30 20:19:33 2016 +0200 e_comp_wl: introduce api to set index of keymap this commit introduces the setting of the index. Setting the index here means that the layout with the id 0..n, out of the compiled keymap file will be used. After a new index is set the modifiers are updated, that the client are aware of the new resulting group. If the api is called before the compositor is inited (this can happen in e_xkb, so the drm can use the keymap at startup) then the index is saved in between and will be flushed once the compositor does the init. --- src/bin/e_comp_wl.h | 1 + src/bin/e_comp_wl_input.c | 67 ++++++++++++++++++++++++++++++++++++----------- src/bin/e_comp_wl_input.h | 2 ++ 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index 1dd47f2..5823488 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -164,6 +164,7 @@ struct _E_Comp_Wl_Data xkb_mod_index_t mod_super; xkb_mod_mask_t mod_depressed, mod_latched, mod_locked; xkb_layout_index_t mod_group; + xkb_layout_index_t choosen_group; struct wl_array keys; struct wl_resource *focus; int mod_changed; diff --git a/src/bin/e_comp_wl_input.c b/src/bin/e_comp_wl_input.c index ff66feb..3a77da8 100644 --- a/src/bin/e_comp_wl_input.c +++ b/src/bin/e_comp_wl_input.c @@ -19,6 +19,7 @@ static void _e_comp_wl_input_context_keymap_set(struct xkb_keymap *keymap, struc //when then later init is called those two fields are used in the keymap of the e_comp_wl struct static struct xkb_context *cached_context; static struct xkb_keymap *cached_keymap; +static xkb_layout_index_t choosen_group; static void _e_comp_wl_input_update_seat_caps(void) @@ -346,22 +347,11 @@ _e_comp_wl_input_keymap_fd_get(off_t size) return fd; } + static void -_e_comp_wl_input_keymap_update(struct xkb_keymap *keymap) +_e_comp_wl_input_state_update(void) { - char *tmp; xkb_mod_mask_t latched = 0, locked = 0; - struct wl_resource *res; - Eina_List *l; - - /* 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) @@ -376,14 +366,38 @@ _e_comp_wl_input_keymap_update(struct xkb_keymap *keymap) } /* create a new xkb state */ - e_comp_wl->xkb.state = xkb_state_new(keymap); + e_comp_wl->xkb.state = xkb_state_new(e_comp_wl->xkb.keymap); xkb_state_update_mask(e_comp_wl->xkb.state, 0, - latched, locked, 0, 0, 0); + latched, locked, + e_comp_wl->kbd.choosen_group, + 0, + 0); +} + +static void +_e_comp_wl_input_keymap_update(struct xkb_keymap *keymap) +{ + char *tmp; + struct wl_resource *res; + Eina_List *l; + + /* 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); + /* increment keymap reference */ e_comp_wl->xkb.keymap = keymap; + /* update the state */ + _e_comp_wl_input_state_update(); + /* fetch updated modifiers */ e_comp_wl->kbd.mod_shift = xkb_map_mod_get_index(keymap, XKB_MOD_NAME_SHIFT); @@ -464,6 +478,13 @@ e_comp_wl_input_init(void) else e_comp_wl_input_keymap_set(NULL, NULL, NULL, NULL, NULL); + if (choosen_group) + e_comp_wl_input_keymap_index_set(choosen_group); + else + e_comp_wl_input_keymap_index_set(0); + + e_comp_wl_input_keyboard_modifiers_update(); + return EINA_TRUE; } @@ -664,6 +685,22 @@ _e_comp_wl_input_context_keymap_set(struct xkb_keymap *keymap, struct xkb_contex } E_API void +e_comp_wl_input_keymap_index_set(xkb_layout_index_t index) +{ + if (e_comp_wl) + { + e_comp_wl->kbd.choosen_group = index; + _e_comp_wl_input_state_update(); + e_comp_wl_input_keyboard_modifiers_update(); + + } + else + choosen_group = index; + + +} + +E_API void e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *layout, const char *variant, const char *options) { struct xkb_keymap *keymap; diff --git a/src/bin/e_comp_wl_input.h b/src/bin/e_comp_wl_input.h index 9f7e40a..8884dee 100644 --- a/src/bin/e_comp_wl_input.h +++ b/src/bin/e_comp_wl_input.h @@ -29,6 +29,8 @@ E_API void e_comp_wl_input_pointer_enabled_set(Eina_Bool enabled); E_API void e_comp_wl_input_keyboard_enabled_set(Eina_Bool enabled); E_API void e_comp_wl_input_touch_enabled_set(Eina_Bool enabled); + +E_API void e_comp_wl_input_keymap_index_set(xkb_layout_index_t index); E_API void e_comp_wl_input_keymap_set(const char *rules, const char *model, const char *layout, const char *variant, const char *options); E_API void e_comp_wl_input_keyboard_event_generate(const char *key, int mods, Eina_Bool up); --