fix mouse hangs after unblank

this fixes T5883
This commit is contained in:
Carsten Haitzler 2017-11-14 18:15:26 +09:00
parent db9e70708a
commit 9fe7343180
3 changed files with 41 additions and 19 deletions

View File

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

View File

@ -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)
{

View File

@ -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