diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 33aeb12df2..1d4b30ba0d 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 b99de45935..243a28ca00 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 b367d0c0a5..c92f3295bf 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 b9a0ee2532..9141ae139b 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 486395c491..eab121f498 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 0d85a5b368..f999d0a76a 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 3751fae34a..214f3e83b2 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 7dc1d59684..feafaa98e7 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 2a6e100622..f2c4f4cc7e 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;