2010/11/29 Dave Andreoli <d...@gurumeditation.it>: > 2010/11/29 Tiago Falcão <ti...@profusion.mobi>: >> Some time ago, we created a system to propagate events across the >> Elementary widget tree, done mostly (and for now, only) to propagate >> key events all the way to the top widget (usually, the window). It was >> needed because the normal propagation Evas does works on Smart >> Objects, but the Elementary works doesn't allow to make a smart member >> out of every child of a widget. >> >> This system was internal, but we began to expose it, so the user can >> hook his own callbacks to listen for key events at the window level >> (or anything below), regardless of what widget is focused. This is >> helpful for things like key bindings on an application. The user >> callbacks will be called in case no widget in the tree processed the >> event. > > So this will work only for key events, right? not mouse or others? > > If yes then the name: > elm_widget_event_callback_add > is wrong, should be something like: > elm_widget_key_event_callback_add >
Only key events were done now out of necessity. I'm not sure more need to be exposed, so before renaming stuff I guess we should think about that. > DaveMDS > >> >> On Mon, Nov 29, 2010 at 2:35 PM, Dave Andreoli <d...@gurumeditation.it> >> wrote: >>> 2010/11/29 Enlightenment SVN <no-re...@enlightenment.org>: >>>> Log: >>>> Event Callback >>> >>> Can you please explain better? This will connect every signal? >>> >>> Guys please, write better log, I can't lost 10 minutes per mail >>> to see what you changed >>> >>> DaveMDS >>> >>>> Author: tiago >>>> Date: 2010-11-29 05:56:30 -0800 (Mon, 29 Nov 2010) >>>> New Revision: 55061 >>>> >>>> Modified: >>>> trunk/TMP/st/elementary/src/bin/test_focus.c >>>> trunk/TMP/st/elementary/src/lib/Elementary.h.in >>>> trunk/TMP/st/elementary/src/lib/elm_main.c >>>> trunk/TMP/st/elementary/src/lib/elm_widget.c >>>> trunk/TMP/st/elementary/src/lib/elm_widget.h >>>> >>>> Modified: trunk/TMP/st/elementary/src/bin/test_focus.c >>>> =================================================================== >>>> --- trunk/TMP/st/elementary/src/bin/test_focus.c 2010-11-29 >>>> 13:17:33 UTC (rev 55060) >>>> +++ trunk/TMP/st/elementary/src/bin/test_focus.c 2010-11-29 >>>> 13:56:30 UTC (rev 55061) >>>> @@ -5,6 +5,23 @@ >>>> #endif >>>> #ifndef ELM_LIB_QUICKLAUNCH >>>> >>>> +static Eina_Bool >>>> +_event(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object >>>> *src __UNUSED__, Evas_Callback_Type type, void *event_info) >>>> +{ >>>> + const char *key; >>>> + if (type == EVAS_CALLBACK_KEY_DOWN) >>>> + printf ("Key Down:"); >>>> + else if (type == EVAS_CALLBACK_KEY_UP) >>>> + printf ("Key Up:"); >>>> + else >>>> + return EINA_FALSE; >>>> + Evas_Event_Key_Down *ev = event_info; >>>> + printf("%s\n", ev->key); >>>> + >>>> + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; >>>> + return EINA_TRUE; >>>> +} >>>> + >>>> static void >>>> _on_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj >>>> __UNUSED__, void *einfo __UNUSED__) >>>> { >>>> @@ -31,6 +48,7 @@ >>>> elm_win_title_set(win, "Focus"); >>>> elm_win_focus_highlight_enabled_set(win, EINA_TRUE); >>>> evas_object_resize(win, 800, 600); >>>> + elm_object_event_callback_add(win, _event, NULL); >>>> elm_win_autodel_set(win, EINA_TRUE); >>>> my_show(win); >>>> >>>> @@ -126,8 +144,10 @@ >>>> evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, >>>> EVAS_HINT_FILL); >>>> evas_object_size_hint_weight_set(bt, 0.0, 0.0); >>>> + elm_object_event_callback_add(bt, _event, NULL); >>>> elm_scroller_content_set(sc, bt); >>>> my_show(bt); >>>> + elm_object_event_callback_del(bt, _event, NULL); >>>> } >>>> } >>>> >>>> >>>> Modified: trunk/TMP/st/elementary/src/lib/Elementary.h.in >>>> =================================================================== >>>> --- trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-11-29 >>>> 13:17:33 UTC (rev 55060) >>>> +++ trunk/TMP/st/elementary/src/lib/Elementary.h.in 2010-11-29 >>>> 13:56:30 UTC (rev 55061) >>>> @@ -215,8 +215,9 @@ >>>> * set on Elm_List_Item, then it is of this type. >>>> */ >>>> typedef Evas_Object *(*Elm_Tooltip_Item_Content_Cb) (void *data, >>>> Evas_Object *obj, void *item); >>>> - >>>> - >>>> + >>>> + typedef Eina_Bool (*Elm_Event_Cb) (void *data, Evas_Object *obj, >>>> Evas_Object *src, Evas_Callback_Type type, void *event_info); >>>> + >>>> #ifndef ELM_LIB_QUICKLAUNCH >>>> #define ELM_MAIN() int main(int argc, char **argv) {elm_init(argc, argv); >>>> return elm_main(argc, argv);} >>>> #else >>>> @@ -368,6 +369,9 @@ >>>> EAPI void elm_object_signal_callback_add(Evas_Object *obj, >>>> const char *emission, const char *source, void (*func) (void *data, >>>> Evas_Object *o, const char *emission, const char *source), void *data); >>>> EAPI void *elm_object_signal_callback_del(Evas_Object *obj, >>>> const char *emission, const char *source, void (*func) (void *data, >>>> Evas_Object *o, const char *emission, const char *source)); >>>> >>>> + EAPI void elm_object_event_callback_add(Evas_Object *obj, >>>> Elm_Event_Cb func, const void *data); >>>> + EAPI void *elm_object_event_callback_del(Evas_Object *obj, >>>> Elm_Event_Cb func, const void *data); >>>> + >>>> EAPI void elm_coords_finger_size_adjust(int times_w, Evas_Coord >>>> *w, int times_h, Evas_Coord *h); >>>> >>>> EAPI double elm_longpress_timeout_get(void); >>>> >>>> Modified: trunk/TMP/st/elementary/src/lib/elm_main.c >>>> =================================================================== >>>> --- trunk/TMP/st/elementary/src/lib/elm_main.c 2010-11-29 13:17:33 UTC >>>> (rev 55060) >>>> +++ trunk/TMP/st/elementary/src/lib/elm_main.c 2010-11-29 13:56:30 UTC >>>> (rev 55061) >>>> @@ -2651,8 +2651,52 @@ >>>> return elm_widget_signal_callback_del(obj, emission, source, func); >>>> } >>>> >>>> +/** >>>> + * Add a callback for a event emitted by widget or their children. >>>> + * >>>> + * This function connects a callback function to any key_down key_up event >>>> + * emitted by the @p obj or their children. >>>> + * This only will be called if no other callback has consumed the event. >>>> + * If you want consume the event, and no other get it, func should return >>>> + * EINA_TRUE and put EVAS_EVENT_FLAG_ON_HOLD in event_flags. >>>> + * >>>> + * @warning Accept duplicated callback addition. >>>> + * >>>> + * @param obj The object >>>> + * @param func The callback function to be executed when the event is >>>> + * emitted. >>>> + * @param data Data to pass in to the callback function. >>>> + * @ingroup General >>>> + */ >>>> +EAPI void >>>> +elm_object_event_callback_add(Evas_Object *obj, Elm_Event_Cb func, const >>>> void *data) >>>> +{ >>>> + elm_widget_event_callback_add(obj, func, data); >>>> +} >>>> >>>> +/** >>>> + * Remove a event callback from an widget. >>>> + * >>>> + * This function removes a callback, previoulsy attached to event emission >>>> + * by the @p obj. >>>> + * The parameters func and data must match exactly those passed to >>>> + * a previous call to elm_object_event_callback_add(). The data pointer >>>> that >>>> + * was passed to this call will be returned. >>>> + * >>>> + * @param obj The object >>>> + * @param func The callback function to be executed when the event is >>>> + * emitted. >>>> + * @param data Data to pass in to the callback function. >>>> + * @return The data pointer >>>> + * @ingroup General >>>> + */ >>>> +EAPI void * >>>> +elm_object_event_callback_del(Evas_Object *obj, Elm_Event_Cb func, const >>>> void *data) >>>> +{ >>>> + return elm_widget_event_callback_del(obj, func, data); >>>> +} >>>> >>>> + >>>> /** >>>> * @defgroup Debug Debug >>>> */ >>>> >>>> Modified: trunk/TMP/st/elementary/src/lib/elm_widget.c >>>> =================================================================== >>>> --- trunk/TMP/st/elementary/src/lib/elm_widget.c 2010-11-29 >>>> 13:17:33 UTC (rev 55060) >>>> +++ trunk/TMP/st/elementary/src/lib/elm_widget.c 2010-11-29 >>>> 13:56:30 UTC (rev 55061) >>>> @@ -12,6 +12,7 @@ >>>> >>>> typedef struct _Smart_Data Smart_Data; >>>> typedef struct _Edje_Signal_Data Edje_Signal_Data; >>>> +typedef struct _Elm_Event_Cb_Data Elm_Event_Cb_Data; >>>> >>>> struct _Smart_Data >>>> { >>>> @@ -77,6 +78,7 @@ >>>> Eina_Bool disabled : 1; >>>> >>>> Eina_List *focus_chain; >>>> + Eina_List *event_cb; >>>> }; >>>> >>>> struct _Edje_Signal_Data >>>> @@ -88,6 +90,11 @@ >>>> void *data; >>>> }; >>>> >>>> +struct _Elm_Event_Cb_Data { >>>> + Elm_Event_Cb func; >>>> + const void *data; >>>> +}; >>>> + >>>> /* local subsystem functions */ >>>> static void _smart_reconfigure(Smart_Data *sd); >>>> static void _smart_add(Evas_Object *obj); >>>> @@ -238,13 +245,7 @@ >>>> 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, event_flags); >>>> + elm_widget_event_propagate(obj, type, event_info, event_flags); >>>> } >>>> >>>> static void >>>> @@ -897,11 +898,40 @@ >>>> return parent; >>>> } >>>> >>>> +EAPI void >>>> +elm_widget_event_callback_add(Evas_Object *obj, Elm_Event_Cb func, const >>>> void *data) >>>> +{ >>>> + API_ENTRY return; >>>> + Elm_Event_Cb_Data *ecb = ELM_NEW(Elm_Event_Cb_Data); >>>> + ecb->func = func; >>>> + ecb->data = data; >>>> + sd->event_cb = eina_list_append(sd->event_cb, ecb); >>>> +} >>>> + >>>> +EAPI void * >>>> +elm_widget_event_callback_del(Evas_Object *obj, Elm_Event_Cb func, const >>>> void *data) >>>> +{ >>>> + API_ENTRY return NULL; >>>> + Eina_List *l; >>>> + Elm_Event_Cb_Data *ecd; >>>> + EINA_LIST_FOREACH(sd->event_cb, l, ecd) >>>> + if ((ecd->func == func) && (ecd->data == data)) >>>> + { >>>> + free(ecd); >>>> + sd->event_cb = eina_list_remove_list(sd->event_cb, l); >>>> + return (void *)data; >>>> + } >>>> + return NULL; >>>> +} >>>> + >>>> EAPI Eina_Bool >>>> -elm_widget_parent_event_propagate(Evas_Object *obj, Evas_Callback_Type >>>> type, void *event_info, Evas_Event_Flags *event_flags) >>>> +elm_widget_event_propagate(Evas_Object *obj, Evas_Callback_Type type, >>>> void *event_info, Evas_Event_Flags *event_flags) >>>> { >>>> - API_ENTRY return EINA_FALSE; >>>> - Evas_Object *parent = sd->parent_obj; >>>> + API_ENTRY return EINA_FALSE; //TODO reduce. >>>> + if (!_elm_widget_is(obj)) return EINA_FALSE; >>>> + Evas_Object *parent = obj; >>>> + Elm_Event_Cb_Data *ecd; >>>> + Eina_List *l, *l_prev; >>>> >>>> while (parent && >>>> (!(event_flags && ((*event_flags) & EVAS_EVENT_FLAG_ON_HOLD)))) >>>> @@ -909,8 +939,16 @@ >>>> sd = evas_object_smart_data_get(parent); >>>> if ((!sd) || (!_elm_widget_is(obj))) >>>> return EINA_FALSE; //Not Elm Widget >>>> + >>>> if (sd->event_func && (sd->event_func(parent, obj, type, >>>> event_info))) >>>> return EINA_TRUE; >>>> + >>>> + EINA_LIST_FOREACH_SAFE(sd->event_cb, l, l_prev, ecd) >>>> + { >>>> + if (ecd->func((void *)ecd->data, parent, obj, type, >>>> event_info) || >>>> + (event_flags && ((*event_flags) & >>>> EVAS_EVENT_FLAG_ON_HOLD))) >>>> + return EINA_TRUE; >>>> + } >>>> parent = sd->parent_obj; >>>> } >>>> >>>> @@ -2499,7 +2537,7 @@ >>>> Edje_Signal_Data *esd; >>>> >>>> INTERNAL_ENTRY; >>>> - >>>> + >>>> if (sd->del_pre_func) sd->del_pre_func(obj); >>>> if (sd->resize_obj) >>>> { >>>> @@ -2531,6 +2569,7 @@ >>>> eina_stringshare_del(esd->source); >>>> free(esd); >>>> } >>>> + eina_list_free(sd->event_cb); /* should be empty anyway */ >>>> if (sd->del_func) sd->del_func(obj); >>>> if (sd->style) eina_stringshare_del(sd->style); >>>> if (sd->type) eina_stringshare_del(sd->type); >>>> >>>> Modified: trunk/TMP/st/elementary/src/lib/elm_widget.h >>>> =================================================================== >>>> --- trunk/TMP/st/elementary/src/lib/elm_widget.h 2010-11-29 >>>> 13:17:33 UTC (rev 55060) >>>> +++ trunk/TMP/st/elementary/src/lib/elm_widget.h 2010-11-29 >>>> 13:56:30 UTC (rev 55061) >>>> @@ -247,7 +247,9 @@ >>>> 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, Evas_Event_Flags *event_flags); >>>> +EAPI void elm_widget_event_callback_add(Evas_Object *obj, >>>> Elm_Event_Cb func, const void *data); >>>> +EAPI void *elm_widget_event_callback_del(Evas_Object *obj, >>>> Elm_Event_Cb func, const void *data); >>>> +EAPI Eina_Bool elm_widget_event_propagate(Evas_Object *obj, >>>> Evas_Callback_Type type, void *event_info, Evas_Event_Flags *event_flags); >>>> EAPI void elm_widget_focus_custom_chain_set(Evas_Object *obj, >>>> Eina_List *objs); >>>> EAPI void elm_widget_focus_custom_chain_unset(Evas_Object >>>> *obj); >>>> EAPI const Eina_List *elm_widget_focus_custom_chain_get(const Evas_Object >>>> *obj); >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! >>>> Tap into the largest installed PC base & get more eyes on your game by >>>> optimizing for Intel(R) Graphics Technology. Get started today with the >>>> Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. >>>> http://p.sf.net/sfu/intelisp-dev2dev >>>> _______________________________________________ >>>> enlightenment-svn mailing list >>>> enlightenment-...@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn >>>> >>> >>> ------------------------------------------------------------------------------ >>> Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! >>> Tap into the largest installed PC base & get more eyes on your game by >>> optimizing for Intel(R) Graphics Technology. Get started today with the >>> Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. >>> http://p.sf.net/sfu/intelisp-dev2dev >>> _______________________________________________ >>> enlightenment-devel mailing list >>> enlightenment-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel >>> >> >> >> >> -- >> Tiago Rezende Campos Falcão >> Developer @ ProFUSION Embedded Systems >> > > ------------------------------------------------------------------------------ > Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! > Tap into the largest installed PC base & get more eyes on your game by > optimizing for Intel(R) Graphics Technology. Get started today with the > Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. > http://p.sf.net/sfu/intelisp-dev2dev > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel