hermet pushed a commit to branch master.
commit cdceaf5792c82f970d38ad35f5928b1f7bcc8cf8
Author: ChunEon Park <[email protected]>
Date: Wed Mar 6 21:33:13 2013 +0900
elementary/widget - added elm_object_item_signal_callback_add(),
elm_object_item_signal_callback_del()
---
ChangeLog | 4 +++
NEWS | 1 +
src/lib/elm_main.c | 12 +++++++
src/lib/elm_object_item.h | 58 ++++++++++++++++++++++++++++++
src/lib/elm_widget.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++
src/lib/elm_widget.h | 15 ++++++++
6 files changed, 181 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index 1642b22..8da1b21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1110,3 +1110,7 @@
* Fix elm_conform didn't change indicator mode when create.
+2013-03-06 ChunEon Park (Hermet)
+
+ * Add elm_object_item_signal_callback_add(),
elm_object_item_signal_callback_del().
+
diff --git a/NEWS b/NEWS
index 3637528..29c2154 100644
--- a/NEWS
+++ b/NEWS
@@ -45,6 +45,7 @@ Additions:
* Add omit feature to elm_index.
* Add elm_transit_smooth_set(), elm_transit_smooth_get()
* Add edje_object_message_signal_process before
edje_object_size_min_restricted_calc.
+ * Add elm_object_item_signal_callback_add(),
elm_object_item_signal_callback_del().
Improvements:
diff --git a/src/lib/elm_main.c b/src/lib/elm_main.c
index 958788f..c16ac79 100644
--- a/src/lib/elm_main.c
+++ b/src/lib/elm_main.c
@@ -1633,6 +1633,18 @@ elm_object_item_signal_emit(Elm_Object_Item *it, const
char *emission, const cha
_elm_widget_item_signal_emit((Elm_Widget_Item *)it, emission, source);
}
+EAPI void
+elm_object_item_signal_callback_add(Elm_Object_Item *it, const char *emission,
const char *source, Elm_Object_Item_Signal_Cb func, void *data)
+{
+ _elm_widget_item_signal_callback_add((Elm_Widget_Item *)it, emission,
source, (Elm_Widget_Item_Signal_Cb) func, data);
+}
+
+EAPI void *
+elm_object_item_signal_callback_del(Elm_Object_Item *it, const char *emission,
const char *source, Elm_Object_Item_Signal_Cb func)
+{
+ return _elm_widget_item_signal_callback_del((Elm_Widget_Item *)it,
emission, source, (Elm_Widget_Item_Signal_Cb) func);
+}
+
EAPI void elm_object_item_disabled_set(Elm_Object_Item *it, Eina_Bool disabled)
{
_elm_widget_item_disabled_set((Elm_Widget_Item *)it, disabled);
diff --git a/src/lib/elm_object_item.h b/src/lib/elm_object_item.h
index a01648a..f4d29e9 100644
--- a/src/lib/elm_object_item.h
+++ b/src/lib/elm_object_item.h
@@ -1,4 +1,18 @@
/**
+ * @typedef Elm_Object_Item_Signal_Cb
+ *
+ * Elm_Object_Item Signal Callback functions' prototype definition. @c data
+ * will have the auxiliary data pointer at the time the callback registration.
+ * @c it will be a pointer the Elm_Object_Item that have the edje object where
+ * the signal comes from. @c emission will identify the exact signal's emission
+ * string and @c source the exact signal's source one.
+ *
+ * @see elm_object_item_signal_callback_add()
+ * @since 1.8
+ */
+typedef void (*Elm_Object_Item_Signal_Cb)(void *data,
Elm_Object_Item *it, const char *emission, const char *source);
+
+/**
* Get the widget object's handle which contains a given item
*
* @param it The Elementary object item
@@ -256,6 +270,50 @@ EAPI void
elm_object_item_data_set(Elm_Object_Item *it,
EAPI void elm_object_item_signal_emit(Elm_Object_Item
*it, const char *emission, const char *source);
/**
+ * Add a callback for a signal emitted by object item edje.
+ *
+ * This function connects a callback function to a signal emitted by the
+ * edje object of the object item.
+ * Globs can occur in either the emission or source name.
+ *
+ * @param it The elementary object item
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ * @param func The callback function to be executed when the signal is
+ * emitted.
+ * @param data A pointer to data to pass to the callback function.
+ * @since 1.8
+ *
+ * @ingroup General
+ */
+EAPI void
elm_object_item_signal_callback_add(Elm_Object_Item *it, const char *emission,
const char *source, Elm_Object_Item_Signal_Cb func, void *data);
+
+/**
+ * Remove a signal-triggered callback from a object item edje object.
+ *
+ * @param it The elementary object item
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ * @param func The callback function to be executed when the signal is
+ * emitted.
+ * @return The data pointer of the signal callback or @c NULL, on
+ * errors.
+ *
+ * This function removes the @b last callback, previously attached to
+ * a signal emitted by an underlying Edje object of @a it, whose
+ * parameters @a emission, @a source and @c func match exactly with
+ * those passed to a previous call to
+ * elm_object_item_signal_callback_add(). The data pointer that was passed
+ * to this call will be returned.
+ *
+ * @see elm_object_item_signal_callback_add()
+ * @since 1.8
+ *
+ * @ingroup General
+ */
+EAPI void
*elm_object_item_signal_callback_del(Elm_Object_Item *it, const char *emission,
const char *source, Elm_Object_Item_Signal_Cb func);
+
+/**
* Set the disabled state of an widget item.
*
* @param it The Elementary object item
diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
index 29b5d40..0d5a2cb 100644
--- a/src/lib/elm_widget.c
+++ b/src/lib/elm_widget.c
@@ -4576,6 +4576,7 @@ EAPI void
_elm_widget_item_free(Elm_Widget_Item *item)
{
Elm_Translate_String_Data *ts;
+ Elm_Widget_Item_Signal_Data *wisd;
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
@@ -4588,6 +4589,13 @@ _elm_widget_item_free(Elm_Widget_Item *item)
if (item->access_info)
eina_stringshare_del(item->access_info);
+ EINA_LIST_FREE (item->signals, wisd)
+ {
+ eina_stringshare_del(wisd->emission);
+ eina_stringshare_del(wisd->source);
+ free(wisd);
+ }
+
EINA_LIST_FREE (item->translate_strings, ts)
{
eina_stringshare_del(ts->id);
@@ -5283,6 +5291,89 @@ _elm_widget_item_signal_emit_hook_set(Elm_Widget_Item
*item,
item->signal_emit_func = func;
}
+
+static void
+_elm_widget_item_signal_cb(void *data, Evas_Object *obj __UNUSED__, const char
*emission,
+ const char *source)
+{
+ Elm_Widget_Item_Signal_Data *wisd = data;
+ wisd->func(wisd->data, wisd->item, emission, source);
+}
+
+EAPI void
+_elm_widget_item_signal_callback_add(Elm_Widget_Item *item,
+ const char *emission,
+ const char *source,
+ Elm_Widget_Item_Signal_Cb func,
+ void *data)
+{
+ ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+ EINA_SAFETY_ON_NULL_RETURN(func);
+
+ Elm_Widget_Item_Signal_Data *wisd;
+
+ wisd = malloc(sizeof(Elm_Widget_Item_Signal_Data));
+ if (!wisd) return;
+
+ wisd->item = item;
+ wisd->func = func;
+ wisd->data = data;
+ wisd->emission = eina_stringshare_add(emission);
+ wisd->source = eina_stringshare_add(source);
+
+ if (_elm_widget_is(item->view))
+ elm_object_signal_callback_add(item->view, emission, source,
_elm_widget_item_signal_cb, wisd);
+ else if (!strcmp(eo_class_name_get(eo_class_get(item->view)), "edje"))
+ edje_object_signal_callback_add(item->view, emission, source,
_elm_widget_item_signal_cb, wisd);
+ else
+ {
+ WRN("The %s widget item doesn't support signal callback add!",
+ eo_class_name_get(eo_class_get(item->widget)));
+ free(wisd);
+ return;
+ }
+
+ item->signals = eina_list_append(item->signals, wisd);
+}
+
+EAPI void *
+_elm_widget_item_signal_callback_del(Elm_Widget_Item *item,
+ const char *emission,
+ const char *source,
+ Elm_Widget_Item_Signal_Cb func)
+{
+ ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL);
+
+ Elm_Widget_Item_Signal_Data *wisd;
+ Eina_List *l;
+ void *data = NULL;
+
+ EINA_LIST_FOREACH(item->signals, l, wisd)
+ {
+ if ((wisd->func == func) && !strcmp(wisd->emission, emission) &&
+ !strcmp(wisd->source, source))
+ {
+ item->signals = eina_list_remove_list(item->signals, l);
+ eina_stringshare_del(wisd->emission);
+ eina_stringshare_del(wisd->source);
+ data = wisd->data;
+
+ if (_elm_widget_is(item->view))
+ elm_object_signal_callback_del(item->view, emission, source,
+ _elm_widget_item_signal_cb);
+ else if (!strcmp(eo_class_name_get(eo_class_get(item->view)),
+ "edje"))
+ edje_object_signal_callback_del_full(item->view, emission,
+ source,
+ _elm_widget_item_signal_cb,
+ data);
+ }
+ }
+
+ return data;
+}
+
EAPI void
_elm_widget_item_access_info_set(Elm_Widget_Item *item,
const char *txt)
diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h
index 0a5b6e7..f8d0cb0 100644
--- a/src/lib/elm_widget.h
+++ b/src/lib/elm_widget.h
@@ -443,6 +443,7 @@ typedef struct _Elm_Cursor Elm_Cursor;
/**< base structure for all widget items that are not Elm_Widget themselves */
typedef struct _Elm_Widget_Item Elm_Widget_Item;
+typedef struct _Elm_Widget_Item_Signal_Data Elm_Widget_Item_Signal_Data;
/**< accessibility information to be able to set and get from the access API */
typedef struct _Elm_Access_Info Elm_Access_Info;
@@ -458,6 +459,7 @@ typedef Evas_Object
*(*Elm_Widget_Content_Unset_Cb)(const void *data, c
typedef void (*Elm_Widget_Signal_Emit_Cb)(void *data, const
char *emission, const char *source);
typedef void (*Elm_Widget_Disable_Cb)(void *data);
typedef Eina_Bool (*Elm_Widget_Del_Pre_Cb)(void *data);
+typedef void (*Elm_Widget_Item_Signal_Cb)(void *data,
Elm_Widget_Item *item, const char *emission, const char *source);
#define ELM_ACCESS_DONE -1 /* sentence done - send done event here
*/
#define ELM_ACCESS_CANCEL -2 /* stop reading immediately */
@@ -528,6 +530,15 @@ EAPI void
_elm_access_highlight_cycle(Evas_Object *obj, Elm_Focus_Di
/**< put this as the first member in your widget item struct */
#define ELM_WIDGET_ITEM Elm_Widget_Item base
+struct _Elm_Widget_Item_Signal_Data
+{
+ Elm_Widget_Item *item;
+ Elm_Widget_Item_Signal_Cb func;
+ const char *emission;
+ const char *source;
+ void *data;
+};
+
struct _Elm_Widget_Item
{
/* ef1 ~~ efl, el3 ~~ elm */
@@ -558,6 +569,7 @@ struct _Elm_Widget_Item
const char *access_info;
Eina_List *access_order;
Eina_List *translate_strings;
+ Eina_List *signals;
Eina_Bool disabled : 1;
};
@@ -724,6 +736,9 @@ EAPI Evas_Object
*_elm_widget_item_part_content_get(const Elm_Widget_Item *i
EAPI Evas_Object *_elm_widget_item_part_content_unset(Elm_Widget_Item
*item, const char *part);
EAPI void _elm_widget_item_part_text_set(Elm_Widget_Item *item,
const char *part, const char *label);
EAPI const char *_elm_widget_item_part_text_get(const Elm_Widget_Item
*item, const char *part);
+
+EAPI void _elm_widget_item_signal_callback_add(Elm_Widget_Item
*item, const char *emission, const char *source, Elm_Widget_Item_Signal_Cb
func, void *data);
+EAPI void *_elm_widget_item_signal_callback_del(Elm_Widget_Item
*it, const char *emission, const char *source, Elm_Widget_Item_Signal_Cb func);
EAPI void _elm_widget_item_signal_emit(Elm_Widget_Item *item,
const char *emission, const char *source);
EAPI void _elm_widget_item_content_set_hook_set(Elm_Widget_Item
*item, Elm_Widget_Content_Set_Cb func);
EAPI void _elm_widget_item_content_get_hook_set(Elm_Widget_Item
*item, Elm_Widget_Content_Get_Cb func);
--
------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the
endpoint security space. For insight on selecting the right partner to
tackle endpoint security challenges, access the full report.
http://p.sf.net/sfu/symantec-dev2dev