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);

-- 


Reply via email to