* edje: Add more focus event in edje. A start for a focus layout work.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 23 Feb 2010 13:39:19 +0000 (13:39 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 23 Feb 2010 13:39:19 +0000 (13:39 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@46389 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/edje_cc_handlers.c
src/lib/Edje.h
src/lib/edje_callbacks.c
src/lib/edje_edit.c
src/lib/edje_load.c
src/lib/edje_private.h
src/lib/edje_program.c
src/lib/edje_util.c

index f5d8c87..77ca283 100644 (file)
@@ -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;
index 40cc81a..b6ad28f 100644 (file)
@@ -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
index b5f89d9..9d06790 100644 (file)
@@ -24,6 +24,38 @@ _edje_hold_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
 }
 
 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;
@@ -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);
+}
index 66f510c..6979bc0 100644 (file)
@@ -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);
      }
 }
 
index dd4ae57..3cfdb9d 100644 (file)
@@ -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)
index 6401167..99a8f76 100644 (file)
@@ -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);
index db96885..063a2b8 100644 (file)
@@ -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);
index 147fe0e..95f4395 100644 (file)
@@ -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