bdilly pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=5cfdf3ec3af60394dfaa19440f475fc23a8567e6

commit 5cfdf3ec3af60394dfaa19440f475fc23a8567e6
Author: Bruno Dilly <[email protected]>
Date:   Thu Nov 17 15:21:02 2016 -0200

    edje: support seat on focus action and signals
    
    Seat goes as an optional parameter for FOCUS_SET (if not
    provided, act over default seat), and emit signals
    with seat suffix:
     * focus,in,$SEAT
     * focus,out,$SEAT
     * focus,part,in,$SEAT
     * focus,part,out,$SEAT
---
 src/bin/edje/edje_cc_handlers.c |  15 +++-
 src/lib/edje/Edje_Common.h      |   2 +-
 src/lib/edje/edje_callbacks.c   |  10 ++-
 src/lib/edje/edje_data.c        |   2 +
 src/lib/edje/edje_edit.c        |   2 +
 src/lib/edje/edje_entry.c       | 162 +++++++++++++++++++++++++++++-----------
 src/lib/edje/edje_load.c        |  13 +++-
 src/lib/edje/edje_private.h     |  14 +++-
 src/lib/edje/edje_program.c     | 107 +++++++++++++++++++++++---
 9 files changed, 263 insertions(+), 64 deletions(-)

diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 33aeb12..1d4b30b 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -2032,6 +2032,7 @@ _edje_program_copy(Edje_Program *ep, Edje_Program *ep2)
    ep->in.from = ep2->in.from;
    ep->in.range = ep2->in.range;
    ep->action = ep2->action;
+   ep->seat = STRDUP(ep2->seat);
    ep->state = STRDUP(ep2->state);
    ep->state2 = STRDUP(ep2->state2);
    ep->value = ep2->value;
@@ -6067,6 +6068,7 @@ _program_free(Edje_Program *pr)
    free((void*)pr->source);
    free((void*)pr->filter.part);
    free((void*)pr->filter.state);
+   free((void*)pr->seat);
    free((void*)pr->state);
    free((void*)pr->state2);
    free((void*)pr->sample_name);
@@ -14091,7 +14093,7 @@ st_collections_group_programs_program_in(void)
         @li DRAG_VAL_SET 0.5 0.0
         @li DRAG_VAL_STEP 1.0 0.0
         @li DRAG_VAL_PAGE 0.0 0.0
-        @li FOCUS_SET
+        @li FOCUS_SET ("seat")
         @li FOCUS_OBJECT
         @li PARAM_COPY "src_part" "src_param" "dst_part" "dst_param"
         @li PARAM_SET "part" "param" "value"
@@ -14167,6 +14169,13 @@ st_collections_group_programs_program_action(void)
        else
          ep->value = parse_float_range(2, 0.0, 1.0);
      }
+   else if (ep->action == EDJE_ACTION_TYPE_FOCUS_SET)
+     {
+       if (get_arg_count() == 1)
+          ep->seat = NULL;
+        else
+          ep->seat = parse_str(1);
+     }
    else if (ep->action == EDJE_ACTION_TYPE_SIGNAL_EMIT)
      {
        ep->state = parse_str(1);
@@ -14309,7 +14318,6 @@ st_collections_group_programs_program_action(void)
        break;
       case EDJE_ACTION_TYPE_ACTION_STOP:
       case EDJE_ACTION_TYPE_FOCUS_OBJECT:
-      case EDJE_ACTION_TYPE_FOCUS_SET:
       case EDJE_ACTION_TYPE_PHYSICS_FORCES_CLEAR:
       case EDJE_ACTION_TYPE_PHYSICS_STOP:
         check_arg_count(1);
@@ -14333,6 +14341,9 @@ st_collections_group_programs_program_action(void)
       case EDJE_ACTION_TYPE_STATE_SET:
         check_min_arg_count(2);
         break;
+      case EDJE_ACTION_TYPE_FOCUS_SET:
+        check_min_arg_count(1);
+        break;
       default:
        check_arg_count(3);
      }
diff --git a/src/lib/edje/Edje_Common.h b/src/lib/edje/Edje_Common.h
index b99de45..243a28c 100644
--- a/src/lib/edje/Edje_Common.h
+++ b/src/lib/edje/Edje_Common.h
@@ -1924,7 +1924,7 @@ typedef enum _Edje_Action_Type
    EDJE_ACTION_TYPE_DRAG_VAL_STEP            = 5,  /**< Drag val step action 
value */
    EDJE_ACTION_TYPE_DRAG_VAL_PAGE            = 6,  /**< Drag val page action 
value */
    EDJE_ACTION_TYPE_SCRIPT                   = 7,  /**< Script action value */
-   EDJE_ACTION_TYPE_FOCUS_SET                = 8,  /**< Forcus set action 
value */
+   EDJE_ACTION_TYPE_FOCUS_SET                = 8,  /**< Focus set action value 
*/
    EDJE_ACTION_TYPE_RESERVED00               = 9,  /**< Reversed do action 
value */
    EDJE_ACTION_TYPE_FOCUS_OBJECT             = 10, /**< Forcus object action 
value */
    EDJE_ACTION_TYPE_PARAM_COPY               = 11, /**< Param copy action 
value */
diff --git a/src/lib/edje/edje_callbacks.c b/src/lib/edje/edje_callbacks.c
index b367d0c..c92f329 100644
--- a/src/lib/edje/edje_callbacks.c
+++ b/src/lib/edje/edje_callbacks.c
@@ -25,29 +25,35 @@ _edje_hold_signal_cb(void *data, const Efl_Event *event)
 static void
 _edje_focus_in_signal_cb(void *data, const Efl_Event *event)
 {
+   Efl_Input_Focus *ev;
    Edje *ed;
    Edje_Real_Part *rp;
 
+   ev = event->info;
    ed = data;
    rp = evas_object_data_get(event->object, "real_part");
    if ((!rp) || (!ed))
      return;
 
-   _edje_emit(ed, "focus,part,in", rp->part->name);
+   _edje_seat_emit(ed, efl_input_device_get(ev),
+                   "focus,part,in", rp->part->name);
 }
 
 static void
 _edje_focus_out_signal_cb(void *data, const Efl_Event *event)
 {
+   Efl_Input_Focus *ev;
    Edje *ed;
    Edje_Real_Part *rp;
 
+   ev = event->info;
    ed = data;
    rp = evas_object_data_get(event->object, "real_part");
    if ((!rp) || (!ed))
      return;
 
-   _edje_emit(ed, "focus,part,out", rp->part->name);
+   _edje_seat_emit(ed, efl_input_device_get(ev),
+                   "focus,part,out", rp->part->name);
 }
 
 static void
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index b9a0ee2..9141ae1 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -1062,6 +1062,8 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"vibration_name", vibration_name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"vibration_repeat", vibration_repeat, EET_T_INT);
 
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "seat", 
seat, EET_T_STRING);
+
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"state", state, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"state2", state2, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, 
"value", value, EET_T_DOUBLE);
diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c
index 486395c..eab121f 100644
--- a/src/lib/edje/edje_edit.c
+++ b/src/lib/edje/edje_edit.c
@@ -10693,6 +10693,7 @@ edje_edit_program_add(Evas_Object *obj, const char 
*name)
    epr->in.from = 0.0;
    epr->in.range = 0.0;
    epr->action = 0;
+   epr->seat = NULL;
    epr->state = NULL;
    epr->value = 0.0;
    epr->state2 = NULL;
@@ -10788,6 +10789,7 @@ edje_edit_program_del(Evas_Object *obj, const char 
*prog)
    _edje_if_string_free(ed, &epr->source);
    _edje_if_string_free(ed, &epr->filter.part);
    _edje_if_string_free(ed, &epr->filter.state);
+   _edje_if_string_free(ed, &epr->seat);
    _edje_if_string_free(ed, &epr->state);
    _edje_if_string_free(ed, &epr->state2);
    _edje_if_string_free(ed, &epr->sample_name);
diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c
index 0d85a5b..f999d0a 100644
--- a/src/lib/edje/edje_entry.c
+++ b/src/lib/edje/edje_entry.c
@@ -113,12 +113,17 @@ _preedit_del(Entry *en)
 }
 
 static void
-_edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission 
EINA_UNUSED, const char *source EINA_UNUSED)
+_edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission, 
const char *source EINA_UNUSED)
 {
+   Efl_Input_Device *seat;
+   const char *seat_name;
    Edje_Real_Part *rp;
    Entry *en;
    Edje *ed;
 
+   seat_name = emission + strlen("focus,part,in,");
+   seat = evas_device_get(evas_object_evas_get(o), seat_name);
+
    rp = data;
    if ((!rp) || (rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -130,7 +135,7 @@ _edje_entry_focus_in_cb(void *data, Evas_Object *o, const 
char *emission EINA_UN
    en = rp->typedata.text->entry_data;
    if (!en || !en->imf_context) return;
 
-   if (evas_object_focus_get(ed->obj))
+   if (evas_object_seat_focus_check(ed->obj, seat))
      {
         ecore_imf_context_focus_in(en->imf_context);
         _edje_entry_imf_cursor_info_set(en);
@@ -158,17 +163,16 @@ _edje_entry_focus_out_cb(void *data, Evas_Object *o 
EINA_UNUSED, const char *emi
 #endif
 
 static void
-_edje_focus_in_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+_edje_focus_in(Edje *ed, Efl_Input_Device *seat)
 {
-   Edje *ed = data;
 #ifdef HAVE_ECORE_IMF
    Edje_Real_Part *rp;
    Entry *en;
 #endif
 
-   _edje_emit(ed, "focus,in", "");
+   _edje_seat_emit(ed, seat, "focus,in", "");
 #ifdef HAVE_ECORE_IMF
-   rp = ed->focused_part;
+   rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
    if (!rp) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -185,17 +189,25 @@ _edje_focus_in_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
 }
 
 static void
-_edje_focus_out_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+_edje_focus_in_cb(void *data, const Efl_Event *event)
+{
+   Efl_Input_Focus *ev = event->info;
+
+   _edje_focus_in(data, efl_input_device_get(ev));
+}
+
+static void
+_edje_focus_out(Edje *ed, Efl_Input_Device *seat)
 {
-   Edje *ed = data;
 #ifdef HAVE_ECORE_IMF
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en;
 #endif
 
-   _edje_emit(ed, "focus,out", "");
+   _edje_seat_emit(ed, seat, "focus,out", "");
 
 #ifdef HAVE_ECORE_IMF
+   rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
    if (!rp) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -211,6 +223,14 @@ _edje_focus_out_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED
 #endif
 }
 
+static void
+_edje_focus_out_cb(void *data, const Efl_Event *event)
+{
+   Efl_Input_Focus *ev = event->info;
+
+   _edje_focus_out(data, efl_input_device_get(ev));
+}
+
 static Edje_Entry_Change_Info *
 _text_filter_markup_prepend_internal(Edje *ed, Entry *en, 
Evas_Textblock_Cursor *c,
                                      char *text,
@@ -1676,7 +1696,9 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
 {
    Edje *ed = data;
    Evas_Event_Key_Down *ev = event_info;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
+   Efl_Input_Device *seat;
+
    Entry *en;
    Eina_Bool control, alt, shift;
 #if defined(__APPLE__) && defined(__MACH__)
@@ -1685,6 +1707,10 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
    Eina_Bool multiline;
    Eina_Bool cursor_changed;
    int old_cur_pos;
+
+   seat = efl_input_device_seat_get(ev->dev);
+   rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+
    if (!rp) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -2340,10 +2366,14 @@ end:
 static void
 _edje_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info)
 {
+   Evas_Event_Key_Up *ev = event_info;
+   Efl_Input_Device *seat;
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en;
 
+   seat = efl_input_device_seat_get(ev->dev);
+   rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
    if (!rp) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -2356,7 +2386,6 @@ _edje_key_up_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, v
 #ifdef HAVE_ECORE_IMF
    if (en->imf_context)
      {
-        Evas_Event_Key_Up *ev = event_info;
         Ecore_IMF_Event_Key_Up ecore_ev;
 
         ecore_imf_evas_event_key_up_wrap(ev, &ecore_ev);
@@ -2797,26 +2826,36 @@ _canvas_viewport_resize_cb(void *data, Evas *e 
EINA_UNUSED, void *event_info EIN
 }
 
 static void
-_evas_focus_in_cb(void *data, Evas *e, EINA_UNUSED void *event_info)
+_evas_focus_in_cb(void *data, const Efl_Event *event)
 {
-   Edje *ed = (Edje *)data;
+   Efl_Input_Focus *ev = event->info;
+   Evas *e = event->object;
+   Efl_Input_Device *seat;
+   Edje *ed = data;
+
    if (!ed) return;
 
-   if (evas_focus_get(e) == ed->obj)
+   seat = efl_input_device_get(ev);
+   if (evas_canvas_seat_focus_get(e, seat) == ed->obj)
      {
-        _edje_focus_in_cb(data, NULL, NULL, NULL);
+        _edje_focus_in(data, seat);
      }
 }
 
 static void
-_evas_focus_out_cb(void *data, Evas *e, EINA_UNUSED void *event_info)
+_evas_focus_out_cb(void *data, const Efl_Event *event)
 {
-   Edje *ed = (Edje *)data;
+   Efl_Input_Focus *ev = event->info;
+   Evas *e = event->object;
+   Efl_Input_Device *seat;
+   Edje *ed = data;
+
    if (!ed) return;
 
-   if (evas_focus_get(e) == ed->obj)
+   seat = efl_input_device_get(ev);
+   if (evas_canvas_seat_focus_get(e, seat) == ed->obj)
      {
-        _edje_focus_out_cb(data, NULL, NULL, NULL);
+        _edje_focus_out(data, seat);
      }
 }
 
@@ -2830,12 +2869,16 @@ _edje_entry_init(Edje *ed)
      return;
    ed->entries_inited = EINA_TRUE;
 
-   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_FOCUS_IN, 
_edje_focus_in_cb, ed);
-   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_FOCUS_OUT, 
_edje_focus_out_cb, ed);
-   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_DOWN, 
_edje_key_down_cb, ed);
-   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_UP, 
_edje_key_up_cb, ed);
-   evas_event_callback_add(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_IN, 
_evas_focus_in_cb, ed);
-   evas_event_callback_add(ed->base->evas, EVAS_CALLBACK_CANVAS_FOCUS_OUT, 
_evas_focus_out_cb, ed);
+   efl_event_callback_add(ed->obj, EFL_EVENT_FOCUS_IN, _edje_focus_in_cb, ed);
+   efl_event_callback_add(ed->obj, EFL_EVENT_FOCUS_OUT, _edje_focus_out_cb, 
ed);
+   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_DOWN,
+                                  _edje_key_down_cb, ed);
+   evas_object_event_callback_add(ed->obj, EVAS_CALLBACK_KEY_UP,
+                                  _edje_key_up_cb, ed);
+   efl_event_callback_add(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_IN,
+                          _evas_focus_in_cb, ed);
+   efl_event_callback_add(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_OUT,
+                          _evas_focus_out_cb, ed);
 }
 
 void
@@ -2847,14 +2890,16 @@ _edje_entry_shutdown(Edje *ed)
      return;
    ed->entries_inited = EINA_FALSE;
 
-   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_FOCUS_IN, 
_edje_focus_in_cb);
-   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_FOCUS_OUT, 
_edje_focus_out_cb);
-   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_DOWN, 
_edje_key_down_cb);
-   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_UP, 
_edje_key_up_cb);
-   if (evas_event_callback_del_full(ed->base->evas, 
EVAS_CALLBACK_CANVAS_FOCUS_IN, _evas_focus_in_cb, ed) != ed)
-     ERR("could not unregister EVAS_CALLBACK_FOCUS_IN");
-   if (evas_event_callback_del_full(ed->base->evas, 
EVAS_CALLBACK_CANVAS_FOCUS_OUT, _evas_focus_out_cb, ed) != ed)
-     ERR("could not unregister EVAS_CALLBACK_FOCUS_OUT");
+   efl_event_callback_del(ed->obj, EFL_EVENT_FOCUS_IN, _edje_focus_in_cb, ed);
+   efl_event_callback_del(ed->obj, EFL_EVENT_FOCUS_OUT, _edje_focus_out_cb, 
ed);
+   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_DOWN,
+                                  _edje_key_down_cb);
+   evas_object_event_callback_del(ed->obj, EVAS_CALLBACK_KEY_UP,
+                                  _edje_key_up_cb);
+   efl_event_callback_del(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_IN,
+                          _evas_focus_in_cb, ed);
+   efl_event_callback_del(ed->base->evas, EFL_CANVAS_EVENT_FOCUS_OUT,
+                          _evas_focus_out_cb, ed);
 }
 
 void
@@ -2948,8 +2993,12 @@ _edje_entry_real_part_init(Edje *ed, Edje_Real_Part *rp)
 
         en->commit_cancel = EINA_FALSE;
 
-        edje_object_signal_callback_add(ed->obj, "focus,part,in", 
rp->part->name, _edje_entry_focus_in_cb, rp);
-        edje_object_signal_callback_add(ed->obj, "focus,part,out", 
rp->part->name, _edje_entry_focus_out_cb, rp);
+        edje_object_signal_callback_add(ed->obj, "focus,part,in,*",
+                                        rp->part->name,
+                                        _edje_entry_focus_in_cb, rp);
+        edje_object_signal_callback_add(ed->obj, "focus,part,out,*",
+                                        rp->part->name,
+                                        _edje_entry_focus_out_cb, rp);
 
         ctx_id = ecore_imf_context_default_id_get();
         if (ctx_id)
@@ -3053,8 +3102,12 @@ _edje_entry_real_part_shutdown(Edje *ed, Edje_Real_Part 
*rp)
              en->imf_context = NULL;
           }
 
-        edje_object_signal_callback_del(ed->obj, "focus,part,in", 
rp->part->name, _edje_entry_focus_in_cb);
-        edje_object_signal_callback_del(ed->obj, "focus,part,out", 
rp->part->name, _edje_entry_focus_out_cb);
+        edje_object_signal_callback_del(ed->obj, "focus,part,in,*",
+                                        rp->part->name,
+                                        _edje_entry_focus_in_cb);
+        edje_object_signal_callback_del(ed->obj, "focus,part,out,*",
+                                        rp->part->name,
+                                        _edje_entry_focus_out_cb);
      }
 #endif
    _compose_seq_reset(en);
@@ -4429,11 +4482,14 @@ static Eina_Bool
 _edje_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, char **text, int *cursor_pos)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    const char *str;
    char *plain_text;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
    if (!rp) return EINA_FALSE;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return EINA_FALSE;
@@ -4506,11 +4562,14 @@ static void
 _edje_entry_imf_event_commit_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, void *event_info)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    char *commit_str = event_info;
    Edje_Entry_Change_Info *info = NULL;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
    if ((!rp)) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -4587,7 +4646,7 @@ static void
 _edje_entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    Edje_Entry_Change_Info *info = NULL;
    int cursor_pos;
@@ -4610,6 +4669,9 @@ _edje_entry_imf_event_preedit_changed_cb(void *data, 
Ecore_IMF_Context *ctx EINA
    Eina_Strbuf *buf;
    Eina_Strbuf *preedit_attr_str;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
    if ((!rp)) return;
 
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
@@ -4751,7 +4813,7 @@ static void
 _edje_entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, void *event_info)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    Ecore_IMF_Event_Delete_Surrounding *ev = event_info;
    Evas_Textblock_Cursor *del_start, *del_end;
@@ -4759,6 +4821,10 @@ _edje_entry_imf_event_delete_surrounding_cb(void *data, 
Ecore_IMF_Context *ctx E
    int cursor_pos;
    int start, end;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
+   if ((!rp)) return;
    if ((!rp) || (!ev)) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -4810,10 +4876,13 @@ static void
 _edje_entry_imf_event_selection_set_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, void *event_info)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    Ecore_IMF_Event_Selection *ev = event_info;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
    if ((!rp) || (!ev)) return;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
@@ -4844,10 +4913,13 @@ static Eina_Bool
 _edje_entry_imf_retrieve_selection_cb(void *data, Ecore_IMF_Context *ctx 
EINA_UNUSED, char **text)
 {
    Edje *ed = data;
-   Edje_Real_Part *rp = ed->focused_part;
+   Edje_Real_Part *rp;
    Entry *en = NULL;
    const char *selection_text = NULL;
 
+   // FIXME
+   //rp = _edje_focused_part_get(ed, efl_input_device_name_get(seat));
+   rp = _edje_focused_part_get(ed, "default");
    if (!rp) return EINA_FALSE;
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return EINA_FALSE;
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 3751fae..214f3e8 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -1809,13 +1809,23 @@ _edje_file_del(Edje *ed)
           }
      }
 
+   if (ed->focused_parts)
+     {
+        Edje_Focused_Part *focused_part;
+
+        EINA_LIST_FREE(ed->focused_parts, focused_part)
+          {
+             free(focused_part->seat);
+             free(focused_part);
+          }
+     }
+
    if (ed->L) _edje_lua2_script_shutdown(ed);
    while (ed->subobjs)
      _edje_subobj_unregister(ed, ed->subobjs->data);
    if (ed->table_parts) free(ed->table_parts);
    ed->table_parts = NULL;
    ed->table_parts_size = 0;
-   ed->focused_part = NULL;
    if (tev)
      {
         evas_event_thaw(tev);
@@ -1982,6 +1992,7 @@ _edje_program_free(Edje_Program *pr, Eina_Bool 
free_strings)
         if (pr->state2) eina_stringshare_del(pr->state2);
         if (pr->sample_name) eina_stringshare_del(pr->sample_name);
         if (pr->tone_name) eina_stringshare_del(pr->tone_name);
+        if (pr->seat) eina_stringshare_del(pr->seat);
      }
    EINA_LIST_FREE(pr->targets, prt)
      free(prt);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 7dc1d59..feafaa9 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -805,6 +805,8 @@ struct _Edje_Program /* a conditional program to be run */
       double   range;
    } in;
 
+   const char *seat; /* which seat to focus, NULL = default seat */
+
    const char *state; /* what state of alternates to apply, NULL = default */
    const char *state2; /* what other state to use - for signal emit action */
    double      value; /* value of state to apply (if multiple names match) */
@@ -1659,7 +1661,7 @@ struct _Edje
    Edje_Var_Pool        *var_pool;
    /* for faster lookups to avoid nth list walks */
    Edje_Real_Part      **table_parts;
-   Edje_Real_Part       *focused_part;
+   Eina_List            *focused_parts;
    Eina_List            *subobjs;
    Eina_List            *text_insert_filter_callbacks;
    Eina_List            *markup_filter_callbacks;
@@ -2273,6 +2275,13 @@ struct _Edje_Font
    char *file;
 };
 
+typedef struct _Edje_Focused_Part Edje_Focused_Part;
+struct _Edje_Focused_Part
+{
+   Edje_Real_Part *part;
+   char *seat;
+};
+
 Edje_Patterns   *edje_match_collection_dir_init(const Eina_List *lst);
 Edje_Patterns   *edje_match_programs_signal_init(Edje_Program * const *array,
                                                 unsigned int count);
@@ -2472,6 +2481,9 @@ void _edje_emit_full(Edje *ed, const char *sig, const 
char *src, void *data, voi
 void _edje_emit_handle(Edje *ed, const char *sig, const char *src, 
Edje_Message_Signal_Data *data, Eina_Bool prop);
 void  _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
 
+void _edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part 
*rp);
+Edje_Real_Part *_edje_focused_part_get(Edje *ed, const char *seat_name);
+
 const Edje_Signals_Sources_Patterns *_edje_signal_callback_patterns_ref(const 
Edje_Signal_Callback_Group *gp);
 void _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns 
*essp);
 void _edje_signal_callback_reset(Edje_Signal_Callback_Flags *flags, unsigned 
int length);
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index 2a6e100..f2c4f4c 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -615,6 +615,20 @@ _edje_physics_action_set(Edje *ed, Edje_Program *pr, void 
(*func)(EPhysics_Body
 
 #endif
 
+static void
+_edje_seat_name_emit(Edje *ed, const char *name, const char *sig, const char 
*src)
+{
+   char buf[128];
+
+   /* keep sending signals without seat information for legacy compatibility */
+   _edje_emit_full(ed, sig, src, NULL, NULL);
+
+   if (!name) return;
+
+   snprintf(buf, sizeof(buf), "%s,%s", sig, name);
+   _edje_emit_full(ed, buf, src, NULL, NULL);
+}
+
 void
 _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char 
*ssig, const char *ssrc)
 {
@@ -943,12 +957,32 @@ low_mem_current:
       break;
 
       case EDJE_ACTION_TYPE_FOCUS_SET:
+      {
+         Edje_Real_Part *focused_part;
+         const char *seat_name;
+
+         /* TODO : use edje custom seat naming */
+         if (pr->seat)
+           seat_name = pr->seat;
+         else
+           {
+              Efl_Input_Device *seat;
+              Evas *e;
+
+              e = evas_object_evas_get(ed->obj);
+              seat = evas_canvas_default_device_get(e, 
EFL_INPUT_DEVICE_CLASS_SEAT);
+              seat_name = evas_device_name_get(seat);
+              if (!seat_name)
+                break;
+           }
+
         if (!pr->targets)
           {
-             if (ed->focused_part)
-               _edje_emit(ed, "focus,part,out",
-                          ed->focused_part->part->name);
-             ed->focused_part = NULL;
+             focused_part = _edje_focused_part_get(ed, seat_name);
+             if (focused_part)
+               _edje_seat_name_emit(ed, seat_name, "focus,part,out",
+                                    focused_part->part->name);
+             _edje_focused_part_set(ed, seat_name, NULL);
           }
         else
           {
@@ -959,20 +993,25 @@ low_mem_current:
                        rp = ed->table_parts[pt->id % ed->table_parts_size];
                        if (rp)
                          {
-                            if (ed->focused_part != rp)
+                            focused_part = _edje_focused_part_get(ed,
+                                                                  seat_name);
+                            if (focused_part != rp)
                               {
-                                 if (ed->focused_part)
-                                   _edje_emit(ed, "focus,part,out",
-                                              ed->focused_part->part->name);
-                                 ed->focused_part = rp;
-                                 _edje_emit(ed, "focus,part,in",
-                                            ed->focused_part->part->name);
+                                 if (focused_part)
+                                   _edje_seat_name_emit(ed, seat_name,
+                                                        "focus,part,out",
+                                                        
focused_part->part->name);
+                                 _edje_focused_part_set(ed, seat_name, rp);
+                                 _edje_seat_name_emit(ed, seat_name,
+                                                      "focus,part,in",
+                                                      rp->part->name);
                               }
                          }
                     }
                }
           }
-        break;
+      }
+      break;
 
       case EDJE_ACTION_TYPE_FOCUS_OBJECT:
         if (!pr->targets)
@@ -1267,6 +1306,50 @@ _edje_emit_full(Edje *ed, const char *sig, const char 
*src, void *data, void (*f
    _edje_emit_send(ed, broadcast, sig, src, data, free_func);
 }
 
+void
+_edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp)
+{
+   Edje_Focused_Part *focused_part;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(ed->focused_parts, l, focused_part)
+     {
+        if (!strcmp(seat_name, focused_part->seat))
+          {
+             focused_part->part = rp;
+             return;
+          }
+     }
+
+   focused_part = calloc(1, sizeof(Edje_Focused_Part));
+   EINA_SAFETY_ON_NULL_RETURN(focused_part);
+
+   focused_part->seat = strdup(seat_name);
+   if (!focused_part->seat)
+     {
+        free(focused_part);
+        return;
+     }
+
+   focused_part->part = rp;
+   ed->focused_parts = eina_list_append(ed->focused_parts, focused_part);
+}
+
+Edje_Real_Part *
+_edje_focused_part_get(Edje *ed, const char *seat_name)
+{
+   Edje_Focused_Part *focused_part;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(ed->focused_parts, l, focused_part)
+     {
+        if (!strcmp(seat_name, focused_part->seat))
+          return focused_part->part;
+     }
+
+   return NULL;
+}
+
 struct _Edje_Program_Data
 {
    Eina_List  *matches;

-- 


Reply via email to