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.

Thank you.
Index: evas/src/lib/include/evas_private.h
===================================================================
--- evas/src/lib/include/evas_private.h (리비전 60722)
+++ evas/src/lib/include/evas_private.h (작업 사본)
@@ -499,6 +499,7 @@
    int                         mouse_grabbed;
 
    int                         last_event;
+   Evas_Callback_Type          last_event_type;
 
    struct {
         int                      in_move, in_resize;
Index: evas/src/lib/canvas/evas_callbacks.c
===================================================================
--- evas/src/lib/canvas/evas_callbacks.c        (리비전 60722)
+++ evas/src/lib/canvas/evas_callbacks.c        (작업 사본)
@@ -170,8 +170,10 @@
    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);
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to