"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)
{
ep->value = parse_float(1);
ep->value2 = parse_float(2);
}
-
+
switch (ep->action)
{
case EDJE_ACTION_TYPE_ACTION_STOP:
/* 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;
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
}
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)
{
Evas_Event_Mouse_In *ev;
}
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);
+}
if (rp->object)
{
- _edje_callbacks_del(rp->object);
+ _edje_callbacks_del(rp->object, rp->edje);
evas_object_del(rp->object);
}
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)
else
{
evas_object_pass_events_set(rp->object, 1);
- _edje_callbacks_del(rp->object);
+ _edje_callbacks_del(rp->object, ed);
}
}
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);
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)
{
_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)
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);
}
else
{
- EINA_LIST_FOREACH(pr->targets, l, pt)
+ EINA_LIST_FOREACH(pr->targets, l, pt)
{
if (pt->id >= 0)
{
}
}
}
+ 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);
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;
}
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);
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