diff --git a/data/elementary/objects/test.edc b/data/elementary/objects/test.edc index fa7c835d30..90db73c162 100644 --- a/data/elementary/objects/test.edc +++ b/data/elementary/objects/test.edc @@ -815,4 +815,22 @@ group { name: "page_layout"; } } } +} + group { "layout_edje"; + parts { + rect { "red"; + desc { + color_class: "red"; + } + } + rect { "blue"; + desc { "default"; + } + desc { "changed"; + color: 0 0 255 255; + link.base: "change" "test"; + } + } + } + } } diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index 8b93a18630..3d62548b39 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -3108,7 +3108,7 @@ _chars_add_till_limit(Evas_Object *obj, #endif EOLIAN static void -_efl_ui_text_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, const char *emission, const char *source) +_efl_ui_text_edje_object_signal_emit(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, const char *emission, const char *source) { /* always pass to both edje objs */ edje_object_signal_emit(sd->entry_edje, emission, source); @@ -3122,7 +3122,7 @@ _efl_ui_text_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, c } EOLIAN static void -_efl_ui_text_elm_layout_signal_callback_add (Eo *obj, Efl_Ui_Text_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) +_efl_ui_text_edje_object_signal_callback_add(Eo *obj, Efl_Ui_Text_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) { Evas_Object *ro; @@ -3132,25 +3132,25 @@ _efl_ui_text_elm_layout_signal_callback_add (Eo *obj, Efl_Ui_Text_Data *sd, cons wd->resize_obj = sd->entry_edje; - elm_obj_layout_signal_callback_add + edje_obj_signal_callback_add (eo_super(obj, MY_CLASS), emission, source, func_cb, data); if (sd->scr_edje) { wd->resize_obj = sd->scr_edje; - elm_obj_layout_signal_callback_add - (eo_super(obj, MY_CLASS), emission, source, func_cb, data); + edje_obj_signal_callback_add + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); } wd->resize_obj = ro; } EOLIAN static void * -_efl_ui_text_elm_layout_signal_callback_del(Eo *obj, Efl_Ui_Text_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb) +_efl_ui_text_edje_object_signal_callback_del(Eo *obj, Efl_Ui_Text_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) { Evas_Object *ro; - void *data = NULL; + void *data_ptr; ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); @@ -3158,19 +3158,19 @@ _efl_ui_text_elm_layout_signal_callback_del(Eo *obj, Efl_Ui_Text_Data *sd, const wd->resize_obj = sd->entry_edje; - data = elm_obj_layout_signal_callback_del - (eo_super(obj, MY_CLASS), emission, source, func_cb); + data_ptr = edje_obj_signal_callback_del + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); if (sd->scr_edje) { wd->resize_obj = sd->scr_edje; - data = elm_obj_layout_signal_callback_del - (eo_super(obj, MY_CLASS), emission, source, func_cb); + data_ptr = edje_obj_signal_callback_del + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); } wd->resize_obj = ro; - return data; + return data_ptr; } #if 0 diff --git a/src/lib/elementary/efl_ui_text.eo b/src/lib/elementary/efl_ui_text.eo index 58260570e2..dea33b5d75 100644 --- a/src/lib/elementary/efl_ui_text.eo +++ b/src/lib/elementary/efl_ui_text.eo @@ -4,7 +4,8 @@ import elm_entry; class Efl.Ui.Text (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Elm.Interface.Atspi.Text, Elm.Interface.Atspi.Text.Editable, Efl.File, - Efl.Ui.Selectable, Efl.Ui.Scrollable, Efl.Ui.Text.Interactive) + Efl.Ui.Selectable, Efl.Ui.Scrollable, Efl.Ui.Text.Interactive, + Edje.Object) { methods { @property scrollable { @@ -377,6 +378,9 @@ class Efl.Ui.Text (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Efl.Canvas.Group.group_del; Efl.Canvas.Group.group_show; Efl.Canvas.Group.group_hide; + Edje.Object.signal_callback_add; + Edje.Object.signal_callback_del; + Edje.Object.signal_emit; Elm.Widget.activate; Elm.Widget.focus_direction_manager_is; Elm.Widget.theme_apply; @@ -388,9 +392,6 @@ class Efl.Ui.Text (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Elm.Layout.theme_enable; Elm.Layout.sizing_eval; Elm.Layout.text.get; - Elm.Layout.signal_callback_add; - Elm.Layout.signal_callback_del; - Elm.Layout.signal_emit; Elm.Layout.text.set; Elm.Layout.content_aliases.get; Elm.Interface_Scrollable.policy.set; diff --git a/src/lib/elementary/elc_naviframe.c b/src/lib/elementary/elc_naviframe.c index dc867a7767..4809779a93 100644 --- a/src/lib/elementary/elc_naviframe.c +++ b/src/lib/elementary/elc_naviframe.c @@ -1005,7 +1005,7 @@ _back_btn_new(Evas_Object *obj, const char *title_label) } EOLIAN static void -_elm_naviframe_elm_layout_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *emission, const char *source) +_elm_naviframe_edje_object_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSED, const char *emission, const char *source) { Elm_Object_Item *eo_top_it; @@ -1013,7 +1013,7 @@ _elm_naviframe_elm_layout_signal_emit(Eo *obj, Elm_Naviframe_Data *sd EINA_UNUSE if (!eo_top_it) return; ELM_NAVIFRAME_ITEM_DATA_GET(eo_top_it, top_it); - elm_obj_layout_signal_emit(VIEW(top_it), emission, source); + edje_obj_signal_emit(VIEW(top_it), emission, source); } /* content/text smart functions proxying things to the top item, which diff --git a/src/lib/elementary/elc_popup.c b/src/lib/elementary/elc_popup.c index f5dfb03f1c..5ec3ca5388 100644 --- a/src/lib/elementary/elc_popup.c +++ b/src/lib/elementary/elc_popup.c @@ -498,9 +498,9 @@ _elm_popup_elm_layout_sizing_eval(Eo *obj, Elm_Popup_Data *sd) } EOLIAN static void -_elm_popup_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, const char *emission, const char *source) +_elm_popup_edje_object_signal_emit(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, const char *emission, const char *source) { - elm_layout_signal_emit(sd->main_layout, emission, source); + edje_obj_signal_emit(sd->main_layout, emission, source); } EOLIAN static Eina_Bool diff --git a/src/lib/elementary/elm_entry.c b/src/lib/elementary/elm_entry.c index 28655eafa6..16b1c43f43 100644 --- a/src/lib/elementary/elm_entry.c +++ b/src/lib/elementary/elm_entry.c @@ -2998,7 +2998,7 @@ _chars_add_till_limit(Evas_Object *obj, } EOLIAN static void -_elm_entry_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char *emission, const char *source) +_elm_entry_edje_object_signal_emit(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const char *emission, const char *source) { /* always pass to both edje objs */ edje_object_signal_emit(sd->entry_edje, emission, source); @@ -3012,7 +3012,7 @@ _elm_entry_elm_layout_signal_emit(Eo *obj EINA_UNUSED, Elm_Entry_Data *sd, const } EOLIAN static void -_elm_entry_elm_layout_signal_callback_add (Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) +_elm_entry_edje_object_signal_callback_add(Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) { Evas_Object *ro; @@ -3022,25 +3022,25 @@ _elm_entry_elm_layout_signal_callback_add (Eo *obj, Elm_Entry_Data *sd, const ch wd->resize_obj = sd->entry_edje; - elm_obj_layout_signal_callback_add + edje_obj_signal_callback_add (eo_super(obj, MY_CLASS), emission, source, func_cb, data); if (sd->scr_edje) { wd->resize_obj = sd->scr_edje; - elm_obj_layout_signal_callback_add - (eo_super(obj, MY_CLASS), emission, source, func_cb, data); + edje_obj_signal_callback_add + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); } wd->resize_obj = ro; } EOLIAN static void * -_elm_entry_elm_layout_signal_callback_del(Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb) +_elm_entry_edje_object_signal_callback_del(Eo *obj, Elm_Entry_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) { Evas_Object *ro; - void *data = NULL; + void *data_ptr; ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); @@ -3048,19 +3048,19 @@ _elm_entry_elm_layout_signal_callback_del(Eo *obj, Elm_Entry_Data *sd, const cha wd->resize_obj = sd->entry_edje; - data = elm_obj_layout_signal_callback_del - (eo_super(obj, MY_CLASS), emission, source, func_cb); + data_ptr = edje_obj_signal_callback_del + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); if (sd->scr_edje) { wd->resize_obj = sd->scr_edje; - data = elm_obj_layout_signal_callback_del - (eo_super(obj, MY_CLASS), emission, source, func_cb); + data_ptr = edje_obj_signal_callback_del + (eo_super(obj, MY_CLASS), emission, source, func_cb, data); } wd->resize_obj = ro; - return data; + return data_ptr; } static Eina_Bool diff --git a/src/lib/elementary/elm_entry.eo b/src/lib/elementary/elm_entry.eo index 8fdba32d90..9e362ba984 100644 --- a/src/lib/elementary/elm_entry.eo +++ b/src/lib/elementary/elm_entry.eo @@ -116,7 +116,7 @@ enum Elm.Cnp_Mode class Elm.Entry (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Elm.Interface.Atspi.Text, Elm.Interface.Atspi.Text.Editable, Efl.File, - Efl.Ui.Selectable, Efl.Ui.Scrollable) + Efl.Ui.Selectable, Efl.Ui.Scrollable, Edje.Object) { legacy_prefix: elm_entry; eo_prefix: elm_obj_entry; @@ -942,6 +942,9 @@ class Elm.Entry (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Efl.Canvas.Group.group_del; Efl.Canvas.Group.group_show; Efl.Canvas.Group.group_hide; + Edje.Object.signal_callback_add; + Edje.Object.signal_callback_del; + Edje.Object.signal_emit; Elm.Widget.activate; Elm.Widget.focus_direction_manager_is; Elm.Widget.theme_apply; @@ -953,9 +956,6 @@ class Elm.Entry (Elm.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Elm.Layout.theme_enable; Elm.Layout.sizing_eval; Elm.Layout.text.get; - Elm.Layout.signal_callback_add; - Elm.Layout.signal_callback_del; - Elm.Layout.signal_emit; Elm.Layout.text.set; Elm.Layout.content_aliases.get; Elm.Interface_Scrollable.policy.set; diff --git a/src/lib/elementary/elm_layout.c b/src/lib/elementary/elm_layout.c index ef601fb577..aabbb56c5e 100644 --- a/src/lib/elementary/elm_layout.c +++ b/src/lib/elementary/elm_layout.c @@ -766,6 +766,7 @@ _elm_layout_efl_canvas_group_group_add(Eo *obj, Elm_Layout_Smart_Data *_pd EINA_ /* has to be there *before* parent's smart_add() */ edje = edje_object_add(evas_object_evas_get(obj)); + eo_composite_attach(obj, edje); elm_widget_resize_object_set(obj, edje, EINA_TRUE); efl_canvas_group_add(eo_super(obj, MY_CLASS)); @@ -909,21 +910,25 @@ _elm_layout_theme_set(Eo *obj, Elm_Layout_Smart_Data *sd, const char *klass, con return _elm_layout_theme_internal(obj, sd); } -EOLIAN static void -_elm_layout_signal_emit(Eo *obj, Elm_Layout_Smart_Data *_pd EINA_UNUSED, const char *emission, const char *source) +EAPI void +elm_layout_signal_emit(Evas_Object *obj, const char *emission, const char *source) { - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); + edje_obj_signal_emit(obj, emission, source); +} - edje_object_signal_emit(wd->resize_obj, emission, source); +EAPI void +elm_layout_signal_callback_add(Evas_Object *obj, + const char *emission, const char *source, + Edje_Signal_Cb func_cb, void *data) +{ + edje_obj_signal_callback_add(obj, emission, source, func_cb, data); } EOLIAN static void -_elm_layout_signal_callback_add(Eo *obj, Elm_Layout_Smart_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) +_elm_layout_edje_object_signal_callback_add(Eo *obj, Elm_Layout_Smart_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) { Edje_Signal_Data *esd; - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - esd = ELM_NEW(Edje_Signal_Data); if (!esd) return; @@ -935,18 +940,23 @@ _elm_layout_signal_callback_add(Eo *obj, Elm_Layout_Smart_Data *sd, const char * sd->edje_signals = eina_list_append(sd->edje_signals, esd); edje_object_signal_callback_add - (wd->resize_obj, emission, source, - _edje_signal_callback, esd); + (eo_super(obj, MY_CLASS), emission, source, _edje_signal_callback, esd); } -EOLIAN static void* -_elm_layout_signal_callback_del(Eo *obj, Elm_Layout_Smart_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb) +EAPI void * +elm_layout_signal_callback_del(Evas_Object *obj, + const char *emission, const char *source, + Edje_Signal_Cb func_cb) { - Edje_Signal_Data *esd = NULL; - void *data = NULL; - Eina_List *l; + return edje_obj_signal_callback_del(obj, emission, source, func_cb, NULL); +} - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); +EOLIAN static void * +_elm_layout_edje_object_signal_callback_del(Eo *obj, Elm_Layout_Smart_Data *sd, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data EINA_UNUSED) +{ + Edje_Signal_Data *esd; + Eina_List *l; + void *data_ptr; EINA_LIST_FOREACH(sd->edje_signals, l, esd) { @@ -956,16 +966,13 @@ _elm_layout_signal_callback_del(Eo *obj, Elm_Layout_Smart_Data *sd, const char * sd->edje_signals = eina_list_remove_list(sd->edje_signals, l); eina_stringshare_del(esd->emission); eina_stringshare_del(esd->source); - data = esd->data; - - edje_object_signal_callback_del_full - (wd->resize_obj, emission, source, - _edje_signal_callback, esd); + data_ptr = esd->data; + edje_obj_signal_callback_del + (obj, emission, source, _edje_signal_callback, esd); free(esd); - return data; /* stop at 1st match */ - + return data_ptr; /* stop at 1st match */ } } @@ -1647,12 +1654,10 @@ _elm_layout_edje_get(Eo *obj, Elm_Layout_Smart_Data *_pd EINA_UNUSED) return wd->resize_obj; } -EOLIAN static const char* -_elm_layout_data_get(const Eo *obj, Elm_Layout_Smart_Data *_pd EINA_UNUSED, const char *key) +EAPI const char * +elm_layout_data_get(const Evas_Object *obj, const char *key) { - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL); - - return edje_object_data_get(wd->resize_obj, key); + return edje_obj_data_get(obj, key); } /* layout's sizing evaluation is deferred. evaluation requests are @@ -1678,30 +1683,36 @@ _elm_layout_sizing_restricted_eval(Eo *obj, Elm_Layout_Smart_Data *sd, Eina_Bool evas_object_smart_changed(obj); } -EOLIAN static int -_elm_layout_freeze(Eo *obj, Elm_Layout_Smart_Data *_pd EINA_UNUSED) +EAPI int +elm_layout_freeze(Evas_Object *obj) { - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, 1); - ELM_LAYOUT_DATA_GET(obj, sd); + return edje_obj_freeze(obj); +} +EOLIAN static int +_elm_layout_edje_object_freeze(Eo *obj, Elm_Layout_Smart_Data *sd) +{ if ((sd->frozen)++ != 0) return sd->frozen; - edje_object_freeze(wd->resize_obj); + edje_obj_freeze(eo_super(obj, MY_CLASS)); return 1; } -EOLIAN static int -_elm_layout_thaw(Eo *obj, Elm_Layout_Smart_Data *_pd EINA_UNUSED) +EAPI int +elm_layout_thaw(Evas_Object *obj) { - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, 0); - ELM_LAYOUT_DATA_GET(obj, sd); + return edje_obj_thaw(obj); +} +EOLIAN static int +_elm_layout_edje_object_thaw(Eo *obj, Elm_Layout_Smart_Data *sd) +{ if (--(sd->frozen) != 0) return sd->frozen; - edje_object_thaw(wd->resize_obj); + edje_obj_thaw(eo_super(obj, MY_CLASS)); - elm_obj_layout_sizing_eval(obj); + _elm_layout_sizing_eval(obj, sd); return 0; } diff --git a/src/lib/elementary/elm_layout.eo b/src/lib/elementary/elm_layout.eo index 92b4fb9f8a..40c6401953 100644 --- a/src/lib/elementary/elm_layout.eo +++ b/src/lib/elementary/elm_layout.eo @@ -17,7 +17,7 @@ struct Elm.Layout_Part_Alias_Description real_part: string; [[Target part name for the alias set on Elm.Layout_Part_Proxies_Description::real_part. An example of usage would be "default" on that field, with "elm.content.swallow" on this one]] } -class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File) +class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File, Edje.Object) { legacy_prefix: elm_layout; eo_prefix: elm_obj_layout; @@ -123,16 +123,6 @@ class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File) @in part_name: string; [[A part from loaded edje group.]] } } - freeze { - [[Freezes the Elementary layout object. - - This function puts all changes on hold. Successive freezes will - nest, requiring an equal number of thaws. - - See also @.thaw. - ]] - return: int; [[The frozen state or 0 on error.]] - } theme_enable { legacy: null; return: bool; @@ -206,23 +196,6 @@ class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File) text: string @nullable; [[The text to set.]] } } - signal_callback_add { - [[Add a callback for a (Edje) signal emitted by a layout widget's - underlying Edje object. - - This function connects a callback function to a signal emitted by - the underlying Edje object of $obj. Globs are accepted in either - the emission or source strings. - ]] - params { - @in emission: string; [[The signal's name string.]] - @in source: string; [[The signal's source string.]] - @in func: Edje.Signal_Cb; [[The callback function to be executed - when the signal is emitted.]] - @in data: void_ptr @optional; [[A pointer to data to pass in to the - callback function.]] - } - } part_cursor_set { [[Sets a specific cursor for an edje part.]] return: bool; [[$true on success or $false on failure, that may be @@ -243,78 +216,6 @@ class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File) legacy: null; return: bool; } - data_get @const { - [[Get the edje data from the given layout. - - This function fetches data specified inside the edje theme of - this layout. This function return NULL if data is not found. - - In EDC this comes from a data block within the group block that - $obj was loaded from. - ]] - /* FIXME-doc - @code - collections { - group { - name: "a_group"; - data { - item: "key1" "value1"; - item: "key2" "value2"; - } - } - } - @endcode - */ - return: string; [[The edje data string.]] - params { - @in key: string; [[The data key.]] - } - } - signal_callback_del { - [[Remove a signal-triggered callback from a given layout widget. - - This function removes the last callback attached to a signal - emitted by the undelying Edje object of $obj, with parameters - $emission, $source and $func matching exactly those passed to a - previous call to @.signal_callback_add. The data pointer that - was passed to this call will be returned. - ]] - return: void_ptr; [[The data pointer of the signal callback (passed on - @.signal_callback_add) or $null on errors.]] - params { - @in emission: string; [[The signal's name string.]] - @in source: string; [[The signal's source string.]] - @in func: Edje.Signal_Cb; [[The callback function being executed - when the signal was emitted.]] - } - } - thaw { - [[Thaws the Elementary object. - - This function thaws the given Edje object and the Elementary - sizing calc. - - Note: If sucessives freezes were done, an equal number of - thaws will be required. - - See also @.freeze. - ]] - return: int; [[The frozen state or 0 if the object is not frozen or on error.]] - } - signal_emit { - [[Send a (Edje) signal to a given layout widget's underlying Edje - object. - - This function sends a signal to the underlying Edje object of - $obj. An Edje program on that Edje object's definition can - respond to a signal by specifying matching 'signal' and - 'source' fields. - ]] - params { - @in emission: string; [[The signal's name string.]] - @in source: string; [[The signal's source string.]] - } - } part_cursor_unset { [[Unsets a cursor previously set with @.part_cursor_set.]] return: bool; @@ -351,6 +252,10 @@ class Elm.Layout (Elm.Widget, Efl.Part, Efl.Container, Efl.File) Efl.Container.content.get; Efl.Container.content_unset; Efl.Part.part; + Edje.Object.freeze; + Edje.Object.thaw; + Edje.Object.signal_callback_add; + Edje.Object.signal_callback_del; } events { theme,changed; diff --git a/src/lib/elementary/elm_layout_legacy.h b/src/lib/elementary/elm_layout_legacy.h index 77bf7cc6e5..0a77d00836 100644 --- a/src/lib/elementary/elm_layout_legacy.h +++ b/src/lib/elementary/elm_layout_legacy.h @@ -241,4 +241,105 @@ EAPI Evas_Object *elm_layout_table_unpack(Evas_Object *obj, const char *part, Ev */ EAPI Eina_Bool elm_layout_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear); +/** + * @brief Get the edje data from the given layout. + * + * This function fetches data specified inside the edje theme of this layout. + * This function return NULL if data is not found. + * + * In EDC this comes from a data block within the group block that @c obj was + * loaded from. + * + * @param[in] key The data key. + * + * @return The edje data string. + * + * @ingroup Elm_Layout + */ +EAPI const char *elm_layout_data_get(const Elm_Layout *obj, const char *key); + +/** + * @brief Send a (Edje) signal to a given layout widget's underlying Edje + * object. + * + * This function sends a signal to the underlying Edje object of @c obj. An + * Edje program on that Edje object's definition can respond to a signal by + * specifying matching 'signal' and 'source' fields. + * + * @param[in] emission The signal's name string. + * @param[in] source The signal's source string. + * + * @ingroup Elm_Layout + */ +EAPI void elm_layout_signal_emit(Elm_Layout *obj, const char *emission, const char *source); + +/** + * @brief Add a callback for a (Edje) signal emitted by a layout widget's + * underlying Edje object. + * + * This function connects a callback function to a signal emitted by the + * underlying Edje object of @c obj. Globs are accepted in either the emission + * or source strings. + * + * @param[in] emission The signal's name string. + * @param[in] source The signal's source string. + * @param[in] func The callback function to be executed when the signal is + * emitted. + * @param[in] data A pointer to data to pass in to the callback function. + * + * @ingroup Elm_Layout + */ +EAPI void elm_layout_signal_callback_add(Elm_Layout *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data); + +/** + * @brief Remove a signal-triggered callback from a given layout widget. + * + * This function removes the last callback attached to a signal emitted by the + * undelying Edje object of @c obj, with parameters @c emission, @c source and + * @c func matching exactly those passed to a previous call to + * @ref elm_layout_signal_callback_add. The data pointer that was passed to + * this call will be returned. + * + * @param[in] emission The signal's name string. + * @param[in] source The signal's source string. + * @param[in] func The callback function being executed when the signal was + * emitted. + * + * @return The data pointer of the signal callback (passed on + * @ref elm_layout_signal_callback_add) or @c null on errors. + * + * @ingroup Elm_Layout + */ +EAPI void *elm_layout_signal_callback_del(Elm_Layout *obj, const char *emission, const char *source, Edje_Signal_Cb func); + +/** + * @brief Freezes the Elementary layout object. + * + * This function puts all changes on hold. Successive freezes will nest, + * requiring an equal number of thaws. + * + * See also @ref elm_layout_thaw. + * + * @return The frozen state or 0 on error. + * + * @ingroup Elm_Layout + */ +EAPI int elm_layout_freeze(Elm_Layout *obj); + +/** + * @brief Thaws the Elementary object. + * + * This function thaws the given Edje object and the Elementary sizing calc. + * + * @note If sucessives freezes were done, an equal number of thaws will be + * required. + * + * See also @ref elm_layout_freeze. + * + * @return The frozen state or 0 if the object is not frozen or on error. + * + * @ingroup Elm_Layout + */ +EAPI int elm_layout_thaw(Elm_Layout *obj); + #include "elm_layout.eo.legacy.h" diff --git a/src/lib/elementary/elm_naviframe.eo b/src/lib/elementary/elm_naviframe.eo index 83c1f2d009..1ce0c01f3a 100644 --- a/src/lib/elementary/elm_naviframe.eo +++ b/src/lib/elementary/elm_naviframe.eo @@ -1,4 +1,4 @@ -class Elm.Naviframe (Elm.Layout, Elm.Interface.Atspi_Widget_Action) +class Elm.Naviframe (Elm.Layout, Elm.Interface.Atspi_Widget_Action, Edje.Object) { legacy_prefix: elm_naviframe; eo_prefix: elm_obj_naviframe; @@ -145,6 +145,7 @@ class Elm.Naviframe (Elm.Layout, Elm.Interface.Atspi_Widget_Action) Efl.Canvas.Group.group_del; Efl.Canvas.Group.group_show; Efl.Canvas.Group.group_add; + Edje.Object.signal_emit; Elm.Widget.focus_direction; Elm.Widget.focus_next_manager_is; Elm.Widget.focus_direction_manager_is; @@ -155,7 +156,6 @@ class Elm.Naviframe (Elm.Layout, Elm.Interface.Atspi_Widget_Action) Elm.Widget.event; Elm.Layout.text.set; Elm.Layout.text.get; - Elm.Layout.signal_emit; Elm.Layout.sizing_eval; Elm.Interface.Atspi_Widget_Action.elm_actions.get; Efl.Part.part; diff --git a/src/lib/elementary/elm_popup.eo b/src/lib/elementary/elm_popup.eo index 90745ca7b3..93feda01d3 100644 --- a/src/lib/elementary/elm_popup.eo +++ b/src/lib/elementary/elm_popup.eo @@ -23,7 +23,7 @@ enum Elm.Popup.Orient } -class Elm.Popup (Elm.Layout, Elm.Interface.Atspi_Widget_Action) +class Elm.Popup (Elm.Layout, Elm.Interface.Atspi_Widget_Action, Edje.Object) { legacy_prefix: elm_popup; eo_prefix: elm_obj_popup; @@ -169,6 +169,7 @@ class Elm.Popup (Elm.Layout, Elm.Interface.Atspi_Widget_Action) Eo.Base.constructor; Efl.Canvas.Group.group_del; Efl.Canvas.Group.group_add; + Edje.Object.signal_emit; Elm.Widget.focus_direction; Elm.Widget.focus_next_manager_is; Elm.Widget.theme_apply; @@ -182,7 +183,6 @@ class Elm.Popup (Elm.Layout, Elm.Interface.Atspi_Widget_Action) Elm.Layout.text.set; Elm.Layout.text.get; Elm.Layout.sizing_eval; - Elm.Layout.signal_emit; Elm.Interface.Atspi_Widget_Action.elm_actions.get; Elm.Interface.Atspi_Accessible.state_set.get; Efl.Part.part; diff --git a/src/tests/elementary/elm_test_layout.c b/src/tests/elementary/elm_test_layout.c index f4f9b0d7fb..6fcb5b43f6 100644 --- a/src/tests/elementary/elm_test_layout.c +++ b/src/tests/elementary/elm_test_layout.c @@ -57,8 +57,39 @@ START_TEST(elm_layout_swallows) } END_TEST +START_TEST(elm_layout_edje_attach) +{ + char buf[PATH_MAX]; + Evas_Object *win, *layout; + const Evas_Object *part; + int r, g, b, a; + + elm_init(1, NULL); + win = elm_win_add(NULL, "layout", ELM_WIN_BASIC); + + layout = eo_add(ELM_LAYOUT_CLASS, win); + snprintf(buf, sizeof(buf), "%s/objects/test.edj", ELM_TEST_DATA_DIR); + edje_object_file_set(layout, buf, "layout_edje"); + evas_object_show(layout); + + edje_object_color_class_set(layout, "red", 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0); + part = edje_object_part_object_get(layout, "red"); + evas_object_color_get(part, &r, &g, &b, &a); + fail_if((r != 255) || (g != 0) || (b != 0) || (a != 255)); + + edje_object_signal_emit(layout, "change", "test"); + edje_object_message_signal_process(layout); + part = edje_object_part_object_get(layout, "blue"); + evas_object_color_get(part, &r, &g, &b, &a); + fail_if((r != 0) || (g != 0) || (b != 255) || (a != 255)); + + elm_shutdown(); +} +END_TEST + void elm_test_layout(TCase *tc) { tcase_add_test(tc, elm_atspi_role_get); tcase_add_test(tc, elm_layout_swallows); + tcase_add_test(tc, elm_layout_edje_attach); }