raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=9fe734318072b4ec86be07d9006f5c36a7556c64

commit 9fe734318072b4ec86be07d9006f5c36a7556c64
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Tue Nov 14 18:15:26 2017 +0900

    fix mouse hangs after unblank
    
    this fixes T5883
---
 src/bin/e_comp_x.c  | 28 +++++++++++-----------------
 src/bin/e_pointer.c | 28 ++++++++++++++++++++++++++--
 src/bin/e_pointer.h |  4 ++++
 3 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index 47403a340..5c8106fc7 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -5122,13 +5122,11 @@ _e_comp_x_cb_ping(void *data EINA_UNUSED, int ev_type 
EINA_UNUSED, Ecore_X_Event
 static void
 _e_comp_pointer_grab(void)
 {
-   fprintf(stderr, "E_COMP_X: 06 create grab win and grab pointer\n");
    if (_e_comp_x_suspend_grabbed) 
ecore_x_window_free(_e_comp_x_suspend_grabbed);
    _e_comp_x_suspend_grabbed = ecore_x_window_input_new(e_comp->root, 0, 0, 1, 
1);
    ecore_x_window_show(_e_comp_x_suspend_grabbed);
    if (!e_grabinput_get(_e_comp_x_suspend_grabbed, 0, 0))
      {
-        fprintf(stderr, "E_COMP_X: 07 grab failed\n");
         ecore_x_window_free(_e_comp_x_suspend_grabbed);
         _e_comp_x_suspend_grabbed = 0;
      }
@@ -5138,7 +5136,6 @@ static void
 _e_comp_pointer_ungrab(void)
 {
    if (!_e_comp_x_suspend_grabbed) return;
-   fprintf(stderr, "E_COMP_X: 6 really ungrab input and free window\n");
    e_grabinput_release(_e_comp_x_suspend_grabbed, 0);
    ecore_x_window_free(_e_comp_x_suspend_grabbed);
    _e_comp_x_suspend_grabbed = 0;
@@ -5147,17 +5144,20 @@ _e_comp_pointer_ungrab(void)
 static void
 _e_comp_cb_pointer_suspend_resume_done(void *data, Evas_Object *obj, const 
char *emission, const char *source)
 {
-   fprintf(stderr, "E_COMP_X: 5 cursor suspend/resume done\n");
    edje_object_signal_callback_del(obj, emission, source,
                                    _e_comp_cb_pointer_suspend_resume_done);
-   if (!data) _e_comp_pointer_ungrab();
+   if (!data)
+     {
+        _e_comp_pointer_ungrab();
+        e_pointer_grab_set(e_comp->pointer, EINA_FALSE);
+     }
 }
 
 EINTERN Eina_Bool
 _e_comp_x_screensaver_on()
 {
    const char *s;
-   fprintf(stderr, "E_COMP_X: 01 screensaver on\n");
+
    if ((!e_comp->pointer) || (!e_comp->pointer->o_ptr)) return 
ECORE_CALLBACK_RENEW;
    s = edje_object_data_get(e_comp->pointer->o_ptr, "can_suspend");
 
@@ -5165,13 +5165,12 @@ _e_comp_x_screensaver_on()
      {
         if (!e_desklock_state_get())
           {
-             fprintf(stderr, "E_COMP_X: 02 ungrab then grab pointer\n");
              _e_comp_pointer_ungrab();
+             e_pointer_grab_set(e_comp->pointer, EINA_FALSE);
+             e_pointer_grab_set(e_comp->pointer, EINA_TRUE);
              _e_comp_pointer_grab();
-             fprintf(stderr, "E_COMP_X: 03 no desklock but abort pointer 
suspend\n");
              if (!_e_comp_x_suspend_grabbed) return ECORE_CALLBACK_RENEW;
           }
-        fprintf(stderr, "E_COMP_X: 04 emit suspend signals to pointer\n");
         edje_object_signal_callback_del(e_comp->pointer->o_ptr,
                                         "e,state,mouse,suspend,done", "e",
                                         
_e_comp_cb_pointer_suspend_resume_done);
@@ -5194,8 +5193,8 @@ _e_comp_x_screensaver_off()
 {
    const char *s;
 
-   fprintf(stderr, "E_COMP_X: 1 screensaver off\n");
    _e_comp_pointer_ungrab();
+   e_pointer_grab_set(e_comp->pointer, EINA_FALSE);
    if ((!e_comp->pointer) || (!e_comp->pointer->o_ptr)) return 
ECORE_CALLBACK_RENEW;
    s = edje_object_data_get(e_comp->pointer->o_ptr, "can_suspend");
 
@@ -5203,15 +5202,10 @@ _e_comp_x_screensaver_off()
      {
         if (!e_desklock_state_get())
           {
-             fprintf(stderr, "E_COMP_X: 2 re-grab pointer because desklock not 
on\n");
+             e_pointer_grab_set(e_comp->pointer, EINA_TRUE);
              _e_comp_pointer_grab();
-             if (!_e_comp_x_suspend_grabbed)
-               {
-                  fprintf(stderr, "E_COMP_X: 3 no desklock but abort pointer 
unsuspend\n");
-                  return ECORE_CALLBACK_RENEW;
-               }
+             if (!_e_comp_x_suspend_grabbed) return ECORE_CALLBACK_RENEW;
           }
-        fprintf(stderr, "E_COMP_X: 4 emit resume signals to pointer\n");
         edje_object_signal_callback_del(e_comp->pointer->o_ptr,
                                         "e,state,mouse,suspend,done", "e",
                                         
_e_comp_cb_pointer_suspend_resume_done);
diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c
index 4f3648bc8..4387ede26 100644
--- a/src/bin/e_pointer.c
+++ b/src/bin/e_pointer.c
@@ -354,6 +354,7 @@ _e_pointer_cb_free(E_Pointer *ptr)
    E_FREE_LIST(ptr->stack, _e_pointer_stack_free);
 
    eina_stringshare_del(ptr->type);
+   eina_stringshare_del(ptr->deferred_type);
 
    E_FREE_FUNC(ptr->idle_tmr, ecore_timer_del);
    E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
@@ -431,6 +432,11 @@ _e_pointer_type_set(E_Pointer *ptr, const char *type)
    /* check if pointer type is already set */
    if (!e_util_strcmp(ptr->type, type)) return;
 
+   if (ptr->grabcount > 0)
+     {
+        eina_stringshare_replace(&(ptr->deferred_type), type);
+        return;
+     }
    eina_stringshare_replace(&ptr->type, type);
 
    /* don't show cursor if in hidden mode */
@@ -462,7 +468,6 @@ _e_pointer_type_set(E_Pointer *ptr, const char *type)
           e_pointer_object_set(ptr, NULL, 0, 0);
         else
           evas_object_show(ptr->o_ptr);
-
      }
    else
      _e_pointer_x11_setup(ptr, NULL);
@@ -641,7 +646,7 @@ e_pointer_type_pop(E_Pointer *ptr, void *obj, const char 
*type)
 
    _e_pointer_type_set(ptr, stack->type);
 
-   eina_stringshare_refplace(&ptr->type, stack->type);
+   eina_stringshare_replace(&ptr->type, stack->type);
 }
 
 E_API void 
@@ -820,6 +825,25 @@ e_pointer_window_add(E_Pointer *ptr, Ecore_Window win)
    _e_pointer_x11_setup(ptr, "default");
 }
 
+E_API void
+e_pointer_grab_set(E_Pointer *ptr, Eina_Bool grab)
+{
+   if (grab) ptr->grabcount++;
+   else
+     {
+        if (ptr->grabcount > 0)
+          {
+             ptr->grabcount--;
+             if ((ptr->grabcount == 0) && (ptr->deferred_type))
+               {
+                  _e_pointer_type_set(ptr, ptr->deferred_type);
+                  eina_stringshare_del(ptr->deferred_type);
+                  ptr->deferred_type = NULL;
+               }
+          }
+     }
+}
+
 EINTERN void
 e_pointers_freeze_set(Eina_Bool set)
 {
diff --git a/src/bin/e_pointer.h b/src/bin/e_pointer.h
index 55f9a2a84..de3c666c2 100644
--- a/src/bin/e_pointer.h
+++ b/src/bin/e_pointer.h
@@ -45,6 +45,7 @@ struct _E_Pointer
    int *pixels;
    int x, y, w, h;
    const char *type;
+   const char *deferred_type;
 
    struct 
      {
@@ -57,6 +58,8 @@ struct _E_Pointer
 
    Eina_List *stack;
 
+   unsigned short grabcount;
+
    Eina_Bool e_cursor E_BITFIELD;
    Eina_Bool color E_BITFIELD;
    Eina_Bool idle E_BITFIELD;
@@ -80,5 +83,6 @@ E_API void e_pointer_mode_pop(void *obj, E_Pointer_Mode mode);
 E_API void e_pointer_idler_before(void);
 E_API void e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int 
y);
 E_API void e_pointer_window_add(E_Pointer *ptr, Ecore_Window win);
+E_API void e_pointer_grab_set(E_Pointer *ptr, Eina_Bool grab);
 # endif
 #endif

-- 


Reply via email to