From cd324e059b6dca337382e6058de3bf018081ad6c Mon Sep 17 00:00:00 2001 From: Tiago Rezende Campos Falcao Date: Wed, 22 Sep 2010 17:45:49 +0000 Subject: [PATCH] Listen Space/Return in some widgets widgets: * button * check * file selector button * hoversel * radio * toggle Author: Helen Fornazier SVN revision: 52600 --- src/lib/elc_fileselector_button.c | 16 ++++++++++++++++ src/lib/elc_hoversel.c | 26 ++++++++++++++++++++++++++ src/lib/elm_button.c | 16 ++++++++++++++++ src/lib/elm_check.c | 17 +++++++++++++++++ src/lib/elm_radio.c | 16 ++++++++++++++++ src/lib/elm_toggle.c | 19 +++++++++++++++++++ 6 files changed, 110 insertions(+) diff --git a/src/lib/elc_fileselector_button.c b/src/lib/elc_fileselector_button.c index 12cce33..8ecdfa2 100644 --- a/src/lib/elc_fileselector_button.c +++ b/src/lib/elc_fileselector_button.c @@ -43,6 +43,8 @@ static void _on_focus_hook(void *data, Evas_Object *obj); static void _selection_done(void *data, Evas_Object *obj, void *event_info); static void _activate(Evas_Object *obj); static void _activate_hook(Evas_Object *obj); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static const char SIG_CLICKED[] = "clicked"; static const char SIG_UNPRESSED[] = "unpressed"; @@ -55,6 +57,19 @@ static const Evas_Smart_Cb_Description _signals[] = {NULL, NULL} }; +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + _activate(obj); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + static void _del_hook(Evas_Object *obj) { @@ -358,6 +373,7 @@ elm_fileselector_button_add(Evas_Object *parent) elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, 1); elm_widget_activate_hook_set(obj, _activate_hook); + elm_widget_event_hook_set(obj, _event_hook); wd->btn = edje_object_add(e); _elm_theme_object_set(obj, wd->btn, "button", "base", "default"); diff --git a/src/lib/elc_hoversel.c b/src/lib/elc_hoversel.c index 0bb9615..e4c3d4f 100644 --- a/src/lib/elc_hoversel.c +++ b/src/lib/elc_hoversel.c @@ -27,6 +27,7 @@ struct _Widget_Data Evas_Object *hover_parent; Eina_List *items; Eina_Bool horizontal : 1; + Eina_Bool expanded : 1; }; struct _Elm_Hoversel_Item @@ -48,6 +49,21 @@ static void _disable_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _parent_del(void *data, Evas *e, Evas_Object *obj, void *event_info); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); + +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + _activate(obj); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} static void _del_pre_hook(Evas_Object *obj) @@ -145,6 +161,13 @@ _activate(Evas_Object *obj) char buf[4096]; if (!wd) return; + if (wd->expanded) + { + elm_hoversel_hover_end(obj); + return; + } + wd->expanded = EINA_TRUE; + if (elm_widget_disabled_get(obj)) return; wd->hover = elm_hover_add(obj); if (wd->horizontal) @@ -256,8 +279,10 @@ elm_hoversel_add(Evas_Object *parent) elm_widget_theme_hook_set(obj, _theme_hook); elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_activate_hook_set(obj, _activate_hook); + elm_widget_event_hook_set(obj, _event_hook); wd->btn = elm_button_add(parent); + wd->expanded = EINA_FALSE; if (wd->horizontal) snprintf(buf, sizeof(buf), "hoversel_horizontal/%s", elm_widget_style_get(obj)); else @@ -443,6 +468,7 @@ elm_hoversel_hover_end(Evas_Object *obj) Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; if (!wd->hover) return; + wd->expanded = EINA_FALSE; evas_object_del(wd->hover); wd->hover = NULL; evas_object_smart_callback_call(obj, "dismissed", NULL); diff --git a/src/lib/elm_button.c b/src/lib/elm_button.c index 8117b18..25ff405 100644 --- a/src/lib/elm_button.c +++ b/src/lib/elm_button.c @@ -34,6 +34,8 @@ static void _signal_unpressed(void *data, Evas_Object *obj, const char *emission static void _on_focus_hook(void *data, Evas_Object *obj); static void _activate(Evas_Object *obj); static void _activate_hook(Evas_Object *obj); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static const char SIG_CLICKED[] = "clicked"; static const char SIG_REPEATED[] = "repeated"; @@ -45,6 +47,19 @@ static const Evas_Smart_Cb_Description _signals[] = { {NULL, NULL} }; +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + _activate(obj); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + static void _del_hook(Evas_Object *obj) { @@ -258,6 +273,7 @@ elm_button_add(Evas_Object *parent) elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, 1); elm_widget_activate_hook_set(obj, _activate_hook); + elm_widget_event_hook_set(obj, _event_hook); wd->btn = edje_object_add(e); _elm_theme_object_set(obj, wd->btn, "button", "base", "default"); diff --git a/src/lib/elm_check.c b/src/lib/elm_check.c index d3451a3..3b335b4 100644 --- a/src/lib/elm_check.c +++ b/src/lib/elm_check.c @@ -42,6 +42,8 @@ static void _signal_check_toggle(void *data, Evas_Object *obj, const char *emiss static void _on_focus_hook(void *data, Evas_Object *obj); static void _activate_hook(Evas_Object *obj); static void _activate(Evas_Object *obj); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static const char SIG_CHANGED[] = "changed"; static const Evas_Smart_Cb_Description _signals[] = { @@ -49,6 +51,20 @@ static const Evas_Smart_Cb_Description _signals[] = { {NULL, NULL} }; +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + _activate(obj); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + + static void _del_hook(Evas_Object *obj) { @@ -227,6 +243,7 @@ elm_check_add(Evas_Object *parent) elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, 1); elm_widget_activate_hook_set(obj, _activate_hook); + elm_widget_event_hook_set(obj, _event_hook); wd->chk = edje_object_add(e); _elm_theme_object_set(obj, wd->chk, "check", "base", "default"); diff --git a/src/lib/elm_radio.c b/src/lib/elm_radio.c index 2ac7c47..948a77b 100644 --- a/src/lib/elm_radio.c +++ b/src/lib/elm_radio.c @@ -62,6 +62,8 @@ static void _signal_radio_on(void *data, Evas_Object *obj, const char *emission, static void _on_focus_hook(void *data, Evas_Object *obj); static void _activate(Evas_Object *obj); static void _activate_hook(Evas_Object *obj); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static const char SIG_CHANGED[] = "changed"; static const Evas_Smart_Cb_Description _signals[] = { @@ -69,6 +71,19 @@ static const Evas_Smart_Cb_Description _signals[] = { {NULL, NULL} }; +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + _activate(obj); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + static void _del_hook(Evas_Object *obj) { @@ -261,6 +276,7 @@ elm_radio_add(Evas_Object *parent) elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, 1); elm_widget_activate_hook_set(obj, _activate_hook); + elm_widget_event_hook_set(obj, _event_hook); wd->radio = edje_object_add(e); _elm_theme_object_set(obj, wd->radio, "radio", "base", "default"); diff --git a/src/lib/elm_toggle.c b/src/lib/elm_toggle.c index 48d82cb..acd5f98 100644 --- a/src/lib/elm_toggle.c +++ b/src/lib/elm_toggle.c @@ -36,6 +36,8 @@ static void _sub_del(void *data, Evas_Object *obj, void *event_info); static void _signal_toggle_off(void *data, Evas_Object *obj, const char *emission, const char *source); static void _signal_toggle_on(void *data, Evas_Object *obj, const char *emission, const char *source); static void _on_focus_hook(void *data, Evas_Object *obj); +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static const char SIG_CHANGED[] = "changed"; static const Evas_Smart_Cb_Description _signals[] = { @@ -43,6 +45,22 @@ static const Evas_Smart_Cb_Description _signals[] = { {NULL, NULL} }; +static Eina_Bool +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +{ + if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; + Evas_Event_Key_Down *ev = event_info; + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return EINA_FALSE; + if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; + if (strcmp(ev->keyname, "Return") && strcmp(ev->keyname, "space")) + return EINA_FALSE; + elm_toggle_state_set(obj, !wd->state); + evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; + return EINA_TRUE; +} + static void _del_hook(Evas_Object *obj) { @@ -196,6 +214,7 @@ elm_toggle_add(Evas_Object *parent) elm_widget_theme_hook_set(obj, _theme_hook); elm_widget_disable_hook_set(obj, _disable_hook); elm_widget_can_focus_set(obj, EINA_TRUE); + elm_widget_event_hook_set(obj, _event_hook); wd->tgl = edje_object_add(e); _elm_theme_object_set(obj, wd->tgl, "toggle", "base", "default"); -- 2.7.4