diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index f5d8c87f97..77ca283350 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -6520,6 +6520,7 @@ st_collections_group_programs_program_action(void) "SCRIPT", EDJE_ACTION_TYPE_SCRIPT, "LUA_SCRIPT", EDJE_ACTION_TYPE_LUA_SCRIPT, "FOCUS_SET", EDJE_ACTION_TYPE_FOCUS_SET, + "FOCUS_OBJECT", EDJE_ACTION_TYPE_FOCUS_OBJECT, NULL); if (ep->action == EDJE_ACTION_TYPE_STATE_SET) { @@ -6546,7 +6547,7 @@ st_collections_group_programs_program_action(void) ep->value = parse_float(1); ep->value2 = parse_float(2); } - + switch (ep->action) { case EDJE_ACTION_TYPE_ACTION_STOP: @@ -6560,6 +6561,7 @@ st_collections_group_programs_program_action(void) /* this is implicitly set by lua_script {} so this is here just for * completeness */ break; + case EDJE_ACTION_TYPE_FOCUS_OBJECT: case EDJE_ACTION_TYPE_FOCUS_SET: check_arg_count(1); break; diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 40cc81af7d..b6ad28f12d 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -125,7 +125,8 @@ typedef enum _Edje_Action_Type EDJE_ACTION_TYPE_SCRIPT = 7, EDJE_ACTION_TYPE_FOCUS_SET = 8, EDJE_ACTION_TYPE_LUA_SCRIPT = 9, - EDJE_ACTION_TYPE_LAST = 10 + EDJE_ACTION_TYPE_FOCUS_OBJECT = 10, + EDJE_ACTION_TYPE_LAST = 11 } Edje_Action_Type; typedef enum _Edje_Tween_Mode diff --git a/legacy/edje/src/lib/edje_callbacks.c b/legacy/edje/src/lib/edje_callbacks.c index b5f89d927f..9d06790c07 100644 --- a/legacy/edje/src/lib/edje_callbacks.c +++ b/legacy/edje/src/lib/edje_callbacks.c @@ -23,6 +23,38 @@ _edje_hold_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) e = NULL; } +void +_edje_focus_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = data; + rp = evas_object_data_get(obj, "real_part"); + if ((!rp) || (!ed)) + return; + + _edje_emit(ed, "focus,part,in", rp->part->name); + return; + e = NULL; +} + +void +_edje_focus_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) +{ + Edje *ed; + Edje_Real_Part *rp; + + ed = data; + rp = evas_object_data_get(obj, "real_part"); + if ((!rp) || (!ed)) + return; + + _edje_emit(ed, "focus,part,out", rp->part->name); + return; + e = NULL; +} + void _edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) { @@ -466,28 +498,62 @@ _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp) } void -_edje_callbacks_del(Evas_Object *obj) +_edje_callbacks_del(Evas_Object *obj, Edje *ed) { - evas_object_event_callback_del(obj, - EVAS_CALLBACK_HOLD, - _edje_hold_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_IN, - _edje_mouse_in_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_OUT, - _edje_mouse_out_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_DOWN, - _edje_mouse_down_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_UP, - _edje_mouse_up_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_MOVE, - _edje_mouse_move_cb); - evas_object_event_callback_del(obj, - EVAS_CALLBACK_MOUSE_WHEEL, - _edje_mouse_wheel_cb); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_HOLD, + _edje_hold_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_IN, + _edje_mouse_in_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_OUT, + _edje_mouse_out_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_DOWN, + _edje_mouse_down_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_UP, + _edje_mouse_up_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_MOVE, + _edje_mouse_move_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_MOUSE_WHEEL, + _edje_mouse_wheel_cb, + ed); evas_object_data_del(obj, "real_part"); } + +void +_edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp) +{ + evas_object_event_callback_add(obj, + EVAS_CALLBACK_FOCUS_IN, + _edje_focus_in_cb, + ed); + evas_object_event_callback_add(obj, + EVAS_CALLBACK_FOCUS_OUT, + _edje_focus_out_cb, + ed); + evas_object_data_set(obj, "real_part", rp); +} + +void +_edje_callbacks_focus_del(Evas_Object *obj, Edje *ed) +{ + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_FOCUS_IN, + _edje_focus_in_cb, + ed); + evas_object_event_callback_del_full(obj, + EVAS_CALLBACK_FOCUS_OUT, + _edje_focus_out_cb, + ed); +} diff --git a/legacy/edje/src/lib/edje_edit.c b/legacy/edje/src/lib/edje_edit.c index 66f510ced7..6979bc08cd 100644 --- a/legacy/edje/src/lib/edje_edit.c +++ b/legacy/edje/src/lib/edje_edit.c @@ -172,7 +172,7 @@ _edje_real_part_free(Edje_Real_Part *rp) if (rp->object) { - _edje_callbacks_del(rp->object); + _edje_callbacks_del(rp->object, rp->edje); evas_object_del(rp->object); } @@ -185,7 +185,7 @@ _edje_real_part_free(Edje_Real_Part *rp) evas_object_clip_unset(rp->swallowed_object); evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part"); if (rp->part->mouse_events) - _edje_callbacks_del(rp->swallowed_object); + _edje_callbacks_del(rp->swallowed_object, rp->edje); if (rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL) @@ -2148,7 +2148,7 @@ edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, Eina_Bool mo else { evas_object_pass_events_set(rp->object, 1); - _edje_callbacks_del(rp->object); + _edje_callbacks_del(rp->object, ed); } } diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index dd4ae5790e..3cfdb9d4b9 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -414,6 +414,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g evas_object_color_set(rp->object, 0, 0, 0, 0); evas_object_pass_events_set(rp->object, 1); evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB); + _edje_callbacks_focus_add(rp->object, ed, rp); break; case EDJE_PART_TYPE_TEXTBLOCK: rp->object = evas_object_textblock_add(ed->evas); @@ -680,7 +681,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g group_path = eina_list_remove(group_path, group_path_entry); eina_stringshare_del(group_path_entry); - + edje_object_signal_callback_add(child_obj, "*", "*", _cb_signal_repeat, obj); if (rp->part->type == EDJE_PART_TYPE_GROUP) { @@ -852,7 +853,8 @@ _edje_file_del(Edje *ed) _edje_entry_real_part_shutdown(rp); if (rp->object) { - _edje_callbacks_del(rp->object); + _edje_callbacks_del(rp->object, ed); + _edje_callbacks_focus_del(rp->object, ed); evas_object_del(rp->object); } if (rp->swallowed_object) diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 640116707f..99a8f76e52 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -1229,7 +1229,9 @@ void _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_ int _edje_timer_cb(void *data); int _edje_pending_timer_cb(void *data); void _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp); -void _edje_callbacks_del(Evas_Object *obj); +void _edje_callbacks_focus_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp); +void _edje_callbacks_del(Evas_Object *obj, Edje *ed); +void _edje_callbacks_focus_del(Evas_Object *obj, Edje *ed); void _edje_edd_init(void); void _edje_edd_shutdown(void); diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index db9688515f..063a2b8d72 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -882,7 +882,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const } else { - EINA_LIST_FOREACH(pr->targets, l, pt) + EINA_LIST_FOREACH(pr->targets, l, pt) { if (pt->id >= 0) { @@ -903,6 +903,44 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const } } } + else if (pr->action == EDJE_ACTION_TYPE_FOCUS_OBJECT) + { + if (!pr->targets) + { + Evas_Object *focused; + + focused = evas_focus_get(evas_object_evas_get(ed->obj)); + if (focused) + { + int i; + + /* Check if the current swallowed object is one of my child. */ + for (i = 0; i < ed->table_parts_size; ++i) + { + rp = ed->table_parts[i]; + if (rp && rp->swallowed_object == focused) + { + evas_object_focus_set(focused, EINA_FALSE); + break; + } + } + } + } + else + { + EINA_LIST_FOREACH(pr->targets, l, pt) + { + if (pt->id >= 0) + { + rp = ed->table_parts[pt->id % ed->table_parts_size]; + if (rp && rp->swallowed_object) + { + evas_object_focus_set(rp->swallowed_object, EINA_TRUE); + } + } + } + } + } else { // _edje_emit(ed, "program,start", pr->name); diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 147fe0eebf..95f43953bf 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -2406,7 +2406,8 @@ edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part"); if (rp->part->mouse_events) - _edje_callbacks_del(rp->swallowed_object); + _edje_callbacks_del(rp->swallowed_object, rp->edje); + _edje_callbacks_focus_del(rp->swallowed_object, rp->edje); rp->swallowed_object = NULL; rp->swallow_params.min.w = 0; @@ -4453,6 +4454,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow) } else evas_object_pass_events_set(obj_swallow, 1); + _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp); if (rp->part->precise_is_inside) evas_object_precise_is_inside_set(obj_swallow, 1); @@ -4476,7 +4478,8 @@ _edje_real_part_swallow_clear(Edje_Real_Part *rp) evas_object_clip_unset(rp->swallowed_object); evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part"); if (rp->part->mouse_events) - _edje_callbacks_del(rp->swallowed_object); + _edje_callbacks_del(rp->swallowed_object, rp->edje); + _edje_callbacks_focus_del(rp->swallowed_object, rp->edje); } static void