On Mon, Sep 20, 2010 at 11:02 PM, Enlightenment SVN
<no-re...@enlightenment.org> wrote:
> Log:
>  Elementary event propagation to widget parents
>
>  The Elm Widgets aren't disposed exactly as trees of Evas Objects, so
>  need store widget parents separated from Evas Smart Object parents.
>
>  The Evas propagation events don't satisfy all use cases. Like managing
>  events in elm_win or try if one parent manage the event before manage
>  it.
>
>  In this, I add hook to each widget manage their interested events or
>  from their child.
> Author:       tiago
> Date:         2010-09-20 19:02:24 -0700 (Mon, 20 Sep 2010)
> New Revision: 52527
>
> Modified:
>  trunk/TMP/st/elementary/src/lib/elm_widget.c 
> trunk/TMP/st/elementary/src/lib/elm_widget.h
>
> Modified: trunk/TMP/st/elementary/src/lib/elm_widget.c
> ===================================================================
> --- trunk/TMP/st/elementary/src/lib/elm_widget.c        2010-09-21 01:58:54 
> UTC (rev 52526)
> +++ trunk/TMP/st/elementary/src/lib/elm_widget.c        2010-09-21 02:02:24 
> UTC (rev 52527)
> @@ -28,6 +28,7 @@
>    void         (*activate_func) (Evas_Object *obj);
>    void         (*disable_func) (Evas_Object *obj);
>    void         (*theme_func) (Evas_Object *obj);
> +   Eina_Bool    (*event_func) (Evas_Object *obj, Evas_Object *source, 
> Evas_Callback_Type type, void *event_info);
>    void         (*signal_func) (Evas_Object *obj, const char *emission,
>                                const char *source);
>    void         (*callback_add_func) (Evas_Object *obj, const char *emission,
> @@ -156,6 +157,40 @@
>  }
>
>  static void
> +_propagate_event(void *data, Evas *e __UNUSED__, Evas_Object *obj, void 
> *event_info)
> +{
> +   INTERNAL_ENTRY;
> +   Evas_Callback_Type type = (Evas_Callback_Type)(long) data;
> +   Evas_Event_Flags *event_flags = NULL;
> +
> +   switch (type)
> +     {
> +      case EVAS_CALLBACK_KEY_DOWN:
> +           {
> +              Evas_Event_Key_Down *ev = event_info;
> +              event_flags = &(ev->event_flags);
> +              break;
> +           }
> +      case EVAS_CALLBACK_KEY_UP:
> +           {
> +              Evas_Event_Key_Up *ev = event_info;
> +              event_flags = &(ev->event_flags);
> +              break;
> +           }
> +      default:
> +         break;
> +     }
> +
> +   if (event_flags && (*event_flags & EVAS_EVENT_FLAG_ON_HOLD))
> +     return;
> +
> +   if (sd->event_func && sd->event_func(obj, obj, type, event_info))
> +     return;
> +
> +   elm_widget_parent_event_propagate(obj, type, event_info);
> +}
> +
> +static void
>  _parent_focus(Evas_Object *obj)
>  {
>    API_ENTRY return;
> @@ -251,6 +286,13 @@
>  }
>
>  EAPI void
> +elm_widget_event_hook_set(Evas_Object *obj, Eina_Bool (*func) (Evas_Object 
> *obj, Evas_Object *source, Evas_Callback_Type type, void *event_info))
> +{
> +   API_ENTRY return;
> +   sd->event_func = func;
> +}
> +
> +EAPI void
>  elm_widget_changed_hook_set(Evas_Object *obj, void (*func) (Evas_Object 
> *obj))
>  {
>    API_ENTRY return;
> @@ -458,6 +500,22 @@
>  {
>    API_ENTRY return;
>    sd->can_focus = can_focus;
> +   if (can_focus)
> +     {
> +        evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
> +                                       _propagate_event,
> +                                       (void *)(long) 
> EVAS_CALLBACK_KEY_DOWN);
> +        evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_UP,
> +                                       _propagate_event,
> +                                       (void *)(long) EVAS_CALLBACK_KEY_UP);
> +     }
> +   else
> +     {
> +        evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN,
> +                                       _propagate_event);
> +        evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_UP,
> +                                       _propagate_event);
> +     }
>  }

Setting can_focus(0); to an object that didn't have the callbacks before will
issue warnings all over the place about deleting a callback that was not
registered.

>
>  EAPI int
> @@ -565,6 +623,24 @@
>    return parent;
>  }
>
> +EAPI Eina_Bool
> +elm_widget_parent_event_propagate(Evas_Object *obj, Evas_Callback_Type type, 
> void *event_info)
> +{
> +   API_ENTRY return EINA_FALSE;
> +   Evas_Object *parent = sd->parent_obj;
> +   while (parent)
> +     {
> +        sd = evas_object_smart_data_get(parent);
> +        if ((!sd) || (!_elm_widget_is(obj)))

Shouldn't you be checking if parent is an elm_widget here?

> +          return EINA_FALSE; //Not Elm Widget
> +        if (sd->event_func && sd->event_func(parent, obj, type, event_info))
> +          return EINA_TRUE;
> +        parent = sd->parent_obj;
> +     }
> +
> +   return EINA_FALSE;
> +}
> +
>  EAPI int
>  elm_widget_focus_jump(Evas_Object *obj, int forward)
>  {
>
> Modified: trunk/TMP/st/elementary/src/lib/elm_widget.h
> ===================================================================
> --- trunk/TMP/st/elementary/src/lib/elm_widget.h        2010-09-21 01:58:54 
> UTC (rev 52526)
> +++ trunk/TMP/st/elementary/src/lib/elm_widget.h        2010-09-21 02:02:24 
> UTC (rev 52527)
> @@ -213,6 +213,7 @@
>  EAPI void             elm_widget_activate_hook_set(Evas_Object *obj, void 
> (*func) (Evas_Object *obj));
>  EAPI void             elm_widget_disable_hook_set(Evas_Object *obj, void 
> (*func) (Evas_Object *obj));
>  EAPI void             elm_widget_theme_hook_set(Evas_Object *obj, void 
> (*func) (Evas_Object *obj));
> +EAPI void             elm_widget_event_hook_set(Evas_Object *obj, Eina_Bool 
> (*func) (Evas_Object *obj, Evas_Object *source, Evas_Callback_Type type, void 
> *event_info));
>  EAPI void             elm_widget_changed_hook_set(Evas_Object *obj, void 
> (*func) (Evas_Object *obj));
>  EAPI void             elm_widget_signal_emit_hook_set(Evas_Object *obj, void 
> (*func) (Evas_Object *obj, const char *emission, const char *source));
>  EAPI void             elm_widget_signal_callback_add_hook_set(Evas_Object 
> *obj, void (*func) (Evas_Object *obj, const char *emission, const char 
> *source, void (*func_cb) (void *data, Evas_Object *o, const char *emission, 
> const char *source), void *data));
> @@ -239,6 +240,7 @@
>  EAPI Evas_Object     *elm_widget_top_get(const Evas_Object *obj);
>  EAPI Eina_Bool        elm_widget_is(const Evas_Object *obj);
>  EAPI Evas_Object     *elm_widget_parent_widget_get(const Evas_Object *obj);
> +EAPI Eina_Bool        elm_widget_parent_event_propagate(Evas_Object *obj, 
> Evas_Callback_Type type, void *event_info);
>  EAPI int              elm_widget_focus_jump(Evas_Object *obj, int forward);
>  EAPI void             elm_widget_focus_set(Evas_Object *obj, int first);
>  EAPI void             elm_widget_focused_object_clear(Evas_Object *obj);
>
>
> ------------------------------------------------------------------------------
> Start uncovering the many advantages of virtual appliances
> and start using them to simplify application deployment and
> accelerate your shift to cloud computing.
> http://p.sf.net/sfu/novell-sfdev2dev
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
>

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to