By the way. I'm really sorry for this one :/

On Thu, Nov 10, 2016 at 4:15 PM, Guilherme Íscaro <isc...@profusion.mobi>
wrote:

> Hey guys, after some investigation I concluded that the problem was way
> below in the stack (At Ecore_Evas to be more exactly). I created a patch to
> fix this problem.
> https://phab.enlightenment.org/D4390
>
> On Thu, Nov 10, 2016 at 1:13 AM, Jean-Philippe André <j...@videolan.org>
> wrote:
>
>> Hey,
>>
>> This patch broke keyboard input in efl weston clients. (just running
>> elm_test here in weston)
>>
>>
>> On 9 November 2016 at 05:08, Guilherme Iscaro <isc...@profusion.mobi>
>> wrote:
>>
>> > bdilly pushed a commit to branch master.
>> >
>> > http://git.enlightenment.org/core/efl.git/commit/?id=
>> > 0e53b9a8ac92041de40244a597087d77611b92f2
>> >
>> > commit 0e53b9a8ac92041de40244a597087d77611b92f2
>> > Author: Guilherme Iscaro <isc...@profusion.mobi>
>> > Date:   Wed Oct 19 11:02:18 2016 -0200
>> >
>> >     Evas: Add support for multiple focused objects.
>> >
>> >     Using the multi-seat support, Evas is able to handle multiple
>> focused
>> > objects.
>> >     This implementation allows one focused object per seat.
>> >     This patch introduces new APIs and events to handle this new
>> scenario,
>> >     while keeping compatible with the old focus APIs.
>> > ---
>> >  src/lib/evas/canvas/efl_canvas_object.eo |  53 +++++++
>> >  src/lib/evas/canvas/evas_canvas.eo       |  25 +++-
>> >  src/lib/evas/canvas/evas_events.c        |  67 ++++++---
>> >  src/lib/evas/canvas/evas_focus.c         | 246
>> > +++++++++++++++++++++++++++----
>> >  src/lib/evas/canvas/evas_main.c          |   3 +
>> >  src/lib/evas/canvas/evas_object_main.c   |  21 ++-
>> >  src/lib/evas/include/evas_private.h      |   5 +-
>> >  7 files changed, 366 insertions(+), 54 deletions(-)
>> >
>> > diff --git a/src/lib/evas/canvas/efl_canvas_object.eo
>> > b/src/lib/evas/canvas/efl_canvas_object.eo
>> > index 84c7f8d..6912111 100644
>> > --- a/src/lib/evas/canvas/efl_canvas_object.eo
>> > +++ b/src/lib/evas/canvas/efl_canvas_object.eo
>> > @@ -209,6 +209,8 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx,
>> > Efl.Gfx.Stack, Efl.Animator,
>> >             is $true, $obj will be set as the currently focused object
>> >             and it will receive all keyboard events that are not
>> >             exclusive key grabs on other objects.
>> > +           See also @.seat_focus_check,
>> > +           @.seat_focus_add, @.seat_focus_del.
>> >           ]]
>> >           set {
>> >              legacy: evas_object_focus_set;
>> > @@ -220,6 +222,55 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx,
>> > Efl.Gfx.Stack, Efl.Animator,
>> >              focus: bool; [[$true when set as focused or $false
>> > otherwise.]]
>> >           }
>> >        }
>> > +      @property seat_focus {
>> > +         [[
>> > +            Check if this object is focused.
>> > +            @since 1.19
>> > +         ]]
>> > +         get {
>> > +         }
>> > +         values {
>> > +            focus: bool; [[$true if focused by at least one seat or
>> > $false otherwise.]]
>> > +         }
>> > +      }
>> > +      seat_focus_check {
>> > +         [[ Check if this object is focused by a given seat @since
>> 1.19 ]]
>> > +         params {
>> > +            @in seat: Efl.Input.Device; [[The seat to check if the
>> object
>> > is focused. Use $null for the default seat.]]
>> > +         }
>> > +         return: bool; [[$true if focused or $false otherwise.]]
>> > +      }
>> > +      seat_focus_add {
>> > +         [[ Add a seat to the focus list.
>> > +
>> > +           Evas supports that an Efl.Canvas.Object may be focused by
>> > multiple seats
>> > +           at the same time. This function adds a new seat to the focus
>> > list, in other words,
>> > +           after the seat is added to the list this object will now be
>> > also focused by this new seat.
>> > +
>> > +           This function generates an \@ref
>> EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_IN
>> > event.
>> > +
>> > +           \@note The old focus APIs ( \@ref evas_object_focus_get,
>> \@ref
>> > evas_object_focus_set,
>> > +           @.key_grab) will still work, however they will only act on
>> the
>> > default seat.
>> > +
>> > +           @since 1.19
>> > +         ]]
>> > +         params {
>> > +            @in seat: Efl.Input.Device; [[The seat that should be added
>> > to the focus list. Use $null for the default seat.]]
>> > +         }
>> > +         return: bool; [[$true if the focus has been set or $false
>> > otherwise.]]
>> > +      }
>> > +      seat_focus_del {
>> > +         [[ Remove a seat from the focus list.
>> > +
>> > +            Removing an seat from the focus list is an unfocus
>> operation,
>> > thus it will generate an
>> > +            \@ref EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_OUT event.
>> > +            @since 1.19
>> > +         ]]
>> > +         params {
>> > +            @in seat: Efl.Input.Device; [[The seat that should be
>> removed
>> > from the focus list. Use $null for the default seat.]]
>> > +         }
>> > +         return: bool; [[$true if the seat was removed from the focus
>> > list or $false otherwise.]]
>> > +      }
>> >        @property is_frame_object {
>> >           set {
>> >              [[@since 1.2]]
>> > @@ -568,5 +619,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx,
>> > Efl.Gfx.Stack, Efl.Animator,
>> >     events {
>> >         focus,in; [[Focus In Event ]]
>> >         focus,out; [[Focus Out Event ]]
>> > +       focus,device,in: Efl.Input.Device; [[Focus In event that
>> contains
>> > the seat device that this object was focused. @since 1.19]]
>> > +       focus,device,out: Efl.Input.Device; [[Focus Out event that
>> > contains the seat device that this object was unfocused.@since 1.19]]
>> >     }
>> >  }
>> > diff --git a/src/lib/evas/canvas/evas_canvas.eo
>> > b/src/lib/evas/canvas/evas_canvas.eo
>> > index 5fcfa63..6888257 100644
>> > --- a/src/lib/evas/canvas/evas_canvas.eo
>> > +++ b/src/lib/evas/canvas/evas_canvas.eo
>> > @@ -119,9 +119,8 @@ class Evas.Canvas (Efl.Object, Efl.Canvas,
>> > Efl.Animator, Efl.Input.Interface)
>> >        }
>> >        @property focus {
>> >           get {
>> > -            [[Retrieve the object that currently has focus.
>> > +            [[Retrieve the object focused by the default seat.
>> >
>> > -              Evas can have (at most) one of its objects focused at a
>> > time.
>> >                Focused objects will be the ones having key events
>> delivered
>> >                to, which the programmer can act upon by means of
>> >                \@ref evas_object_event_callback_add usage.
>> > @@ -136,7 +135,10 @@ class Evas.Canvas (Efl.Object, Efl.Canvas,
>> > Efl.Animator, Efl.Input.Interface)
>> >
>> >                See also \@ref evas_object_focus_set,
>> >                \@ref evas_object_focus_get, \@ref evas_object_key_grab,
>> > -              \@ref evas_object_key_ungrab.
>> > +              \@ref evas_object_key_ungrab, @.seat_focus_get,
>> > +              @.focused_objects.get, @Efl.Canvas.Object.seat_focus_
>> check,
>> > +              @Efl.Canvas.Object.seat_focus_add,
>> > +              @Efl.Canvas.Object.seat_focus_del.
>> >              ]]
>> >              /* FIXME-doc
>> >              Example:
>> > @@ -154,6 +156,23 @@ class Evas.Canvas (Efl.Object, Efl.Canvas,
>> > Efl.Animator, Efl.Input.Interface)
>> >                                                    or $null if there is
>> > not one.]]
>> >           }
>> >        }
>> > +      @property focused_objects {
>> > +         [[Return an iterator of focused objects. @since 1.19]]
>> > +         get {
>> > +            return: free(own(iterator<Eina_Hash_Tuple>),
>> > eina_iterator_free);  [[An iterator that contains
>> > +
>> >        Eina_Hash_Tuple which the key is an
>> > +
>> >      Efl.Input.Device and the data is an Efl.Canvas.Object or $null on
>> > error.]]
>> > +         }
>> > +      }
>> > +      seat_focus_get {
>> > +         [[Return the focused object by a given seat. @since 1.19]]
>> > +         params {
>> > +             @in seat: Efl.Input.Device;[[The seat to fetch the focused
>> > +                                          object or $null for the
>> default
>> > seat.]]
>> > +         }
>> > +         return: Efl.Canvas.Object; [[The object that has the focus or
>> > $null if
>> > +                                      the seat has no focused object.]]
>> > +      }
>> >        @property object_top {
>> >           get {
>> >              [[Get the highest (stacked) Evas object on the canvas $e.
>> > diff --git a/src/lib/evas/canvas/evas_events.c
>> b/src/lib/evas/canvas/evas_
>> > events.c
>> > index c3946ca..d199cfc 100644
>> > --- a/src/lib/evas/canvas/evas_events.c
>> > +++ b/src/lib/evas/canvas/evas_events.c
>> > @@ -2665,6 +2665,48 @@ evas_event_feed_multi_move(Eo *eo_e, int d, int
>> x,
>> > int y, double rad, double rad
>> >  }
>> >
>> >  static void
>> > +_key_event_dispatch(Evas_Public_Data *e, void *event_info,
>> > +                    Efl_Input_Device *device,
>> > +                    const Efl_Event_Description *efl_event_desc,
>> > +                    Evas_Callback_Type evas_event_type, int event_id)
>> > +{
>> > +   Eo *focused;
>> > +
>> > +   if (!device)
>> > +     device = e->default_seat;
>> > +   else
>> > +     {
>> > +        const char *name = efl_input_device_name_get(device);
>> > +
>> > +        while ((device = efl_input_device_parent_get(device)))
>> > +          {
>> > +             if (efl_input_device_type_get(device) ==
>> > EFL_INPUT_DEVICE_CLASS_SEAT)
>> > +               break;
>> > +          }
>> > +        if (!device)
>> > +          {
>> > +             ERR("Could not find the parent seat from device name '%s'.
>> > Using default seat instead", name);
>> > +             device = e->default_seat;
>> > +          }
>> > +     }
>> > +
>> > +   focused = eina_hash_find(e->focused_objects, &device);
>> > +
>> > +   if (!focused)
>> > +     return;
>> > +
>> > +   Evas_Object_Protected_Data *focused_obj =
>> > +     efl_data_scope_get(focused, EFL_CANVAS_OBJECT_CLASS);
>> > +
>> > +   if (!e->is_frozen && !evas_event_freezes_through(focused,
>> > focused_obj))
>> > +     {
>> > +        evas_object_event_callback_call(focused, focused_obj,
>> > +                                        evas_event_type, event_info,
>> > +                                        event_id, efl_event_desc);
>> > +     }
>> > +}
>> > +
>> > +static void
>> >  _canvas_event_feed_key_down_internal(Evas_Public_Data *e,
>> > Efl_Input_Key_Data *ev)
>> >  {
>> >     Eina_Bool exclusive = EINA_FALSE;
>> > @@ -2738,15 +2780,9 @@ _canvas_event_feed_key_down_in
>> ternal(Evas_Public_Data
>> > *e, Efl_Input_Key_Data *ev
>> >                 }
>> >            }
>> >       }
>> > -   if ((e->focused) && (!exclusive))
>> > -     {
>> > -        Evas_Object_Protected_Data *focused_obj =
>> > efl_data_scope_get(e->focused, EFL_CANVAS_OBJECT_CLASS);
>> > -        if (!e->is_frozen && !evas_event_freezes_through(e->focused,
>> > focused_obj))
>> > -          {
>> > -             evas_object_event_callback_call(e->focused, focused_obj,
>> > EVAS_CALLBACK_KEY_DOWN, evt,
>> > -                                             event_id,
>> > EFL_EVENT_KEY_DOWN);
>> > -          }
>> > -     }
>> > +   if (!exclusive)
>> > +     _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_DOWN,
>> > +                         EVAS_CALLBACK_KEY_DOWN, event_id);
>> >     _evas_post_event_callback_call(e->evas, e);
>> >     _evas_unwalk(e);
>> >
>> > @@ -2828,16 +2864,9 @@ _canvas_event_feed_key_up_inte
>> rnal(Evas_Public_Data
>> > *e, Efl_Input_Key_Data *ev)
>> >                 }
>> >            }
>> >       }
>> > -   if ((e->focused) && (!exclusive))
>> > -     {
>> > -        Evas_Object_Protected_Data *focused_obj =
>> > efl_data_scope_get(e->focused, EFL_CANVAS_OBJECT_CLASS);
>> > -        if (!e->is_frozen && !evas_event_freezes_through(e->focused,
>> > focused_obj))
>> > -          {
>> > -             evas_object_event_callback_call
>> > -                   (e->focused, focused_obj, EVAS_CALLBACK_KEY_UP, evt,
>> > -                    event_id, EFL_EVENT_KEY_UP);
>> > -          }
>> > -     }
>> > +   if (!exclusive)
>> > +     _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_UP,
>> > +                         EVAS_CALLBACK_KEY_UP, event_id);
>> >     _evas_post_event_callback_call(e->evas, e);
>> >     _evas_unwalk(e);
>> >
>> > diff --git a/src/lib/evas/canvas/evas_focus.c
>> b/src/lib/evas/canvas/evas_
>> > focus.c
>> > index 6737589..96cf0ca 100644
>> > --- a/src/lib/evas/canvas/evas_focus.c
>> > +++ b/src/lib/evas/canvas/evas_focus.c
>> > @@ -7,51 +7,247 @@
>> >
>> >  /* public calls */
>> >
>> > -EOLIAN void
>> > -_efl_canvas_object_key_focus_set(Eo *eo_obj,
>> Evas_Object_Protected_Data
>> > *obj, Eina_Bool focus)
>> > +
>> > +static Eina_Bool
>> > +_already_focused(Eina_List *seats, Efl_Input_Device *seat)
>> >  {
>> > +   Eina_List *l;
>> > +   const Efl_Input_Device *s;
>> >
>> > -   int event_id = 0;
>> > -   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > -   return;
>> > -   MAGIC_CHECK_END();
>> > +   EINA_LIST_FOREACH(seats, l, s)
>> > +     {
>> > +        if (s == seat)
>> > +          return EINA_TRUE;
>> > +     }
>> > +
>> > +   return EINA_FALSE;
>> > +}
>> > +
>> > +static Efl_Input_Device *
>> > +_default_seat_get(Eo *evas_obj)
>> > +{
>> > +   Evas_Public_Data *edata;
>> > +   Evas *evas = evas_object_evas_get(evas_obj);
>> > +
>> > +   edata = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
>> > +   return edata->default_seat;
>> > +}
>> > +
>> > +static void
>> > +_evas_focus_set(Eo *evas_obj, Efl_Input_Device *key, Eina_Bool focus)
>> > +{
>> > +   Evas_Public_Data *edata;
>> > +   Evas *evas = evas_object_evas_get(evas_obj);
>> > +
>> > +   edata = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
>> >
>> > -   event_id = _evas_object_event_new();
>> > -   if (obj->focused == focus) goto end;
>> > -   if (_evas_object_intercept_call(eo_obj,
>> EVAS_OBJECT_INTERCEPT_CB_FOCUS_SET,
>> > 1, focus)) return;
>> >     if (focus)
>> > +     eina_hash_add(edata->focused_objects, &key, evas_obj);
>> > +   else
>> > +     eina_hash_del_by_key(edata->focused_objects, &key);
>> > +}
>> > +
>> > +static Eo *
>> > +_current_focus_get(Eo *evas_obj, Efl_Input_Device *key)
>> > +{
>> > +   Evas_Public_Data *edata;
>> > +   Evas *evas = evas_object_evas_get(evas_obj);
>> > +
>> > +   edata = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
>> > +
>> > +   return eina_hash_find(edata->focused_objects, &key);
>> > +}
>> > +
>> > +static void
>> > +_evas_object_unfocus(Evas_Object_Protected_Data *obj, Efl_Input_Device
>> > *seat)
>> > +{
>> > +   obj->focused_by_seats = eina_list_remove(obj->focused_by_seats,
>> seat);
>> > +   _evas_focus_set(obj->object, seat, EINA_FALSE);
>> > +
>> > +   //Legacy events...
>> > +   if (seat == obj->layer->evas->default_seat)
>> >       {
>> > -        if (obj->layer->evas->focused)
>> > -          evas_object_focus_set(obj->layer->evas->focused, 0);
>> > -
>> > -        if (obj->layer->evas->focused) goto end;
>> > -        obj->focused = 1;
>> > -        obj->layer->evas->focused = eo_obj;
>> > -        evas_object_event_callback_call(eo_obj, obj,
>> > EVAS_CALLBACK_FOCUS_IN, NULL, event_id, EFL_CANVAS_OBJECT_EVENT_FOCUS_
>> IN);
>> > +        evas_object_event_callback_call(obj->object, obj,
>> > +                                        EVAS_CALLBACK_FOCUS_OUT,
>> > +                                        NULL, _evas_object_event_new(),
>> > +                                        EFL_CANVAS_OBJECT_EVENT_FOCUS_
>> > OUT);
>> >          evas_event_callback_call(obj->layer->evas->evas,
>> > -                                 EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
>> > eo_obj);
>> > +                                 EVAS_CALLBACK_CANVAS_OBJECT_F
>> OCUS_OUT,
>> > +                                 obj->object);
>> >       }
>> > -   else
>> > +   efl_event_callback_call(obj->object,
>> > +                           EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_OUT,
>> > +                           seat);
>> > +   _evas_post_event_callback_call(obj->layer->evas->evas,
>> > +                                  obj->layer->evas);
>> > +}
>> > +
>> > +void
>> > +_evas_focus_device_del_cb(void *data, const Efl_Event *ev)
>> > +{
>> > +   _evas_object_unfocus(data, ev->object);
>> > +}
>> > +
>> > +EOLIAN Eina_Bool
>> > +_efl_canvas_object_seat_focus_del(Eo *eo_obj,
>> > +                                  Evas_Object_Protected_Data *obj,
>> > +                                  Efl_Input_Device *seat)
>> > +{
>> > +   Eina_List *l;
>> > +   Efl_Input_Device *dev, *def;
>> > +
>> > +   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > +   return EINA_FALSE;
>> > +   MAGIC_CHECK_END();
>> > +
>> > +   def = _default_seat_get(eo_obj);
>> > +   if (!seat)
>> > +     seat = def;
>> > +
>> > +   EINA_LIST_FOREACH(obj->focused_by_seats, l, dev)
>> > +     {
>> > +        if (dev != seat)
>> > +          continue;
>> > +        if (_evas_object_intercept_call(eo_obj,
>> > +                                        EVAS_OBJECT_INTERCEPT_CB_
>> > FOCUS_SET,
>> > +                                        1, EINA_FALSE))
>> > +          {
>> > +             return EINA_FALSE;
>> > +          }
>> > +
>> > +        efl_event_callback_del(dev, EFL_EVENT_DEL,
>> > +                               _evas_focus_device_del_cb, obj);
>> > +        _evas_object_unfocus(obj, dev);
>> > +        return EINA_TRUE;
>> > +     }
>> > +
>> > +   return EINA_FALSE;
>> > +}
>> > +
>> > +EOLIAN Eina_Bool
>> > +_efl_canvas_object_seat_focus_add(Eo *eo_obj,
>> > +                                  Evas_Object_Protected_Data *obj,
>> > +                                  Efl_Input_Device *seat)
>> > +{
>> > +   Eo *current_focus;
>> > +   Efl_Input_Device *def;
>> > +
>> > +   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > +   return EINA_FALSE;
>> > +   MAGIC_CHECK_END();
>> > +
>> > +   def = _default_seat_get(eo_obj);
>> > +   if (!seat)
>> > +     seat = def;
>> > +
>> > +   EINA_SAFETY_ON_NULL_RETURN_VAL(seat, EINA_FALSE);
>> > +   if (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT)
>> > +     return EINA_FALSE;
>> > +
>> > +   if (_already_focused(obj->focused_by_seats, seat))
>> > +     goto end;
>> > +
>> > +   if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_
>> > FOCUS_SET,
>> > +                                   1, EINA_TRUE))
>> >       {
>> > -        obj->focused = 0;
>> > -        obj->layer->evas->focused = NULL;
>> > -        evas_object_event_callback_call(eo_obj, obj,
>> > EVAS_CALLBACK_FOCUS_OUT, NULL, event_id, EFL_CANVAS_OBJECT_EVENT_FOCUS_
>> > OUT);
>> > +        return EINA_FALSE;
>> > +     }
>> > +
>> > +   current_focus = _current_focus_get(eo_obj, seat);
>> > +   if (current_focus)
>> > +     efl_canvas_object_seat_focus_del(current_focus, seat);
>> > +
>> > +   efl_event_callback_add(seat, EFL_EVENT_DEL,
>> _evas_focus_device_del_cb,
>> > obj);
>> > +
>> > +   obj->focused_by_seats = eina_list_append(obj->focused_by_seats,
>> seat);
>> > +   _evas_focus_set(eo_obj, seat, EINA_TRUE);
>> > +   //Legacy events...
>> > +   if (seat == def)
>> > +     {
>> > +        evas_object_event_callback_call(eo_obj, obj,
>> > EVAS_CALLBACK_FOCUS_IN,
>> > +                                        NULL, _evas_object_event_new(),
>> > +                                        EFL_CANVAS_OBJECT_EVENT_FOCUS_
>> > IN);
>> >          evas_event_callback_call(obj->layer->evas->evas,
>> > -                                 EVAS_CALLBACK_CANVAS_OBJECT_F
>> OCUS_OUT,
>> > eo_obj);
>> > +                                 EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
>> > eo_obj);
>> >       }
>> >
>> > +   efl_event_callback_call(eo_obj,
>> > +                           EFL_CANVAS_OBJECT_EVENT_FOCUS_DEVICE_IN,
>> > seat);
>> >   end:
>> >     _evas_post_event_callback_call(obj->layer->evas->evas,
>> > obj->layer->evas);
>> > +   return EINA_TRUE;
>> >  }
>> >
>> >  EOLIAN Eina_Bool
>> > -_efl_canvas_object_key_focus_get(Eo *eo_obj EINA_UNUSED,
>> > Evas_Object_Protected_Data *obj)
>> > +_efl_canvas_object_seat_focus_check(Eo *eo_obj,
>> > +                                    Evas_Object_Protected_Data *obj,
>> > +                                    Efl_Input_Device *seat)
>> >  {
>> > -   return obj->focused;
>> > +   Eina_List *l;
>> > +   Efl_Input_Device *s;
>> > +
>> > +   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > +   return EINA_FALSE;
>> > +   MAGIC_CHECK_END();
>> > +
>> > +   if (!seat)
>> > +     seat = _default_seat_get(eo_obj);
>> > +
>> > +   EINA_LIST_FOREACH(obj->focused_by_seats, l, s)
>> > +     {
>> > +        if (s == seat)
>> > +          return EINA_TRUE;
>> > +     }
>> > +   return EINA_FALSE;
>> > +}
>> > +
>> > +EOLIAN void
>> > +_efl_canvas_object_key_focus_set(Eo *eo_obj,
>> Evas_Object_Protected_Data
>> > *obj, Eina_Bool focus)
>> > +{
>> > +   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > +   return;
>> > +   MAGIC_CHECK_END();
>> > +
>> > +   if (focus)
>> > +     _efl_canvas_object_seat_focus_add(eo_obj, obj, NULL);
>> > +   else
>> > +     _efl_canvas_object_seat_focus_del(eo_obj, obj, NULL);
>> > +}
>> > +
>> > +EOLIAN Eina_Bool
>> > +_efl_canvas_object_seat_focus_get(Eo *eo_obj,
>> Evas_Object_Protected_Data
>> > *obj)
>> > +{
>> > +   MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
>> > +   return EINA_FALSE;
>> > +   MAGIC_CHECK_END();
>> > +
>> > +   return eina_list_count(obj->focused_by_seats) ? EINA_TRUE :
>> > EINA_FALSE;
>> > +}
>> > +
>> > +EOLIAN Eina_Bool
>> > +_efl_canvas_object_key_focus_get(Eo *eo_obj,
>> Evas_Object_Protected_Data
>> > *obj)
>> > +{
>> > +   return _efl_canvas_object_seat_focus_check(eo_obj, obj, NULL);
>> > +}
>> > +
>> > +EOLIAN Evas_Object *
>> > +_evas_canvas_seat_focus_get(Eo *eo_obj EINA_UNUSED, Evas_Public_Data
>> *e,
>> > +                            Efl_Input_Device *seat)
>> > +{
>> > +   if (!seat)
>> > +     seat = e->default_seat;
>> > +
>> > +   return eina_hash_find(e->focused_objects, &seat);
>> >  }
>> >
>> >  EOLIAN Evas_Object*
>> >  _evas_canvas_focus_get(Eo *eo_obj EINA_UNUSED, Evas_Public_Data *e)
>> >  {
>> > -   return e->focused;
>> > +   return _evas_canvas_seat_focus_get(eo_obj, e, NULL);
>> > +}
>> > +
>> > +EOLIAN Eina_Iterator *
>> > +_evas_canvas_focused_objects_get(Eo *eo_obj EINA_UNUSED,
>> > Evas_Public_Data *e)
>> > +{
>> > +   return eina_hash_iterator_tuple_new(e->focused_objects);
>> >  }
>> > diff --git a/src/lib/evas/canvas/evas_main.c
>> b/src/lib/evas/canvas/evas_
>> > main.c
>> > index 8155bc8..822b387 100644
>> > --- a/src/lib/evas/canvas/evas_main.c
>> > +++ b/src/lib/evas/canvas/evas_main.c
>> > @@ -212,6 +212,8 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj,
>> > Evas_Public_Data *e)
>> >
>> >     _evas_canvas_event_init(eo_obj, e);
>> >
>> > +   e->focused_objects = eina_hash_pointer_new(NULL);
>> > +
>> >     return eo_obj;
>> >  }
>> >
>> > @@ -342,6 +344,7 @@ _evas_canvas_efl_object_destructor(Eo *eo_e,
>> > Evas_Public_Data *e)
>> >     eina_array_flush(&e->image_unref_queue);
>> >     eina_array_flush(&e->glyph_unref_queue);
>> >     eina_array_flush(&e->texts_unref_queue);
>> > +   eina_hash_free(e->focused_objects);
>> >
>> >     EINA_LIST_FREE(e->touch_points, touch_point)
>> >       free(touch_point);
>> > diff --git a/src/lib/evas/canvas/evas_object_main.c
>> > b/src/lib/evas/canvas/evas_object_main.c
>> > index 76c3c2b..c74d01d 100644
>> > --- a/src/lib/evas/canvas/evas_object_main.c
>> > +++ b/src/lib/evas/canvas/evas_object_main.c
>> > @@ -696,14 +696,25 @@ _efl_canvas_object_efl_object_destructor(Eo
>> > *eo_obj, Evas_Object_Protected_Data
>> >     Evas_Object *proxy;
>> >     Eina_List *l, *l2;
>> >     Evas_Canvas3D_Texture *texture;
>> > +   Efl_Input_Device *dev;
>> > +   Evas_Public_Data *edata;
>> >
>> > +   edata = efl_data_scope_get(evas_object_evas_get(eo_obj),
>> > EVAS_CANVAS_CLASS);
>> >     evas_object_hide(eo_obj);
>> > -   if (obj->focused)
>> > +   EINA_LIST_FREE (obj->focused_by_seats, dev)
>> >       {
>> > -        obj->focused = EINA_FALSE;
>> > -        if ((obj->layer) && (obj->layer->evas))
>> > -          obj->layer->evas->focused = NULL;
>> > -        evas_object_event_callback_call(eo_obj, obj,
>> > EVAS_CALLBACK_FOCUS_OUT, NULL, _evas_object_event_new(),
>> > EFL_CANVAS_OBJECT_EVENT_FOCUS_OUT);
>> > +        efl_event_callback_del(dev, EFL_EVENT_DEL,
>> > +                               _evas_focus_device_del_cb, obj);
>> > +        eina_hash_del_by_key(edata->focused_objects, &dev);
>> > +        //default seat - legacy support.
>> > +        if (dev == edata->default_seat)
>> > +          {
>> > +             evas_object_event_callback_call(eo_obj, obj,
>> > EVAS_CALLBACK_FOCUS_OUT,
>> > +                                             NULL,
>> > _evas_object_event_new(),
>> > +
>> >  EFL_CANVAS_OBJECT_EVENT_FOCUS_OUT);
>> > +          }
>> > +        efl_event_callback_call(eo_obj,
>> > +                                EFL_CANVAS_OBJECT_EVENT_FOCUS_
>> DEVICE_OUT,
>> > dev);
>> >          if ((obj->layer) && (obj->layer->evas))
>> >            _evas_post_event_callback_call(obj->layer->evas->evas,
>> > obj->layer->evas);
>> >       }
>> > diff --git a/src/lib/evas/include/evas_private.h
>> > b/src/lib/evas/include/evas_private.h
>> > index dcbcbec..bb24435 100644
>> > --- a/src/lib/evas/include/evas_private.h
>> > +++ b/src/lib/evas/include/evas_private.h
>> > @@ -889,7 +889,7 @@ struct _Evas_Public_Data
>> >     int            in_smart_calc;
>> >     int            smart_calc_count;
>> >
>> > -   Evas_Object   *focused;
>> > +   Eina_Hash     *focused_objects; //Key - seat; value - the focused
>> > object
>> >     void          *attach_data;
>> >     Evas_Modifier  modifiers;
>> >     Evas_Lock      locks;
>> > @@ -1109,6 +1109,7 @@ struct _Evas_Object_Protected_Data
>> >     const Evas_Object_Map_Data *map;
>> >     const Evas_Object_3D_Data  *data_3d;
>> >     const Evas_Object_Mask_Data *mask;
>> > +   Eina_List                  *focused_by_seats;
>> >
>> >     // Pointer to the Evas_Object itself
>> >     Evas_Object                *object;
>> > @@ -1158,7 +1159,6 @@ struct _Evas_Object_Protected_Data
>> >     Eina_Bool                   rect_del : 1;
>> >     Eina_Bool                   mouse_in : 1;
>> >     Eina_Bool                   pre_render_done : 1;
>> > -   Eina_Bool                   focused : 1;
>> >     Eina_Bool                   in_layer : 1;
>> >
>> >     Eina_Bool                   no_propagate : 1;
>> > @@ -1715,6 +1715,7 @@ void _canvas_font_cache_flush(Eo *e, void *_pd,
>> > va_list *list);
>> >  void _canvas_font_cache_set(Eo *e, void *_pd, va_list *list);
>> >  void _canvas_font_cache_get(Eo *e, void *_pd, va_list *list);
>> >  void _canvas_font_available_list(Eo *e, void *_pd, va_list *list);
>> > +void _evas_focus_device_del_cb(void *data, const Efl_Event *ev);
>> >
>> >  void _canvas_key_modifier_get(Eo *e, void *_pd, va_list *list);
>> >  void _canvas_key_lock_get(Eo *e, void *_pd, va_list *list);
>> >
>> > --
>> >
>> > --
>> > Jean-Philippe André
>> >
>> >
>> ------------------------------------------------------------
>> ------------------
>> Developer Access Program for Intel Xeon Phi Processors
>> Access to Intel Xeon Phi processor-based developer platforms.
>> With one year of Intel Parallel Studio XE.
>> Training and support from Colfax.
>> Order your platform today. http://sdm.link/xeonphi
>> _______________________________________________
>> enlightenment-devel mailing list
>> enlightenment-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>>
>
>
------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to