From 4e872770a51e0c13a3436fd7a7ba1bf8767d5b34 Mon Sep 17 00:00:00 2001 From: raster Date: Tue, 5 Jul 2011 01:33:59 +0000 Subject: [PATCH] From: Hyoyoung Chang Subject: [E-devel] [patch] evas - add checking event type Dear developers. I found a bug about evas event handling. In some situation, evas blocks some events by checking _evas_event_counter. So I made a patch that is checking event type also event counter. Reproduce steps: 1. make a window 2. show window before adding a elementary/genlist widget --- codes --- void _gl_mousedown_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) { printf("_gl_mousedown_cb !! \n"); } static Eina_Bool create_main_win(App *app) { app->win = elm_win_add(NULL, "genlist-win", ELM_WIN_BASIC); evas_object_show(app->win); <-- position 1 Evas_Object *genlist = elm_genlist_add(app->win); elm_win_resize_object_add(app->win, genlist); evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_DOWN, _gl_mousedown_cb, NULL); evas_object_show(genlist); evas_object_resize(app->win, 320, 240); //evas_object_show(app->win); <-- position 2 return EINA_TRUE; } --- codes --- In common use case, apps don't show main window at position 1. However to reproduce, it can be at position 1. Then, focus is at just on main window. In that situation, if a user clicks a genlist, its event is dropped by evas. Because in mouse down callback, it give focus to genlist. Then two events is made. First is mouse down, second is focus handling. In event callback, evas processes mouse down after focus handling. But evas found that mouse event is retarded event than focus handling. So it ignores it. This patch is introduce event handling type checking to evas_object_event_callback_call. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@61026 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- ChangeLog | 5 +++++ src/lib/canvas/evas_callbacks.c | 4 +++- src/lib/include/evas_private.h | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index fae3a1c..3e5d06f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -413,3 +413,8 @@ * Polygon: Implemented "is_inside". +2011-07-05 Hyoyoung Chang + + * Fix bug where event causes event in callback on same object, but + with same event counter, so also filter out same event types. + diff --git a/src/lib/canvas/evas_callbacks.c b/src/lib/canvas/evas_callbacks.c index 1c083bc..b87b3d8 100644 --- a/src/lib/canvas/evas_callbacks.c +++ b/src/lib/canvas/evas_callbacks.c @@ -170,8 +170,10 @@ evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void Evas *e; if ((obj->delete_me) || (!obj->layer)) return; - if (obj->last_event == _evas_event_counter) return; + if ((obj->last_event == _evas_event_counter) && + (obj->last_event_type == type)) return; obj->last_event = _evas_event_counter; + obj->last_event_type = type; if (!(e = obj->layer->evas)) return; _evas_walk(e); diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h index 3a1fef8..53f06f7 100644 --- a/src/lib/include/evas_private.h +++ b/src/lib/include/evas_private.h @@ -499,6 +499,7 @@ struct _Evas_Object int mouse_grabbed; int last_event; + Evas_Callback_Type last_event_type; struct { int in_move, in_resize; -- 2.7.4