bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=53636dd87c560127a09386a9ad5a71726d6f76c5
commit 53636dd87c560127a09386a9ad5a71726d6f76c5 Author: Marcel Hollerbach <marcel-hollerb...@t-online.de> Date: Fri Apr 8 22:37:16 2016 +0200 e_xkb: use new_keyboard event to restore known layout Summary: the new_keyboard event is now used to restore the known layouts out of the config, if the state is changedthe new group is safed in the config which will be safed later. Reviewers: zmike Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D3877 --- src/bin/e_xkb.c | 78 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/src/bin/e_xkb.c b/src/bin/e_xkb.c index 3f88152..1428605 100644 --- a/src/bin/e_xkb.c +++ b/src/bin/e_xkb.c @@ -3,9 +3,12 @@ static void _e_xkb_update_event(int); static void _e_xkb_type_update(E_Pixmap_Type comp_type, int cur_group); static int _e_xkb_cur_group = -1; -static Ecore_Event_Handler *xkb_state_handler = NULL; -static int _e_xkb_skip_events = 0; +static Ecore_Event_Handler *xkb_state_handler = NULL, *xkb_new_keyboard_handler = NULL; +#ifndef HAVE_WAYLAND_ONLY +static int skip_new_keyboard = 0; +static Ecore_Timer *save_group; +#endif E_API int E_EVENT_XKB_CHANGED = 0; @@ -32,35 +35,50 @@ _e_xkb_init_timer(void *data) } #ifndef HAVE_WAYLAND_ONLY + static Eina_Bool -_xkb_changed_state(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +_e_xkb_save_group(void *data) { - if (_e_xkb_skip_events > 0) + int group = (int) data; + + if (e_config->xkb.cur_group != group) { - _e_xkb_skip_events--; + e_config->xkb.cur_group = group; + e_config_save_queue(); + + e_xkb_update(e_config->xkb.cur_group); + } + + save_group = NULL; + + return EINA_FALSE; +} + +static Eina_Bool +_xkb_new_keyboard(void *data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + if (skip_new_keyboard > 0) + { + skip_new_keyboard --; return ECORE_CALLBACK_PASS_ON; } -#if 0 - Ecore_X_Event_Xkb *ev = (Ecore_X_Event_Xkb *)event; + //we have to restore our settings here + e_xkb_update(-1); + e_xkb_update(e_config->xkb.cur_group); - if (ev->group < 0 || - ev->group >= (int)eina_list_count(e_config->xkb.used_layouts)) - return ECORE_CALLBACK_PASS_ON; + return ECORE_CALLBACK_PASS_ON; +} - e_config->xkb.cur_group = ev->group; -#else - (void)event; -#endif +static Eina_Bool +_xkb_new_state(void* data EINA_UNUSED, int type EINA_UNUSED, void *event) +{ + Ecore_X_Event_Xkb *ev = event; + + ecore_timer_del(save_group); + + save_group = ecore_timer_add(0.5, _e_xkb_save_group, (void*)(intptr_t)ev->group); - /* - * XKb_STATE_NOTIFY does not only indicate a new group setted somewhere in e, - * it also indicates that there is probebly a new set of available groups which is unknown to e - * so setting a new groupindex does not mean you have setted to a new group from the enlightenment config. - * So better reconfigure the enlightenment known configuration and ignore the sets from outside of e - */ - _e_xkb_update_event(0); - _e_xkb_update_event(e_config->xkb.cur_group); return ECORE_CALLBACK_PASS_ON; } #endif @@ -73,7 +91,10 @@ e_xkb_init(E_Pixmap_Type comp_type) E_EVENT_XKB_CHANGED = ecore_event_type_new(); #ifndef HAVE_WAYLAND_ONLY if (comp_type == E_PIXMAP_TYPE_X) - xkb_state_handler = ecore_event_handler_add(ECORE_X_EVENT_XKB_STATE_NOTIFY, _xkb_changed_state, NULL); + { + xkb_state_handler = ecore_event_handler_add(ECORE_X_EVENT_XKB_STATE_NOTIFY, _xkb_new_state, NULL); + xkb_new_keyboard_handler = ecore_event_handler_add(ECORE_X_EVENT_XKB_NEWKBD_NOTIFY, _xkb_new_keyboard, NULL); + } #endif if (e_config->xkb.dont_touch_my_damn_keyboard) return 1; _e_xkb_type_update(comp_type, -1); @@ -89,8 +110,12 @@ e_xkb_init(E_Pixmap_Type comp_type) E_API int e_xkb_shutdown(void) { - if (xkb_state_handler) - ecore_event_handler_del(xkb_state_handler); + E_FREE_FUNC(xkb_state_handler, ecore_event_handler_del); + E_FREE_FUNC(xkb_new_keyboard_handler, ecore_event_handler_del); +#ifndef HAVE_WAYLAND_ONLY + ecore_timer_del(save_group); + save_group = NULL; +#endif return 1; } @@ -108,7 +133,6 @@ _e_x_xkb_update(int cur_group) if (cur_group != -1) { _e_xkb_cur_group = cur_group; - _e_xkb_skip_events ++; #ifndef HAVE_WAYLAND_ONLY if (e_comp->root) ecore_x_xkb_select_group(cur_group); @@ -188,7 +212,7 @@ _e_x_xkb_update(int cur_group) } } } - _e_xkb_skip_events ++; + skip_new_keyboard ++; INF("SET XKB RUN: %s", eina_strbuf_string_get(buf)); ecore_exe_run(eina_strbuf_string_get(buf), NULL); eina_strbuf_free(buf); --