raster pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=3ee5a0378d2b41313156748ec33202c44c117239
commit 3ee5a0378d2b41313156748ec33202c44c117239 Author: Carsten Haitzler (Rasterman) <[email protected]> Date: Sun Aug 6 18:31:19 2017 +0900 e - do workaround with in events due to flags to get ptr focus right so we egnore some mouse in evets due to their flags (crossing events thansk to grab changes or other stuff) that we want to ignore for other reasons like when a popup menu happens and so on... so if we get a mouse in... 0.1 sec later double check where the pointer is with a poll then fix focus. this should patch over a long standing annoyance here in x11. @fix --- src/bin/e_comp_x.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index 20b519f92..c9bf7fe7c 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -68,6 +68,8 @@ static int screen_size_index = -1; static Ecore_X_Atom backlight_atom = 0; extern double e_bl_val; +static Ecore_Timer *mouse_in_fix_check_timer = NULL; + static Eina_Hash *dead_wins; static Ecore_Window _e_comp_x_suspend_grabbed; // window grabber for suspending pointer @@ -2378,33 +2380,55 @@ _e_comp_x_mouse_in_job(void *d EINA_UNUSED) } static Eina_Bool +_e_comp_x_mouse_in_fix_check_timer_cb(void *data EINA_UNUSED) +{ + E_Client *ec; + + mouse_in_fix_check_timer = NULL; + ec = e_client_under_pointer_get + (e_desk_current_get(e_zone_current_get()), NULL); + if (ec) + { + mouse_client = ec; + if (mouse_in_job) ecore_job_del(mouse_in_job); + mouse_in_job = ecore_job_add(_e_comp_x_mouse_in_job, NULL); + } + return EINA_FALSE; +} + +static Eina_Bool _e_comp_x_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, Ecore_X_Event_Mouse_In *ev) { E_Client *ec; if (e_comp->comp_type != E_PIXMAP_TYPE_X) return ECORE_CALLBACK_RENEW; ec = _e_comp_x_client_find_by_window(ev->win); - if (!ec) return ECORE_CALLBACK_RENEW; + if (!ec) goto done; if (ev->mode == ECORE_X_EVENT_MODE_NORMAL) { if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR) { - if (ev->win != e_client_util_pwin_get(ec)) return ECORE_CALLBACK_RENEW; - if (ev->event_win != e_client_util_win_get(ec)) return ECORE_CALLBACK_RENEW; + if (ev->win != e_client_util_pwin_get(ec)) goto done; + if (ev->event_win != e_client_util_win_get(ec)) goto done; } if (ev->detail == ECORE_X_EVENT_DETAIL_VIRTUAL) { - if (ev->win != e_client_util_win_get(ec)) return ECORE_CALLBACK_RENEW; - if (ev->event_win != e_client_util_pwin_get(ec)) return ECORE_CALLBACK_RENEW; + if (ev->win != e_client_util_win_get(ec)) goto done; + if (ev->event_win != e_client_util_pwin_get(ec)) goto done; } - if (!evas_object_visible_get(ec->frame)) return ECORE_CALLBACK_RENEW; + if (!evas_object_visible_get(ec->frame)) goto done; } - if (_e_comp_x_client_data_get(ec)->deleted) return ECORE_CALLBACK_RENEW; + if (_e_comp_x_client_data_get(ec)->deleted) goto done; mouse_client = ec; - if (!mouse_in_job) - mouse_in_job = ecore_job_add(_e_comp_x_mouse_in_job, NULL); + if (mouse_in_job) ecore_job_del(mouse_in_job); + mouse_in_job = ecore_job_add(_e_comp_x_mouse_in_job, NULL); mouse_in_coords.x = ev->root.x; mouse_in_coords.y = ev->root.y; +done: + if (mouse_in_fix_check_timer) + ecore_timer_del(mouse_in_fix_check_timer); + mouse_in_fix_check_timer = + ecore_timer_add(0.1, _e_comp_x_mouse_in_fix_check_timer_cb, NULL); return ECORE_CALLBACK_RENEW; } @@ -5812,6 +5836,7 @@ e_comp_x_shutdown(void) E_FREE_FUNC(damages_hash, eina_hash_free); E_FREE_FUNC(alarm_hash, eina_hash_free); E_FREE_FUNC(frame_extents, eina_hash_free); + E_FREE_FUNC(mouse_in_fix_check_timer, ecore_timer_del); e_xsettings_shutdown(); if (e_comp->comp_type == E_PIXMAP_TYPE_X) ecore_x_screensaver_custom_blanking_disable(); --
