From 6deb21f9f9e326921c16dabbd774b8d1666867c8 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 2 Oct 2019 13:21:35 +0900 Subject: [PATCH 01/29] Efl.Gfx.Vg.Value_Provider: Introduce property change feature of Efl.Ui.Animation_View Summary: Efl.Gfx.Vg.Value_Provider is an object for integrating and managing the properties of vector objects. These values are dependent on the keypath. Keypath is the target a specific content or a set of contents that will be updated. It can include the specific name of the contents, wildcard(*) or Globstar(**). The valueProvider is borrowed from another library that uses a vector object of type json, such as Efl.Ui.Animation_View (https://github.com/airbnb/lottie-ios/blob/5fc0e59e0cb85d3586b1d0d1cf4a2c9669b91d15/lottie-swift/src/Public/iOS/AnimatedControl.swift#L50) This feature should be used with some patches that apply to the vg json loader and Efl.Canvas.Vg.Object. Test Plan: N/A Reviewers: Hermet, kimcinoo, smohanty Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9874 --- src/lib/elementary/efl_ui_animation_view.c | 36 +++++ src/lib/elementary/efl_ui_animation_view.eo | 14 ++ .../efl_ui_animation_view_private.h | 1 + src/lib/evas/Efl_Canvas.h | 1 + src/lib/evas/Evas_Eo.h | 1 + .../evas/canvas/efl_gfx_vg_value_provider.c | 129 ++++++++++++++++++ .../evas/canvas/efl_gfx_vg_value_provider.eo | 72 ++++++++++ .../evas/canvas/efl_gfx_vg_value_provider.h | 33 +++++ src/lib/evas/canvas/evas_vg_private.h | 11 ++ src/lib/evas/canvas/meson.build | 2 + 10 files changed, 300 insertions(+) create mode 100644 src/lib/evas/canvas/efl_gfx_vg_value_provider.c create mode 100644 src/lib/evas/canvas/efl_gfx_vg_value_provider.eo create mode 100644 src/lib/evas/canvas/efl_gfx_vg_value_provider.h diff --git a/src/lib/elementary/efl_ui_animation_view.c b/src/lib/elementary/efl_ui_animation_view.c index 418d8adc42..bca8c1d4a4 100644 --- a/src/lib/elementary/efl_ui_animation_view.c +++ b/src/lib/elementary/efl_ui_animation_view.c @@ -236,6 +236,11 @@ EOLIAN static void _efl_ui_animation_view_efl_object_destructor(Eo *obj, Efl_Ui_Animation_View_Data *pd EINA_UNUSED) { + Efl_Gfx_Vg_Value_Provider *vp; + EINA_LIST_FREE(pd->vp_list, vp) + efl_unref(vp); + eina_list_free(pd->vp_list); + efl_destructor(efl_super(obj, MY_CLASS)); } @@ -707,6 +712,37 @@ _efl_ui_animation_view_max_frame_get(const Eo *obj EINA_UNUSED, Efl_Ui_Animation return pd->max_progress * (evas_object_vg_animated_frame_count_get(pd->vg) - 1); } +EOLIAN static void +_efl_ui_animation_view_value_provider_override(Eo *obj EINA_UNUSED, Efl_Ui_Animation_View_Data *pd, Efl_Gfx_Vg_Value_Provider *value_provider) +{ + if (!value_provider) return; + + if (pd->vp_list) + { + const char *keypath1 = efl_gfx_vg_value_provider_keypath_get(value_provider); + if (!keypath1) + { + ERR("Couldn't override Value Provider(%p). Keypath is NULL.", value_provider); + return; + } + const Eina_List *l; + Efl_Gfx_Vg_Value_Provider *_vp; + EINA_LIST_FOREACH(pd->vp_list, l, _vp) + { + const char *keypath2 = efl_gfx_vg_value_provider_keypath_get(_vp); + if (!strcmp(keypath1, keypath2)) + { + pd->vp_list = eina_list_remove(pd->vp_list, _vp); + efl_unref(_vp); + break; + } + } + } + + efl_ref(value_provider); + pd->vp_list = eina_list_append(pd->vp_list, value_provider); +} + EAPI Elm_Animation_View* elm_animation_view_add(Evas_Object *parent) { diff --git a/src/lib/elementary/efl_ui_animation_view.eo b/src/lib/elementary/efl_ui_animation_view.eo index 474bd76a9f..d07905989e 100644 --- a/src/lib/elementary/efl_ui_animation_view.eo +++ b/src/lib/elementary/efl_ui_animation_view.eo @@ -256,7 +256,21 @@ class @beta Efl.Ui.Animation_View extends Efl.Ui.Widget implements Efl.Gfx.View, ]] } } + value_provider_override{ + [[Override each value of the animation object. + Values can be properties of Efl.Gfx.Vg.Value_provider such as color and matrix information. + Example: + Eo *vp = efl_add(EFL_GFX_VG_VALUE_PROVIDER_CLASS, NULL); + @Efl.Gfx.Vg.Value_Provider.keypath.set(vp, "SomeLayer:SomeObject:SomeContents"); + // Set vp property + @.value_provider_override(target_animation_view, vg); + See @Efl.Gfx.Vg.Value_Provider + ]] + params { + value_provider: Efl.Gfx.Vg.Value_Provider; [[ Override the values of the animation object. this should have keypath infomation. See @Efl.Gfx.Vg.Value_Provider ]] + } + } } implements { Efl.Object.constructor; diff --git a/src/lib/elementary/efl_ui_animation_view_private.h b/src/lib/elementary/efl_ui_animation_view_private.h index 0de9b2afc8..9199dc75ac 100644 --- a/src/lib/elementary/efl_ui_animation_view_private.h +++ b/src/lib/elementary/efl_ui_animation_view_private.h @@ -19,6 +19,7 @@ struct _Efl_Ui_Animation_View_Data double frame_duration; double min_progress; double max_progress; + Eina_List *vp_list; Eina_Bool play_back : 1; Eina_Bool auto_play : 1; diff --git a/src/lib/evas/Efl_Canvas.h b/src/lib/evas/Efl_Canvas.h index 66fe692a72..cd8bf52693 100644 --- a/src/lib/evas/Efl_Canvas.h +++ b/src/lib/evas/Efl_Canvas.h @@ -81,6 +81,7 @@ extern "C" { #include #include #include +#include #include #include diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 593c4d9a69..5f46511e84 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -439,6 +439,7 @@ typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x, #include "canvas/efl_canvas_proxy.eo.h" #include "canvas/efl_gfx_mapping.eo.h" +#include "canvas/efl_gfx_vg_value_provider.eo.h" /** * @ingroup Evas_Object_VG * diff --git a/src/lib/evas/canvas/efl_gfx_vg_value_provider.c b/src/lib/evas/canvas/efl_gfx_vg_value_provider.c new file mode 100644 index 0000000000..ccf334924f --- /dev/null +++ b/src/lib/evas/canvas/efl_gfx_vg_value_provider.c @@ -0,0 +1,129 @@ +#include "efl_gfx_vg_value_provider.h" + +#define MY_CLASS EFL_GFX_VG_VALUE_PROVIDER_CLASS + +EOLIAN static Eo * +_efl_gfx_vg_value_provider_efl_object_constructor(Eo *obj, + Efl_Gfx_Vg_Value_Provider_Data *pd EINA_UNUSED) +{ + obj = efl_constructor(efl_super(obj, MY_CLASS)); + + pd->flag = EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_NONE; + + return obj; +} + +EOLIAN static void +_efl_gfx_vg_value_provider_efl_object_destructor(Eo *obj, + Efl_Gfx_Vg_Value_Provider_Data *pd EINA_UNUSED) +{ + if (pd->keypath) eina_stringshare_del(pd->keypath); + efl_destructor(efl_super(obj, MY_CLASS)); +} + +EOLIAN void +_efl_gfx_vg_value_provider_keypath_set(Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, Eina_Stringshare *keypath) +{ + if(!keypath) return; + eina_stringshare_replace(&pd->keypath, keypath); +} + +EOLIAN Eina_Stringshare* +_efl_gfx_vg_value_provider_keypath_get(const Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd) +{ + return pd->keypath; +} + +EOLIAN void +_efl_gfx_vg_value_provider_transform_set(Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, Eina_Matrix3 *m) +{ + if (m) + { + if (!pd->m) + { + pd->m = malloc(sizeof (Eina_Matrix3)); + if (!pd->m) return; + } + pd->flag = pd->flag | EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_TRANSFORM_MATRIX; + memcpy(pd->m, m, sizeof (Eina_Matrix3)); + } + else + { + free(pd->m); + pd->m = NULL; + } +} + +EOLIAN Eina_Matrix3* +_efl_gfx_vg_value_provider_transform_get(const Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd) +{ + return pd->m; +} + +EOAPI void +_efl_gfx_vg_value_provider_fill_color_set(Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, int r, int g, int b, int a) +{ + pd->flag = pd->flag | EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_FILL_COLOR; + + pd->fill.r = r; + pd->fill.g = g; + pd->fill.b = b; + pd->fill.a = a; +} + +EOAPI void +_efl_gfx_vg_value_provider_fill_color_get(const Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, int *r, int *g, int *b, int *a) +{ + if (r) *r = pd->fill.r; + if (g) *g = pd->fill.g; + if (b) *b = pd->fill.b; + if (a) *a = pd->fill.a; +} + +EOAPI void +_efl_gfx_vg_value_provider_stroke_color_set(Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, int r, int g, int b, int a) +{ + pd->flag = pd->flag | EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_COLOR; + + pd->stroke.r = r; + pd->stroke.g = g; + pd->stroke.b = b; + pd->stroke.a = a; +} + +EOAPI void +_efl_gfx_vg_value_provider_stroke_color_get(const Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, int *r, int *g, int *b, int *a) +{ + if (r) *r = pd->stroke.r; + if (g) *g = pd->stroke.g; + if (b) *b = pd->stroke.b; + if (a) *a = pd->stroke.a; +} + +EOAPI void +_efl_gfx_vg_value_provider_stroke_width_set(Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd, double w) +{ + if (w < 0) return ; + + pd->flag = pd->flag | EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_WIDTH; + pd->stroke.width = w; +} + +EOAPI double +_efl_gfx_vg_value_provider_stroke_width_get(const Eo *obj EINA_UNUSED, Efl_Gfx_Vg_Value_Provider_Data *pd) +{ + return pd->stroke.width; +} + +/* This function only use in internal */ +Efl_Gfx_Vg_Value_Provider_Change_Flag +efl_gfx_vg_value_provider_changed_flag_get(Eo *obj) +{ + EINA_SAFETY_ON_FALSE_RETURN_VAL(efl_isa(obj, MY_CLASS), EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_NONE); + Efl_Gfx_Vg_Value_Provider_Data *pd = efl_data_scope_get(obj, MY_CLASS); + if (!pd) return EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_NONE; + return pd->flag; +} + + +#include "efl_gfx_vg_value_provider.eo.c" diff --git a/src/lib/evas/canvas/efl_gfx_vg_value_provider.eo b/src/lib/evas/canvas/efl_gfx_vg_value_provider.eo new file mode 100644 index 0000000000..2e21774a2f --- /dev/null +++ b/src/lib/evas/canvas/efl_gfx_vg_value_provider.eo @@ -0,0 +1,72 @@ +class @beta Efl.Gfx.Vg.Value_Provider extends Efl.Object +{ + [[Efl Vector Value Provider class. + + This class is a set of that contain the value of several properties provided by content. + User can use this class to change the properties for the specific content specified by the keypath. + ]] + methods { + @property keypath { + [[ Keypath is the target a specific content or a set of contents that will be updated. + It can include the specific name of the contents, wildcard(*) or Globstar(**). + ]] + get { + } + set { + } + values { + keypath: stringshare; [[ The keypath of contents ]] + } + } + @property transform { + [[ User can adjust transform value of the content specified by the keypath. ]] + set { + } + get { + } + values { + m: ptr(Eina.Matrix3); [[ Matrix Value. ]] + } + } + @property fill_color { + [[ User can adjust color value of the fill content specified by the keypath. ]] + set { + } + get { + } + values { + r: int; [[ Red color value of fill. ]] + g: int; [[ Green color value of fill. ]] + b: int; [[ Blue color value of fill. ]] + a: int; [[ Alpha value of fill. ]] + } + } + @property stroke_color { + [[ User can adjust color value of the stroke content specified by the keypath. ]] + set { + } + get { + } + values { + r: int; [[ Red color value of stroke. ]] + g: int; [[ Green color value of stroke. ]] + b: int; [[ Blue color value of stroke. ]] + a: int; [[ Alpha value of stroke. ]] + } + } + @property stroke_width { + [[ User can adjust width value of the stroke content specified by the keypath. ]] + set { + } + get { + } + values { + width: double; [[ Width value of stroke. ]] + } + } + } + implements { + Efl.Object.constructor; + Efl.Object.destructor; + } +} diff --git a/src/lib/evas/canvas/efl_gfx_vg_value_provider.h b/src/lib/evas/canvas/efl_gfx_vg_value_provider.h new file mode 100644 index 0000000000..5b4b806000 --- /dev/null +++ b/src/lib/evas/canvas/efl_gfx_vg_value_provider.h @@ -0,0 +1,33 @@ +#ifndef EFL_GFX_VG_VALUE_PROVIDER_H +#define EFL_GFX_VG_VALUE_PROVIDER_H + +#include "evas_common_private.h" +#include "evas_private.h" +#include "evas_vg_private.h" + +struct _Efl_Gfx_Vg_Value_Provider_Data +{ + Eo* obj; + Efl_Gfx_Vg_Value_Provider_Change_Flag flag; + + Eina_Stringshare *keypath; + + Eina_Matrix3 *m; + struct { + int r; + int g; + int b; + int a; + } fill; + struct { + int r; + int g; + int b; + int a; + double width; + } stroke; +}; + +typedef struct _Efl_Gfx_Vg_Value_Provider_Data Efl_Gfx_Vg_Value_Provider_Data; + +#endif diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h index 6dcd7215dd..9ec89633c2 100644 --- a/src/lib/evas/canvas/evas_vg_private.h +++ b/src/lib/evas/canvas/evas_vg_private.h @@ -9,6 +9,8 @@ typedef struct _Efl_Canvas_Vg_Gradient_Data Efl_Canvas_Vg_Gradient_Data; typedef struct _Efl_Canvas_Vg_Interpolation Efl_Canvas_Vg_Interpolation; typedef struct _Efl_Canvas_Vg_Object_Data Efl_Canvas_Vg_Object_Data; +typedef enum _Efl_Gfx_Vg_Value_Provider_Change_Flag Efl_Gfx_Vg_Value_Provider_Change_Flag; + typedef struct _Vg_Cache { Eina_Hash *vfd_hash; @@ -128,6 +130,15 @@ struct _Efl_Canvas_Vg_Interpolation Eina_Point_3D skew; }; +enum _Efl_Gfx_Vg_Value_Provider_Change_Flag +{ + EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_NONE = 0, + EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_FILL_COLOR = 2, + EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_COLOR = 4, + EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_WIDTH = 8, + EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_TRANSFORM_MATRIX = 16 +}; +Efl_Gfx_Vg_Value_Provider_Change_Flag efl_gfx_vg_value_provider_changed_flag_get(Eo *obj); void evas_cache_vg_init(void); void evas_cache_vg_shutdown(void); diff --git a/src/lib/evas/canvas/meson.build b/src/lib/evas/canvas/meson.build index c306c900a3..758a8db064 100644 --- a/src/lib/evas/canvas/meson.build +++ b/src/lib/evas/canvas/meson.build @@ -40,6 +40,7 @@ pub_eo_files = [ 'efl_canvas_text_factory.eo', 'efl_canvas_rectangle.eo', 'efl_canvas_object.eo', + 'efl_gfx_vg_value_provider.eo', 'efl_canvas_vg_object.eo', 'efl_canvas_vg_node.eo', 'efl_canvas_vg_container.eo', @@ -179,6 +180,7 @@ evas_src += files([ 'efl_canvas_animation_group_parallel.c', 'efl_canvas_animation_group_sequential.c', 'efl_canvas_animation_player.c', + 'efl_gfx_vg_value_provider.c', 'efl_canvas_vg_object.c', 'efl_canvas_vg_node.c', 'efl_canvas_vg_container.c', From 779bd0539eb6ab8050289da83d0792670a15422c Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 2 Oct 2019 14:30:06 +0900 Subject: [PATCH 02/29] vg_common_json: Override value_provider list Summary: If value_provider is applied to Efl.Ui.Animation_View, it is passed as vector object. The passed value_provider list passes to Vg_File_Data. If there is a value_Provider list in Vg_File_Data, it apply the property to Lottie_Animation using lottie_animation_property_override api. Depends on D9874 Test Plan: ... Eo *vp = efl_add(EFL_GFX_VG_VALUE_PROVIDER_CLASS, p); efl_gfx_vg_value_provider_keypath_set(vp, "**"); efl_gfx_vg_value_provider_fill_color_set(vp, 100, 0 ,0 ,255); efl_ui_animation_view_value_provider_override(anim_view, vp); vp = efl_add(EFL_GFX_VG_VALUE_PROVIDER_CLASS, p); efl_gfx_vg_value_provider_keypath_set(vp, "**"); efl_gfx_vg_value_provider_stroke_width_set(vp, 50.0); efl_gfx_vg_value_provider_stroke_color_set(vp, 0, 255, 0, 100); efl_ui_animation_view_value_provider_override(anim_view, vp); ... Reviewers: Hermet, kimcinoo, smohanty Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9897 --- src/lib/elementary/efl_ui_animation_view.c | 1 + src/lib/evas/canvas/efl_canvas_vg_object.c | 2 + src/lib/evas/include/evas_private.h | 1 + src/static_libs/vg_common/vg_common.h | 1 + src/static_libs/vg_common/vg_common_json.c | 55 ++++++++++++++++++++++ 5 files changed, 60 insertions(+) diff --git a/src/lib/elementary/efl_ui_animation_view.c b/src/lib/elementary/efl_ui_animation_view.c index bca8c1d4a4..82aba0f3c4 100644 --- a/src/lib/elementary/efl_ui_animation_view.c +++ b/src/lib/elementary/efl_ui_animation_view.c @@ -741,6 +741,7 @@ _efl_ui_animation_view_value_provider_override(Eo *obj EINA_UNUSED, Efl_Ui_Anima efl_ref(value_provider); pd->vp_list = eina_list_append(pd->vp_list, value_provider); + efl_key_data_set(pd->vg, "_vg_value_providers", pd->vp_list); } EAPI Elm_Animation_View* diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index 0c8e50bed3..660d1ebe1a 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -616,6 +616,8 @@ _cache_vg_entry_render(Evas_Object_Protected_Data *obj, h = size.h; } + if (pd->vg_entry->vfd) + pd->vg_entry->vfd->vp_list = efl_key_data_get(obj->object, "_vg_value_providers"); root = evas_cache_vg_tree_get(vg_entry, pd->frame_idx); if (!root) return; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index c80053c7f9..86bb885ce3 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1541,6 +1541,7 @@ struct _Vg_File_Data Vg_File_Anim_Data *anim_data; //only when animation supported. int ref; int w, h; //default size + Eina_List *vp_list; //Value providers. void *loader_data; //loader specific local data diff --git a/src/static_libs/vg_common/vg_common.h b/src/static_libs/vg_common/vg_common.h index 520fcdbfd6..83f9224e45 100644 --- a/src/static_libs/vg_common/vg_common.h +++ b/src/static_libs/vg_common/vg_common.h @@ -7,6 +7,7 @@ #include "evas_common_private.h" #include "evas_private.h" +#include "evas_vg_private.h" /****************************************************************************************** * SVG Compatible feature implementation diff --git a/src/static_libs/vg_common/vg_common_json.c b/src/static_libs/vg_common/vg_common_json.c index 3b3d114503..5ad4150506 100644 --- a/src/static_libs/vg_common/vg_common_json.c +++ b/src/static_libs/vg_common/vg_common_json.c @@ -443,6 +443,59 @@ _update_vg_tree(Efl_Canvas_Vg_Container *root, const LOTLayerNode *layer, int de } #endif +#ifdef BUILD_VG_LOADER_JSON +void +_value_provider_override(Vg_File_Data *vfd) +{ + Lottie_Animation *lot_anim = (Lottie_Animation *) vfd->loader_data; + + Eina_List *l; + Efl_Gfx_Vg_Value_Provider *vp; + EINA_LIST_FOREACH(vfd->vp_list, l, vp) + { + const char *keypath; + Efl_Gfx_Vg_Value_Provider_Change_Flag flag; + flag = efl_gfx_vg_value_provider_changed_flag_get(vp); + + if (flag & EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_FILL_COLOR) + { + int r, g, b, a; + r = g = b = a = 0; + efl_gfx_vg_value_provider_fill_color_get(vp, &r, &g, &b, &a); + keypath = efl_gfx_vg_value_provider_keypath_get(vp); + + lottie_animation_property_override(lot_anim, LOTTIE_ANIMATION_PROPERTY_FILLCOLOR, (char*)keypath, r / 255.0, g / 255.0, b / 255.0); + lottie_animation_property_override(lot_anim, LOTTIE_ANIMATION_PROPERTY_FILLOPACITY, (char*)keypath, (a / 255.0) * 100.0); + } + if (flag & EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_COLOR) + { + int r, g, b, a; + r = g = b = a = 0; + efl_gfx_vg_value_provider_stroke_color_get(vp, &r, &g, &b, &a); + keypath = efl_gfx_vg_value_provider_keypath_get(vp); + + lottie_animation_property_override(lot_anim, LOTTIE_ANIMATION_PROPERTY_STROKECOLOR, (char*)keypath, r / 255.0, g / 255.0, b / 255.0); + lottie_animation_property_override(lot_anim, LOTTIE_ANIMATION_PROPERTY_STROKEOPACITY, (char*)keypath, (a / 255.0) * 100.0); + } + if (flag & EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_STROKE_WIDTH) + { + double w; + w = efl_gfx_vg_value_provider_stroke_width_get(vp); + keypath = efl_gfx_vg_value_provider_keypath_get(vp); + + lottie_animation_property_override(lot_anim, LOTTIE_ANIMATION_PROPERTY_STROKEWIDTH, (char*)keypath, w); + } + if (flag & EFL_GFX_VG_VALUE_PROVIDER_CHANGE_FLAG_TRANSFORM_MATRIX) + { + //TODO: When the lottie animation's transform property is implemented, + // the transform property override function have to added. + } + } +} + +#endif + + Eina_Bool vg_common_json_create_vg_node(Vg_File_Data *vfd) { @@ -450,6 +503,8 @@ vg_common_json_create_vg_node(Vg_File_Data *vfd) Lottie_Animation *lot_anim = (Lottie_Animation *) vfd->loader_data; if (!lot_anim) return EINA_FALSE; + if (vfd->vp_list) _value_provider_override(vfd); + unsigned int frame_num = (vfd->anim_data) ? vfd->anim_data->frame_num : 0; const LOTLayerNode *tree = lottie_animation_render_tree(lot_anim, frame_num, From 3f51e30976ebe68cf5480598a0d8302d82e1961e Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 2 Oct 2019 14:32:33 +0900 Subject: [PATCH 03/29] elementary_test: Add the value provider test for animation_view Summary: Add an Value Provider item to test vector animation on elementary_test. This test is to apply Efl.Gfx.Vg.Value_Provider to the loaded efl_ui_animation object. If Evas Vg Json(Lottie) Loader is not supported, use the vector class to output the svg file. Depends on D9874 Depends on D9897 Test Plan: elementary_test -> Value Provider Reviewers: Hermet, kimcinoo, smohanty Reviewed By: Hermet Subscribers: cedric, #committers, #reviewers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10015 --- data/elementary/images/three_box.json | 1 + src/bin/elementary/meson.build | 1 + src/bin/elementary/test.c | 2 + .../test_efl_gfx_vg_value_provider.c | 605 ++++++++++++++++++ 4 files changed, 609 insertions(+) create mode 100644 data/elementary/images/three_box.json create mode 100644 src/bin/elementary/test_efl_gfx_vg_value_provider.c diff --git a/data/elementary/images/three_box.json b/data/elementary/images/three_box.json new file mode 100644 index 0000000000..f58fbcdec8 --- /dev/null +++ b/data/elementary/images/three_box.json @@ -0,0 +1 @@ +{"v":"5.5.9","fr":29.9700012207031,"ip":0,"op":130.000005295009,"w":1920,"h":1080,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"layer","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-261,"s":[1,0,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[1,0,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0,1,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[0,0,1,1]},{"t":119.000004846969,"s":[1,0,0,1]}],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-400,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[10]},{"t":108.00000439893,"s":[100]}],"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-600,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[1,0.917647123337,0,1]},{"t":96.0000039101602,"s":[1,1,1,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[69]},{"t":102.000004154545,"s":[2]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[600,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"box3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":-6.00000024438501,"op":894.000036413367,"st":-6.00000024438501,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/bin/elementary/meson.build b/src/bin/elementary/meson.build index debce1ded8..502573c49e 100644 --- a/src/bin/elementary/meson.build +++ b/src/bin/elementary/meson.build @@ -161,6 +161,7 @@ elementary_test_src = [ 'test_ui_items.c', 'test_ui_frame.c', 'test_efl_ui_animation_view.c', + 'test_efl_gfx_vg_value_provider.c', 'test.h' ] diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index 8d5e997140..8259ed8b0c 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -406,6 +406,7 @@ void test_efl_ui_item(void *data, Evas_Object *obj, void *event_info); void test_ui_frame(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED); void test_efl_ui_animation_view(void *data, Evas_Object *obj, void *event_info); +void test_efl_gfx_vg_value_provider(void *data, Evas_Object *obj, void *event_info); static void _list_udpate(void); @@ -1301,6 +1302,7 @@ add_tests: //------------------------------// ADD_TEST_EO(NULL, "Vector Animation", "Animation View", test_efl_ui_animation_view); + ADD_TEST_EO(NULL, "Vector Animation", "Value Provider", test_efl_gfx_vg_value_provider); #undef ADD_TEST diff --git a/src/bin/elementary/test_efl_gfx_vg_value_provider.c b/src/bin/elementary/test_efl_gfx_vg_value_provider.c new file mode 100644 index 0000000000..7f5add084c --- /dev/null +++ b/src/bin/elementary/test_efl_gfx_vg_value_provider.c @@ -0,0 +1,605 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include +#include +#include "elm_priv.h" + +#ifndef EFL_BETA_API_SUPPORT +#define EFL_BETA_API_SUPPORT +#endif + +#ifndef EFL_EO_API_SUPPORT +#define EFL_EO_API_SUPPORT +#endif + +#ifdef BUILD_VG_LOADER_JSON + +Evas_Object *values[4], *anim_view; +Evas_Object *path_entry, *type_hoversel; + +Eina_Bool +add_value_provider(char* new_path, char* new_type, char* new_values) +{ + const char* type = elm_object_text_get(type_hoversel); + if (!type) return EINA_FALSE; + const char* path = efl_text_get(path_entry); + if (!path) return EINA_FALSE; + + if (strstr(type, "Color") != NULL) + { + int color[4]; + Eo *vp = efl_add(EFL_GFX_VG_VALUE_PROVIDER_CLASS, anim_view); + efl_gfx_vg_value_provider_keypath_set(vp, (char*)path); + for (int i = 0; i < 4; i++) + { + char* v = (char*)efl_text_get(values[i]); + if (v) color[i] = atoi(v); + } + + sprintf(new_path, "%s", path); + sprintf(new_values, "%d %d %d %d",color[0], color[1], color[2], color[3]); + if (!strcmp(type, "FillColor")) + { + efl_gfx_vg_value_provider_fill_color_set(vp, color[0], color[1], color[2], color[3]); + sprintf(new_type, "FillColor"); + } + if (!strcmp(type, "StrokeColor")) + { + efl_gfx_vg_value_provider_stroke_color_set(vp, color[0], color[1], color[2], color[3]); + sprintf(new_type, "StrokeColor"); + } + + + efl_ui_animation_view_value_provider_override(anim_view, vp); + } + if (!strcmp(type, "StrokeWidth")) + { + double width; + Eo *vp = efl_add(EFL_GFX_VG_VALUE_PROVIDER_CLASS, anim_view); + efl_gfx_vg_value_provider_keypath_set(vp, (char*)path); + char* v = (char*)efl_text_get(values[0]); + if (v) width = strtod(v, NULL); + efl_gfx_vg_value_provider_stroke_width_set(vp, width); + efl_ui_animation_view_value_provider_override(anim_view, vp); + evas_object_show(anim_view); + sprintf(new_path, "%s", path); + sprintf(new_type, "StrokeWidth"); + sprintf(new_values, "%f", width); + } + return EINA_TRUE; +} + +static void +btn_clicked_cb(void *data , const Efl_Event *ev ) +{ + const char *text = efl_text_get(ev->object); + + if (!text) return; + + if (!strcmp("Play", text)) + efl_ui_animation_view_play((Evas_Object*)data); + else if (!strcmp("Pause", text)) + efl_ui_animation_view_pause((Evas_Object*)data); + else if (!strcmp("Resume", text)) + efl_ui_animation_view_resume((Evas_Object*)data); + else if (!strcmp("Play Back", text)) + efl_ui_animation_view_play_back((Evas_Object*)data); + else if (!strcmp("Stop", text)) + efl_ui_animation_view_stop((Evas_Object*)data); + else if (!strcmp("ADD", text)) + { + Evas_Object *list = (Evas_Object*)data; + Elm_Object_Item *list_it; + char new_path[255], new_type[255], new_values[255]; + if (add_value_provider(new_path, new_type, new_values)) + { + char buf[255]; + //TODO: Even if there is the same path as the existing item, it is added without updating. + // In efl_ui_animation_view, duplicate paths are managed. + // However, animator (lottie) does not have an implementation that manages overridden values. + /*Eina_List *items = (Eina_List*)elm_list_items_get(list); + Eina_List *l; + EINA_LIST_FOREACH(items, l, list_it) + { + char item_text[255]; + strcpy(item_text, elm_object_item_text_get(list_it)); + if (item_text[0] != '/') + { + char* path = strtok(item_text, "/"); + char* type = strtok(NULL, "/"); + if (!strcmp(new_path, path) && !strcmp(new_type, type)) + { + elm_object_item_del(list_it); + break; + } + } + }*/ + sprintf(buf, "%s/%s/%s", new_path, new_type, new_values); + list_it = elm_list_item_append(list, buf, NULL, NULL, NULL, NULL); + elm_list_item_bring_in(list_it); + elm_list_go(list); + } + } + else if (!strcmp("DEL", text)) + { + Evas_Object *list = (Evas_Object*)data; + Elm_Object_Item *list_it = elm_list_selected_item_get(list); + if (list_it) + { + char item_text[255]; + strcpy(item_text, elm_object_item_text_get(list_it)); + if (item_text[0] != '/') + { + /* Need to work */ + } + //TODO + printf("Value provider remove is not implemented yet\n"); + /*elm_object_item_del(list_it); + elm_list_go(list);*/ + } + } +} + +static void +check_changed_cb(void *data, const Efl_Event *event) +{ + Evas_Object *anim_view = data; + efl_ui_animation_view_auto_repeat_set(anim_view, efl_ui_selectable_selected_get(event->object)); +} + +static void +speed_changed_cb(void *data, const Efl_Event *event) +{ + Evas_Object *anim_view = data; + double speed = 1; + if (efl_ui_selectable_selected_get(event->object)) speed = 0.25; + efl_ui_animation_view_speed_set(anim_view, speed); +} + +static void +limit_frame_cb(void *data, const Efl_Event *event) +{ + Evas_Object *anim_view = data; + int frame_count = efl_ui_animation_view_frame_count_get(anim_view); + printf("Total Frame Count : %d\n", frame_count); + if (efl_ui_selectable_selected_get(event->object)) + { + efl_ui_animation_view_min_frame_set(anim_view, 5); + efl_ui_animation_view_max_frame_set(anim_view, 10); + printf("Frames to show 5-10 only\n"); + } + else + { + efl_ui_animation_view_min_frame_set(anim_view, 0); + efl_ui_animation_view_max_frame_set(anim_view, frame_count); + printf("Showing all frames now\n"); + } +} + +static void +update_anim_view_state(Evas_Object *anim_view, Evas_Object *label) +{ + Efl_Ui_Animation_View_State state = efl_ui_animation_view_state_get(anim_view); + + switch (state) + { + case EFL_UI_ANIMATION_VIEW_STATE_NOT_READY: + efl_text_set(label, "State = Not Ready"); + break; + case EFL_UI_ANIMATION_VIEW_STATE_PLAY: + efl_text_set(label, "State = Playing"); + break; + case EFL_UI_ANIMATION_VIEW_STATE_PLAY_BACK: + efl_text_set(label, "State = Playing Back"); + break; + case EFL_UI_ANIMATION_VIEW_STATE_PAUSE: + efl_text_set(label, "State = Paused"); + break; + case EFL_UI_ANIMATION_VIEW_STATE_STOP: + efl_text_set(label, "State = Stopped"); + break; + } +} + +static void +_play_updated(void *data, Evas_Object *obj, void *ev EINA_UNUSED) +{ + Evas_Object *slider = data; + efl_ui_range_value_set(slider, efl_ui_animation_view_progress_get(obj)); +} + +static void +_state_update(void *data, Evas_Object *obj, void *ev EINA_UNUSED) +{ + Evas_Object *label = data; + update_anim_view_state(obj, label); +} + +static void +_play_done(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + printf("done!\n"); +} + +static void +_play_repeated(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + printf("repeated!\n"); +} + +static void +_slider_changed_cb(void *data, const Efl_Event *ev) +{ + Evas_Object *anim_view = data; + efl_ui_animation_view_progress_set(anim_view, efl_ui_range_value_get(ev->object)); +} + +static void +_slider_reset(void *data, Evas_Object *obj EINA_UNUSED, void *ev EINA_UNUSED) +{ + Evas_Object *slider = data; + efl_ui_range_value_set(slider, 0); +} + +void values_input(Eo* box, const char* type) +{ + for (int i = 0; i < 4; i++) + { + if (values[i]) + { + //efl_pack_unpack(box, values[i]); + efl_del(values[i]); + values[i] = NULL; + } + } + if (strstr(type, "Color") != NULL) + { + char color_text[4][2] = { "R", "G", "B", "A" }; + for (int i = 0; i < 4; i++) + { + values[i] = efl_add(EFL_UI_TEXT_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_interactive_editable_set(efl_added, EINA_TRUE), + efl_pack(box, efl_added)); + efl_gfx_hint_size_min_set(values[i], EINA_SIZE2D(50, 10)); + efl_text_set(efl_part(values[i], "efl.text_guide"), color_text[i]); + } + } + else if (!strcmp(type, "StrokeWidth")) + { + values[0] = efl_add(EFL_UI_TEXT_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_interactive_editable_set(efl_added, EINA_TRUE), + efl_pack(box, efl_added)); + efl_gfx_hint_size_min_set(values[0], EINA_SIZE2D(50, 10)); + efl_text_set(efl_part(values[0], "efl.text_guide"), "Width(double type)"); + } +} + +static void +_hover_item_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object* box = (Evas_Object*)data; + const char *selected = elm_object_item_text_get(event_info); + + elm_object_text_set(obj, selected); + values_input(box, selected); +} + +void +test_efl_gfx_vg_value_provider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eo *win, *box, *box_sub, *label, *check, *slider, *list; + char buf[255]; + // This line must to need. + setenv("ELM_ACCEL", "gl", 1); + + win = efl_add_ref(EFL_UI_WIN_CLASS, NULL, + efl_ui_win_type_set(efl_added, EFL_UI_WIN_TYPE_BASIC), + efl_text_set(efl_added, "Efl_Ui_Animation_View demo"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE)); + + // Create a box in Canvas + box = efl_add(EFL_UI_BOX_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, EFL_GFX_HINT_EXPAND), + efl_content_set(win, efl_added)); + + //Create a label to show state of animation + label = efl_add(EFL_UI_TEXT_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_pack(box, efl_added)); + + //Create Animation View to play animation directly from JSON file + snprintf(buf, sizeof(buf), "%s/images/three_box.json", elm_app_data_dir_get()); + anim_view = efl_add(EFL_UI_ANIMATION_VIEW_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, EFL_GFX_HINT_EXPAND), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(600, 600)), + efl_file_set(efl_added, buf), + efl_pack(box, efl_added)); + +//----------------------------------------------------------------------------------- + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_pack(box, efl_added)); + //Path + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_TRUE, EINA_FALSE), + efl_text_set(efl_added, "Path examples : three_box.json\n" + "**\n" + "layer.*.Fill 1\n" + "layer.box1.*\n" + "layer.box1.Fill 1\n" + "layer.box1.Stroke 1\n" + "layer.box_sub.Fill 1\n" + "layer.box_sub.Stroke 1\n" + "layer.box_sub.Fill 1\n" + "layer.box_sub.Stroke 1\n"), + efl_text_interactive_editable_set(efl_added, EINA_FALSE), + efl_text_multiline_set(efl_added, EINA_TRUE), + efl_pack(box_sub, efl_added)); + + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_fill_set(efl_added, EINA_TRUE, EINA_FALSE), + efl_text_set(efl_added, "[Value Provider]"), + efl_text_interactive_editable_set(efl_added, EINA_FALSE), + efl_text_multiline_set(efl_added, EINA_TRUE), + efl_pack(box_sub, efl_added)); +//----------------------------------------------------------------------------------- + // Controller Set : 0 + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), + efl_pack(box, efl_added)); + + //Path + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "PATH : "), + efl_text_interactive_editable_set(efl_added, EINA_FALSE), + efl_pack(box_sub, efl_added)); + + path_entry = efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0.1, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_interactive_editable_set(efl_added, EINA_TRUE), + efl_pack(box_sub, efl_added)); + efl_gfx_hint_size_min_set(path_entry, EINA_SIZE2D(200, 10)); + efl_text_set(efl_part(path_entry, "efl.text_guide"), "Enter path(ex: ** or Layer.Shape.Fill) "); + + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "TYPE : "), + efl_text_interactive_editable_set(efl_added, EINA_FALSE), + efl_pack(box_sub, efl_added)); + type_hoversel = elm_hoversel_add(box_sub); + elm_hoversel_hover_parent_set(type_hoversel, win); + evas_object_size_hint_weight_set(type_hoversel, 0, 0); + evas_object_size_hint_align_set(type_hoversel, EVAS_HINT_FILL, EVAS_HINT_FILL); + efl_gfx_hint_size_min_set(type_hoversel, EINA_SIZE2D(100, 10)), + elm_object_text_set(type_hoversel, "FillColor"); + elm_hoversel_item_add(type_hoversel, "FillColor", NULL, ELM_ICON_NONE, _hover_item_selected_cb, box_sub); + elm_hoversel_item_add(type_hoversel, "StrokeColor", NULL, ELM_ICON_NONE, _hover_item_selected_cb, box_sub); + elm_hoversel_item_add(type_hoversel, "StrokeWidth", NULL, ELM_ICON_NONE, _hover_item_selected_cb, box_sub); + evas_object_show(type_hoversel); + elm_object_focus_set(type_hoversel, EINA_TRUE); + efl_pack(box_sub, type_hoversel); + + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "VALUES : "), + efl_text_interactive_editable_set(efl_added, EINA_FALSE), + efl_pack(box_sub, efl_added)); + values_input(box_sub, elm_object_text_get(type_hoversel)); + +//----------------------------------------------------------------------------------- + + // Controller Set : 0 + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), + efl_pack(box, efl_added)); + + list = elm_list_add(win); + evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(list); + efl_pack(box_sub, list); + + elm_object_item_disabled_set(elm_list_item_append(list, "Example : ** / FillColor / 255, 255, 255, 255", NULL, NULL, NULL, NULL), EINA_TRUE); + efl_gfx_hint_size_min_set(list, EINA_SIZE2D(400, 100)), + elm_list_go(list); + + + + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "ADD"), + efl_pack(box_sub, efl_added), + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(50, 20)), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, list)); + + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, 0, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "DEL"), + efl_pack(box_sub, efl_added), + efl_gfx_hint_size_min_set(efl_added, EINA_SIZE2D(50, 20)), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, list)); +//----------------------------------------------------------------------------------- + // Controller Set : 0 + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), + efl_pack(box, efl_added)); + + //Loop + check = efl_add(EFL_UI_CHECK_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_pack(box_sub, efl_added)); + efl_text_set(check, "Loop"); + efl_event_callback_add(check, EFL_UI_EVENT_SELECTED_CHANGED, check_changed_cb, anim_view); + + //Speed: 0.5x + check = efl_add(EFL_UI_CHECK_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_pack(box_sub, efl_added)); + efl_text_set(check, "Speed: 0.25x"); + efl_event_callback_add(check, EFL_UI_EVENT_SELECTED_CHANGED, speed_changed_cb, anim_view); + + //Limit Frames + check = efl_add(EFL_UI_CHECK_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_pack(box_sub, efl_added)); + efl_text_set(check, "Limit Frames"); + efl_event_callback_add(check, EFL_UI_EVENT_SELECTED_CHANGED, limit_frame_cb, anim_view); + + + //Duration Text + snprintf(buf, sizeof(buf), "Duration: %1.2fs", efl_ui_animation_view_duration_time_get(anim_view)); + efl_add(EFL_UI_TEXT_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, buf), + efl_pack(box_sub, efl_added)); + + //Slider + slider = efl_add(EFL_UI_SLIDER_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_ui_range_limits_set(efl_added, 0, 1), + efl_event_callback_add(efl_added, EFL_UI_RANGE_EVENT_CHANGED, _slider_changed_cb, anim_view), + efl_pack(box, efl_added)); + + //Controller Set: 1 + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, 1), + efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), + efl_pack(box, efl_added)); + + //Play Button + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "Play"), + efl_pack(box_sub, efl_added), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, anim_view)); + + + //Play Back Button + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "Play Back"), + efl_pack(box_sub, efl_added), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, anim_view)); + + //Stop Button + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "Stop"), + efl_pack(box_sub, efl_added), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, anim_view)); + + //Controller Set: 2 + box_sub = efl_add(EFL_UI_BOX_CLASS, box, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, 1), + efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), + efl_pack(box, efl_added)); + + //Pause Button + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "Pause"), + efl_pack(box_sub, efl_added), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, anim_view)); + + //Resume Button + efl_add(EFL_UI_BUTTON_CLASS, box_sub, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_text_set(efl_added, "Resume"), + efl_pack(box_sub, efl_added), + efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, btn_clicked_cb, anim_view)); + + evas_object_smart_callback_add(anim_view, "play,start", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,stop", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,pause", _state_update, label); + evas_object_smart_callback_add(anim_view, "play,resume", _state_update, label); + + evas_object_smart_callback_add(anim_view, "play,repeat", _play_repeated, label); + evas_object_smart_callback_add(anim_view, "play,done", _play_done, label); + + evas_object_smart_callback_add(anim_view, "play,update", _play_updated, slider); + evas_object_smart_callback_add(anim_view, "play,stop", _slider_reset, slider); + + update_anim_view_state(anim_view, label); + + efl_gfx_entity_size_set(win, EINA_SIZE2D(600, 850)); +} + +#else + +void +test_efl_gfx_vg_value_provider(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Eo *win, *box; + char buf[255]; + + win = efl_add_ref(EFL_UI_WIN_CLASS, NULL, + efl_ui_win_type_set(efl_added, EFL_UI_WIN_TYPE_BASIC), + efl_text_set(efl_added, "Efl_Ui_Animation_View demo"), + efl_ui_win_autodel_set(efl_added, EINA_TRUE)); + + // Create a box + box = efl_add(EFL_UI_BOX_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, EFL_GFX_HINT_EXPAND), + efl_content_set(win, efl_added)); + + efl_add(EFL_UI_TEXT_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, 0.1), + efl_gfx_hint_fill_set(efl_added, EINA_FALSE, EINA_FALSE), + efl_text_set(efl_added, "Evas Vg Json (Lottie) Loader is not supported, Only Static Vector Image is available!"), + efl_pack(box, efl_added)); + + //Create Vector object. + snprintf(buf, sizeof(buf), "%s/images/tiger.svg", elm_app_data_dir_get()); + efl_add(EFL_CANVAS_VG_OBJECT_CLASS, win, + efl_gfx_hint_weight_set(efl_added, EFL_GFX_HINT_EXPAND, EFL_GFX_HINT_EXPAND), + efl_gfx_hint_align_set(efl_added, EVAS_HINT_FILL, EVAS_HINT_FILL), + efl_gfx_entity_size_set(efl_added, EINA_SIZE2D(600, 600)), + efl_file_simple_load(efl_added, buf, NULL), + efl_gfx_entity_visible_set(efl_added, EINA_TRUE), + efl_pack(box, efl_added)); + + efl_gfx_entity_size_set(win, EINA_SIZE2D(600, 730)); +} + +#endif From be2e0bef07f06339d09cb06bb2d9e08503814edb Mon Sep 17 00:00:00 2001 From: Felipe Magno de Almeida Date: Wed, 2 Oct 2019 09:55:24 +0200 Subject: [PATCH 04/29] elementary: Add documentatio to efl_ui_layout_factory.eo Summary: Documentation was very sparse and actually empty in some places. Add proper documentation Related to T7717 Reviewers: woohyun, cedric, SanghyeonLee, lauromoura, brunobelo, myoungwoon, segfaultxavi Reviewed By: segfaultxavi Subscribers: segfaultxavi, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10267 --- src/lib/elementary/efl_ui_layout_factory.eo | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/lib/elementary/efl_ui_layout_factory.eo b/src/lib/elementary/efl_ui_layout_factory.eo index ac15fcc73d..4640004bec 100644 --- a/src/lib/elementary/efl_ui_layout_factory.eo +++ b/src/lib/elementary/efl_ui_layout_factory.eo @@ -1,13 +1,24 @@ class @beta Efl.Ui.Layout_Factory extends Efl.Ui.Caching_Factory { - [[Efl Ui Layout Factory class]] + [[@Efl.Ui.Factory that creates @Efl.Ui.Layout objects with caching. + + This factory is meant to be used by @Efl.Ui.View objects that use + items with Layout and need the items to be created, updated, + their model set and connected automatically before the @Efl.Ui.View + receives the item instance. + + This class inherits from @Efl.Ui.Caching_Factory and inherits + all its properties. + ]] methods { theme_config { - [[]] + [[Set the theme that will be applied to the created @Efl.Ui.Layout objects. + See @Efl.Ui.Layout_Base.theme for more details. + ]] params { klass: string; [[The class of the group.]] group: string; [[The group.]] - style: string; [[The style to used.]] + style: string; [[The style to use.]] } } } From 8d37815a73d30d9b8b394c8192e065fbe48d7bb5 Mon Sep 17 00:00:00 2001 From: Stefan Schmidt Date: Wed, 2 Oct 2019 10:18:16 +0200 Subject: [PATCH 05/29] docs: enable compression for tar file and avoid file name clash Summary: While the target name implies a compression we only ever put this all into a tar archive so far. Using xz compression as we do with our source archives. Also adjust the file naming to avoid clashing with the source tarballs. We used -doc with autotools before, so this is really more of a catchup. Reviewers: bu5hm4n, segfaultxavi Reviewed By: segfaultxavi Subscribers: ProhtMeyhet, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10266 --- doc/meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/meson.build b/doc/meson.build index 11e80dfadc..068554f87b 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -182,8 +182,8 @@ doc_target += custom_target('doxygen', ) compress_target = custom_target('package_doc_tar', - command: [tar, '-C', meson.build_root(), '-cf', 'efl-'+meson.project_version()+'.tar', 'html', 'man'], - output: 'efl-'+meson.project_version()+'.tar', + command: [tar, '-C', meson.build_root(), '--xz', '-cf', 'efl-'+meson.project_version()+'-doc.tar.xz', 'html', 'man'], + output: 'efl-'+meson.project_version()+'-doc.tar.xz', depends: doc_target, build_by_default: false ) From f53583a5c91cc0e960d8177555919f168281ac15 Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Wed, 2 Oct 2019 11:31:19 +0200 Subject: [PATCH 06/29] docs: Fix problems with monospaced text Eolian recently added support for $[...] which allows highlighting more than one word in monospaced text. --- src/lib/efl/interfaces/efl_text_markup_util.eo | 16 +++++++--------- src/lib/elementary/efl_ui_average_model.eo | 4 ++-- src/lib/elementary/efl_ui_exact_model.eo | 8 ++++---- src/lib/elementary/efl_ui_homogeneous_model.eo | 14 +++++++------- src/lib/elementary/efl_ui_size_model.eo | 10 +++++----- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/lib/efl/interfaces/efl_text_markup_util.eo b/src/lib/efl/interfaces/efl_text_markup_util.eo index 90d63e10d4..7f83a10272 100644 --- a/src/lib/efl/interfaces/efl_text_markup_util.eo +++ b/src/lib/efl/interfaces/efl_text_markup_util.eo @@ -5,23 +5,21 @@ class @beta Efl.Text_Markup_Util { methods { text_to_markup @static { [[Converts a given (UTF-8) text to a markup-compatible string. - This is used mainly to set a plain text with the $.markup_set - property. + This is used mainly to set a plain text with @Efl.Text_Markup.markup.set. ]] params { - @in text: string; [[The text (UTF-8) to convert to markup]] + @in text: string; [[The text (UTF-8) to convert to markup.]] } - return: mstring @move; [[The markup representation of given text]] + return: mstring @move; [[The markup representation of given text.]] } markup_to_text @static { - [[Converts a given (UTF-8) text to a markup-compatible string. - This is used mainly to set a plain text with the $.markup_set - property. + [[Converts a markup string to a (UTF-8) plain text. + This is used mainly to set a markup text with the @Efl.Text.text.set. ]] params { - @in text: string; [[The markup-text to convert to text (UTF-8)]] + @in text: string; [[The markup-text to convert to text (UTF-8).]] } - return: mstring @move; [[The text representation of given format]] + return: mstring @move; [[The text representation of given markup string.]] } } } diff --git a/src/lib/elementary/efl_ui_average_model.eo b/src/lib/elementary/efl_ui_average_model.eo index 98d97598f8..9c1413995a 100644 --- a/src/lib/elementary/efl_ui_average_model.eo +++ b/src/lib/elementary/efl_ui_average_model.eo @@ -3,10 +3,10 @@ class @beta Efl.Ui.Average_Model extends Efl.Ui.Exact_Model [[Class to be used to store object item size for List/Grid View. This model provide the same feature as @Efl.Ui.Exact_Model except for the - @Efl.Model.property "$total.width" and "$total.height" which reflect an + @Efl.Model.property $["total.width"] and $["total.height"] which reflect an estimated value of the total size by using the currently know size from its children as an average size for all its children. As more children fill - "$self.width" and "$self.height", this model will figure out a more precise + $["self.width"] and $["self.height"], this model will figure out a more precise answer. Once all children size is known, the result will be exact and the same as @Efl.Ui.Exact_Model. diff --git a/src/lib/elementary/efl_ui_exact_model.eo b/src/lib/elementary/efl_ui_exact_model.eo index 691a7504ef..0e63976e54 100644 --- a/src/lib/elementary/efl_ui_exact_model.eo +++ b/src/lib/elementary/efl_ui_exact_model.eo @@ -2,13 +2,13 @@ class @beta Efl.Ui.Exact_Model extends Efl.Ui.Size_Model { [[Class to be used to store object item size for List/Grid View. - This model provide "$total.width" and "$total.height" as an accumulated size of all - its children "$self.width" and "$self.height" @Efl.Model.property. This is currently + This model provide $["total.width"] and $["total.height"] as an accumulated size of all + its children $["self.width"] and $["self.height"] @Efl.Model.property. This is currently assuming a vertical list only. - This model will return an error code EAGAIN for "$item.width" and "$item.height" all + This model will return an error code $EAGAIN for $["item.width"] and $["item.height"] all the time and the View that use this Model should continue to get this value even after - computing all the "$self.width" and "$self.height" of this object children.]] + computing all the $["self.width"] and $["self.height"] of this object children.]] implements { Efl.Object.constructor; diff --git a/src/lib/elementary/efl_ui_homogeneous_model.eo b/src/lib/elementary/efl_ui_homogeneous_model.eo index 996c1ac364..87d38b52b4 100644 --- a/src/lib/elementary/efl_ui_homogeneous_model.eo +++ b/src/lib/elementary/efl_ui_homogeneous_model.eo @@ -2,16 +2,16 @@ class @beta Efl.Ui.Homogeneous_Model extends Efl.Ui.Size_Model { [[Class to be used to store object item size for List/Grid View. - This model provides the properties "$item.width" and "$item.height" which have the - same value for all siblings of this object. The first sibling that defines "$self.width" - and "$self.height" set them for all other siblings and also set "$item.width" and - "$item.height" for the parent (See @Efl.Ui.Size_Model). + This model provides the properties $["item.width"] and $["item.height"] which have the + same value for all siblings of this object. The first sibling that defines $["self.width"] + and $["self.height"] set them for all other siblings and also set $["item.width"] and + $["item.height"] for the parent (See @Efl.Ui.Size_Model). - Subsequent attempts to set "$self.width" or "$self.height" will fail with a + Subsequent attempts to set $["self.width"] or $["self.height"] will fail with a Read Only error code. - The properties "$total.width" and "$total.height" are computed from the number of node, - the "$self.width" and "$self.height" assuming that the View is a vertical list.]] + The properties $["total.width"] and $["total.height"] are computed from the number of node, + the $["self.width"] and $["self.height"] assuming that the View is a vertical list.]] implements { Efl.Object.constructor; diff --git a/src/lib/elementary/efl_ui_size_model.eo b/src/lib/elementary/efl_ui_size_model.eo index 333347d478..a0bf0d1a1d 100644 --- a/src/lib/elementary/efl_ui_size_model.eo +++ b/src/lib/elementary/efl_ui_size_model.eo @@ -2,14 +2,14 @@ class @beta Efl.Ui.Size_Model extends Efl.Composite_Model { [[Class to be used to store object item size for List/Grid View. - This model provide the following properties that can be retrived by + This model provide the following properties that can be retrieved by @Efl.Model.properties.get : - - "$self.width" and "$self.height" define the size of this object from the point of - view of the @Efl.Ui.View that use it. It only apply on children and not on the + - $["self.width"] and $["self.height"] define the size of this object from the point of + view of the @Efl.Ui.View that use it. They only apply to children and not to the top root object. - - "$item.width" and "$item.height" define all the children size and is available + - $["item.width"] and $["item.height"] define all the children size and are available only on @Efl.Ui.Size_Model that do have children. - - "$total.width" and "$total.height" define the accumulated size used by all the children. + - $["total.width"] and $["total.height"] define the accumulated size used by all the children. Only vertical list accumulation logic is implemented at this point.]] data: null; From 7b4a58313b3ab6f8e5610e90c5a1153c7f27b1c5 Mon Sep 17 00:00:00 2001 From: Bruno da Silva Belo Date: Wed, 2 Oct 2019 12:01:25 +0200 Subject: [PATCH 07/29] csharp: More updated docs to 1.23. Summary: eina_config and eina_common updated to 1.23. Reviewers: lauromoura, felipealmeida, segfaultxavi Reviewed By: segfaultxavi Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8293 Differential Revision: https://phab.enlightenment.org/D10263 --- src/bindings/mono/eina_mono/eina_common.cs | 8 +++++++- src/bindings/mono/eina_mono/eina_config.cs | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/bindings/mono/eina_mono/eina_common.cs b/src/bindings/mono/eina_mono/eina_common.cs index 7d97a9142e..d552f75128 100644 --- a/src/bindings/mono/eina_mono/eina_common.cs +++ b/src/bindings/mono/eina_mono/eina_common.cs @@ -41,7 +41,7 @@ internal static class NativeCustomExportFunctions efl_mono_native_efl_unref_addr_get(); } -/// Wrapper around native memory DllImport'd functions +/// Wrapper around native memory DllImport'd functions (SINCE EFL 1.23). public static class MemoryNative { public static void Free(IntPtr ptr) @@ -126,6 +126,9 @@ public static class MemoryNative } } +/// +/// Conversor of raw pointer to a type and type to raw pointer (SINCE EFL 1.23). +/// public static class PrimitiveConversion { public static T PointerToManaged(IntPtr nat) @@ -148,6 +151,9 @@ public static class PrimitiveConversion } } +/// +/// Conversor of string to native string and native string to string.. (SINCE EFL 1.23). +/// public static class StringConversion { public static IntPtr ManagedStringToNativeUtf8Alloc(string managedString) diff --git a/src/bindings/mono/eina_mono/eina_config.cs b/src/bindings/mono/eina_mono/eina_config.cs index 9f3028f62d..3b35b2142f 100644 --- a/src/bindings/mono/eina_mono/eina_config.cs +++ b/src/bindings/mono/eina_mono/eina_config.cs @@ -6,6 +6,9 @@ using System.Runtime.InteropServices; namespace Eina { +/// +/// Manage the initialization and cleanup for eina (SINCE EFL 1.23). +/// public class Config { [DllImport(efl.Libs.Eina)] private static extern int eina_init(); @@ -28,7 +31,7 @@ public class Config /// /// Wrapper class for pointers that need some cleanup afterwards -/// like strings. +/// like strings (SINCE EFL 1.23). /// public class DisposableIntPtr : IDisposable { From fa908800556d8e4be7ce8785e7b88123df89e0a5 Mon Sep 17 00:00:00 2001 From: Yeongjong Lee Date: Wed, 2 Oct 2019 12:04:12 +0200 Subject: [PATCH 08/29] efl_gfx_arrangement: change content_padding param type and remove scalable Summary: This change `content_padding` parameter type to int from double for consistency of size properties. `scalable` should be handled in more common size API. Co-authored-by: Mike Blumenkrantz ref T7864 Test Plan: ninja test Reviewers: zmike Reviewed By: zmike Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7864 Differential Revision: https://phab.enlightenment.org/D10154 --- src/bin/elementary/test_evas_snapshot.c | 2 +- src/bin/elementary/test_gfx_filters.c | 2 +- src/bin/elementary/test_ui_box.c | 10 +++---- src/bin/elementary/test_ui_pager.c | 10 +++---- src/bin/elementary/test_ui_pager_scroll.c | 18 ++++++------- src/bin/elementary/test_ui_relative_layout.c | 14 +++++----- src/bin/elementary/test_ui_spotlight.c | 10 +++---- src/bin/elementary/test_ui_tab_pager.c | 14 +++++----- src/bin/elementary/test_ui_table.c | 10 +++---- .../elementary/table_cxx_example_01.cc | 2 +- .../elementary/table_cxx_example_02.cc | 2 +- src/lib/efl/interfaces/efl_gfx_arrangement.eo | 5 ++-- src/lib/elementary/efl_page_indicator_icon.c | 2 +- src/lib/elementary/efl_ui_box.c | 10 +++---- src/lib/elementary/efl_ui_box_private.h | 3 +-- src/lib/elementary/efl_ui_container_layout.c | 6 +---- src/lib/elementary/efl_ui_container_layout.h | 3 +-- .../efl_ui_spotlight_indicator_icon.c | 2 +- src/lib/elementary/efl_ui_table.c | 10 +++---- src/lib/elementary/efl_ui_table_private.h | 3 +-- src/lib/elementary/efl_ui_tags.c | 16 ++++++------ src/tests/elementary/efl_ui_test_box.c | 24 ++++++----------- src/tests/elementary/efl_ui_test_table.c | 26 +++++++------------ .../spec/efl_test_gfx_arrangement.c | 15 +++++------ 24 files changed, 92 insertions(+), 127 deletions(-) diff --git a/src/bin/elementary/test_evas_snapshot.c b/src/bin/elementary/test_evas_snapshot.c index f1395f2750..40513bb8c5 100644 --- a/src/bin/elementary/test_evas_snapshot.c +++ b/src/bin/elementary/test_evas_snapshot.c @@ -129,7 +129,7 @@ test_evas_snapshot(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e efl_ui_win_autodel_set(efl_added, 1)); table = efl_add(EFL_UI_TABLE_CLASS, win, - efl_gfx_arrangement_content_padding_set(efl_added, 5, 5, 1)); + efl_gfx_arrangement_content_padding_set(efl_added, 5, 5)); efl_content_set(win, table); // Objects below the snapshot diff --git a/src/bin/elementary/test_gfx_filters.c b/src/bin/elementary/test_gfx_filters.c index 4cd521430f..35360b61b6 100644 --- a/src/bin/elementary/test_gfx_filters.c +++ b/src/bin/elementary/test_gfx_filters.c @@ -387,7 +387,7 @@ test_gfx_filters(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *eve efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), efl_gfx_hint_weight_set(efl_added, 1.0, 0.0), efl_gfx_hint_fill_set(efl_added, EINA_TRUE, EINA_FALSE), - efl_gfx_arrangement_content_padding_set(efl_added, 5, 5, 1), + efl_gfx_arrangement_content_padding_set(efl_added, 5, 5), efl_gfx_hint_margin_set(efl_added, 5, 5, 5, 5), efl_gfx_arrangement_content_align_set(efl_added, 0, 0.5)); efl_pack(box, box2); diff --git a/src/bin/elementary/test_ui_box.c b/src/bin/elementary/test_ui_box.c index 8b2e8ef2d8..57dc98bd6f 100644 --- a/src/bin/elementary/test_ui_box.c +++ b/src/bin/elementary/test_ui_box.c @@ -72,11 +72,11 @@ user_min_slider_cb(void *data EINA_UNUSED, const Efl_Event *event) static void padding_slider_cb(void *data, const Efl_Event *event) { - int val = elm_slider_value_get(event->object); + unsigned int val = lround(elm_slider_value_get(event->object)); Eo *win = data, *box; box = efl_key_wref_get(win, "box"); - efl_gfx_arrangement_content_padding_set(box, val, val, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(box, val, val); } static void @@ -240,7 +240,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in vbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL)); - efl_gfx_arrangement_content_padding_set(vbox, 10, 10, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(vbox, 10, 10); efl_gfx_hint_margin_set(vbox, 5, 5, 5, 5); elm_win_resize_object_add(win, vbox); @@ -256,7 +256,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in hbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); efl_content_set(f, hbox); - efl_gfx_arrangement_content_padding_set(hbox, 10, 0, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(hbox, 10, 0); /* weights radio group */ @@ -533,7 +533,7 @@ test_ui_box(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in bx = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); efl_key_wref_set(win, "box", bx); - efl_gfx_arrangement_content_padding_set(bx, 10, 10, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(bx, 10, 10); efl_gfx_hint_align_set(bx, 0.5, 0.5); efl_gfx_hint_weight_set(bx, 1, 1); efl_content_set(f, bx); diff --git a/src/bin/elementary/test_ui_pager.c b/src/bin/elementary/test_ui_pager.c index e0df202244..34792f3832 100644 --- a/src/bin/elementary/test_ui_pager.c +++ b/src/bin/elementary/test_ui_pager.c @@ -443,12 +443,12 @@ static void pack_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Pack", btn, NULL, efl_added, NULL)); in_box1 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp1 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box1, @@ -458,7 +458,7 @@ static void pack_cb(void *data, efl_ui_pager_current_page_get(pager))); in_box2 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp2 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box2); @@ -628,7 +628,7 @@ static void current_page_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Current Page", btn, NULL, efl_added, NULL)); @@ -674,7 +674,7 @@ static void indicator_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Indicator", btn, NULL, efl_added, NULL)); diff --git a/src/bin/elementary/test_ui_pager_scroll.c b/src/bin/elementary/test_ui_pager_scroll.c index b6548a4b88..c60ac486b2 100644 --- a/src/bin/elementary/test_ui_pager_scroll.c +++ b/src/bin/elementary/test_ui_pager_scroll.c @@ -495,7 +495,7 @@ static void padding_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Padding Size", btn, NULL, efl_added, NULL)); @@ -522,7 +522,7 @@ static void side_page_num_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Side Page Num", btn, NULL, efl_added, NULL)); @@ -555,12 +555,12 @@ static void pack_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Pack", btn, NULL, efl_added, NULL)); in_box1 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp1 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box1, @@ -570,7 +570,7 @@ static void pack_cb(void *data, efl_ui_pager_current_page_get(pager))); in_box2 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp2 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box2); @@ -739,7 +739,7 @@ static void current_page_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Current Page", btn, NULL, efl_added, NULL)); @@ -787,7 +787,7 @@ static void scroll_block_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Scroll Block", btn, NULL, efl_added, NULL)); @@ -826,7 +826,7 @@ static void loop_cb(void *data EINA_UNUSED, back_btn_cb, navi)); box = efl_add(EFL_UI_RADIO_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Loop", btn, NULL, efl_added, NULL)); @@ -874,7 +874,7 @@ static void indicator_cb(void *data EINA_UNUSED, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Indicator", btn, NULL, efl_added, NULL)); diff --git a/src/bin/elementary/test_ui_relative_layout.c b/src/bin/elementary/test_ui_relative_layout.c index 426d471c06..40d9891725 100644 --- a/src/bin/elementary/test_ui_relative_layout.c +++ b/src/bin/elementary/test_ui_relative_layout.c @@ -150,7 +150,7 @@ _setter_add(Eo *vbox, Eo *btn, Options option) hbox = efl_add(EFL_UI_BOX_CLASS, vbox, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), - efl_gfx_arrangement_content_padding_set(efl_added, 2, 2, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 2, 2), efl_pack(vbox, efl_added)); efl_add(EFL_UI_TEXT_CLASS, hbox, @@ -192,13 +192,13 @@ _button_frame_add(Eo *box, Eo *btn) vbox = efl_add(EFL_UI_BOX_CLASS, f, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL), - efl_gfx_arrangement_content_padding_set(efl_added, 2, 2, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 2, 2), efl_gfx_hint_margin_set(efl_added, 2, 2, 2, 2), efl_content_set(f, efl_added)); hbox = efl_add(EFL_UI_BOX_CLASS, vbox, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), - efl_gfx_arrangement_content_padding_set(efl_added, 2, 2, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 2, 2), efl_pack(vbox, efl_added)); efl_add(EFL_CANVAS_RECTANGLE_CLASS, hbox, @@ -231,7 +231,7 @@ _button_frame_add(Eo *box, Eo *btn) hbox = efl_add(EFL_UI_BOX_CLASS, vbox, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), - efl_gfx_arrangement_content_padding_set(efl_added, 2, 2, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 2, 2), efl_pack(vbox, efl_added)); efl_add(EFL_UI_TEXT_CLASS, hbox, @@ -251,7 +251,7 @@ _button_frame_add(Eo *box, Eo *btn) hbox = efl_add(EFL_UI_BOX_CLASS, vbox, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), - efl_gfx_arrangement_content_padding_set(efl_added, 2, 2, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 2, 2), efl_pack(vbox, efl_added)); efl_add(EFL_UI_TEXT_CLASS, hbox, @@ -281,7 +281,7 @@ test_ui_relative_layout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo vbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL), - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_gfx_hint_margin_set(efl_added, 5, 5, 5, 5), efl_content_set(win, efl_added)); @@ -293,7 +293,7 @@ test_ui_relative_layout(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo hbox = efl_add(EFL_UI_BOX_CLASS, f, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), - efl_gfx_arrangement_content_padding_set(efl_added, 10, 0, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 0), efl_content_set(f, efl_added)); /* contents */ diff --git a/src/bin/elementary/test_ui_spotlight.c b/src/bin/elementary/test_ui_spotlight.c index 384da6e751..a41ab69be5 100644 --- a/src/bin/elementary/test_ui_spotlight.c +++ b/src/bin/elementary/test_ui_spotlight.c @@ -594,12 +594,12 @@ pack_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Pack", btn, NULL, efl_added, NULL)); in_box1 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp1 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box1); @@ -611,7 +611,7 @@ pack_cb(void *data, efl_ui_range_value_set(sp1, num); in_box2 = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); sp2 = efl_add(EFL_UI_SPIN_BUTTON_CLASS, in_box2); @@ -781,7 +781,7 @@ active_index_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Active Index", btn, NULL, efl_added, NULL)); @@ -828,7 +828,7 @@ indicator_cb(void *data, back_btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Indicator", btn, NULL, efl_added, NULL)); diff --git a/src/bin/elementary/test_ui_tab_pager.c b/src/bin/elementary/test_ui_tab_pager.c index 1f35bf01a8..62e4e7df09 100644 --- a/src/bin/elementary/test_ui_tab_pager.c +++ b/src/bin/elementary/test_ui_tab_pager.c @@ -200,7 +200,7 @@ _current_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Current", btn, NULL, efl_added, NULL)); sp = efl_add(EFL_UI_SPIN_BUTTON_CLASS, box, @@ -301,7 +301,7 @@ _pack_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Pack", btn, NULL, efl_added, NULL)); /* Pack Begin */ @@ -329,7 +329,7 @@ _pack_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_pack_end(box, efl_added)); in_box = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), efl_pack_end(box, efl_added)); @@ -406,7 +406,7 @@ _unpack_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Unpack", btn, NULL, efl_added, NULL)); /* Clear */ @@ -430,7 +430,7 @@ _unpack_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_pack_end(box, efl_added)); in_box = efl_add(EFL_UI_BOX_CLASS, box, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL), efl_pack_end(box, efl_added)); @@ -500,7 +500,7 @@ _tab_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Tab", btn, NULL, efl_added, NULL)); label_check = efl_add(EFL_UI_CHECK_CLASS, box); @@ -560,7 +560,7 @@ _transition_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) efl_event_callback_add(efl_added, EFL_INPUT_EVENT_CLICKED, _btn_cb, navi)); box = efl_add(EFL_UI_BOX_CLASS, navi, - efl_gfx_arrangement_content_padding_set(efl_added, 10, 10, EINA_TRUE), + efl_gfx_arrangement_content_padding_set(efl_added, 10, 10), elm_naviframe_item_push(navi, "Transition", btn, NULL, efl_added, NULL)); btn = efl_add(EFL_UI_BUTTON_CLASS, box, diff --git a/src/bin/elementary/test_ui_table.c b/src/bin/elementary/test_ui_table.c index 67f7067657..bc448bf9b5 100644 --- a/src/bin/elementary/test_ui_table.c +++ b/src/bin/elementary/test_ui_table.c @@ -79,7 +79,7 @@ static void padding_slider_cb(void *data, const Efl_Event *event) { int val = elm_slider_value_get(event->object); - efl_gfx_arrangement_content_padding_set(data, val, val, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(data, val, val); } static void @@ -201,7 +201,7 @@ test_ui_table(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_ vbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL)); - efl_gfx_arrangement_content_padding_set(vbox, 10, 10, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(vbox, 10, 10); efl_gfx_hint_weight_set(vbox, 1, 1); efl_gfx_hint_margin_set(vbox, 5, 5, 5, 5); elm_win_resize_object_add(win, vbox); @@ -222,7 +222,7 @@ test_ui_table(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_ hbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); elm_object_content_set(f, hbox); - efl_gfx_arrangement_content_padding_set(hbox, 10, 0, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(hbox, 10, 0); /* weights radio group */ @@ -570,7 +570,7 @@ test_ui_table_linear(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_VERTICAL)); - efl_gfx_arrangement_content_padding_set(vbox, 10, 10, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(vbox, 10, 10); efl_gfx_hint_margin_set(vbox, 5, 5, 5, 5); elm_win_resize_object_add(win, vbox); efl_gfx_entity_visible_set(vbox, 1); @@ -591,7 +591,7 @@ test_ui_table_linear(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, hbox = efl_add(EFL_UI_BOX_CLASS, win, efl_ui_layout_orientation_set(efl_added, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL)); elm_object_content_set(f, hbox); - efl_gfx_arrangement_content_padding_set(hbox, 5, 0, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(hbox, 5, 0); efl_gfx_entity_visible_set(hbox, 1); ico = elm_icon_add(win); diff --git a/src/examples/elementary/table_cxx_example_01.cc b/src/examples/elementary/table_cxx_example_01.cc index 11e97b589f..f96bf8291b 100644 --- a/src/examples/elementary/table_cxx_example_01.cc +++ b/src/examples/elementary/table_cxx_example_01.cc @@ -15,7 +15,7 @@ efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) efl::ui::Table table(instantiate, win); win.content_set(table); - table.content_padding_set(5, 5, true); + table.content_padding_set(5, 5); // FIXME // table.homogeneous_set(true); diff --git a/src/examples/elementary/table_cxx_example_02.cc b/src/examples/elementary/table_cxx_example_02.cc index f0ca35e76d..0fe8cf0b6f 100644 --- a/src/examples/elementary/table_cxx_example_02.cc +++ b/src/examples/elementary/table_cxx_example_02.cc @@ -16,7 +16,7 @@ efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED) efl::ui::Table table(instantiate, win); win.content_set(table); - table.content_padding_set(5, 5, true); + table.content_padding_set(5, 5); efl::canvas::Rectangle rect(instantiate, win); rect.color_set(255, 0, 0, 255); diff --git a/src/lib/efl/interfaces/efl_gfx_arrangement.eo b/src/lib/efl/interfaces/efl_gfx_arrangement.eo index 00f3fe4281..9a3cc4a444 100644 --- a/src/lib/efl/interfaces/efl_gfx_arrangement.eo +++ b/src/lib/efl/interfaces/efl_gfx_arrangement.eo @@ -40,9 +40,8 @@ interface @beta Efl.Gfx.Arrangement set {} get {} values { - pad_horiz: double(0.0); [[Horizontal padding.]] - pad_vert: double(0.0); [[Vertical padding.]] - scalable: bool(false); [[$true if scalable.]] + pad_horiz: uint(0u); [[Horizontal padding.]] + pad_vert: uint(0u); [[Vertical padding.]] } } } diff --git a/src/lib/elementary/efl_page_indicator_icon.c b/src/lib/elementary/efl_page_indicator_icon.c index 258b494e0f..4a13db3d05 100644 --- a/src/lib/elementary/efl_page_indicator_icon.c +++ b/src/lib/elementary/efl_page_indicator_icon.c @@ -148,7 +148,7 @@ _efl_page_indicator_icon_efl_page_indicator_bind(Eo *obj, if (spd->pager.obj) { efl_ui_layout_orientation_set(spd->idbox, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL); - efl_gfx_arrangement_content_padding_set(spd->idbox, 15, 15, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(spd->idbox, 15, 15); pd->v = eina_value_float_new(0.0); diff --git a/src/lib/elementary/efl_ui_box.c b/src/lib/elementary/efl_ui_box.c index 3cee95ccab..7d97ec3f85 100644 --- a/src/lib/elementary/efl_ui_box.c +++ b/src/lib/elementary/efl_ui_box.c @@ -406,27 +406,23 @@ _efl_ui_box_efl_ui_layout_orientable_orientation_get(const Eo *obj EINA_UNUSED, } EOLIAN static void -_efl_ui_box_efl_gfx_arrangement_content_padding_set(Eo *obj, Efl_Ui_Box_Data *pd, double h, double v, Eina_Bool scalable) +_efl_ui_box_efl_gfx_arrangement_content_padding_set(Eo *obj, Efl_Ui_Box_Data *pd, unsigned int h, unsigned int v) { - scalable = !!scalable; if (h < 0) h = 0; if (v < 0) v = 0; - if (EINA_DBL_EQ(pd->pad.h, h) && EINA_DBL_EQ(pd->pad.v, v) && - (pd->pad.scalable == scalable)) + if (EINA_DBL_EQ(pd->pad.h, h) && EINA_DBL_EQ(pd->pad.v, v)) return; pd->pad.h = h; pd->pad.v = v; - pd->pad.scalable = scalable; efl_pack_layout_request(obj); } EOLIAN static void -_efl_ui_box_efl_gfx_arrangement_content_padding_get(const Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd, double *h, double *v, Eina_Bool *scalable) +_efl_ui_box_efl_gfx_arrangement_content_padding_get(const Eo *obj EINA_UNUSED, Efl_Ui_Box_Data *pd, unsigned int *h, unsigned int *v) { - if (scalable) *scalable = pd->pad.scalable; if (h) *h = pd->pad.h; if (v) *v = pd->pad.v; } diff --git a/src/lib/elementary/efl_ui_box_private.h b/src/lib/elementary/efl_ui_box_private.h index 4cb94c5d8f..bc9fca1d47 100644 --- a/src/lib/elementary/efl_ui_box_private.h +++ b/src/lib/elementary/efl_ui_box_private.h @@ -19,8 +19,7 @@ struct _Efl_Ui_Box_Data Eina_List *children; struct { - double h, v; - Eina_Bool scalable: 1; + unsigned int h, v; } pad; struct { diff --git a/src/lib/elementary/efl_ui_container_layout.c b/src/lib/elementary/efl_ui_container_layout.c index 34a8bbb49b..60bdaa8d5b 100644 --- a/src/lib/elementary/efl_ui_container_layout.c +++ b/src/lib/elementary/efl_ui_container_layout.c @@ -111,16 +111,12 @@ void _efl_ui_container_layout_init(Eo* obj, Efl_Ui_Container_Layout_Calc *calc) { Eina_Rect geom; - Eina_Bool pad_scalable; geom = efl_gfx_entity_geometry_get(obj); efl_gfx_hint_margin_get(obj, &calc[0].margin[0], &calc[0].margin[1], &calc[1].margin[0], &calc[1].margin[1]); - calc[0].scale = calc[1].scale = efl_gfx_entity_scale_get(obj); - efl_gfx_arrangement_content_padding_get(obj, &calc[0].pad, &calc[1].pad, &pad_scalable); - calc[0].pad = pad_scalable ? (calc[0].pad * calc[0].scale) : calc[0].pad; - calc[1].pad = pad_scalable ? (calc[1].pad * calc[1].scale) : calc[1].pad; + efl_gfx_arrangement_content_padding_get(obj, &calc[0].pad, &calc[1].pad); // pack align is used if "no item has a weight" efl_gfx_arrangement_content_align_get(obj, &calc[0].align, &calc[1].align); diff --git a/src/lib/elementary/efl_ui_container_layout.h b/src/lib/elementary/efl_ui_container_layout.h index 097abee13b..031dd30190 100644 --- a/src/lib/elementary/efl_ui_container_layout.h +++ b/src/lib/elementary/efl_ui_container_layout.h @@ -30,8 +30,7 @@ struct _Efl_Ui_Container_Layout_Calc int size; int margin[2]; double align; - double scale; - double pad; + unsigned int pad; Eina_Bool fill : 1; }; diff --git a/src/lib/elementary/efl_ui_spotlight_indicator_icon.c b/src/lib/elementary/efl_ui_spotlight_indicator_icon.c index 2165ec94f7..c7bc2a31de 100644 --- a/src/lib/elementary/efl_ui_spotlight_indicator_icon.c +++ b/src/lib/elementary/efl_ui_spotlight_indicator_icon.c @@ -81,7 +81,7 @@ _efl_ui_spotlight_indicator_icon_efl_ui_spotlight_indicator_bind(Eo *obj, Efl_Ui efl_content_set(efl_part(pd->container, "efl.indicator"), pd->indicator); efl_gfx_entity_visible_set(pd->indicator, EINA_TRUE); efl_ui_layout_orientation_set(pd->indicator, EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL); - efl_gfx_arrangement_content_padding_set(pd->indicator, 15, 15, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(pd->indicator, 15, 15); for (int i = 0; i < efl_content_count(pd->container); ++i) { diff --git a/src/lib/elementary/efl_ui_table.c b/src/lib/elementary/efl_ui_table.c index 865fc76577..9e70116953 100644 --- a/src/lib/elementary/efl_ui_table.c +++ b/src/lib/elementary/efl_ui_table.c @@ -267,27 +267,23 @@ _efl_ui_table_efl_object_invalidate(Eo *obj, Efl_Ui_Table_Data *pd) } EOLIAN static void -_efl_ui_table_efl_gfx_arrangement_content_padding_set(Eo *obj, Efl_Ui_Table_Data *pd, double h, double v, Eina_Bool scalable) +_efl_ui_table_efl_gfx_arrangement_content_padding_set(Eo *obj, Efl_Ui_Table_Data *pd, unsigned int h, unsigned int v) { - scalable = !!scalable; if (h < 0) h = 0; if (v < 0) v = 0; - if (EINA_DBL_EQ(pd->pad.h, h) && EINA_DBL_EQ(pd->pad.v, v) && - (pd->pad.scalable == scalable)) + if (EINA_DBL_EQ(pd->pad.h, h) && EINA_DBL_EQ(pd->pad.v, v)) return; pd->pad.h = h; pd->pad.v = v; - pd->pad.scalable = scalable; efl_pack_layout_request(obj); } EOLIAN static void -_efl_ui_table_efl_gfx_arrangement_content_padding_get(const Eo *obj EINA_UNUSED, Efl_Ui_Table_Data *pd, double *h, double *v, Eina_Bool *scalable) +_efl_ui_table_efl_gfx_arrangement_content_padding_get(const Eo *obj EINA_UNUSED, Efl_Ui_Table_Data *pd, unsigned int *h, unsigned int *v) { - if (scalable) *scalable = pd->pad.scalable; if (h) *h = pd->pad.h; if (v) *v = pd->pad.v; } diff --git a/src/lib/elementary/efl_ui_table_private.h b/src/lib/elementary/efl_ui_table_private.h index 47d1cc4cb7..5b24e046fb 100644 --- a/src/lib/elementary/efl_ui_table_private.h +++ b/src/lib/elementary/efl_ui_table_private.h @@ -38,8 +38,7 @@ struct _Efl_Ui_Table_Data int last_col, last_row; // only used by pack api Efl_Ui_Layout_Orientation fill_dir; // direction in which cells are added when using pack() struct { - double h, v; - Eina_Bool scalable: 1; + unsigned int h, v; } pad; struct { double h, v; diff --git a/src/lib/elementary/efl_ui_tags.c b/src/lib/elementary/efl_ui_tags.c index b06e4a512f..2a8fb8417a 100644 --- a/src/lib/elementary/efl_ui_tags.c +++ b/src/lib/elementary/efl_ui_tags.c @@ -50,10 +50,10 @@ _shrink_mode_set(Eo *obj, if (shrink == EINA_TRUE) { Evas_Coord w = 0; - double box_inner_item_width_padding = 0; + unsigned int box_inner_item_width_padding = 0; Eina_Value val; - efl_gfx_arrangement_content_padding_get(sd->box, &box_inner_item_width_padding, NULL, NULL); + efl_gfx_arrangement_content_padding_get(sd->box, &box_inner_item_width_padding, NULL); // unpack all items and entry efl_pack_unpack_all(sd->box); EINA_LIST_FOREACH(sd->layouts, l, layout) @@ -69,7 +69,7 @@ _shrink_mode_set(Eo *obj, Eina_Size2D label_min = efl_gfx_hint_size_combined_min_get(sd->label); w -= label_min.w; - w -= box_inner_item_width_padding; + w -= (Evas_Coord)box_inner_item_width_padding; } layout = NULL; @@ -487,14 +487,14 @@ _box_resize_cb(void *data, Eina_Rect r; Eina_List *l; Eo *layout; - double hpad; + unsigned int hpad; Efl_Ui_Tags_Data *sd = efl_data_scope_get(data, EFL_UI_TAGS_CLASS); r = efl_gfx_entity_geometry_get(sd->box); if ((r.w <= elm_config_finger_size_get()) || (r.h <= elm_config_finger_size_get())) return; - efl_gfx_arrangement_content_padding_get(obj, &hpad, NULL, NULL); + efl_gfx_arrangement_content_padding_get(obj, &hpad, NULL); if (sd->h_box < r.h) efl_event_callback_call @@ -511,9 +511,9 @@ _box_resize_cb(void *data, min = efl_gfx_hint_size_combined_min_get(layout); - if (min.w > r.w - hpad) + if (min.w > r.w - (int)hpad) { - min.w = r.w - hpad; + min.w = r.w - (int)hpad; efl_gfx_hint_size_min_set(layout, EINA_SIZE2D(min.w, min.h)); efl_gfx_entity_size_set(layout, EINA_SIZE2D(min.w, min.h)); } @@ -746,7 +746,7 @@ _view_init(Evas_Object *obj, Efl_Ui_Tags_Data *sd) if (str) hpad = atoi(str); str = elm_layout_data_get(obj, "vertical_pad"); if (str) vpad = atoi(str); - efl_gfx_arrangement_content_padding_set(sd->box, hpad, vpad, EINA_TRUE); + efl_gfx_arrangement_content_padding_set(sd->box, hpad, vpad); efl_content_set(efl_part(obj, "efl.box"), sd->box); diff --git a/src/tests/elementary/efl_ui_test_box.c b/src/tests/elementary/efl_ui_test_box.c index 63760b6081..64133cdb8d 100644 --- a/src/tests/elementary/efl_ui_test_box.c +++ b/src/tests/elementary/efl_ui_test_box.c @@ -504,7 +504,7 @@ EFL_END_TEST EFL_START_TEST (efl_ui_box_properties) { double h, v; - Eina_Bool b; + unsigned int ph, pv; //align test efl_gfx_arrangement_content_align_get(layout, &h, &v); @@ -522,22 +522,14 @@ EFL_START_TEST (efl_ui_box_properties) ck_assert(EINA_DBL_EQ(v, 1)); //padding test - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0.0)); - ck_assert(EINA_DBL_EQ(v, 0.0)); - ck_assert_int_eq(b, 0); + efl_gfx_arrangement_content_padding_get(layout, &ph, &pv); + ck_assert_int_eq(ph, 0.0); + ck_assert_int_eq(pv, 0.0); - efl_gfx_arrangement_content_padding_set(layout, 0.3, 0.8234, 1); - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0.3)); - ck_assert(EINA_DBL_EQ(v, 0.8234)); - ck_assert_int_eq(b, 1); - - efl_gfx_arrangement_content_padding_set(layout, -1.23, 123, 45); - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0)); - ck_assert(EINA_DBL_EQ(v, 123)); - ck_assert_int_eq(b, 1); + efl_gfx_arrangement_content_padding_set(layout, 3, 8234); + efl_gfx_arrangement_content_padding_get(layout, &ph, &pv); + ck_assert_int_eq(ph, 3); + ck_assert_int_eq(pv, 8234); //direction test ck_assert_int_eq(efl_ui_layout_orientation_get(layout), EFL_UI_LAYOUT_ORIENTATION_VERTICAL); diff --git a/src/tests/elementary/efl_ui_test_table.c b/src/tests/elementary/efl_ui_test_table.c index bafe072118..0f7c2365c0 100644 --- a/src/tests/elementary/efl_ui_test_table.c +++ b/src/tests/elementary/efl_ui_test_table.c @@ -332,7 +332,7 @@ EFL_START_TEST (efl_ui_table_layout_update_matrix) efl_gfx_hint_margin_set(layout, 10, 10, 20, 20); efl_ui_table_homogeneous_set(layout, 0, 1); - efl_gfx_arrangement_content_padding_set(layout, 10, 5, 0); + efl_gfx_arrangement_content_padding_set(layout, 10, 5); for (i = 0; i < 3; i++) { @@ -477,7 +477,7 @@ EFL_END_TEST EFL_START_TEST (efl_ui_table_properties) { double h, v; - Eina_Bool b; + unsigned int ph, pv; Eina_Bool homogeneoush, homogeneousv; //align test @@ -496,22 +496,14 @@ EFL_START_TEST (efl_ui_table_properties) ck_assert(EINA_DBL_EQ(v, 1)); //padding test - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0.0)); - ck_assert(EINA_DBL_EQ(v, 0.0)); - ck_assert_int_eq(b, 0); + efl_gfx_arrangement_content_padding_get(layout, &ph, &pv); + ck_assert_int_eq(ph, 0); + ck_assert_int_eq(pv, 0); - efl_gfx_arrangement_content_padding_set(layout, 0.3, 0.8234, 1); - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0.3)); - ck_assert(EINA_DBL_EQ(v, 0.8234)); - ck_assert_int_eq(b, 1); - - efl_gfx_arrangement_content_padding_set(layout, -1.23, 123, 45); - efl_gfx_arrangement_content_padding_get(layout, &h, &v, &b); - ck_assert(EINA_DBL_EQ(h, 0)); - ck_assert(EINA_DBL_EQ(v, 123)); - ck_assert_int_eq(b, 1); + efl_gfx_arrangement_content_padding_set(layout, 3, 8234); + efl_gfx_arrangement_content_padding_get(layout, &ph, &pv); + ck_assert_int_eq(ph, 3); + ck_assert_int_eq(pv, 8234); //direction test ck_assert_int_eq(efl_ui_layout_orientation_get(layout), EFL_UI_LAYOUT_ORIENTATION_HORIZONTAL); diff --git a/src/tests/elementary/spec/efl_test_gfx_arrangement.c b/src/tests/elementary/spec/efl_test_gfx_arrangement.c index ba213a51b7..7c0367b147 100644 --- a/src/tests/elementary/spec/efl_test_gfx_arrangement.c +++ b/src/tests/elementary/spec/efl_test_gfx_arrangement.c @@ -35,20 +35,17 @@ EFL_END_TEST EFL_START_TEST(pack_padding) { -#define TUPLE_CHECK(H, V, rh, rv, S, rs) \ +#define TUPLE_CHECK(H, V, rh, rv) \ do { \ - double v, h; \ - Eina_Bool r; \ - efl_gfx_arrangement_content_padding_set(widget, H, V, S); \ - efl_gfx_arrangement_content_padding_get(widget, &h, &v, &r); \ + unsigned int v, h; \ + efl_gfx_arrangement_content_padding_set(widget, H, V); \ + efl_gfx_arrangement_content_padding_get(widget, &h, &v); \ ck_assert(v == rv); \ ck_assert(h == rh); \ - ck_assert_int_eq(r, S); \ } while(0); - TUPLE_CHECK( 0.0, 0.0, 0.0, 0.0, EINA_TRUE, EINA_TRUE); - TUPLE_CHECK( -1.0, -123.0, 0.0, 0.0, EINA_FALSE, EINA_FALSE); - TUPLE_CHECK( -1.0, 123.0, 0.0, 123.0, EINA_FALSE, EINA_FALSE); + TUPLE_CHECK( 0, 0, 0, 0); + TUPLE_CHECK( 1, 123, 1, 123); #undef TUPLE_CHECK } EFL_END_TEST From 1d27c9d2e4c528cfd7633d74e10d5d1480fb1b6c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 2 Oct 2019 12:13:10 +0200 Subject: [PATCH 09/29] edje/edit: add api for checking 'required' property of parts Summary: this is useful for verifying api compliance Reviewers: cedric Reviewed By: cedric Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10055 --- src/lib/edje/Edje_Edit.h | 11 +++++++++++ src/lib/edje/edje_edit.c | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/src/lib/edje/Edje_Edit.h b/src/lib/edje/Edje_Edit.h index 3803a64d0d..b08a85246d 100644 --- a/src/lib/edje/Edje_Edit.h +++ b/src/lib/edje/Edje_Edit.h @@ -1878,6 +1878,17 @@ EAPI Eina_Bool edje_edit_part_mouse_events_get(Evas_Object *obj, const char *par */ EAPI Eina_Bool edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, Eina_Bool mouse_events); +/** + * @brief Gets required value for part. + * + * @param obj Object being edited. + * @param part Part to get if the part is required by API. + * + * @return @c EINA_TRUE if part is required by the object's implementation, @c EINA_FALSE otherwise. + * @since 1.23 + */ +EAPI Eina_Bool edje_edit_part_required_get(Evas_Object *obj, const char *part); + /** * @brief Gets anti-aliasing for part. * diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c index ef58e91511..1aa5eb8633 100644 --- a/src/lib/edje/edje_edit.c +++ b/src/lib/edje/edje_edit.c @@ -3873,6 +3873,13 @@ edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, Eina_Bool mo return EINA_TRUE; } +EAPI Eina_Bool +edje_edit_part_required_get(Evas_Object *obj, const char *part) +{ + GET_RP_OR_RETURN(EINA_FALSE); + return rp->part->required; +} + EAPI Eina_Bool edje_edit_part_anti_alias_get(Evas_Object *obj, const char *part) { From 5e5aac50065abfd12da8bd90fa1b8dec5e86aea7 Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Wed, 2 Oct 2019 16:37:33 +0200 Subject: [PATCH 10/29] evas: silence compiler warning in textblock Uninitialized variable. --- src/lib/evas/canvas/evas_object_textblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 82c66e3c0d..1ec71f2f53 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -9737,7 +9737,7 @@ _evas_textblock_cursor_cluster_pos_get(Evas_Textblock_Cursor *cur, Eina_Bool inc Evas_Text_Props_Info *info = ti->text_props.info; int it_index = ((inc) ? cur->pos : ret) - last_it->text_pos; - Evas_Font_OT_Info ot; + Evas_Font_OT_Info ot = {0}; if (ti->text_props.len != ti->text_props.text_len)/*if code point count same as glyph count skip it*/ { Evas_BiDi_Direction itdir = ti->text_props.bidi_dir; From 0d48cb46d45184608bbbbafa298f0f719e35688f Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Wed, 2 Oct 2019 17:05:36 +0200 Subject: [PATCH 11/29] elm: add basics test to create a destroy *every* widget with errors Summary: this simply creates packs, resizes, and destroys every single widget that we have in legacy elm. This i made to ensure that there are no mistakes in the construction chain. Additionally, a second test case checks that creation with none elm parents is erroring but not failing, this seems weird, but we have provided that in the past, so we should continue providing this. Reviewers: zmike, segfaultxavi Reviewed By: zmike, segfaultxavi Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10088 --- src/tests/elementary/elm_suite.c | 1 + src/tests/elementary/elm_suite.h | 1 + src/tests/elementary/elm_test_widget_basics.c | 137 ++++++++++++++++++ src/tests/elementary/meson.build | 3 +- 4 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 src/tests/elementary/elm_test_widget_basics.c diff --git a/src/tests/elementary/elm_suite.c b/src/tests/elementary/elm_suite.c index 87fac6e4e1..d6aa4636e8 100644 --- a/src/tests/elementary/elm_suite.c +++ b/src/tests/elementary/elm_suite.c @@ -86,6 +86,7 @@ static const Efl_Test_Case etc[] = { { "elm_code_widget_selection", elm_code_test_widget_selection }, { "elm_code_widget_undo", elm_code_test_widget_undo }, { "elm_widget_focus", elm_test_widget_focus}, + { "elm_widget_basics", elm_test_widget_basics}, { NULL, NULL } }; diff --git a/src/tests/elementary/elm_suite.h b/src/tests/elementary/elm_suite.h index ba76b29615..67f5d0d5c4 100644 --- a/src/tests/elementary/elm_suite.h +++ b/src/tests/elementary/elm_suite.h @@ -84,6 +84,7 @@ void elm_test_slideshow(TCase *tc); void elm_test_spinner(TCase *tc); void elm_test_plug(TCase *tc); void elm_test_widget_focus(TCase *tc); +void elm_test_widget_basics(TCase *tc); void elm_code_file_test_load(TCase *tc); void elm_code_file_test_memory(TCase *tc); diff --git a/src/tests/elementary/elm_test_widget_basics.c b/src/tests/elementary/elm_test_widget_basics.c new file mode 100644 index 0000000000..12f439d0b3 --- /dev/null +++ b/src/tests/elementary/elm_test_widget_basics.c @@ -0,0 +1,137 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include +#include "elm_suite.h" + +typedef struct _Simple_Test_Widget +{ + Evas_Object* (*constructor)(Evas_Object *win); + const char *name; +} Simple_Test_Widget; + + +static const Simple_Test_Widget simple_widgets[] = { + {elm_flip_add, "flip"}, + {elm_frame_add, "frame"}, + {elm_player_add, "player"}, + {elm_video_add, "video"}, + {elm_ctxpopup_add, "ctxpopup"}, + {elm_fileselector_add, "fileselector"}, + {elm_hoversel_add, "hoversel"}, + {elm_multibuttonentry_add, "multibuttonentry"}, + {elm_naviframe_add, "naviframe"}, + {elm_popup_add, "popup"}, + {elm_actionslider_add, "actionslider"}, + {elm_bg_add, "bg"}, + {elm_box_add, "box"}, + {elm_bubble_add, "bubble"}, + {elm_calendar_add, "calendar"}, + {elm_button_add, "button"}, + {elm_check_add, "check"}, + {elm_clock_add, "clock"}, + {elm_colorselector_add, "colorselector"}, + {elm_conformant_add, "conformant"}, + {elm_dayselector_add, "dayselector"}, + {elm_entry_add, "entry"}, + {elm_flipselector_add, "flipselector"}, + {elm_gengrid_add, "gengrid"}, + {elm_genlist_add, "genlist"}, + {elm_grid_add, "grid"}, + {elm_hover_add, "hover"}, + {elm_icon_add, "icon"}, + {elm_image_add, "image"}, + {elm_index_add, "index"}, + {elm_label_add, "label"}, + {elm_layout_add, "layout"}, + {elm_list_add, "list"}, + {elm_map_add, "map"}, + {elm_mapbuf_add, "mapbuf"}, + {elm_menu_add, "menu"}, + {elm_notify_add, "notify"}, + {elm_panel_add, "panel"}, + {elm_panes_add, "panes"}, + {elm_photo_add, "photo"}, + {elm_photocam_add, "photocam"}, + {elm_plug_add, "plug"}, + {elm_prefs_add, "prefs"}, + {elm_progressbar_add, "progressbar"}, + {elm_radio_add, "radio"}, + {elm_route_add, "route"}, + {elm_separator_add, "seperator"}, + {elm_slider_add, "slider"}, + {elm_slideshow_add, "slideshow"}, + {elm_spinner_add, "spinner"}, + {elm_table_add, "table"}, + {elm_textpath_add, "textpath"}, + {elm_toolbar_add, "toolbar"}, + {elm_web_add, "web"}, + {elm_diskselector_add, "diskselector"}, + {elm_datetime_add, "datetime"}, + //{elm_glview_add, "glview"}, This is causing issues on platforms that do not have gl, like CI, or minimal VMs + //{elm_combobox_add, "button"}, This is a beta widget which was never public and is written in a few ways that break basic assertions of widgets base class + //{elm_thumb_add, "button"}, This dies because of a ethumb bug, where the log domain is not correctly inited + //{elm_systray_add, "button"}, This is not a elm widget, but matches the API regax + //{elm_factory_add, "button"}, This is a beta widget which was never public but matches the API regax + {NULL, NULL}, +}; + +EFL_START_TEST(elm_test_widget_creation_easy) +{ + Evas_Object *win, *o; + win = win_add(); + + evas_object_resize(win, 200, 200); + evas_object_show(win); + for (int i = 0; simple_widgets[i].name; ++i) + { + o = simple_widgets[i].constructor(win); + ck_assert_ptr_ne(o, NULL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, o); + evas_object_show(o); + evas_object_del(o); + } +} +EFL_END_TEST + +EFL_START_TEST(elm_test_widget_creation_error_parent) +{ + Evas_Object *win, *o, *parent; + Evas *evas; + + win = win_add(); + evas = evas_object_evas_get(win); + evas_object_resize(win, 200, 200); + evas_object_show(win); + + parent = evas_object_rectangle_add(evas); + + for (int i = 0; simple_widgets[i].name; ++i) + { + if (eina_streq(simple_widgets[i].name, "gengrid") || + eina_streq(simple_widgets[i].name, "genlist")) + continue; + if (eina_streq(simple_widgets[i].name, "datetime")) //this crashes in textblock + continue; + + EXPECT_ERROR_START; + o = simple_widgets[i].constructor(parent); + EXPECT_ERROR_END; + ck_assert_ptr_ne(o, NULL); + evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_win_resize_object_add(win, o); + evas_object_show(o); + evas_object_del(o); + } +} +EFL_END_TEST + +void elm_test_widget_basics(TCase *tc) +{ + tcase_add_test(tc, elm_test_widget_creation_easy); + tcase_add_test(tc, elm_test_widget_creation_error_parent); +} diff --git a/src/tests/elementary/meson.build b/src/tests/elementary/meson.build index f7d56d742f..54953158e5 100644 --- a/src/tests/elementary/meson.build +++ b/src/tests/elementary/meson.build @@ -99,7 +99,8 @@ elementary_suite_src = [ 'elm_code_test_widget_text.c', 'elm_code_test_widget_selection.c', 'elm_code_test_widget_undo.c', - 'elm_test_widget_focus.c' + 'elm_test_widget_focus.c', + 'elm_test_widget_basics.c' ] elementary_suite = executable('elementary_suite', From 9e113d0f2f105c7ff53d467e911d00fd5abd9ada Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 2 Oct 2019 17:52:41 +0200 Subject: [PATCH 12/29] efl_ui/bg: unset finger_size multiplier during construction Summary: this is not a clickable widget, so it shouldn't use finger size ref T8304 @fix Reviewers: segfaultxavi Reviewed By: segfaultxavi Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8304 Differential Revision: https://phab.enlightenment.org/D10274 --- src/lib/elementary/efl_ui_bg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/elementary/efl_ui_bg.c b/src/lib/elementary/efl_ui_bg.c index 614896dd2c..51b12158db 100644 --- a/src/lib/elementary/efl_ui_bg.c +++ b/src/lib/elementary/efl_ui_bg.c @@ -292,7 +292,7 @@ _efl_ui_bg_legacy_efl_object_constructor(Eo *obj, void *_pd EINA_UNUSED) efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY); EFL_UI_BG_DATA_GET_OR_RETURN_VAL(obj, pd, obj); efl_gfx_entity_scale_set(pd->img, 1.0); - + efl_ui_layout_finger_size_multiplier_set(obj, 0, 0); return obj; } From 914135a6db9fd199c8cd69501fc7102a39a97921 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Wed, 2 Oct 2019 19:03:58 +0200 Subject: [PATCH 13/29] meson: pass correct PACKAGE_DATA_DIR Summary: PACKAGE_DATA_DIR was set to the build dir instead to the elementary specific data dir. ref T8304 Reviewers: segfaultxavi Reviewed By: segfaultxavi Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8304 Differential Revision: https://phab.enlightenment.org/D10275 --- doc/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/meson.build b/doc/meson.build index 068554f87b..5598b18ba3 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -133,7 +133,7 @@ foreach widget_preview : widget_previews dependencies: elementary, build_by_default: false, c_args : [ - '-DPACKAGE_DATA_DIR="'+meson.current_build_dir()+'"', + '-DPACKAGE_DATA_DIR="'+join_paths(meson.source_root(), 'data', 'elementary')+'"', '-DTESTS_BUILD_DIR="'+meson.current_build_dir()+'"', '-DTESTS_SRC_DIR="'+meson.current_source_dir()+'"', '-DDOCW_DIR="'+meson.current_build_dir()+'"'] From b6c76c78b8a0704b0dbe6e7c558dcc8787510290 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 2 Oct 2019 23:28:38 -0300 Subject: [PATCH 14/29] elementary: always use a font that matches our expectation for our test instead of the system one. Summary: Our tests do rely on the font to have certain characteristic so that they have the value and the item size being calculated is the one we expect. As it is quite hard to support an infinite number of font with random size, it is easier to embed one we can rely on for our test. I have copied Vera from Expedite and changed evas global font path to look for it first. After this patch, even with an incompatible font in the system, it does still pass all tests. This add around 400KB of data to our git, but is necessary for a reliable tests suite. @fix T8277 Reviewers: lauromoura, zmike, bu5hm4n Reviewed By: zmike Subscribers: #reviewers, #committers Tags: #efl Maniphest Tasks: T8277 Differential Revision: https://phab.enlightenment.org/D10276 --- src/tests/elementary/fonts/Vera.ttf | Bin 0 -> 65932 bytes src/tests/elementary/fonts/VeraBI.ttf | Bin 0 -> 63208 bytes src/tests/elementary/fonts/VeraBd.ttf | Bin 0 -> 58716 bytes src/tests/elementary/fonts/VeraIt.ttf | Bin 0 -> 63684 bytes src/tests/elementary/fonts/VeraSe.ttf | Bin 0 -> 60280 bytes src/tests/elementary/fonts/VeraSeBd.ttf | Bin 0 -> 58736 bytes src/tests/elementary/fonts/fonts.alias | 7 ++++++ src/tests/elementary/fonts/fonts.dir | 31 ++++++++++++++++++++++++ src/tests/elementary/suite_helpers.c | 13 ++++++++-- 9 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/tests/elementary/fonts/Vera.ttf create mode 100644 src/tests/elementary/fonts/VeraBI.ttf create mode 100644 src/tests/elementary/fonts/VeraBd.ttf create mode 100644 src/tests/elementary/fonts/VeraIt.ttf create mode 100644 src/tests/elementary/fonts/VeraSe.ttf create mode 100644 src/tests/elementary/fonts/VeraSeBd.ttf create mode 100644 src/tests/elementary/fonts/fonts.alias create mode 100644 src/tests/elementary/fonts/fonts.dir diff --git a/src/tests/elementary/fonts/Vera.ttf b/src/tests/elementary/fonts/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* zC^QzD=7A5@!hAMQtdbVU3v~1J<@)*N#pcD<8ljf06jwpfN)(KwZpZzF^0u2a0p-|!ObcW!}m_*E{=TZbfN8XRDk9()43 z^bP|YgmykD6|i~dJ`>KjIO|O5Cb*~wU%^FHpFlKXG(&K&oz_fa8y~g3ucYqeTf%SN z{1Bc(gOdw2D+D^=XD)Ul1RKt5us+a~pieM$7kcY^nnvg+N)PIbg-7)Bgn6bKVTn*H zt=6wFZ4%ZCTcoG-n@yqcQkY(+GawWI=Qhw_x5U#9LL!ToI_MG%i6*zD2jN~o=NqTVAwyT6x1cLziBqm2}Qk#f_k%@{ls=PlC&v=#|>^ zqfp(vf`vn4HbG;4gEgfmn>-!7yMh)DKqff{^y%D@L)L=mk)TU;2341;ak^hu8^p-f zMt@207kUWELNcT^Q}75L$)kTjctCnUUnD#(Y!vJPG=xPO<7p!6MSC-k5&L#FpOqVT z8~N!FQzZ@BSG<(Jc``@lvoS78Pzkp`_uJ29xQTQkS-A(w&s@((;Fma(i2kv z3(?z6Nv0mGk3P*blnvL9HjQJG^u?@1UuK%e=Ia-mcAEk?XK+3NJJN$jRf_dZIqdA+ z0qjWAbm_|WyJZKriyJs5Ja=LuGSqZrtj8uEkdF!n$V=GFv%y4<6Z{K2_R9kmEdfy^ z_@NuP#Uk}!7=FXv9km8sKhZKgGE_QSnPj|$9;S#*su^0-{f}qemoF9!2Y?1 zP^L`${(IT~$3NG}B8T-V+m9>9kL6!KYIHDj2H!2_{UBOk>`|Q z%CK_+groTqU9HSPQUfIZh7vCND~GVVxBZqJfK?RjJo<7OWCedj|GR%w4%O9hYz~UI zgjI4eT6Xgo=rQuL$c9j)GH@io1#g@d$z?#{{&)aifwYWjcN16f+R&pRvK4EpZYa&mEorr04tO+!eKo(>%=uMGK@1GG5dR@2-+oXvu zeC{U1Sy-f$cxB}%yZ{Ol}D6Emb=TNmP9OxT;g65 z71Z`DaRBWFHnoJBquRyZh1Wkjw6tv7iN?mXQ!5XhZ@x=~=eFb>&nS<}K77x+HXc zXhSI9ytTN-JPyx;o$9U$@mTgv_ER}8pE>h#&QsZ=_D*SrgV%-1fs|Bi({63DFBf9ZpjQrxyHQ9u(84 zb-Eq3cwkIrrk3y$(DpomJ=56O_oc_q-@AAIv6q_9f^7TugLLe;F!iS!`wR2w5UR&( zNWS9ol84cfS8g#Js!WJsBZ5Z5d%I zh^N(4AWl5(X#2K$Wba8#3oj3E2>&4bR=AW#(rB8H=1L2dI_r}3NrukGGEzp%gfdrI zsA0;ZoWN0PT19Ih89P!PBFs1f5f?WdHD7#X=GkclA3UPmR?gDIrZ1?jQP{h3`w6Qs zb@J_SdZhAmXW_>q1*2$^^5KaiM-IOx`)|vcQBc>E#6GOce)V~k z2g-PHGI(G@w##swA(+Dr&Kkdf6E=1tKBh6@l;MQ!wUF@mV4^n-IxB7~zS_RQY;O?&rls^8nFD0lJ?J@CM; zF~2?5=jdanv=1?6LYoCr+flJm;-5!k*@bgk8ILy}qZpR`ze+RaE#rr{7y(`U1?$&!szI zSNXd55;=u)X}w4?Th65sx5fJAdqyqI9_yP&fcY`?TaEZn%)8ql`~MZ=-TOotua0LT zHZsH$W)gJ7`np+HE4@ZenP0N&?UFp&LiJ{nX;+V|uS3a0k$?~UjFdA06FEGN97mp` z+@Ve6?+XHJ6F&Rf%x)zk)mhhk^ybd|ZE}adLZUbYcLEb5tWV;v$AV9hExur|o@BNU z24DB>kocK!yI`rx3ev}gX}r!xb9uuN4kHrTkPNBEir^gc6neI zZXpj&o;)GMeb;Z%=vT-VfdZSBIKIbX_r~kX zrCSJ5s_X)*WdEP=d&DZObm3Sv(PXkGUUnLSY(x&%xy-fUZq^ujD%h?g4x3&t=Q#AX zoUkC6q8Mndl%^)c>r~IUfB);Z)i5p>L62W@Y)))>?E2USyxxfYEcRZk0Wzsdp{uQA zwu-1r6Vb$sHl+eR?MsSYg*QJKlJ< zxmL_OJbl_@UJS%SVBm+-xOVI1)Gx0WZa&rZaxBmFdnB0Ow_?2D{OXFq#C*YMI)9F; zZvvrj{Nxi(a>Crm^DCXU2bj~9abJF=CnhbpnpDe+b&K_jvDaB_sx~jSEVeGTEw(Rq zR684jZv{I5O`DXPc4?TEn+`o+zwywajkl;%xq0jF%JR!NLdJLL> z@s|i31n`{QRFyP5Jru4*JC~#K#EBNqLg?*tH}*FlmW>D7_!jg#pUDLETC}wao6qlQ zw5h%nT|I@~n`(T6X(+;+_=KDUKj4*MM&x8w=Eq1+cV`Gc=(|ov%Q7=6B z)4#kj#fF1&4wCHgmk~X2;JT%?(QryP>kVR# zMKseJ#DovFO7yRBtqS5kSR8yXUlempsNSm6`$uPV;80y|7sZ5Ah772G-sFo@-3e+@ zO!bq;cM|yKb#|CB%oJws3fH2usk6DCp`Wpzsh`>8CTb@WT}PjYn(=n&B% zGSQtF6`N3FtTEM?Yb;IzdI^GTlugXcEX>Mm%+7*Y2n%IlxK5Rjl$e(IaN^>`C5h`3 z8xn6N24R!EnLb|&DiSf{gYR%nzkwJ^xl8}aq>H}iqGUPTT}GB z=lQLF`CaibG3{`N4!OCWtSD>8ZL4-3kBND`M~_JljL3md zcoYiWXdc3CPEW%9u?`uz1=iaodL%ppG!Q^5Ueb>{rB!F8#- z!=EKFt{aBHAP))hP|^lrkD%xC8<0uD4-!IHh!~H6Y9dP%-TEG+2kp!HiU^<}%$LQo z#7t?J?9q=W&Bp;PJ9ca(?jhKjBw-PoFD?Sp7t0HEixD|oU|4LZ zHqJFIGS~7Gc^q!>6=H1qPWFOrl>|xJ~&r1j71G?w+d(1Cd ze=EGiUK8=#0fslMr-gUe1@V1pfhs7WG!_47jETmKZ~XeJt6zWBsC;tu?>}6H$ZTda z`TK4I+uSr0#O{YRhhKm|D0i|aQ{utfK#8aPI%<^^8cgAuMz7J_a?nJC?P`-n)}1Q5HNqf2SdgMV8ZEv zPgJ%VMbQ`{x{UG00b)1fIB|k*qOsUGmo60N>Z*)u#bw5A;%;$^?n&c%<34&od{Nx1 zd)C-s3`3ww!cm0@L4C<(2r==HaGaqd0>X%zvtCkn9S`FtTe4WDlwlZd@>p<8LMI86 z*aT_3JV`fRKi)9Olw&Eg%%_VjJLo3e^K_5yh~@W|&n)*WNnnXV;1ORnEH4%+kI;ix zm6OWJtMp~1;wnv~iDF*!XU%WXMrD{VTnJDer97540GEgXk6jfGjY_V z2B%u0tgS~%>S+qjiBr^j1e_;&l@oS#`P$)?wJcwi6Zj5jQSRf!E!=EIDpwZvtZw|4B*b+!A zOt@QgONmH^h%?5TV$BJbj@FJgx1$&IEkf2}veety)6~=4+tSC{$Cm6EL_8D$Y^0}n zyvsG+kYOBZ$+BkIJdRxQ0DV9h$8y9RaBUp8Ho-6fOLm-jl68_T$5Bj+g&D>YYl$t- zQLUeEoo`!3o-nL1tuU{$tg^1MZ8OxH>do7&+iiPHd(6*UpSK-x{NC}I5)v$PqHwFKf!s7g%2QJcLMcf}2$4XJ}@8MQEX5*(|-W;WL zu2kcNp+c5UGU;umAQr0cq<5QoB1oQW;xx=qX*gIv0ip7TO?fm=C}w$Lo-_^N@+GDh zO`%-Pv;@o_Wiy*c3dfoj3CEg?#Jv4YpKRREkOM}EauheT{gH9J%+o#C<}%4~h7h|e z+$6c97%?3%AiVpg!F9mzr8u*}D8&W@lW?QtC-@V0@L;1&io>lu9-)DA15cH2t@#^! zZCrBYn{7CU{KmGgvL)<}{9|AY{qDv1C`|PfiMv1p;QniT!c$MxEke9TO|QhCfK)MX z;7#wn7JNY`L2Zc(L53drIm$S=}GE%efc z(?xZG?$6Igxf;*jV~Ot{FGEtZeeQHJNEYJvVFJz=7*# zJ@-@E>*MQw+_^3^c->P!uA5M|@zY!Nm338HzW;O+_;QtALI!;|w1TXq5EU9aG02VBL<69@0+~m^5(I*rTH}`m2v4$-R5fR>)P>WeZR<;0lhd zDI=%o9Pm)9nT=?il|+&Ao?NrTVh#-pwK~E=Bk&G)goTA#98tC?v%_k(*`nMITT~?f zo^B4cSq$tgmm#9wVp!)6iwF-3az{p4oU#?$!ca0kD9k30cZNkpa|?MR#eVrF4h`_~ z2{8{t_W$~$o2cNpw;uTWPEEZ59sJQsuoH6Q7-NdZ9b&FD?=bU>v(TKFVoQm2j-}eV zAZ$VST=(3lB{60!*tR=ghO|4L+TptvqvboZ+(~Jk2@})OCT&%22~o<#0RwkeRy>{7 zU+~xRpXJGElO_yGn>bPV2NI#P6DzYS8=kJnoSS%OwVDzQ%2q0Kc#bhBi-ZqOS@J2x zu?}i@F6?UEBdF=1)j+g&(K%X;l&YJGnr_}2i70A~nh~b*DaBjEXo6a!W_GAGy?r(0 zrdp$(;vkD5f#)OOKOI?%p9tg-{JduHuhx9rt_C+tTSi;guBKO;nm@L!K^A{&pKIQl zN0mAJbOJS*Uf4dxFJW=m)JVJv^{^JGSN}@QVDf7 zQAYz;@E_+7e)Y>sgZ4Fpf3@c0b~PLV-)QUF)o=)WHGlNhsQX(L0@z?L1o#~@K=AXL z!TcA_ezE4`b~PLV-)QT24K!V!d;J*lW1veCkOM8AFycofn?mt4ylnqCe4gBW-l!vz6eO8>Z4Fo6eusLjinkN}T+#ZMg zj_Wje$GjobFxmMan;aCXUSxq9y^YMKc30u>0~&$+1{@DtVDSqir?fODr?hOeXKtsi zT~E~19&41!%5p}}o;`YW`Ori18U&^Va!5IgT=uOv+l?X*cslt7_!FC% znshiYGTCcvE6peT1578vBf}a4)9q16xb31!EQvCt~gnb+L>=Eq4R}P_>tA-6)HLCdU z{6_cRi)q%XmirWhpe# zG|(@U&;>V*%Z9NZf>v=i@~G|GNZ~^94OVm%{33iwJ z<1&z%NDmXLUVREvT@L*2h1cac#&Ze7 z5V|x)-Z*>qqi+Xnk&YctOx$t#<2ohj;6eIf-AyX}Ba+kqp?d@H`-D6@b|Bf{>7SI` z5&yTk@Z_GNCE%{*vX?KfqgE#khOi{ zgiU>mAN@4=qa{-w?APzTeOcSs{;rd|j$BdO<-x8aRtg*UBqZbvom^?t&)Z%!c})+$DV)wu|w|s1V zs(uI_a}wF^N$!#mWfoZ(w z&(kv_eQ;XJxnarY`V1fZzPZo)&dL_?J_sOqu%7 z)Gr_3N_Dem&zd!Rw(`@~t;$c@Gu17st}dN0vG~a0lDwe7T~{4i+AphT`VOgh>eQ)U zEnE8K)Ts|YJax(!%U66kW$M)FrRaTU`&Q-d?AfJwrqb5!RK~M1O}Q~}#K^Si^A?OR zcj!lDefD8qsxO@$=rE_yOk!_PsFZ{n&2jle=FS`hL(k@?PvYbFcg%1Cpn9 zG{{4y;^wGxI5K+Fi;D z1)ob_mR|qd^E*5X(+980{Nvrbf6Q7bUHmnYO#dYU{&Q)R`^BerAC8P(93FQ2gAacQ zgWjbHY@?is^=`(A|3FU^#ie+o=(HlZc+LWYj+6;$8Z%5YSqf~^{0bZ{HTmu`bgP-F7Q!R*Z%lE^L{@wc|+a_353Li5CTC)L<^{hC8O==)e2QFYBg{zy;UlYO#a{Xotf~^d++alKL3GPIdjh5 zXYak%+H0-7_TFn(NRTxz_{h&mXT*~OALL_}P8G?u)bN#lTw=YGu4layW!L|<-bws{y0zix&Yxqs(?g<9 z-ZNgUFGeg^nKyr2R%5?wP=B^))0J^Lg4Z3v5DYR5)=7mdq!Kq!ES$upYqF^U&#&0L z=7kh`Bfhg_Ok8`{ypR@qNacYEsf5eOI}JXDX;}EWNL!>^WL#vj+^S(}UgGcRroR1l zbotwFn>=s5^_IxU4^$C$ejml`#O1+Uc)0Ysy$0;|cI^>YuBo z`=@8l?XyBH_1}|O-^UJJWW}xp*~fz5aH4J$rkzsE*euOx87b8%W{788W0uZbWO${k z^75x|!>*vBqqjUW%P{fW*5H-0MQG8h zuLiG_JwuCL8?kYwX4x$JTduoi*Q7URMNe_x&^6cWnh3ldRY#3`^{Xf( zu)@!kpK1uWi*f=P?woQ5e)&u#zTV|AC%No55W@q;rJ#cTEO2JTWAc~-mVh;26OU=SC(E1V%krlur3ccJ^L6?9e0Wc@ zu{1s3l8=cE@tu}<%DiR1G6Ya7!K7%Ft_sW4vGCVaZmzOaS*vV=U4z|&J;S`ie8c>M zlLiL{Ctn3$;8k&d>Q$Dj;7=Xx8toqKx!!xd?|T2}q|t%V$rH9^y^#Gv&I`FO6uwaO zLZ5BL=)AITCZ+<#X%n*qI3ozNp+~;MT7;C34M+4px$ME4W~{tt(zplqT=u~DnN7HQ zu=(m=PJL)6A_x6^uY2jjho}?fzEn{e3sN-THtJ5r4fi{aAaS>6~dZ&M@oKNHYkPiWBTEGIS9u7b+Ga6kn0- z-!rSh$qWwF(l}I0!wS*3KfKR_?q>IM?#=F(-Nqu!G8DOrJ$<}=eATWR&uYg*zUQ33 zcC~t1ye@H~$;v)ximDy#&sA3M}7#@w@5s6OIHs2K8rdgtIyskB9%XdZpi0hYc z!bbFPv_=azRQ{p?duK-IUh8_L;TM&Hp%7+yKEo^kj%W!MAY6bx*`&8R^qS9YTAi6J zQ|{{bIcZj(OuJ{vygMTZVD*L=_gGniNSi0P&w@*XUdhUxmb*6>%l|H#f@jZ*EnzKW zT*Ja5Z|K#BS3mLOt9b?1?9Ad(c~^~dSFEd>`B+JGg2~o3a@`ZpKd*cA+%vT`cE=Mb z$z#S|fBl#-UGE8h&F=oYez&m{{@Y?z7fe${Io1qQQNV{I-X4U<7 z^~<`vF8US%SG*X#`u$(MscE--d{<*My7#UIxFkW7wCKIq4YM1P{MKNS&EU`(&Dav| zupwA7Vj`Ikt}hmv!h6-Ln z)HGP{vOlJK3^!MrM0rUF0qo>OFS2UYhR$Y-Jf)yG_)d8e;z#Bm)UiJtlpR%{Hr@XS$&ZEzWZ>hqjyGnT55_Z--lp~ zIzwJ^z?hrmbL9DE8}qXAVW-HZOHfeMcp_3F_V3G@Wq1KELmUL^L7pq^e z7(kzrlpOG4K$V%AndZ&wBb_o2YfZ@m1FI29CdMe$j8iPyCl6{S$FTa9Ic|4ZwYPsk z@7~qv_bdS%h(}UF|gB&KSXP(Po@cw?!^)p5c z%_(==Y|%5i7w)Xl>9yBxx?!?S4Qg9TzYClT-Ti~eeD%F|gLGUZBkJmKMaA#`n zJZA}-fRSBA1;YsnslioWe=1uV_I&l97~;vy1Xuus7VgFLR#ne{4a=R;y!aFi7H!CY zS!{r+wYnF&#_B>(_G`X%HF%&&HkZoY=iFAXmHW6 z5vv!ke%Nr!ExEZ(nVBz~yz=_sbdHq&&+wEJo zuGLCj#gf&BqxVMN{$uogM6%S&oQHWK*65iK;rVh+AH1@tv|y;qsRpzZBtIB<$fsId zgMB+P)A~PHy0b*T!_{uS%=T(l+9L(S22>ZC+^V2D(_H8dD2sDwp~YQVZOOfA7{tsw zhtAa^0w&rMpTHuc>=AXe=hJft-wJktNbq21g?JdH;pM?q<$cThm6w+HFE1-E5B3fA z3zi1^2g`!xWBZQnH@0+a|FLCb%OB|bK>5mGb8vI;h2S58`+^_i-^pMvcp6Q^oWoqh z+{VN^68RH(vAw{w(7DjH&^@i+w9;w)riZp*?(nOFK#=aHENCp z*Mno0hU!JiQF`XZTV?bKh8e1vUeSKN=I1+HBSs(k(SK+bY*Tn=`|LkWpT2MIZ@#^5 z)ccS9{=kJBX?}e8AF)j~x+i3Rf>u6xYV_!t$-DkkRfXLP%kN#bto`}(J8PyzQ{%gC zK)I3K&lolsUW<>zJ`L9P?N^x9EB!m;upNcY9qF%rXB>u6STD0L?}lQJFXbv3hk@lP z;$sXUM_e(3QeRy(4vWpFmj@U1(T0^yN}7;4zSo58xq+EEIBUkxWNf-%9dMJQ!C4<@ zNN>t$%53V@)VnFGDZ3%3DYq%FDZi3VX`zhY#`l`sXO5cbpMf!4 zy}FBIxHY|>OkJPxGg&U;OF%yVn;NA3r#9 zLI0m!*Kx0gmBy6=p1=O3>)u=@tB(g%K0gMw4I(}2e+PRt8*1ypU|DuLHny756sI>- z&i#3gC;gA)ttv3(rX^dAno7?_r~)lFGp7)N36l{i?ZhF*c49{dj$<|&P#pa;dIE3` z`yRHB2ab@$;y5haxODnGXuk`aeeW{eWxglVD1MMwjI_9d<3=P=9uiAU!mc8)TBY{& z>(!Gd53am_{+Mmkrv72ps~?Y=G_kx8;k5R=^_F48h8aJ+dE)m*P8+DX5S{O$QxocV zYJzT+!GaL5dbBbYnU4!hzy2RiO+drqI|dWy99+8cq~}}(O%|f&dHt1sox-^afoGBo z??n;c=P_+Y^cSLOKhUzUMqnz&zbQeRVS^4q@={=WA@C{v^m|04iy@BD$Ma{O(@(|X zsV61h(C+t)X{JVu!%Bjw*hP+m4`9aV6n2#J3X(*|t?L?sw`WBsAeclFtfz;AK@23_4sTlTG}*0g zFnfFVP8*))Kw$UYTDq;p;(yrpd2)+edsuyLXvz7RJJXWiyBCZrhaI)DDIbifSS|Kc zAjF*X!c*demVSwEVg!>?A-gzWSe+lfTxwUvXPC@9oIz)j&Jl}NTMfp@@pFi6)D@2H zH*HB;EvCTUXd3+5&cV~m2HakD`~2KB-)bqt^56Vf6?E&fy)x^66pcLA^+5F4!9enJ zIXP>d)3rUOjo$u-PsWuvgylp1*RcDCU~gSk|E!u4RhsLU6&$@wHe6P-As5Ry92@+# zy;Z5Z7Q?ijScu|Fqz{NbGaFZjOlZ+9 zd}+*8L*N)R4ZZdzxisoBH$7Eihnv}$Kg@F&>YmV-B(W&|oUH|x4 zcjcM&*nPjp=sq(HZ{DaLH54E&CSuA$;*8RNA#tC+i0$zH0#(JTW6TVhY+vAD4(k^d zt3&?StWLAj@`c B$Rw4SzSQ=Ui5YQD@exg+`lsp<{syr;k8E%leX-35St!f~_w0 zE+oQ7#)2sDcnf$J5l7M=`(r4OGbW;a^J0GtdAqP3@9SOKGvl;pdM;&LxEn1QdA=o% zFL3gR&1(MwQI(uuV8y5dO~9H_;}?j@pw}6`z#eAP7wA<+G+EQsa0lW|u_X?RW>l7i zHnX-+uNI*twdXLfj~h=sP9@P2S+scGFOg_LqD2UZDecg-g4mzk+TmzlH020fO#yvM<9Eh0h*iLr84cnyC5N%zvrpX`>Y%TJrOgttP z<>IVPeDyy)bV%27`0$yw!-u2%$Qpv!+9Fv2lUQ|Rl2u1NPha(E z1*}vu$_g0Z8*3&k4(KWmJQ+iRS@1N&&#YFZikI1%idaPfxR<@~G6&L}4C)65GdKd> zFSb{J27$y+Pk4(1ITHRy<)q}r{#KgLB%<1#eJ^@_^a^d4_TsEn(OnWoUb_M=Qzhg(TzmI;0r9HPG>(w;> zBLhq-IrlQF8zDBXxy)z1p|3CVssS)rWGgjo%$Opjafx+P3DXj+T^=kLR&`s|qN+_* zd#mZQ=es>BY}1@jlo zPwZ`4c;~!D(W9#qd!IyODeX&x(k%zZJg*>}z?YbQD0`D5`Ev2$5)vrQVG^Lrbup7)PrwzOV&qegm zyE3=~^Oi#)c4E$hDCR`5rXF~dAC)+(S$I0R+~A^q+#YH4KwMm zf!^^P`Ramq^8^C)3`FwP)cJQC4>OkU?-CJx@ouaPlzOKI?P{Zb6$0a;wov-#7!?>J zrdTy&6^vI+Ftb%3)!s|w#5o9(Q(G+NLhKj>$r&r&AjKOGKNa1r4U^H)2kNJoOInC4 z>E*@2B-N=ibsBV*4F;P77Tyx9zC@FFD1+d7&pAXVmp+5OE?YUpd87O26h2*N#2sr` zcq;1qMt6mHg-y{s{Z}SgQ;2{~K`%tP1@Zf0@l6p?1wNaE8N!v=RB zyol1GYr2o={>+hc-=H6>$r1exM*``G>mE_-44@k7fu?=>X~O0Ziv#9{%omn!J~w5v z@#N`$iF}``#u;8SY=!kxrtXKPvStJfrM*>ArY@(K!&jPQx9RB)uu+h6lkOhy&!aS z+_Jn_arP+69u0Y+UKHA6PrYF@EZ+ch%`bv|>`AF+>_+pfcBQ_a{G#h;R`r@u!+fV9 z86IkPlEGq0Q8v@H2(kbpP*!lu@(Peubmiw2UtvW`+}7>!7N*l%n6A>}-a-r}xHK8R z(PZ3D%oL}4l07L11ej(h&lsDr(!J8N65$&5W&9(KZY@KMa8W2CgYkkeBGb)=! zZ_#Y9WIUSBb#1aVG1kKK4V3m>6i6VMtxHzPm$VMQQ6TOoTIVfK8Jn`ww$i>bWpm2D zlz*gPDvbl3OT!9apNQHK-F`l@fb5GlHe4KA;QR_inJdrsnRY0TWrq#=#$|J?()}^X zttNS$Sc_Xe7y&n7Cs#LUyk$kIPW2IAK2UnvFFXvhvTagWrZTw zDryTqicZm0FdMH^K4Aw-4+=IPu_)UBz~R^v{JWEKcD%i@u-#VcTgXhshcj=N;2UV ze^KmpI_kRUOi>Q8m&TP6Kf$?RQGjexN_{*A_&QeLwjN| zG-UWkvB!BGm^uiH3tJ~PEWAWE%N{6+h;++^>+&v$nRPAs3g_G>=1?xMXf8TL?E;@@ z4g|jcf^=9g8FN}+;xDy)ee?9`7ap#5`mXqKYK8(Hu9i4zZEO7SwN3HE*mU1>+SJrO^j?Y#9o{{kD?9Ji5UE6e3cpSbQb$5)nr*Wxx@lt=Vs zB9H$3YV=Fisl$Y#mHrGwVHQ`g_luWf=q{5d-BCQ5W|kTxo|t1#Fs@U&iPX!9C;Ir4 zArR&}FM69P{v>Ae%Qzun^Bdx;-eXUsoWv9JMNclwV~RhCt(2E1iIwt(_)7WM6M0+W ziTR=@7v?d^6ZFyDsP%HpSL#*vcC|~VT@Cbb)@mxf{Wl1WwL zY)_-CU&7H`cVi$OTP_LrWKV4U*cwwa#pVTDb}RjPML6gBl_$PgyKUQAS;+LwH+b_a z#$Ni-rfSR!+!4%IKC{bi(0pdM-Qarz#~8g4u>WT!4jEA9z=Y&`vG41iOs&0Lqa#U?dLDzvM!DwFz>hT5N*wYd8gBFNNdr(i7ZJSdRxUw)^tZvxEGV z7q&KhkNx(WCroqRW81iH-A2>MYpxl6?PJZ&SgE$&I6^m*Ys>ltt-5#BpAA@77MJ>o zR-poy2IZnBZv8v&m^|-@)$x_#6TJ_SEM-N_Z9y-#*8G=sxBH)|YJy`KHqxX*FMKU} zL?W9fFcqU&Dmf<=>kfMMD#{AB#Icho`a3BuuoSBk3*=!z>YkbyyyE7YuLw@8-?Vh; zCixn_9yal2+?*I(x_PtQ1MamvgfBziz?!M7pv!8qIsb(t^^~VbZ^a6H=?10wJ-k^qu8+l~{y`ukPH|Z&$Bs{Rm;y zq7O-&WNFK_J#EPjy6rBT`CqQD!Cp2)krzgS1df0qcP`eLO0J8Q9?-LLQ+xH^(!SLL zvoFso9MQXeY1Pn)S^fLF-4EDoH{V)52QRuv66n=7gZ2_m!@C>7PUDgQ3-m6o{&ysS zzA~k{Qm?&2LGX>?D{a{~-=OkZ_kY1sy&GdeCw!E>5lK|seaZyChz0h5-Gw75v`mM2 zFhXIwWaulVTSDt1iZ~p4<=e{LW8Dadfu))SDH=^3j4KYlt<{W;-iv_ZQ=ho*6GW_g z>cfT6uMp*5H)QUDjneycVA+wdk?m?~5J6961)>RIQ&FrHYyIjGkjPda+w<}1x!O;A z3Y9fKoD%?3erHp&-xCifztm7~Tjc!MdD3Z>iecyjdkobIzuI_h+{~a;`$ieQF~VDBH0iL66t)(6s5r{F7t)VvV?QKz zHayj3)15LXfzsEpt=YH}baP;YF)Ntuv9{QqpqlSVm)&gE(qM)=lhX_pHm@_&qL!!A zZ6TXLV`qfCSrNCBf_<_xnlfI<&~LJCvTd?&!tVJ^?oFOe-d)yRwq5pJj$N)@?p>Z; zUJut_(9u~lbzb90BMcA z-6n_6cZ127Dxtt2`=H5sR#yVq@y)RqN6Rod7Ci+A!&%~Am;C)tvnw7TiU+3*E0G1I z_aqne&FYg|mRFWvTu@qAT2#_!V8PV|6SF7gOhcr>nYnjo-<@-JuD>7;!)UC2FX}Te z9|`iWDwv!-Ij1hW4s(P}T9d9`-@rIQO&7!oYVtMto01v=^%?b?E0leS%W^lDoGdAl zaa&@#FScgTFN^ABS{#$(;+8AIv71GeDFrD;{nZr{i+{5t^!U2aKm)oU2JxKqcw1yAA^HVAvQurU@I3c2N_=<+M#Mvd8LlU-&L_dg ztLy={6&>D}hPi5+hJgAQAHp}>6C++`2N49wosyL@EakS8*hvLEE|Ia}v1luH{7d95 z9M%;J4*wRy#sB=r;JI% z`~EmdCt`7uE{#RRI7tk;_J4|#WPZKtnePph1bO%Y&MW;;_a5ZJ`BO$?yL)2`GPrV3 z_nxd1#E@_pj=<`G?0g`2ooz!b!o&v578r1{7lKh3H(&#XVM8n;#RiE;fy2I(Z381x z47bU#L70}YAn2=AqDPx$r4|-gG8hF`efKQ?PV@)yeo9%+Q}Nzy7=@;)(XenE5i>uf(PT0V$JD0ls9PP?{o8)j?OT_o zT$cN^fD5Z65lk21!nk@zBE)lSnHWW4R*^0~n2%Kh5l!L3Wjlc+&4k&I=et^ShiMaM zj~`G!^126V)`g-k57N7qEXW$9T{d<24S9JDnVCPjb8Ym~a@4L)_b5G#ebmTck(}0f z)S7iP+kZ6RJZk;c^zY20+27`^D^B*Sq_q1AJ@?5uoyDjiW+P;i1dVX`_+%_BixFfL zT&{iBNXmndj`fb7HAWbq>Ks#My#8WMkAtg?CPvI`#JHxAmEM!>ED#4k?~<7kLAD3^ReWKYrn4{ljP(>@TysV(5juz-Jy~* zcQ`$dB)@9>nO&FVK(ug+#b)|Jn$LfgoRx`HL+4UzvGuxZW|JkdhU=PT7#+PZC z!NJ+SgSno*=7ZL>r_)2pPxjJy{8rhzUXK)8EBfZ<6z3IU=1z}YB9?yHg?_Ww0)r<_ z6_(_b)gIbYagNbS;|}te&S&@8Q-L*@J&OpA3hrQ2_MB2j*AOG?U~|qjFQjr4P6fwE z74Rg)7iiYwEN{)OvtM>o(j3Q~t_ALeo`v3pzJ>ldN%OK6W-rWHn7c4U4<24-d1!~}?K8a3ybb7EUbaSK+Fg$ik z%gkTCm94v?y6bbD?D2hlQ1s#Kw|+UZ<(5f1ru}F1?LG&q*J|1yt2gw~2A-(ffpf^_ zO#V}QLu&uL?Ea|@?QczG^lrB z%qF%*$^K5UX~m6*A+rku%h+i7d$vZ&Lt_8G-4*3UitpbQg?Fd&6busTd=&BEcXvyn zgP>=~>~mtfl<@;Btbu05o-y4?dKa272ZebbOeE@uE8Q7P{b23~+fGCgy%Sdr@$-XG zGMCCW!z5xA`aI|_^q>XWTCDA$Ex5U72O2gTy2&Pv$<|93rA&_sWJ@*(W8bK zZdUL3^ykJ?(QlzOUIC6r8^6SQlDmUB$sV`f@4yl8dP|Dq4TJxU49l6`9?gx@i6^9* zCs+{}B(5x|(rWRe0@f`Ty(emW>0!W$+Fp8i@HUS?(t;wb~-AHP1Eo70Mia&dMz=% zCWteZaDInGX;<3+znI3RZU3(V?c7HHeQWKB=}7@Gh~bA0?zfoxgI#z6X!U( zMhoxx`R9Uj`06yZ7k-4xjNifwcP~~}$uW{}!pUNmJu$@Y;mDiRzjV-@z~`mG@)C13 zm!=Q;g#{c2VS-**bY7;F8m#E(aWCF8uN_?b+;eM<-$qYu-Fi{Y9*o6~KLe)#4?u}o zF){C;M2w^38)pH~p#yfjwBY}HMbRhpm@ig7y~mWTa`o9Jsc78E@C@sD5Kac$)~!*F zR)@hJ`xz83#Kn))uhq+{cWl*C?9}f77LiqHN270RRmsn- zUfmq6GtP|Os>|&9bpFnr%f&VgJ=N{YU$C@`8za3apJ?P$sdejb{NSAJ=@x$0CM5JEA zxeA$=a5ox1{4;GY9a#&iM-#E?T@~ z>0NiWBCL=z#}UKeXoIwU0ddt(Z7B4u`=i`N1F$$YzY2zb)V|i%$irr!bvt?-7;9A5O+ z%C#%BaR_C(Olw5mH+AnbuOE49m{*tUX5MMYt6_!(TVT4s!S{W9H+N$c-hE~F>~4ho zSL)oUa~~@8@lQW~;NuA&&6PWUTl}}%l=|yGjJrrYncYC78Z4!e4_5W@b0+p%>!GNY zt#K|$8y-*bJM}Aci3im0)lb#m)q_}Tu~z+3wWw!7^oOx_~?@Cy7)J*3`% z6@C({0b13+P}(=@8Px_qL0E-Uow`FctLf@(HADSLy`}c5chsNNyXp%yQyozI)PA)^ z%~JnR>(pU&P#sdURVUV;txS@&k>a0|&)N%Enh``f@Inmgs8>@r-{tHtB9!*zYQv)n;ir*41=>Xm}=eZGKzrl>3Iyn0}|E(~rjQzG|U9PgUbt z$nYBQwN_2Q-yw2ss8kb;STL>IiYOzpa2n;a-O_fnTiTpxlhj}8^u1ryQR;W$7ximK z{lfVE4d1U5b(8vC_?3EH_(j`m@O=aH`JK=R*Ha9yYL&R&XvB%pFitY!-y(y8-Kx}k zQg5{10^H9uwW^~DTCzPUY8>*0uo7mrak@&wzN`&~SGqp|Udr?xYAL?cOuf_?^M`2L zXKEzq|CsO|^QNhx$eYFM$=zr0d?UWQ!5=4ZUnOuQG`Bp4ZyDMK9>#NJC_tI`f+yv> zRo;PB(I(;@wAUs?*Wevf^_5t|R;hNQZDsOB{u=Tz@=1Q%YoMplLuirsi)--TGvL1{ z{+jR|B6Uc7$!o%I_zIuko$`GJ-^2KZfw%Se`xXA?;qOWOy%v9W8=AWROLw)>fp=C5 z-w1ySj|hK&?`@drR2N8a8k?J{k{Sy@$T4Zc(HtuyadYvSKJ=`X^I(qDSs3*I7M zC;rOwc>fi=qAu^nX^T3;G*qxh@x{A`;VenmH>vUP!`zIxV3X8jbql=6x59sXo0_Je)S(lm zs~M1uvmo#1K-SNLoSzR#zYtP>G3ESSkn|$wmqEtYs|LvUM#%RjB@+IJ&_1G@9)x^; z2)g27=%z=YiGB>MHA9m;4&4Ol3(fU2$nBp)V*f&IfcDy`HbIv>4ej(R^{o1}dQSaD zJrAAMs(!0}2aOeiE_y+|s6;1-77&f_s@ef<(yp)-S-q}ysXt&9z#pOS_CQCx2@Urr z=()Gl+i|V7ml{p<*kS0L_n=`uh-;gp&@~@H_k5!MgL>#Q^*QwF7tmv!&{!v+v%Z2B zJV~AUFKE!O)hXyL(OPGrt3{i2YcS~~DlxoQMpzPN9BE^PFU<~@rPI1}=3TRwFPc4L zfosu>C36-|zhlONyJjqzG2L+0-Afi4?-)3ssz%_za>C09D+ntI2NG5j4kD}}+vS2= zccRdbR+^Roi$T2K1JZ0Esc+2oNL~FRp_(PM?bf4)H^R?#f=5v-Amc5p* ztjX4K)}_{vEz96vkn&M#M(UNRD^tHsOHR8t z?Ij%XI4=F^^!GDXXY4@~vS0SviF2gx&H5tymh2_j|H7iJ;W_`2^N*Z!xz^ldOgNS2 z4$U2%dvose+{L-~<*vOey(Q$(McW`yT8!qTgfv zUMwA3y1Bor|G56GWvk1tDF6Ls#>;Xp8++N_ijfud6(3bzUAYMV8Y>^J{8{Da1L_An zHsDtS_7CW;%B-rXnpL%~YGc)JtM(4OW#CT+{<-?f>Xz!`gVdnRL8EKjHJLTVH3Ms| ztQlK#Yt7u6dux7Fv#w@i&2MX7t?8&aQ1g$$nS&b!Zyx;F5X+FMLw-DD&ycTcb8By_ z{Y~w*+TFG9)_zzU9eT&*LoOeA`S{D9y8Q2#cMZFJ*rUUa1P2GN2~G*l57q})2cHN& z9SjBAgMSJh4*tg#!7Cm-)!&`^{`^wv{+5r8$_4*?GDZUY?By&kZ(+X*OhwI0YIff8-e1L;!;IG)#&x+A!r%n^~2#Fah>=tY`*)r&A6@5xt%ye=WEARIs_KJk2D>~=u0 z{E@o55pZyKGay!70oL;A)lB~b!jXidK(%}|j@LI4-b^@=xh4Vs`D!xopO0vKcLUb3 zCexW_7U68BT*&K1go_E65H2NLPFPRaK)8aik?=mgp^0!M;VQxw)(z8TD7TH}h6uMX z*Eaan^3}`Th&O{Ma#FW;wy^`8l@A#$7>f|@WBUDs2M7=Horeey6JoT5^qqXealY*o zQ=aDiv%Ee>*hPqAwxLV0+De-LgA1? z)Isjo@w$cAQhFh9D^Ej&+X!FA??T{Hp311G5cm`rArxE{0$1`>@KeOHu#*ROiokmU z2lKwPx(K~b?nsG6N=ht3ZxR?H+y-th0v#iO(&{4Bfxcg)!h9Mbl$I8=lw#$LZpU>m zP^uUujsO&F7lZ!=j^Leb7yq?JWQ<$cXa1P;I!g+*u63!=FK)8sx z785QZTuQi{Z>}e7AY4J%NO&L9G!d>OTt(Od%oM}=5ZK1|hX@4^#jro*{!ZTM!1|tI z;6d6LAr!h7tK+;DikA>4C8Tl*Ft8nW1oI`J^?E>|bqO(FLd=(t)+MBM3Ha?Gp1w@j z&h#CiLJ4VILRy!A%IhJ!g_rtLBK3tuDc919zHCKbyk|SEUj{$-1?{#&%6kZfA4*C6 zQr4lAbtonEOG*7w<}GF3Qsiw$dZBwM+Is|g!qZ(0DDUZyUe*j)K`64WzZ!(v_Gka< zkM?fI^$4aMi8}WO-33l0oC50iXHEK}56XLH5zgit<}lY>!g+*u63!=FK)8tSSxmTu za4F$(!g|66!WD##g!d6P5w0X$Mc4xQ+@IL%Pi*ujHu|eAtkpJPvOjUsADkdHZ)fYI zC-x_P`p5CJkLmXl9w0o(79AoyOxVf1$N8SKOw$Ee2HYN@q=cIqSltd-9sL||5NcS4 zUYrFu7@St7YNICsN1*gF?9rE8;|M1bN^dFyr^$O}@jbKohB-_x-l;NJ`U3AHoKJ{J ze%uj#fsrQR5<<}zWlHo#nG$_bhIkGFMPHOD(HCXvKEfu#m4vGZg(u61)iUt8)F(u^ zg|*riy&b<^?vgf2|0+}MY?olQ3_LICBZT{yem~&>!h>wlA;QCioy;peu>!rL2G9#x zT|s?aL5_uGgIZOTpays8IhbiY0&Lg~&a6aJz z!bQxxm~aWpw|dMFYN7V&?^ftA6lat^m+(Ttc7Yd zBH9Lcb@W-lk%ZTRvejxFug6CZ;(7wpOpHcwJ(<^2(C@0zN91kO`L;Q{KbLSG;hlu@ z2^SD9 zau+F7LuV`Q2x}=Zm*%;UPHUR29{d{(pe5TL%L(+X1Jb^ufT4q@Tm|a|!1W-bpy0 zZ~@^WzF{%p62hf~%L(fV8wghrHWJ>)vYH5260RZ?i7}W~++g5Du0w>|SSztz2Ll^Y zL*cibP7Wb=4MES6r?dD}`j`dUhlT3VsCv_fkkJwC_%k$ieB@KX!9At@(Hc3 zIZQv7a30~Eg!2g(5H8{y785QZTuQi{u%57ia0Ou_;e9NziEt(1D#8}Xy;{&qS|swJ zmhz#Nc4jT`(~LV}Z`6`rwUiIFln=GQk31FIvKHJcP^`yVj4qque-Z0(C^hC#;(sXK zCU@j*LxJrh@DbkvI0`A70llchC~*6BK=Ck)f>%MH@bf6pQSOT-8ik&91)%WKDDu)M zye)uh;h!1O0a3!JmdB&6a zGSg2c2Tlggi!qNOezRM^b-Mw_5sJU-7VwhX zSxmTua4F$(!g|66!WD##gy)!7JV;a6kETG*$aODp$Q0IO3TrZjHJQSiOhL^LLNbcw zUq_y)BlYVbOQ9(tmyQ6I5Q>JaQv(Ra)~bVamH8JL9l(DF{;7kF+6*YZ!8%x~@>JSb zM=q*EOXXU8gLP=HTno3(!y($sHN%)p4v>$FW`=$9i=f>(z0rSBKdjd4upw9eJh>GeL4K5~GehQwPZ} z<%(~xj@r3SiEpqD6xRcaZ?F#IDQTnl2J4^&Bqc2j>gYP^=sN1?I;=;K_sgiEj-!S; z%-qPe_y+4Bh2(AGbE~7xSqG^o*Fw`edfw`kP{pI zbZV~Y)Lhd^@#&y=A<~HdZ94sL)2X?pQ*%vceWug@Hl1~tg|c8Lfh*boMJCLGwh|~K z&{-UT&O+(UxE5dBES5ft*qa5tAa}$UHw)6{AfU+bSsa1R0{@S|wfJOaK`#iD5$J5T zYc_4d*|Z5~qxA~+#g{mnZJEtF&t{!x(6ha@yKzS(=W^y+&RolpYdh|Ut8x(tAV*1m}>=dtzfPd%(a5KRxsBJ z=32pAE0}8qb2TzoBXcz}S0i&ZGFKyWH8NKtb2T#88s=KVG;5e<4bn7YhEy=N25H(b zhanhlW}0TEX+|2k|1$8|j5P90tg;r&;~W7LdD5ba2#a}NWJ?P?e3GV=*D{aOf*vJM z#&<0kVGEQ|UJFK(0;~CE85g%e=ExgF=Cptt=K&7owP>prXhnhJ2*(pnVtTO?T4*P< zkjGjmVOqe6l71QCa>9DT2ErADjf86mn=vokLjG(af3{%WSKc7@Y74ks>LXt67IJJ0 z=5*y+#+xlzvm{XFaS*VGu#@S3+fkgo4jj;b^GWzBcNb^GWzBcNb^GWzBcNRmy04A8 zuZ_B|jk>Rmy04A8uZ_B|jk>Rmy04A8uZ_B|jk>Rmy04A8uMK#T_lxe6H4Fj;|83NL zZRpo}T#N2&11+SDqWjvY`(%}#q!)^`QTMe`_q9>?wNdxAQTMe`*R)ahwNdxAkR7|+yp|b_ zZE6`)E@!TK!Un<>gpGu2Sd-=`G_-2t8$yIK`>+l471+-Dgn2(gD0275)wv?IL} z^$^cSJ3Sli^lY?)7R|UL^K0$&Y_!v}(GE}4cH9xqMms$l?euK4qX$V!nMZ4#k0`?NhNdMqP07SlMe8wTo)4xe|D(8gr(@G9jZUC%LoN~9jcPo z19)Asl7tclq_*38{w6_Bi3_co2FnPat z&O3Yx?WLH_JeolGzO{|@k{ykGdUgZS(qKEu=nVd{b~B}|yQ0A--P zVQTF#bwQZAAWU5lrY;Cm7htpoT@a=&2vZk?sSCo?1!3xfFm*wgeLPHE5T-5&Qx}A( z3&PX|Vd{b~bwQZAAWU5lrY;Cm7lf$`!qf#}>VhzJL72KAOkEJBE(lW>gsBU{)CFPc zf-rSKn7SZLT@a=&2vc%~sS9MCJp9Gf1z~FKFm*wgx*$wl5C$$~Zc;|9Vd{b~bwQZA zAWU5lrY;Cm7lf$`!qf#}>VhzJL72KAOkEJBE(lW>gsBU{)CE{G1sNV8r6QzMgp>jw zfKpf&Kq&TAgp`VqQkWG%&x(*zuqr?)c(}n25mG8bN<~Pi2q_gIr6QzMgp`VqQV~)r zLQ27x1L++hr6QzMgp`VqQV~)rLP|wQsR$_*A*CXuRD_g@kWvv+Dnd#{NT~=Z6(OY} zq*R2IijYzfQYu19MM$X#DHS25BBWG=l!}m25mG8bO3CgAc>nQFpx9RtQYu19MM$X# zDHS25BBWG=l!}m25mG8bN<~Pi2q_gIr6Q!%K5FfK)Y|(3_|QETs`*4{_0 zy^k7UA6vAKT6-V0_C9LueUy{?sI~V|Ywx4h-bbyyk6L>_OWe;A_p`+PED@{R(8m2N zaX(Ak&l2~u#QiLBKTF)t68E#j{VZ`mOWe;A_p`+PEO9?eJirnUu*3r_@c>K2iaL~d zfF&Mai3eEX0hV}xB_3dj2Uy|(mUw_A9$<+FSmFVecz`7yV2QHkPJu!)&vlSCgLvBH zT6`J@!2<$igebj4plIqt%yo#l4l&mu<~qb&hnVXSa~)!?L(FxUxehbeVdgr_T!)$K zFmoMduEWfAn7NK2S0Ok?=2eez{CJGx?qeJw9%FwzhWALC=}aSIKN( z5ea_`Zx$%y++!T)9^*Lo7=FnenO8kVK0L;G)nlAj{fzd;XBg=!XaX67dyV9WSTFL=2_ekkHnWqvmNW7#SZDD9nwiVq?2|?Cv|Qo?T}8|A)T~C zI%$V=(hljQ9nwiVq?3BElX|d|c1S1fkWShmowP$bX@_*u4(X&F(n&j{lXgfa?T}8| zA)T~CI%$V=(hljQ9nwiVq?2|?C+(0<+993bx-7Ip?2t~{A)T~CI;mAV(duU07tD0h z4(X&F(n&j{le)E&y0w$KwUc_YlX~+w@qCLh%%xCdZy8$DSs~ zo+ihhrdQ`QIrcO;_B1*6G&%M(IrcO;_B1*6G&%M(IrcQlmp7j#JWJRGc$O_a%a)#H ziD%KqBe*YZJj*toWgE}3jc3`$v&8UOdScI_jgnqg3Y}#e&$5kYS?*c1RGvz?T`a4M zWp%NvE|%5BvbtDS7t88mSzRovi)D4OtS*+-#j?6sRu{|aVp&}*tBYlEnrkiQe>Fg%G-eS<{3@eq|;!)Y7C7*nT&$(+U%F8~B^C6;1+IsVRP2>j3 zCdEV=#0+ZQa2r;tcQ-2)Lxa$v=vapmO-FXJZ(FYzF@ zKQ<`qabTzw2TmJ|7W~kgdOoO=#bUIX%!rf&fJa6PF7eMO(1>U_28+?i^vI^y8}(NC zfujZxh#C*Dd%=R7u@_wM+6xPj{PMM0twy88YDSUBgPpHbf8is+@bc#XwiFrXkaZmXB!+8-sAL0YQY&IM4VH0%V6h%bhlZqm?i4oMoTaW-~wb*S&Btyl3u=DtE z#;^cR7 zNOJ@eF??9fpdtQQ&1OjsstL=OkqxNCes+9}_$B0&zetAEIJ<-&;S{7x&{2LdKknP@ zcJP25)C2wSM!~1iVh1UuBqWqqBTADA$xy7|!z`5*CUMJ)_+Dg2Z7<+)lO9zCPFYE- z)EEU>&A4j;$>a?&%7B6jQRuM`9h_nV-oaxgo8TjcVu1z&aA|Vl3hl941s^t)Cp>~< z7J(RW85lxX#)52kuD44*^cD0#v*aSZjxyp=C(iW@JX+kno3~1D$ug37<;j0ACf=$%4hx^cri4QsA2Co5c8Bq{u zi>k;!G&hzOoU4@6Yau@D7Ka`9Fx$cD7vTfAG&@lM>H`kKOYEqu4Ryr<9ylN#_=xqU z9()M$h!2t!_z;4l9Im6K9Eq-CFm%>&FOc~ie1L#PkOk!k3z|@n-KqzXgs?_~bVYoCUxkqERweSxX>-}Z zV-}}~AYzz+xU}FHLLdP>7udHr?GCF0C%f2fZUD$fFobj=w4C^GOU2MJtrif$0^#RG zZmXPO!_W8NL%0}06s$M`54^j#j0Uts!2ad=&|2fas zk~oeJo5uqw;PePOfB*~dj#@fAc(dRGRQI4O;lObVlA&T~o!|p0fscS494Oo>odGDh z03TKZDr+^eHa6k|1>uNO5DEXFzAnUvH%0Jawz%vbCpwVT1=VCi1L7a@memUuMt$U6 z4yzlLbs`j>)9!QH9N;o=G3o@dYeV0(8NI@;5LCiHXq3tB0y6DvA{#G2>MhB@cKDzZ zpk8*n*Xu=}@HoNF$YX^h5t#veAnY^VVzYUX*y;0Hk<4gxp-53?U_PVKn!*Z;U=(aR zofq_Z8^jNUvaqSmCSB4Dd^l|;x$6*h9_L*2CZ&9-cANuiwz%zHCsdc!4IO+|{0Cvf-zKDY}>0(`iDUj)F$TaW;Baryl?LKt$xjXo&&KuUC)R0og_Jxl_k zuuJgaw3;B7PzI!r*$l+HP%(?s>a;?gUx*KXy5IvxA~<|5;KSw-e274ceM~rM+hg+s z;i!*W@L~730W(lm-ZwS z02FxK;6}UG?QwWqPKVnCe7K-Ly=afq?sOm<@MTIu&72TbNQw4BIeL-XiNkVZ7$yeD z*ZeKTKscc1Ih{#KN$3+v9+1x~oze}NWp(=jLQln#Qi`ZfIgArMUg%*hsy&gW%DFC?G~RCZ$Sbi_a-OXk<4uN0gDFWLpn`n z4?ciQ!3VjIzyTs6RB=pB`+UF$5HI+U&`S=OHzM%y0jDXI+*|NrwfS5DFH~0yA0TM_ zgJOL?M=}cVx`123hoAUxIX&)VoRbWlF8Bba;0Sf}C#NYHHFH65yIeqo!)12)go8ca zSbe@99}r2%l#Hg@eF5SFcidjlDc%4y6W-(lK9eC@ys61{Btyj@#SD<;z$Ng}8z(kP z`QRI`7c6oSKJYGw8Pq||L_}GEc&`frMeqTNp6|&@rDP#GKTIFLJJ|<(IQ(M5q5<&_ zdCQT40#F~H*KBq>K|hzz<92y*7>vsUo$iM$krSkmjrfr63kBzP`GF4@3x45XuTQ!S zKI90gw>wpxLBpBo*>1Lf|vNKcXv>%*Fk#rs(X0ywb3QD;# z3URxW+(47XorK(OpFdWg7(T=t{0=_csi~=u5h;EYiL4F}x(M)*;&R&XGYQR21wQ=g zsSYGV#ehWvR60_^O3CiQ2apMrm}6}eNPIXge&Sw4lnsdY3qH{C!QqxTJ|NYVO3TI3 za2A^*;7Lt_Dt871A0TM_W3hm@oM}L~-vitNAFgD7k~_)kar?Y!Ubh!gC;(XkPH|g3 z9^k_)Sn|M}^bjA2M;Q((^pTN3u7K_(+za2pSOokhfgvC;;?HO0rnIf)7s;LOc6?={}DS zhG{a|gExDuUew2JP6Io55$fOL4xsfgo|2Ip_>gXck4pgYAs75Wd4Nt{PkMSfWJFpL z*f|+@d`WH>_$A%rvf*bknwt*Ml9ZX@L^6vd87MSBx5e<0hq_Rg3PXcMF2IM|?1d=9 z;RzrVq%rUT#3vyfD(?DFLD63FAwDwlJqlvfk>X7cz_f9t$S@#*4Y3!&TdoXr>3|oS z4yxOok`(X+{2-Js!|(OOo=Abv2d8*#qRTv%bjb~Y?!|Fa9>GV7&*%3h1(ITKMMCO4 zOYEmW$q#|+&B(}rj7UcaxRey!0SQE>WWaX9&lE_74B#WsE7OH!s2HdKV;EK~ez@{| zkWivag`t5G2=~Otjh6deR zx*4Uv8_rEm!L?Uxj7gCl4HvId<{D<={ws06 zx3i(6Iln#gFMu_cvG~Y!T|K?u@4I-Av7?t^{1xlEo7er~^LsGA_j|^aHMl37I~Y-j z{wu{tKjth1-}GaN*;rNJSTOJKd3n^af-y@2V+<^gwFHihESEhWI5shdX=~uv$|BAC z0>^f92;0E~<58kyC>E1$c(Oa{oU=YZN1*~#td(MZf=2hRloOw_THY}?&gM$ zEN^*dV~%(F+O^&q8r9>iY3^z6-q75XGd#w-u(`XzTiejtF__pTmW}w{K-O$27YO8ynjix?7vGyuDrChR%NP zy5{a4+|aeEx1qhWy|WeTG=g?CvbU|-+tSqu;xsfic6F@7a2n9thS}G)H#T>I3h9Zn zXhdQLCTsFG^z?K!wl`osZ&O!eUq^FiZ$mG^)6%}SxyPGMGio<@Yr9%{H#T%PCuV4n zK$g3^n)(`>wP~8#!KL<9eZ9>Z479@V4O!my&c?NUO$5ot_TILxzFq*+(H>ZcR?zs~ zLkRZu08v6G%iGbcVZE*oTh|_DLmV)=9iRr#KW}Nm5z~TZSTI03 zZJ~{AT^&D$mDteI*WHN)K@r^8)aC8z%JTN~tyKlHvrP!>7`R6 zn09qSGP=DTUEP|55KLnb_xAR$Yi?=4LODUO#$NAe=%*Drx|-Ts+DX_N*7idDaDZtW znwm81H9FJc>l(TNb>G^CZVmmW=AQOeY%-7>I(Jc)`6^OxP3H$GFnCrlGaji(LzHX#z_F|M#L5WUaOo6c#eStzp#8}*-UTZ^jdsR%S#7O%evP-hvbv(Y4Cl(LW>hSgSza~UdjamNnqTLwD6cH9 z!=!cdwOa#Im6zeZS>DRBni+F2^YjbKE6VGZWO-+m*HzJ+voPs&Z}s$=y7CzdDyG+X zs~6N%&#x`R95XR(Re9B{8mv-QSq3C9(Tw@kOKQqz&#BA8O?5b#<*lokKC`THdd<8n zf^dG_oU$6PHY5j7Vh(TFLb|zj&h&~3?*-*`wRJUR(<^B#hI(gL&95XHEvT9~y{>$I zmG^=&pfde}3OWhcK!q6<)5|Nfyfdd)PM=Na1Q(%U0dz*lK{w1Ut17FRUXkUktuC8U zP6wc4c}>|2K#P%}Jt%>*m}$oRs@k#(7vKcO1(yIr=9Fo80D(mZwZ zYe0|yD2vK#%d))FYszbhBeQDe16<-K?jRf&fSwpyUKN0sctq#u+F0qpD7rg9#hGQ( zD=;C1r0U0GHTf#LxUqR1c3e+zlj}-SQ>eNYg^|L})Rh6GdUhwauYOKD#P-Dg(oCJM z<%acv=4U|TYf6~Z2-GC3lCFfCHZ(&M_K@a>*61RovauaTl}t=`S4UUC{`EAh#bUT? zc$BxPxnV7C3n)iy^|5LpXc*UZw`1as-R-?lDc*)Yn9J_=O#zdP6*R2Q$ADHjAO7y< zo^`NT?Hiic_UB-+ZnA3xFSK(@S9eDMbxlV$_Lc_ShF)(gQ3`esTBEx)r>(blUFrDo z8#ivuSrv4}a-a&?4A#Zgv3}Og+F2`WW4-W4(^(_Sz~6lMow=+4N2@Tx%Pzo}Ue<$8 zH*01Mtb=9YY&q-1_#7NfXKV4}Wi`Wd^=RLkaZfYu*?`|o82RIQylkO1q5@#G zp!K>iUlWez1A?`fbv^6DxEg%c;?tnb>t%VEGY^pdc;4Ww!8x;s=NvoZ|2-<$ndN^? z2O9fhm`Bs1U84h0g=pRYS~P>|4LDwdb6toK{uNhf4f<5$&TiaGGxp$j7ijF&zInlQ zy4D=va;vsdCsrhG5r`uwP|#Wg8A%z<*r<)`fQ0I^2WOzsI&DZQ8nGft3_+OA64|WbITAHF zrh7?>NL~o8M%>d7z|V^-bfyoqp;-vlUR>Ad(}E+CG=e4_=ZR9@Q7e$N5*K>eM%+g< zq!mYKLTA?Dd>2;f)8N$UM9?&0ZhbGcgGPOrgXRvd5yaugE70sjheklwr_G{MbtBHw z-Cf#TUTwb+zsF(}oPT7$6K*;O`v8y5(I9tdEuzZ^uh(IAeJ}Q4ExP_wc+h#B>f-@V zH@?x#x^~d#ZpU|8S(o7;RR0|7ARl#Tbve^9^n%I+r7m?N7;V(((SddT^$Nk=&;ks* zL0{qy@tb(1uSk+Ym~?4)_h^(@jS-Ew9vl-~hvb;>?SfDvVGpxL-!7Hd+sizK<}Z{jGCrl?KOX zdDAIEXK4PP=PBVzIOzQE(EjS*Noxh^^z$62G5s1}TdbPU}9*Lf=NPqI*fpwt@yDQr?Pj zgi%}I9NiJrrG%jl360mOdp?cm%0I_xgyT8}Ba%j#dI8V>7J{+soKKGtOoR0A(e?!K zoK_$VMst~V!-!TVYI`-BcY69S z`zY*!Yc{isHEt7DGfZ&-~aj=v*QDMK+zRoi6)i*GO{4 z%Kr$II(9#$$B8d}xSQm8G?jmfvLk*A(RhT9V<}0P{WA>4${p!i-2>FI3GTX}-5}3M z-+SbX5QKEcXnU;h)JFJA4UigIUAMKmbd6}(;Eex&Xsz>i?Fd%7UrlnX+sBqMayN&S zY1EpJ%yAu#YT*aZ!qFmlm^Iq9a-8$Rx2wUGh492@;_OVENyG@cLe~?uow*3db!-mC zEzsuD=cvIrntKVx(%j_3S83noVSE+lBF$IE7HeyiVK$m|KGvhTD{;00e`!q`M|aG? znFaVx$Fp(ng1~xJxQlS0@s;@01t6`%`H@w}LPay{>k(v?_*R4Y=LBG$j=9UV`3Qbm zf0j0Hm39~1H!A??bR1XXt{SXbju{rXhK{jSVm@{Sc=xx z;UM}i49rI|K=@bShiFT5tkqU1!`Vul)92M^^#Urwgy7bxu>jv^VkFUlFr+!?8gYf_ zSus44APUL?@pL*yRBDjZ{e%foWJDT9V-lQgEO&lNI)W?ET*Nn`RE4%mEht+CUJ+dS z8M>e3iX?vqFc^_IUG9nA!Ld3Oh(A>tXD z4AN|b`?My(9E69YnWQYphY_mK{v#Qql}HNc8?8Wlgk+4kMAw4*Q(q&<#|7HG!CC3P zvC>acM*Ao@E_fg909|5#tUGiX1=pszM{p-;C0gnb5|?#q{Ofr~w0#+D99heC0UOtY zS#%FL7!T@pf5g|(?a*jnlqeFknIje@sH0;pMNU) zF2{JvXVAFOo^a3`(Y;AMRwDbT!%rR(`Ruw+NWP!$rRcr}dF6VPP0@fJsRpAMiVn#( zkB$F&03-PU1ckm<(Eg9iMX?uULCABU)ri76G_;yd&3|TV&yN@>Ql+@08}n?`j(atz zI`O>$P|&P&wViFk_h1a8=LZOf5nlZ(9t3guSM(=Ou?G^Q$5`zeg~`9n!CHhFL8`}V zLHg2=r|&MPE9Brizl!24@c;3Pbcnf=)eNM$;K7|d6Nh}j*TX-EC;M@5Y`AxZnKh2(G zpW^&>zR$4SP@=qtJIC`r`K+UtVd?bF}{QC zkusHI>_zqodk^OsTg@f>juY9+G5mbZ4zbm2fPKOx<(MJV=#yKd@7aKKQ2HJiO8D{c z1d+g2iZ|tY`4xE=@B%(u5(OebT!7!pX#~54ePU?g{TM?(o3X-x^rG~H^d|cV&|_6; zxwKijg?+>y}uJ-z7`d{UOvQLz}OV!1%@R+j;_=63 zE01pxkIfd34vI%q@vth6sN&zB5{FgsP`r3h6%X8RQ65mm{T6Y*U%u~Ni*jGSxYr_n zGbj!%30DrO;@5-X;Gp;wzWhoR_o(9ERB`v9xa-bH<*p`iXQa5JEnc~!N!;!~cUy{b z`=GcjMcj(Pw+@P5-V&<(GF;qpvrD-pRNU+m2liW)175M;D)!x!qU;+KH(}sSDdNVx zp~{V^V($$eWpAjs!6UB6`Rn7vb)jOL7c}1zRb5LB-8>3uNDlWe)TDd%5T(-llTox^MT+=MOI5K1=r0Kui(O(-idd+M1*)i1MXf4oRB@pys^_OD)%(Q! z6j9|8m8z&v#XMEa9Teq*VvbqN@yoNy4l1)$QFc(woDrkU927HR#0`C_6fit|NLp+zb3pHoGlMHKqw2?Z8qf=v`y zM7}EWWVe#HMdXf;QF5EaczhclBXU%cJt(p=qm-<9A`|B_qr^D;88=U4q&t+1NRggq zQPLeE%_34=A|=_Oq~wcahe%3vDM_Is(ItG&6va0vyxgLA^F>0WNbt+?aTX=sDdH?5 z)+}QEa*U@`iPe3y0EbHz zPW*AE2nYT+<_UYGu&KhT3X9pISoR6CMVS4vaZnhVgn}VTsgV8A!hvHU96|zAQl#J( z!TmCe5c~<=bop+c`TyuY_Wx+z|Le=fvBwOG4Dzxpuj{asQr>jff8k>9t4n;@S?7KA zx{Th#topFM-}}V5bJdIG7-h*}CHAmLF&&mul0Nyli=Sj?&8uGQJ^bggnSoi$>Sy9y z?P4r|e{>qFmCejXn-^|(p9Az1Nl}=>6*P{S6tlr> zR1D@)vA}>h&LkTYlTip|6V z+$V%DMEHb{ALi}rcc^OYTHaQs?pKZty{N9_cMrXx-U?`56!(fYKtmYC`<)73C}UM- zlw_m9U~-*3`ypX!F*LC`h2*PUe$^3UG zW5K}hT%e*MQy_ds9O9D{qJ4^eAwGO$rhY$*n=8d2SH?4n)c5N@s#m|S z|F~W~QOKiash<||xO&m1p2BA<->z;wrk;9F-Ojht=RNK@#0J4ZeiDysf#+Nd2f40{l_0} zdxo3O{`_ZfS0siOaGz+Z@W`b;ZHAXmes}7-Q#kJ_3CNDN<6VxgFw%J5 zALXkhiARi#^A-Mjvo+c}&RSxfXPuX}%(^^n74NWirdf^530vokbH<0W7)z`*JT)pe z&5~x#Ov}ujlr|~1Tq+mkmO0irX>)UzN=wCZ%W~`T$mL0k)7p3!@08Yvc1yc;ZEo@k zw!+M(@?xJsGIC#7fvWD&fyT(g8c9Zk%LpjPNReCOf422JY(w8SYDiY$Hknf zbL%z?Z2ngL!*j1iNAsM&E_<%IaMA7a7dB1)dv)!B?#UY_iM{Go(+>AMr2h9h_1V=k zXMFd{{-N%yrMZVs#>J^$>W1_J+IJZ{II6W!u%G#kk!i2V+PrE zR#RaEngZj81F8$-Z&$w&&muCgGq2yt)*9D17}#etSzWTj_3qiD*rudraX)lWs#NIm zaGxZ(Lp{=R^`ojv6@f$I=bsj--yG!AZs%!ICC^ZQKXjM+);<-X3qSXo`i=CtHh;X| zVO-1BIE*GVz3yGMz``t0GJFqb5J9*=v1#4~wHWyO%H9{>D*iVU86)EDkl z|1k8h`T;MJ>UsV?o&nf1q!O5hubG?8@~6A(R*Tsv!%kXkCZTk=ZH^|7$p)vz;1*m+ z%qd&Vc7wG*SpU@3A0|XHx@RR+f(OtD zHr^j5DT0w%W}=kUNgzFraQjKu^SFP!ZkGc_S%brOFK?Tt?gtE82(wA&E)e~itmgPb zB$^5nNf24+6n&}ow|8n-;zbMCk=zxxzd+vlX2a*th zE`vnBhxNqUdeWNW>&KZxBE!N$eB)dn4xFYPa1u7=RBlRsQE?IdgNnuegq6oX>`xvl z84WU-vI(BzBJ5x$HC1j*kIe~nd#dZIHl)SpdEA~FF|o6;S^e+B->PRiR<-ijBY)?{ z&zCQmc30<;eTD1Vmn@rpaMjXV3cJ=wr(RL7y!M8hcsN&%^8Rb~?o&Sp4XOM7PT*}} zz5Z;A*#y7C!zFI;fP|%@PnPlfR zwut2cLTfzd^A20;<{h@yEnEByvz~h%i(2vHpXe^0xFp0EqJ*T7L*d)a>z-0?D&XzB z^DACcaOO+6?=Q{ahB;>n)$eeV3-X)*x<;~J_%oQS$l(!ESfrxJrAj1oEOuIZJV@^W zv@nOlgfmi@JYgaVP!70DN=SQaazG&BFaYIin$p(TI1J^y!*&hSC=Jvo78L;X5k*l9 z(hBl^LZD~^>KTh+;FG*HIGq0<#GJu z>U%0{md>l4LzAbq!5kOCqr<3HisNcdoL4Od*gScd9xMV;gb+Yq# zm;mNWgi908b@QIdi}eE%!jP#r3v+J}udKgB-KZYA^vkxACI8j_o0sRRJq@?hS2_;+CELrk>cSA*W);J#R^&UES(<|7f=TvYn z6mlj(yWi!X#O=b4V}aiaXR=wA6tir_$D)|caw!v5W1qrBt=Ve9R#qG)qXOk=mSh`L z^}8pZC#ln%)06MQGlhc|lsdTGmIPkIYp)pkir>=3AN%dG!efQ%-lC!U>GJNOTf~EBYt+xdT^FBAoQwe{(|}_f zyTM;#P$XH7Lw-(1lCD&aHo8{2SA@o`i0(1=hxXW|4XoB)A0OuyOpb6N8HnFJBE;f~ zCy5Purn*tk6vcPyNqD5>iw04}CetE|d56vV{+f4q6ngO*dhski$a2W7k=QDSxyEvy z7|vIVXNre5WM^HJ`ze>yZuPz`1HF^F-d=nAv)BEi?!{i^nEL5wHv8MZRXQUIaPoVKmVN<8EZoe-ioY_{|SGZVDxS=Q3)sxZ`Tb~|c7IvFCBua!N zq>p&tK`r=)Qvuu{wdOkLiF6J6bZiP;VEs|`tln5}syEkL>aF$R^%3=v^-=ZF^)a>; zqn%W)dpR1S;TodD`ZHYmwEKpo)$8{zmfS@P@4oQK|B0&l)ru#+Q1`1Ra;#k!06 z>^D{(kv@6)#wCrv-Cf@zy{QglWxe`nLEZnBxx3Of|Vs9=IQk(N7}~qFhfr~+n5YB7hj(nnH^&jX(3LtCnh^2OoTXn2x`b> z)tpvxO?BFybdfgD)ImTCYw|zuu#0wrhkk`<>MmEKI5m?7RKzHkK1FjPeVU##22=+* zm!l~!9qzlWW%0&aTh$|L*YHZ7I>6;e4{hpIZ&qLVhx*k!QbEh+CFS@?x8BiP+i+W7 z?W(QW*EPTXm&12n`}^$ixA*^#ditfqcl=d~+_-9H-NsdAwa^cBkgQ@z7R5H({0YWb z3tP!o$gw>ZxhKk!*yC!7s!unjB!q;dgxGbt(tJ4Vn4^UFh*VjBN~$1jPVGGNgQ1YN zbI)s5$sf{X?Xq>*yBuB4uH>$iuGFqH^NM0!R~D0Nomz-Zl+WA&Bb~~%5J~s1>k1c< zbVXL)v*PhDV9sLC@rYlnzgT_hjf)3Z5&^Bu+3C-~GY~DUs-9Ll3Rj3E#dUcC>kbENP+!OHjXl=@jEcNFE zb0G%vXwQ!+rKUQA=KXE5n7Gl*3^Keh%8VQZ2%7hXya+sFRi4beUYj4k!Wn+>uhP7YlXvclCKA)`Sg zqDhL24zZY#vH>m3B0f6QC+v=BWM`53g4RLYN^TF757A#eeF`Bfs1slVv0x-erAq_% zkt;gli-r^x>283L+)^IH+h(Z;`0MI^lWWnAx%1~-SW*32&(y8|)$qFyS8uDRE-~>Y z^;Z6UUiFri(kZKpN~X-XfR~O-zwf4vPq$2-TA2x)m#cRgS1WfyvsJJa{=)Lg?3{7V zNVYX9EXJ_aRx!(Y$+)d~VVC%}PFYlm{FGUa%+9H>De)rG6CW`nEy5FCTnXk3e5l9f zdeAfgt#@`ZWo}$YPaUPuoKiNU6c}~icO2YSF*Viq6?S_RbhmOsw zedgC6@eAt8E+3i~&SRcC#vKRtbgJK9tNvZRZ&B^-t5(%iuH{o-JIv?oI{eIv;5rE{pxDLY|-jPTxX_fNNYOcn@^*<(-`K1L4&$K({UusF>Y8GF_#3r^ol zEi&sf$+ZRv4!=!wywIT!vjNBsW|pN^ZnEED4rO%XrH) z%O1;f_%SIalO@5NY0j`*VKTs>BClDqcgP%`8oK{RwGUOnC%8$yLG|$KmvWc-wQ_7Q zQ%aDgA=+X{Vk!rKnF;YU`sDnjZclWS%M%qHWx|2c6CE8@>S5cQmm9W4*P6FQB7sTC zO9P9Hk)v%MVT%qE(ecqzRFuzk8pw?HlgC3Lo*o#BorV(jfUd=pL`d*}Q*w{_0J~Rn zhYMPJFRXZPYV&2+u4+C}A>F@f4eZ-fL)#GpPUn_$`^4V1Ws|0=M~8YY*)VU8+Al@L z-qiUw^>50tTmNm>ThJU79lnk|AIs+YW1S&3CSs%dge#=a)+FlVVqH$=3=fYn*yEte zT+buo)b04$qb~KRmZi+~J8UkSTQax|?u?j>Sa}6skph$C9dUH@R1b_3W$udQ_pgFK z_l|m?yK4tuf2{Y5{;Bo9>-tQ6_4(g4pV&PM&fHw?dYDhyam&HtiR$a+Gu2zwZ|^@^ zUWMHXJ{aa|e28FvzmIz&%n{6Ejwoe2&9!`IxCxp^wuGCN7?)X!h>FyR4b?No@aSR# z>WTsaGBpXr)OMF3n_v(0l6Hnxc^$n|jz5g=x-_(8TYWc|7^*o33 z2T>_6yYRx#Zg^e2c~b`-GUu9gUC|Gfk0u}S}N}}TrTZI`h2H_ z1YOH*n`!4*qilfGHEbV8S;%1-AF+>G(!NS|lnnJ0Nv)+rw_G6IU3}&^T;h+^FYvin z&qk2U5;SHu-=7I+%tnuynE{QNpfQg?6M)1>keH(^Bao0>j@fiUvDD1;kHFZhZVkdP zw3Fxo*+N&s*V>LLit~7xH#$a&#p2%5*tjTH0*PCch})I`iPHrx!AErfnT2~@PLew8 zmH}8&w;oU))dCMK*9o1fr9p$>QLdA+n<-G6Ba$aah}2a2u1j7B>H|TEr-}tvHxa+b>n?B#5s_N6v+&^($Ny(Ra(!#FUWqbyYcob52=j{`V)z@dwQV*%$ zJp8iL1$jUwNRvd;byn8rpKc1OHyH=Q1EpsH)6K+v2?x}cU@et)nl4A}#9|=cL;G

1$W7r@e0!HPu@g0mkJPQ3hhEb-G4zU50u9!$ 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 W_YF69v_ymE68(IXMraZLEdC#Jb*K;k literal 0 HcmV?d00001 diff --git a/src/tests/elementary/fonts/VeraBd.ttf b/src/tests/elementary/fonts/VeraBd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51d6111d722981a86766cc99c53f1956e5c0a229 GIT binary patch literal 58716 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 V!o5>kzlbDRJjU5v3Ujx#{eMf40U-bY literal 0 HcmV?d00001 diff --git a/src/tests/elementary/fonts/VeraSe.ttf b/src/tests/elementary/fonts/VeraSe.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4b4ecc66671e45e9dac162aa85dab558cebc191c GIT binary patch literal 60280 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 Date: Thu, 3 Oct 2019 14:01:35 +0200 Subject: [PATCH 15/29] doc: improve colorselector preview Summary: this has always been broken, it was just never noticed because colorselector was broken @fix ref T8304 Reviewers: segfaultxavi Reviewed By: segfaultxavi Subscribers: segfaultxavi, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8304 Differential Revision: https://phab.enlightenment.org/D10278 --- doc/widgets/widget_preview_colorselector.c | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/widgets/widget_preview_colorselector.c b/doc/widgets/widget_preview_colorselector.c index 784a2d67b4..48b3daca29 100644 --- a/doc/widgets/widget_preview_colorselector.c +++ b/doc/widgets/widget_preview_colorselector.c @@ -8,6 +8,7 @@ evas_object_show(bx); Evas_Object *o = elm_colorselector_add(win); evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);; +elm_colorselector_palette_item_selected_set(eina_list_data_get(elm_colorselector_palette_items_get(o)), EINA_TRUE); elm_box_pack_end(bx, o); evas_object_show(o); From b12f07e52bf5d16595cc3ef120ecdc8c203437fc Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Thu, 3 Oct 2019 20:18:54 +0200 Subject: [PATCH 16/29] Pyolian gendoc: unbreak after recent eolian changes shiny new generated documentation can be seen at: www.gurumeditation.it/dokuwiki_efl/ --- src/scripts/gendoc/doc_enum.template | 2 +- src/scripts/gendoc/doc_macros.include | 4 ++-- src/scripts/gendoc/gendoc.py | 20 ++++++++++--------- src/scripts/pyolian/eolian.py | 2 +- src/scripts/pyolian/generator.py | 2 +- src/scripts/pyolian/test_gen_class.template | 3 +-- .../pyolian/test_gen_namespace.template | 2 +- 7 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/scripts/gendoc/doc_enum.template b/src/scripts/gendoc/doc_enum.template index bdbb37a527..f7a11ee6c4 100644 --- a/src/scripts/gendoc/doc_enum.template +++ b/src/scripts/gendoc/doc_enum.template @@ -33,7 +33,7 @@ enum { typedef enum { - ${field.c_name}$ = ${field.value.serialize}$, + ${field.c_constant}$ = ${field.value.serialize}$, } ${enum.name.replace('.', '_')}$; diff --git a/src/scripts/gendoc/doc_macros.include b/src/scripts/gendoc/doc_macros.include index 64b5311e5a..507693179a 100644 --- a/src/scripts/gendoc/doc_macros.include +++ b/src/scripts/gendoc/doc_macros.include @@ -178,8 +178,8 @@ interface#! #!#### FUNC_SCOPE(func) ###################################################### #!############################################################################## - - ''class method'' #! + + ''static method'' #! diff --git a/src/scripts/gendoc/gendoc.py b/src/scripts/gendoc/gendoc.py index 2ebaa605d4..bee5161f0b 100755 --- a/src/scripts/gendoc/gendoc.py +++ b/src/scripts/gendoc/gendoc.py @@ -41,7 +41,7 @@ _choices = ['start', 'classes', 'enums', 'structs', 'aliases'] parser.add_argument('--step', '-s', metavar='STEP', default=None, choices=_choices, help='A single step to run (default to all), ' - 'valid choices: '+ ', '.join(_choices)) + 'valid choices: ' + ', '.join(_choices)) args = parser.parse_args() @@ -64,6 +64,8 @@ if not eolian_db.all_eo_files_parse(): def cleanup_db(): global eolian_db del eolian_db + + atexit.register(cleanup_db) @@ -72,14 +74,14 @@ def page_path_for_object(obj): path = ['data', 'pages', 'develop', 'api'] for ns in obj.namespaces: path.append(ns.lower()) - output_file = obj.short_name.lower() + '.txt' - return os.path.join(args.root_path, *path, output_file) + output_filename = obj.short_name.lower() + '.txt' + return os.path.join(args.root_path, *path, output_filename) # render a (temporary) page for analizying the namespaces hierarchy t = Template('namespaces.template') -nspaces = [ ns for ns in eolian_db.all_namespaces - if ns.name.startswith(args.namespace) ] +nspaces = [ns for ns in eolian_db.all_namespaces + if ns.name.startswith(args.namespace)] tot_classes = tot_regulars = tot_abstracts = tot_mixins = tot_ifaces = 0 tot_enums = tot_structs = tot_aliases = 0 @@ -113,7 +115,7 @@ totals = [ root_ns = eolian_db.namespace_get_by_name(args.namespace) -output_file = os.path.join(args.root_path,'data','pages','develop','api','namespaces.txt') +output_file = os.path.join(args.root_path, 'data', 'pages', 'develop', 'api', 'namespaces.txt') t.render(output_file, args.verbose, root_ns=root_ns, totals=totals) @@ -121,10 +123,10 @@ t.render(output_file, args.verbose, root_ns=root_ns, totals=totals) if args.step in ('start', None): t = Template('doc_start.template') - nspaces = [ ns for ns in eolian_db.all_namespaces - if ns.name.startswith(args.namespace) ] + nspaces = [ns for ns in eolian_db.all_namespaces + if ns.name.startswith(args.namespace)] - output_file = os.path.join(args.root_path,'data','pages','develop','api','start.txt') + output_file = os.path.join(args.root_path, 'data', 'pages', 'develop', 'api', 'start.txt') t.render(output_file, args.verbose, nspaces=nspaces) diff --git a/src/scripts/pyolian/eolian.py b/src/scripts/pyolian/eolian.py index 2c23fa2c5b..a8b77e15e9 100644 --- a/src/scripts/pyolian/eolian.py +++ b/src/scripts/pyolian/eolian.py @@ -1154,7 +1154,7 @@ class Typedecl(Object): class Enum_Type_Field(Object): def __repr__(self): - return "".format(self) + return "".format(self) @cached_property def c_constant(self): diff --git a/src/scripts/pyolian/generator.py b/src/scripts/pyolian/generator.py index 0b7e8024e3..28138f531f 100755 --- a/src/scripts/pyolian/generator.py +++ b/src/scripts/pyolian/generator.py @@ -141,7 +141,7 @@ class Template(pyratemp.Template): 'Eolian_Typedecl_Type': eolian.Eolian_Typedecl_Type, 'Eolian_Type_Type': eolian.Eolian_Type_Type, 'Eolian_Type_Builtin_Type': eolian.Eolian_Type_Builtin_Type, - 'Eolian_C_Type_Type': eolian.Eolian_C_Type_Type, + # 'Eolian_C_Type_Type': eolian.Eolian_C_Type_Type, 'Eolian_Expression_Type': eolian.Eolian_Expression_Type, 'Eolian_Expression_Mask': eolian.Eolian_Expression_Mask, 'Eolian_Binary_Operator': eolian.Eolian_Binary_Operator, diff --git a/src/scripts/pyolian/test_gen_class.template b/src/scripts/pyolian/test_gen_class.template index cc0e845ab5..d53ae823e5 100644 --- a/src/scripts/pyolian/test_gen_class.template +++ b/src/scripts/pyolian/test_gen_class.template @@ -3,8 +3,7 @@ Class: ${cls.name}$ (${cls.short_name}$) ================================================================================ Class type: ${cls.type}$ -Base Class: ${cls.base_class.name if cls.base_class else None}$ -Inherits: ${', '.join([i.name for i in cls.inherits])}$ +Parent: ${cls.parent.name if cls.parent else None}$ Hierarchy: ${' => '.join([i.name for i in cls.hierarchy])}$ InheritsFull: ${', '.join([i.name for i in cls.inherits_full])}$ Namespace: ${cls.namespace}$ diff --git a/src/scripts/pyolian/test_gen_namespace.template b/src/scripts/pyolian/test_gen_namespace.template index 8cdb4f7ca7..27e6dcb533 100644 --- a/src/scripts/pyolian/test_gen_namespace.template +++ b/src/scripts/pyolian/test_gen_namespace.template @@ -59,7 +59,7 @@ Enums: * ${typedecl.name}$ - ${field.c_name}$ = ${field.value.serialize}$ + ${field.c_constant}$ = ${field.value.serialize}$ no enums available From 5c94f62b6d9173d9238ef905291d62181b3381e1 Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Thu, 3 Oct 2019 22:40:16 +0200 Subject: [PATCH 17/29] Pyolian gendoc: make links to functions actually work --- src/scripts/gendoc/doc_class.template | 6 ++++-- src/scripts/gendoc/doc_macros.include | 11 ++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/scripts/gendoc/doc_class.template b/src/scripts/gendoc/doc_class.template index 92e7b5b04b..14f1f568a1 100644 --- a/src/scripts/gendoc/doc_class.template +++ b/src/scripts/gendoc/doc_class.template @@ -57,8 +57,8 @@ ${OBJECT_STATIC_CONTENT(obj=cls, section='description')}$ +{{anchor:${impl.short_name}$}} ${IMPLEMENT_FULL(impl=impl, cls=cls)}$ -\\ No properties defined in this class. @@ -68,8 +68,8 @@ No properties defined in this class. +{{anchor:${impl.short_name}$}} ${IMPLEMENT_FULL(impl=impl, cls=cls)}$ -\\ No methods defined in this class. @@ -103,4 +103,6 @@ No extensions defined in this class. | ''${ev.name}$'' | ${BEST_SUMMARY(obj=ev)}$ ${OBJECT_SCOPE(obj=ev)}$ ${EVENT_TAGS}$ | ${TYPE_LINK(type=ev.type) if ev.type else 'None'}$ | + +No events defined in this class. diff --git a/src/scripts/gendoc/doc_macros.include b/src/scripts/gendoc/doc_macros.include index 507693179a..9fb07d2ea4 100644 --- a/src/scripts/gendoc/doc_macros.include +++ b/src/scripts/gendoc/doc_macros.include @@ -167,12 +167,9 @@ interface#! :${n.lower()}$#! - -:method#! - -:property#! - -:${func.short_name}$|${func.short_name}$]] +:${func.class_.short_name}$#! +#${func.short_name}$#! +|${func.short_name}$]] #!############################################################################## #!#### FUNC_SCOPE(func) ###################################################### @@ -305,7 +302,7 @@ ${', ' if i else ''}$#! ) #! -${IMPLEMENT_TAGS}$ #! +${IMPLEMENT_TAGS(impl=impl)}$ #! => //${impl.function.method_return_type.short_name}$// #! From 94733b4926c4032fe6f6b411e07526e11a46fd1e Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 4 Oct 2019 10:05:45 +0900 Subject: [PATCH 18/29] efl_ui_animation_view : Put @beta on Efl.Ui.Animation_View_State Summary: Efl.Ui.Animation_View class still in beta state. Test Plan: N/A Reviewers: Hermet, kimcinoo, smohanty Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10268 --- src/lib/elementary/efl_ui_animation_view.eo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/elementary/efl_ui_animation_view.eo b/src/lib/elementary/efl_ui_animation_view.eo index d07905989e..2d090bbee7 100644 --- a/src/lib/elementary/efl_ui_animation_view.eo +++ b/src/lib/elementary/efl_ui_animation_view.eo @@ -1,5 +1,5 @@ -enum Efl.Ui.Animation_View_State +enum @beta Efl.Ui.Animation_View_State { [[State of animation view]] not_ready, [[Animation is not ready to play. (Probably, it didn't file set yet or failed to read file.]] From 04a49f58752060dfac9360b3d83ed50164cfae79 Mon Sep 17 00:00:00 2001 From: Bruno da Silva Belo Date: Fri, 4 Oct 2019 08:46:29 +0200 Subject: [PATCH 19/29] csharp: Standardizing doc tag. Reviewers: felipealmeida, brunobelo, segfaultxavi Reviewed By: segfaultxavi Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10280 --- .../eolian_mono/eolian/mono/documentation.hh | 2 +- src/bindings/mono/efl_mono/Bind.cs | 6 ++--- src/bindings/mono/efl_mono/Factory.cs | 2 +- src/bindings/mono/efl_mono/GenericModel.cs | 2 +- src/bindings/mono/efl_mono/UserModel.cs | 2 +- src/bindings/mono/efl_mono/efl_all.cs | 10 ++++++-- .../mono/efl_mono/efl_csharp_application.cs | 9 ++++--- src/bindings/mono/eina_mono/eina_accessor.cs | 15 +++++++++--- src/bindings/mono/eina_mono/eina_array.cs | 5 +++- src/bindings/mono/eina_mono/eina_binbuf.cs | 4 +++- src/bindings/mono/eina_mono/eina_common.cs | 13 +++++++--- src/bindings/mono/eina_mono/eina_config.cs | 9 ++++--- src/bindings/mono/eina_mono/eina_error.cs | 5 +++- src/bindings/mono/eina_mono/eina_hash.cs | 5 +++- src/bindings/mono/eina_mono/eina_inarray.cs | 5 +++- src/bindings/mono/eina_mono/eina_inlist.cs | 5 +++- src/bindings/mono/eina_mono/eina_iterator.cs | 5 +++- src/bindings/mono/eina_mono/eina_list.cs | 5 +++- src/bindings/mono/eina_mono/eina_log.cs | 5 +++- src/bindings/mono/eina_mono/eina_promises.cs | 2 +- src/bindings/mono/eina_mono/eina_slice.cs | 10 ++++++-- src/bindings/mono/eina_mono/eina_strbuf.cs | 5 +++- src/bindings/mono/eina_mono/eina_value.cs | 24 ++++++++++++++----- .../mono/eldbus_mono/eldbus_config.cs | 5 +++- .../mono/eldbus_mono/eldbus_connection.cs | 5 +++- .../mono/eldbus_mono/eldbus_message.cs | 5 +++- .../mono/eldbus_mono/eldbus_object.cs | 5 +++- .../mono/eldbus_mono/eldbus_pending.cs | 5 +++- src/bindings/mono/eldbus_mono/eldbus_proxy.cs | 5 +++- 29 files changed, 139 insertions(+), 46 deletions(-) diff --git a/src/bin/eolian_mono/eolian/mono/documentation.hh b/src/bin/eolian_mono/eolian/mono/documentation.hh index 0035754dbe..0bdfbda64e 100644 --- a/src/bin/eolian_mono/eolian/mono/documentation.hh +++ b/src/bin/eolian_mono/eolian/mono/documentation.hh @@ -560,7 +560,7 @@ struct documentation_generator { std::string str = doc.full_text; if (!doc.since.empty()) - str += "\\
Since EFL " + doc.since; + str += "\\
Since EFL " + doc.since + "."; str += tail_text; return generate_tag_summary(sink, str, context); } diff --git a/src/bindings/mono/efl_mono/Bind.cs b/src/bindings/mono/efl_mono/Bind.cs index 27c78593d6..c4aec5b5e1 100644 --- a/src/bindings/mono/efl_mono/Bind.cs +++ b/src/bindings/mono/efl_mono/Bind.cs @@ -13,7 +13,7 @@ namespace Efl { /// /// It is internally instantiated and returned by generated extension methods. /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// public class BindableProperty { @@ -79,7 +79,7 @@ public class BindableProperty /// /// It is internally instantiated and returned by generated extension methods. /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// public class BindablePart { @@ -99,7 +99,7 @@ public class BindablePart ///

Represents bindable factory parts as used by instances. /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// public class BindableFactoryPart { diff --git a/src/bindings/mono/efl_mono/Factory.cs b/src/bindings/mono/efl_mono/Factory.cs index f0d62bbb68..2c9f139ca7 100644 --- a/src/bindings/mono/efl_mono/Factory.cs +++ b/src/bindings/mono/efl_mono/Factory.cs @@ -15,7 +15,7 @@ namespace Efl { namespace Ui { /// factory.Style().Bind("Name"); // The factory Style property is bound to the Name property for the given model. /// /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// /// public class ItemFactory : Efl.Ui.LayoutFactory, IDisposable diff --git a/src/bindings/mono/efl_mono/GenericModel.cs b/src/bindings/mono/efl_mono/GenericModel.cs index 6b162ed58d..79cca5f2a5 100644 --- a/src/bindings/mono/efl_mono/GenericModel.cs +++ b/src/bindings/mono/efl_mono/GenericModel.cs @@ -11,7 +11,7 @@ namespace Efl { /// Generic implementation for MVVM models based on /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// public class GenericModel : Efl.Object, Efl.IModel, IDisposable { diff --git a/src/bindings/mono/efl_mono/UserModel.cs b/src/bindings/mono/efl_mono/UserModel.cs index ffe6f9e6d6..08e6f6e371 100644 --- a/src/bindings/mono/efl_mono/UserModel.cs +++ b/src/bindings/mono/efl_mono/UserModel.cs @@ -65,7 +65,7 @@ internal class ModelHelper /// PersonModel p = await model.GetAtAsync(0); /// /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// [Efl.Eo.BindingEntity] public class UserModel : Efl.MonoModelInternal, IDisposable diff --git a/src/bindings/mono/efl_mono/efl_all.cs b/src/bindings/mono/efl_mono/efl_all.cs index 52903013fe..e57da1b80e 100644 --- a/src/bindings/mono/efl_mono/efl_all.cs +++ b/src/bindings/mono/efl_mono/efl_all.cs @@ -39,7 +39,10 @@ static class UnsafeNativeMethods } } -/// Wrapper around the initialization functions of all modules. (Since EFL 1.23) +/// Wrapper around the initialization functions of all modules. +/// +/// Since EFL 1.23. +/// public static class All { private static bool InitializedUi = false; @@ -109,7 +112,10 @@ public static class All namespace Ui { -/// Initialization and shutdown of the UI libraries. (Since EFL 1.23) +/// Initialization and shutdown of the UI libraries. +/// +/// Since EFL 1.23. +/// public static class Config { public static void Init() diff --git a/src/bindings/mono/efl_mono/efl_csharp_application.cs b/src/bindings/mono/efl_mono/efl_csharp_application.cs index 5010cc9419..809b2433bd 100644 --- a/src/bindings/mono/efl_mono/efl_csharp_application.cs +++ b/src/bindings/mono/efl_mono/efl_csharp_application.cs @@ -9,7 +9,10 @@ namespace Efl namespace Csharp { -///The components to be initialized. (Since Efl 1.23) +/// The components to be initialized. +/// +/// Since EFL 1.23. +/// public enum Components { ///Basic components: Eina, Eo, Ecore, Evas and DBus. @@ -22,13 +25,13 @@ public enum Components /// This represents the entry point for the EFL framework /// You can use this class to implement the 4 abstract methods which will then be called accordingly /// All subsystems of efl are booted up correctly when the abstract methods of this class are called. +/// +/// Since EFL 1.23. /// /// /// Calls to efl outside those efl-callbacks or outside the mainloop are not allowed and will lead to issues /// /// -/// (Since EFL 1.23) -/// /// /// UserApp is the class that implements the Application abstract /// diff --git a/src/bindings/mono/eina_mono/eina_accessor.cs b/src/bindings/mono/eina_mono/eina_accessor.cs index 6442c55961..5880503062 100644 --- a/src/bindings/mono/eina_mono/eina_accessor.cs +++ b/src/bindings/mono/eina_mono/eina_accessor.cs @@ -19,7 +19,10 @@ internal class AccessorNativeFunctions } /// Accessors provide an uniform way of accessing Eina containers, -/// similar to C++ STL's and C# IEnumerable (SINCE EFL 1.23). +/// similar to C++ STL's and C# IEnumerable. +/// +/// Since EFL 1.23. +/// public class Accessor : IEnumerable, IDisposable { /// Pointer to the native accessor. @@ -133,7 +136,10 @@ public class Accessor : IEnumerable, IDisposable } } -///Accessor for Inlists (SINCE EFL 1.23). +/// Accessor for Inlists. +/// +/// Since EFL 1.23. +/// public class AccessorInList : Accessor { /// Create a new accessor wrapping the given pointer. @@ -153,7 +159,10 @@ public class AccessorInList : Accessor } } -///Accessor for Inarrays (SINCE EFL 1.23). +/// Accessor for Inarrays. +/// +/// Since EFL 1.23. +/// public class AccessorInArray : Accessor { /// Create a new accessor wrapping the given pointer. diff --git a/src/bindings/mono/eina_mono/eina_array.cs b/src/bindings/mono/eina_mono/eina_array.cs index 90cc4b4cf1..655fbab03a 100644 --- a/src/bindings/mono/eina_mono/eina_array.cs +++ b/src/bindings/mono/eina_mono/eina_array.cs @@ -45,7 +45,10 @@ public static class ArrayNativeFunctions eina_array_foreach_custom_export_mono(IntPtr array, IntPtr cb, IntPtr fdata); } -/// A container of contiguous allocated elements (SINCE EFL 1.23). +/// A container of contiguous allocated elements. +/// +/// Since EFL 1.23. +/// public class Array : IEnumerable, IDisposable { public static uint DefaultStep = 32; diff --git a/src/bindings/mono/eina_mono/eina_binbuf.cs b/src/bindings/mono/eina_mono/eina_binbuf.cs index 3dcda65bf8..66b89e272d 100644 --- a/src/bindings/mono/eina_mono/eina_binbuf.cs +++ b/src/bindings/mono/eina_mono/eina_binbuf.cs @@ -7,7 +7,9 @@ namespace Eina { /// -/// A Generic buffer designed to be a mutable string (SINCE EFL 1.23). +/// A Generic buffer designed to be a mutable string. +/// +/// Since EFL 1.23. /// public class Binbuf : IDisposable { diff --git a/src/bindings/mono/eina_mono/eina_common.cs b/src/bindings/mono/eina_mono/eina_common.cs index d552f75128..77ed8b719e 100644 --- a/src/bindings/mono/eina_mono/eina_common.cs +++ b/src/bindings/mono/eina_mono/eina_common.cs @@ -41,7 +41,10 @@ internal static class NativeCustomExportFunctions efl_mono_native_efl_unref_addr_get(); } -/// Wrapper around native memory DllImport'd functions (SINCE EFL 1.23). +/// Wrapper around native memory DllImport'd functions. +/// +/// Since EFL 1.23. +/// public static class MemoryNative { public static void Free(IntPtr ptr) @@ -127,7 +130,9 @@ public static class MemoryNative } /// -/// Conversor of raw pointer to a type and type to raw pointer (SINCE EFL 1.23). +/// Conversor of raw pointer to a type and type to raw pointer +/// +/// Since EFL 1.23. /// public static class PrimitiveConversion { @@ -152,7 +157,9 @@ public static class PrimitiveConversion } /// -/// Conversor of string to native string and native string to string.. (SINCE EFL 1.23). +/// Conversor of string to native string and native string to string. +/// +/// Since EFL 1.23. /// public static class StringConversion { diff --git a/src/bindings/mono/eina_mono/eina_config.cs b/src/bindings/mono/eina_mono/eina_config.cs index 3b35b2142f..1b57da029c 100644 --- a/src/bindings/mono/eina_mono/eina_config.cs +++ b/src/bindings/mono/eina_mono/eina_config.cs @@ -7,7 +7,9 @@ namespace Eina { /// -/// Manage the initialization and cleanup for eina (SINCE EFL 1.23). +/// Manage the initialization and cleanup for eina. +/// +/// Since EFL 1.23. /// public class Config { @@ -30,8 +32,9 @@ public class Config } /// -/// Wrapper class for pointers that need some cleanup afterwards -/// like strings (SINCE EFL 1.23). +/// Wrapper class for pointers that need some cleanup afterwards like strings +/// +/// Since EFL 1.23. /// public class DisposableIntPtr : IDisposable { diff --git a/src/bindings/mono/eina_mono/eina_error.cs b/src/bindings/mono/eina_mono/eina_error.cs index f3f4fbae03..a1b4f1e9d9 100644 --- a/src/bindings/mono/eina_mono/eina_error.cs +++ b/src/bindings/mono/eina_mono/eina_error.cs @@ -6,7 +6,10 @@ using System.Runtime.InteropServices; namespace Eina { -/// Error codes from native Eina methods. (Since EFL 1.23) +/// Error codes from native Eina methods. +/// +/// Since EFL 1.23. +/// public struct Error : IComparable { int code; diff --git a/src/bindings/mono/eina_mono/eina_hash.cs b/src/bindings/mono/eina_mono/eina_hash.cs index aca590fea2..f4678a1f26 100644 --- a/src/bindings/mono/eina_mono/eina_hash.cs +++ b/src/bindings/mono/eina_mono/eina_hash.cs @@ -130,7 +130,10 @@ public static class HashNativeFunctions eina_hash_iterator_ptr_key_wrapper_new_custom_export_mono(IntPtr hash); } -/// Wrapper around native dictionary mapping keys to values. (Since EFL 1.23) +/// Wrapper around native dictionary mapping keys to values. +/// +/// Since EFL 1.23. +/// public class Hash : IEnumerable>, IDisposable { public IntPtr Handle {get; set;} = IntPtr.Zero; diff --git a/src/bindings/mono/eina_mono/eina_inarray.cs b/src/bindings/mono/eina_mono/eina_inarray.cs index 4ca3babe5a..a9c8d5fc92 100644 --- a/src/bindings/mono/eina_mono/eina_inarray.cs +++ b/src/bindings/mono/eina_mono/eina_inarray.cs @@ -67,7 +67,10 @@ public static class InarrayNativeFunctions eina_inarray_accessor_new(IntPtr array); } -/// Wrapper around an inplace array. (Since EFL 1.23) +/// Wrapper around an inplace array. +/// +/// Since EFL 1.23. +/// public class Inarray : IEnumerable, IDisposable { public static uint DefaultStep = 0; diff --git a/src/bindings/mono/eina_mono/eina_inlist.cs b/src/bindings/mono/eina_mono/eina_inlist.cs index f93c1ab485..ed98730c5d 100644 --- a/src/bindings/mono/eina_mono/eina_inlist.cs +++ b/src/bindings/mono/eina_mono/eina_inlist.cs @@ -80,7 +80,10 @@ public static class InlistNativeFunctions eina_inlist_iterator_wrapper_new_custom_export_mono(IntPtr in_list); } -/// Wrapper around an inplace list. (Since EFL 1.23) +/// Wrapper around an inplace list. +/// +/// Since EFL 1.23. +/// public class Inlist : IEnumerable, IDisposable { public IntPtr Handle {get;set;} = IntPtr.Zero; diff --git a/src/bindings/mono/eina_mono/eina_iterator.cs b/src/bindings/mono/eina_mono/eina_iterator.cs index 47d1627638..defbd9601d 100644 --- a/src/bindings/mono/eina_mono/eina_iterator.cs +++ b/src/bindings/mono/eina_mono/eina_iterator.cs @@ -29,7 +29,10 @@ public static class IteratorNativeFunctions eina_carray_iterator_new(IntPtr array); } -/// Wrapper around a native Eina iterator. (Since EFL 1.23) +/// Wrapper around a native Eina iterator. +/// +/// Since EFL 1.23. +/// public class Iterator : IEnumerable, IDisposable { public IntPtr Handle {get;set;} = IntPtr.Zero; diff --git a/src/bindings/mono/eina_mono/eina_list.cs b/src/bindings/mono/eina_mono/eina_list.cs index 7521ed6f46..cf787455bd 100644 --- a/src/bindings/mono/eina_mono/eina_list.cs +++ b/src/bindings/mono/eina_mono/eina_list.cs @@ -106,7 +106,10 @@ public static class ListNativeFunctions eina_list_last_data_get_custom_export_mono(IntPtr list); } -/// Native wrapper around a linked list of items. (Since EFL 1.23) +/// Native wrapper around a linked list of items. +/// +/// Since EFL 1.23. +/// public class List : IEnumerable, IDisposable { diff --git a/src/bindings/mono/eina_mono/eina_log.cs b/src/bindings/mono/eina_mono/eina_log.cs index 1e0de41941..5782ef6466 100644 --- a/src/bindings/mono/eina_mono/eina_log.cs +++ b/src/bindings/mono/eina_mono/eina_log.cs @@ -9,7 +9,10 @@ namespace Eina { // Manual wrappers around eina functions -/// EFL Logging facilities. (Since EFL 1.23) +/// EFL Logging facilities. +/// +/// Since EFL 1.23. +/// public class Log { [DllImport(efl.Libs.Eina)] private static extern void eina_log_print( diff --git a/src/bindings/mono/eina_mono/eina_promises.cs b/src/bindings/mono/eina_mono/eina_promises.cs index 2d0f99d991..897d200cf1 100644 --- a/src/bindings/mono/eina_mono/eina_promises.cs +++ b/src/bindings/mono/eina_mono/eina_promises.cs @@ -71,7 +71,7 @@ static internal class PromiseNativeMethods /// /// With a Promise you can attach futures to it, which will be used to notify of the value being available. /// -/// (Since Efl 1.23) +/// Since Efl 1.23. /// public class Promise : IDisposable { diff --git a/src/bindings/mono/eina_mono/eina_slice.cs b/src/bindings/mono/eina_mono/eina_slice.cs index 1e31f8134d..a0c8fd971c 100644 --- a/src/bindings/mono/eina_mono/eina_slice.cs +++ b/src/bindings/mono/eina_mono/eina_slice.cs @@ -14,7 +14,10 @@ public interface ISliceBase int Length {get;set;} }; -/// Pointer to a slice of native memory. (Since EFL 1.23) +/// Pointer to a slice of native memory. +/// +/// Since EFL 1.23. +/// [StructLayout(LayoutKind.Sequential)] public struct Slice : ISliceBase { @@ -41,7 +44,10 @@ public struct Slice : ISliceBase } } -/// Pointer to a slice of native memory. (Since EFL 1.23) +/// Pointer to a slice of native memory. +/// +/// Since EFL 1.23. +/// [StructLayout(LayoutKind.Sequential)] public struct RwSlice : ISliceBase { diff --git a/src/bindings/mono/eina_mono/eina_strbuf.cs b/src/bindings/mono/eina_mono/eina_strbuf.cs index e6a8ced124..97664d9620 100644 --- a/src/bindings/mono/eina_mono/eina_strbuf.cs +++ b/src/bindings/mono/eina_mono/eina_strbuf.cs @@ -50,7 +50,10 @@ static internal class StrbufNativeMethods } // namespace EinaNative -///Native string buffer, similar to the C# StringBuilder class. (Since EFL 1.23) +/// Native string buffer, similar to the C# StringBuilder class. +/// +/// Since EFL 1.23. +/// public class Strbuf : IDisposable { ///Pointer to the underlying native handle. diff --git a/src/bindings/mono/eina_mono/eina_value.cs b/src/bindings/mono/eina_mono/eina_value.cs index 561f696fa4..d3791bd4f3 100644 --- a/src/bindings/mono/eina_mono/eina_value.cs +++ b/src/bindings/mono/eina_mono/eina_value.cs @@ -536,7 +536,10 @@ static internal class UnsafeNativeMethods } } -/// Struct for passing Values by value to Unmanaged functions. (Since EFL 1.23) +/// Struct for passing Values by value to Unmanaged functions. +/// +/// Since EFL 1.23. +/// [StructLayout(LayoutKind.Sequential)] public struct ValueNative { @@ -549,7 +552,10 @@ public struct ValueNative } } -/// Exception for failures when setting an container item. (Since EFL 1.23) +/// Exception for failures when setting an container item. +/// +/// Since EFL 1.23. +/// [Serializable] public class SetItemFailedException : Exception { @@ -574,7 +580,10 @@ public class SetItemFailedException : Exception } } -/// Exception for methods that must have been called on a container. (Since EFL 1.23) +/// Exception for methods that must have been called on a container. +/// +/// Since EFL 1.23. +/// [Serializable] public class InvalidValueTypeException: Exception { @@ -600,7 +609,10 @@ public class InvalidValueTypeException: Exception } -/// Managed-side Enum to represent Eina_Value_Type constants. (Since EFL 1.23) +/// Managed-side Enum to represent Eina_Value_Type constants. +/// +/// Since EFL 1.23. +/// public enum ValueType { /// Signed 8 bit integer. Same as 'sbyte' @@ -729,7 +741,7 @@ static class ValueTypeMethods /// marshall_type_impl.hh in the generator). User-facing API still uses Eina.ValueType /// normally. /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// [EditorBrowsable(EditorBrowsableState.Never)] public class ValueTypeBox @@ -935,7 +947,7 @@ static class ValueTypeBridge /// blobs and structs. It is able to convert between data types, including /// to and from strings. /// -/// (Since EFL 1.23) +/// Since EFL 1.23. /// public class Value : IDisposable, IComparable, IEquatable { diff --git a/src/bindings/mono/eldbus_mono/eldbus_config.cs b/src/bindings/mono/eldbus_mono/eldbus_config.cs index b2decdf5eb..b0a0c1fd13 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_config.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_config.cs @@ -6,7 +6,10 @@ using System.Runtime.InteropServices; namespace eldbus { -/// Initializes Eldbus. (Since EFL 1.23) +/// Initializes Eldbus. +/// +/// Since EFL 1.23. +/// public static class Config { [DllImport(efl.Libs.Eldbus)] private static extern int eldbus_init(); diff --git a/src/bindings/mono/eldbus_mono/eldbus_connection.cs b/src/bindings/mono/eldbus_mono/eldbus_connection.cs index 8bdc7a161b..18ec10f32a 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_connection.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_connection.cs @@ -88,7 +88,10 @@ public static class EldbusConnectionNativeFunctions // eldbus_name_owner_changed_callback_del(IntPtr conn, string bus, Eldbus_Name_Owner_Changed_Cb cb, IntPtr cb_data); } -/// Represents a DBus connection. (Since EFL 1.23) +/// Represents a DBus connection. +/// +/// Since EFL 1.23. +/// public class Connection : IDisposable { public enum Type diff --git a/src/bindings/mono/eldbus_mono/eldbus_message.cs b/src/bindings/mono/eldbus_mono/eldbus_message.cs index bb0a8d81c9..2bd7431c98 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_message.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_message.cs @@ -189,7 +189,10 @@ public static class EldbusMessageNativeFunctions } -/// Represents a DBus message. (Since EFL 1.23) +/// Represents a DBus message. +/// +/// Since EFL 1.23. +/// public class Message : IDisposable { public IntPtr Handle {get;set;} = IntPtr.Zero; diff --git a/src/bindings/mono/eldbus_mono/eldbus_object.cs b/src/bindings/mono/eldbus_mono/eldbus_object.cs index b703b48fbf..d86ad6cc61 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_object.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_object.cs @@ -82,7 +82,10 @@ public static class EldbusObjectNativeFunctions // eldbus_object_manager_interfaces_removed(IntPtr obj, Eldbus_Signal_Cb cb, IntPtr cb_data); } -/// Represents a DBus object. (Since EFL 1.23) +/// Represents a DBus object. +/// +/// Since EFL 1.23. +/// public class Object : System.IDisposable { diff --git a/src/bindings/mono/eldbus_mono/eldbus_pending.cs b/src/bindings/mono/eldbus_mono/eldbus_pending.cs index 65b1f3be35..3570ca1842 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_pending.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_pending.cs @@ -41,7 +41,10 @@ public static class EldbusPendingNativeFunctions eldbus_pending_free_cb_del(IntPtr pending, IntPtr cb, IntPtr data); } -/// Represents a DBus pending. (Since EFL 1.23) +/// Represents a DBus pending. +/// +/// Since EFL 1.23. +/// public class Pending { public IntPtr Handle {get;set;} = IntPtr.Zero; diff --git a/src/bindings/mono/eldbus_mono/eldbus_proxy.cs b/src/bindings/mono/eldbus_mono/eldbus_proxy.cs index 5a2baf211a..2d692cdd65 100644 --- a/src/bindings/mono/eldbus_mono/eldbus_proxy.cs +++ b/src/bindings/mono/eldbus_mono/eldbus_proxy.cs @@ -65,7 +65,10 @@ public static class EldbusProxyNativeFunctions eldbus_proxy_event_callback_del(IntPtr proxy, int type, IntPtr cb, IntPtr cb_data); } -/// Represents a DBus proxy object. (Since EFL 1.23) +/// Represents a DBus proxy object. +/// +/// Since EFL 1.23. +/// public class Proxy : IDisposable { public IntPtr Handle {get;set;} = IntPtr.Zero; From f81c4d3f9f5c531d34161421315d4fdcc1cea935 Mon Sep 17 00:00:00 2001 From: Stefan Schmidt Date: Wed, 2 Oct 2019 14:56:22 +0200 Subject: [PATCH 20/29] docs: fix elementary group name in docs Use aliase for group name for a better look. Reviewed-by: Xavi Artigas Differential Revision: https://phab.enlightenment.org/D10271 --- elm_intro.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/elm_intro.h.in b/elm_intro.h.in index 7394aaad7c..cf489dbe05 100644 --- a/elm_intro.h.in +++ b/elm_intro.h.in @@ -1,5 +1,5 @@ /** - * @page elementary_main + * @page elementary_main Elementary * @image html elementary.png * @version @VMAJ@.@VMIN@.@VMIC@ * @date 2008-2014 From 15696f5e7c15072d65e76fb40c5ad4867be1e552 Mon Sep 17 00:00:00 2001 From: Stefan Schmidt Date: Wed, 2 Oct 2019 16:25:03 +0200 Subject: [PATCH 21/29] efl_ui_video: bring back Elm_video doxygen group for docs This group got lost at some point and resulted in broken link in our doxygen documentation. Reviewed-by: Xavi Artigas Differential Revision: https://phab.enlightenment.org/D10273 --- src/lib/elementary/efl_ui_video_legacy.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/elementary/efl_ui_video_legacy.h b/src/lib/elementary/efl_ui_video_legacy.h index 1d4d3c3621..d010d3a53e 100644 --- a/src/lib/elementary/efl_ui_video_legacy.h +++ b/src/lib/elementary/efl_ui_video_legacy.h @@ -1,5 +1,10 @@ typedef Eo Elm_Video; +/** + * @defgroup Elm_Video Video + * @ingroup Elementary + */ + /** * @brief Add a new Elm_Player object to the given parent Elementary (container) object. * From 6d8e39a6425e721eb40e0cb1e67f1cbf5b223cc0 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 4 Oct 2019 13:16:02 +0100 Subject: [PATCH 22/29] build - remove evas-modules option as its rather pointless evas-modules affects evas engine modules if they are static or shared, but ecore evas modules are still modules... so all in all this doesnt help much as it still requires modules to be separate from the shared libs, thus disallowing for statically linking efl into an app anyway etc. etc. etc. ... so less options to deal with, less complexity. better. --- .ci/ci-configure.sh | 4 ++-- meson.build | 16 +------------- meson_options.txt | 7 ------ src/modules/evas/engines/buffer/meson.build | 20 +++++++---------- src/modules/evas/engines/drm/meson.build | 18 +++++++-------- src/modules/evas/engines/fb/meson.build | 18 +++++++-------- src/modules/evas/engines/gl_cocoa/meson.build | 18 +++++++-------- src/modules/evas/engines/gl_drm/meson.build | 18 +++++++-------- .../evas/engines/gl_generic/meson.build | 18 +++++++-------- src/modules/evas/engines/gl_x11/meson.build | 18 +++++++-------- src/modules/evas/engines/meson.build | 22 ------------------- .../evas/engines/software_ddraw/meson.build | 20 ++++++++--------- .../evas/engines/software_gdi/meson.build | 18 +++++++-------- .../evas/engines/software_x11/meson.build | 18 +++++++-------- .../evas/engines/wayland_egl/meson.build | 19 +++++++--------- .../evas/engines/wayland_shm/meson.build | 18 +++++++-------- 16 files changed, 100 insertions(+), 170 deletions(-) diff --git a/.ci/ci-configure.sh b/.ci/ci-configure.sh index 54ed89d4a5..97fcb1785d 100755 --- a/.ci/ci-configure.sh +++ b/.ci/ci-configure.sh @@ -25,7 +25,7 @@ if [ "$DISTRO" != "" ] ; then DISABLED_LINUX_COPTS=" -Daudio=false -Davahi=false -Dx11=false -Dphysics=false -Deeze=false \ -Dopengl=none -Deina-magic-debug=false -Dbuild-examples=false -Dbuild-tests=false \ -Dcrypto=gnutls -Dglib=false -Dgstreamer=false -Dsystemd=false -Dpulseaudio=false \ - -Dnetwork-backend=connman -Dxinput2=false -Dtslib=false -Devas-modules=static \ + -Dnetwork-backend=connman -Dxinput2=false -Dtslib=false \ -Devas-loaders-disabler=gst,pdf,ps,raw,svg,xcf,bmp,dds,eet,generic,gif,ico,jp2k,json,pmaps,psd,tga,tgv,tiff,wbmp,webp,xpm \ -Decore-imf-loaders-disabler=xim,ibus,scim -Demotion-loaders-disabler=gstreamer,gstreamer1,libvlc,xine \ -Demotion-generic-loaders-disabler=vlc -Dfribidi=false -Dfontconfig=false \ @@ -37,7 +37,7 @@ if [ "$DISTRO" != "" ] ; then MINGW_COPTS="--cross-file .ci/cross_toolchain.txt -Davahi=false -Deeze=false -Dsystemd=false \ -Dpulseaudio=false -Dx11=false -Dopengl=none -Dlibmount=false \ - -Devas-loaders-disabler=json,pdf,ps,raw,svg,rsvg -Devas-modules=static -Dbindings=luajit \ + -Devas-loaders-disabler=json,pdf,ps,raw,svg,rsvg -Dbindings=luajit \ -Dharfbuzz=true -Dpixman=true -Dembedded-lz4=false " if [ "$1" = "options-enabled" ]; then diff --git a/meson.build b/meson.build index d653f96ede..b75bcf3e3f 100644 --- a/meson.build +++ b/meson.build @@ -252,21 +252,7 @@ evas_img_modules = ['evas' ,[], true, false, false, false evas_engines = [join_paths('evas', 'engines'),[], true, false, false, false, false, false, [], []] evas_goal = ['evas_goal' ,[], false, true, false, false, false, false, ['eina', 'efl', 'eo'], []] -if get_option('evas-modules') == 'static' - evas_settings = [ - evas_lib, - evas_img_modules, - evas_engines, - evas_goal, - ] -else - evas_settings = [ - evas_lib, - evas_img_modules, - evas_goal, - evas_engines, - ] -endif +evas_settings = [ evas_lib, evas_img_modules, evas_goal, evas_engines ] subprojects = [ # name | option | mod | lib | bin | bench | tests | examples | pkg-config options | name of static libs diff --git a/meson_options.txt b/meson_options.txt index 33e74dedbb..0a4702cad8 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -192,13 +192,6 @@ option('unmount-path', description : 'Path to the unmount binary, if "detect" internal eeze bins are used' ) -option('evas-modules', - type : 'combo', - choices : ['shared', 'static'], - value : 'shared', - description : 'Should modules be shared or statically inlined' -) - option('evas-loaders-disabler', type : 'array', description : 'List of modular image/vector loaders to disable in efl', diff --git a/src/modules/evas/engines/buffer/meson.build b/src/modules/evas/engines/buffer/meson.build index ef42fd41bf..8c6a071e77 100644 --- a/src/modules/evas/engines/buffer/meson.build +++ b/src/modules/evas/engines/buffer/meson.build @@ -13,15 +13,11 @@ install_headers('Evas_Engine_Buffer.h', install_dir : join_paths(dir_include, 'evas-'+version_major), ) -if get_option('evas-modules') == 'shared' - evas_engine_buffer_mod = shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -else - evas_engine_buffer_mod = [] -endif +evas_engine_buffer_mod = shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/drm/meson.build b/src/modules/evas/engines/drm/meson.build index 441a09a316..fb97b631de 100644 --- a/src/modules/evas/engines/drm/meson.build +++ b/src/modules/evas/engines/drm/meson.build @@ -7,13 +7,11 @@ engine_src = files([ engine_deps = [ecore_drm2, libdrm] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/fb/meson.build b/src/modules/evas/engines/fb/meson.build index c857e83aec..625edd5d33 100644 --- a/src/modules/evas/engines/fb/meson.build +++ b/src/modules/evas/engines/fb/meson.build @@ -9,13 +9,11 @@ engine_src = files([ engine_deps = [ecore_fb] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/gl_cocoa/meson.build b/src/modules/evas/engines/gl_cocoa/meson.build index a175c3c730..a0bd765c9b 100644 --- a/src/modules/evas/engines/gl_cocoa/meson.build +++ b/src/modules/evas/engines/gl_cocoa/meson.build @@ -7,13 +7,11 @@ engine_src = files([ engine_deps = [ecore_cocoa, gl_deps] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/gl_drm/meson.build b/src/modules/evas/engines/gl_drm/meson.build index 28988d5599..8acf82365d 100644 --- a/src/modules/evas/engines/gl_drm/meson.build +++ b/src/modules/evas/engines/gl_drm/meson.build @@ -7,13 +7,11 @@ engine_src = files([ engine_deps = [ecore_drm2, libdrm, gl_deps, dependency('gbm')] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/gl_generic/meson.build b/src/modules/evas/engines/gl_generic/meson.build index 86e5c8fedd..d137eb26ef 100644 --- a/src/modules/evas/engines/gl_generic/meson.build +++ b/src/modules/evas/engines/gl_generic/meson.build @@ -70,13 +70,11 @@ engine_deps = [gl_deps] engine_include_dir = include_directories(join_paths('..','software_generic'), join_paths('..', 'gl_common')) -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/gl_x11/meson.build b/src/modules/evas/engines/gl_x11/meson.build index 7aec198e39..0bac84147e 100644 --- a/src/modules/evas/engines/gl_x11/meson.build +++ b/src/modules/evas/engines/gl_x11/meson.build @@ -7,13 +7,11 @@ engine_src = files([ engine_deps = [ecore_x_deps, gl_deps] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/meson.build b/src/modules/evas/engines/meson.build index d0c1b8fe24..2504a761a9 100644 --- a/src/modules/evas/engines/meson.build +++ b/src/modules/evas/engines/meson.build @@ -62,28 +62,6 @@ foreach engine_conf : engines subdir(engine) - if get_option('evas-modules') == 'static' - tmp = static_library(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas_pre] + engine_deps, - ) - evas_static_list += declare_dependency( - include_directories: [include_directories('.')] + config_dir + [engine_include_dir], - link_with: tmp, - dependencies : [eina, evas_pre] + engine_deps, - sources : engine_src - ) - if engine == 'gl_generic' - #special case, see evas_module.c - config_h.set('EVAS_STATIC_BUILD_GL_COMMON', '1') - else - config_h.set('EVAS_STATIC_BUILD_'+engine.to_upper(), '1') - endif - else - #nothing here shared building is handled directly on the engine configuration side - #reason for this is that the .so files have to be placed in the correct directory in order - # to make them discoverable by evas module code - endif config_h.set('BUILD_ENGINE_'+engine.to_upper(), '1') endif endforeach diff --git a/src/modules/evas/engines/software_ddraw/meson.build b/src/modules/evas/engines/software_ddraw/meson.build index 404fe7c894..9b742757fa 100644 --- a/src/modules/evas/engines/software_ddraw/meson.build +++ b/src/modules/evas/engines/software_ddraw/meson.build @@ -7,14 +7,12 @@ engine_src = files([ engine_deps = [cc.find_library('ddraw')] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - cpp_args: ['-fno-rtti', '-fno-exceptions'], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + cpp_args: ['-fno-rtti', '-fno-exceptions'], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/software_gdi/meson.build b/src/modules/evas/engines/software_gdi/meson.build index e492e001e6..ef7a0aa690 100644 --- a/src/modules/evas/engines/software_gdi/meson.build +++ b/src/modules/evas/engines/software_gdi/meson.build @@ -7,13 +7,11 @@ engine_src = files([ engine_deps = [cc.find_library('gdi32')] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/software_x11/meson.build b/src/modules/evas/engines/software_x11/meson.build index b5409568c0..c2f8f544e8 100644 --- a/src/modules/evas/engines/software_x11/meson.build +++ b/src/modules/evas/engines/software_x11/meson.build @@ -28,13 +28,11 @@ config_h.set('BUILD_ENGINE_SOFTWARE_XLIB', '1') #it looks weird but is right, gl_deps is needed for evas_x_egl.c engine_deps = [x11, ecore_x, ecore_x_deps, gl_deps] -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/wayland_egl/meson.build b/src/modules/evas/engines/wayland_egl/meson.build index 818210fc62..af7314627b 100644 --- a/src/modules/evas/engines/wayland_egl/meson.build +++ b/src/modules/evas/engines/wayland_egl/meson.build @@ -8,14 +8,11 @@ engine_deps = [ecore_wl2, dependency('wayland-egl'), gl_deps] engine_include_dir = include_directories(join_paths('..','wayland_common')) - -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) diff --git a/src/modules/evas/engines/wayland_shm/meson.build b/src/modules/evas/engines/wayland_shm/meson.build index 29453841cc..2a181cea48 100644 --- a/src/modules/evas/engines/wayland_shm/meson.build +++ b/src/modules/evas/engines/wayland_shm/meson.build @@ -8,13 +8,11 @@ engine_deps = [ecore_wl2] engine_include_dir = include_directories(join_paths('..','wayland_common')) -if get_option('evas-modules') == 'shared' - shared_module(mod_full_name, engine_src, - include_directories : config_dir + [engine_include_dir], - dependencies : [eina, evas] + engine_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) -endif +shared_module(mod_full_name, engine_src, + include_directories : config_dir + [engine_include_dir], + dependencies : [eina, evas] + engine_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension +) +module_files += join_paths(mod_install_dir, 'lib'+mod_full_name + '.' + sys_mod_extension) From d5c8d0529278300eb889881b4774deebc4d46f31 Mon Sep 17 00:00:00 2001 From: Lauro Moura Date: Thu, 3 Oct 2019 20:52:25 -0300 Subject: [PATCH 23/29] csharp: Move locks inside AddRemove native handlers Summary: Instead of using a lock block in every method definition, we just need them inside the actual methods adding/removing the handlers. Kudos to @herb for the suggestion. Reviewers: felipealmeida, herb, brunobelo Reviewed By: brunobelo Subscribers: cedric, #reviewers, herb, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9758 --- src/bin/eolian_mono/eolian/mono/events.hh | 40 +++++------ src/bindings/mono/eo_mono/EoWrapper.cs | 86 ++++++++++++----------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/bin/eolian_mono/eolian/mono/events.hh b/src/bin/eolian_mono/eolian/mono/events.hh index 6c5f12ea2a..2e4ca32c66 100644 --- a/src/bin/eolian_mono/eolian/mono/events.hh +++ b/src/bin/eolian_mono/eolian/mono/events.hh @@ -447,36 +447,30 @@ struct event_definition_generator scope_tab << "{\n" << scope_tab << scope_tab << "add\n" << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << "lock (eflBindingEventLock)\n" + << scope_tab << scope_tab << scope_tab << "Efl.EventCb callerCb = (IntPtr data, ref Efl.Event.NativeStruct evt) =>\n" << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "Efl.EventCb callerCb = (IntPtr data, ref Efl.Event.NativeStruct evt) =>\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "var obj = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(data).Target;\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "if (obj != null)\n" << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "var obj = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(data).Target;\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "if (obj != null)\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << event_args + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "try\n" << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << event_args - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "try\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "value?.Invoke(obj, args);\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "catch (Exception e)\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Log.Error(e.ToString());\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);\n" - << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "value?.Invoke(obj, args);\n" << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "};\n\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "AddNativeEventHandler(" << library_name << ", key, callerCb, value);\n" - << scope_tab << scope_tab << scope_tab << "}\n" // End of lock block + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "catch (Exception e)\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "{\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Log.Error(e.ToString());\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);\n" + << scope_tab << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << scope_tab << "}\n" + << scope_tab << scope_tab << scope_tab << "};\n\n" + << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" + << scope_tab << scope_tab << scope_tab << "AddNativeEventHandler(" << library_name << ", key, callerCb, value);\n" << scope_tab << scope_tab << "}\n\n" << scope_tab << scope_tab << "remove\n" << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << "lock (eflBindingEventLock)\n" - << scope_tab << scope_tab << scope_tab << "{\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" - << scope_tab << scope_tab << scope_tab << scope_tab << "RemoveNativeEventHandler(" << library_name << ", key, value);\n" - << scope_tab << scope_tab << scope_tab << "}\n" // End of lock block + << scope_tab << scope_tab << scope_tab << "string key = \"_" << upper_c_name << "\";\n" + << scope_tab << scope_tab << scope_tab << "RemoveNativeEventHandler(" << library_name << ", key, value);\n" << scope_tab << scope_tab << "}\n" << scope_tab << "}\n\n" ).generate(sink, attributes::unused, context); diff --git a/src/bindings/mono/eo_mono/EoWrapper.cs b/src/bindings/mono/eo_mono/EoWrapper.cs index 79d597c7b6..eae4eea3b5 100644 --- a/src/bindings/mono/eo_mono/EoWrapper.cs +++ b/src/bindings/mono/eo_mono/EoWrapper.cs @@ -20,7 +20,7 @@ namespace Eo public abstract class EoWrapper : IWrapper, IDisposable { /// Object used to synchronize access to EFL events. - protected readonly object eflBindingEventLock = new object(); + private readonly object eflBindingEventLock = new object(); private bool generated = true; private System.IntPtr handle = IntPtr.Zero; @@ -215,30 +215,33 @@ public abstract class EoWrapper : IWrapper, IDisposable /// Managed delegate that will be called by evtCaller on event raising. protected void AddNativeEventHandler(string lib, string key, Efl.EventCb evtCaller, object evtDelegate) { - IntPtr desc = Efl.EventDescription.GetNative(lib, key); - if (desc == IntPtr.Zero) + lock (eflBindingEventLock) { - Eina.Log.Error($"Failed to get native event {key}"); - return; - } + IntPtr desc = Efl.EventDescription.GetNative(lib, key); + if (desc == IntPtr.Zero) + { + Eina.Log.Error($"Failed to get native event {key}"); + return; + } - var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); - var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); - if (ws.EoEvents.ContainsKey((desc, evtDelegate))) - { - Eina.Log.Warning($"Event proxy for event {key} already registered!"); - return; - } + var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); + var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); + if (ws.EoEvents.ContainsKey((desc, evtDelegate))) + { + Eina.Log.Warning($"Event proxy for event {key} already registered!"); + return; + } - IntPtr evtCallerPtr = Marshal.GetFunctionPointerForDelegate(evtCaller); - if (!Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evtCallerPtr, wsPtr)) - { - Eina.Log.Error($"Failed to add event proxy for event {key}"); - return; - } + IntPtr evtCallerPtr = Marshal.GetFunctionPointerForDelegate(evtCaller); + if (!Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evtCallerPtr, wsPtr)) + { + Eina.Log.Error($"Failed to add event proxy for event {key}"); + return; + } - ws.EoEvents[(desc, evtDelegate)] = (evtCallerPtr, evtCaller); - Eina.Error.RaiseIfUnhandledException(); + ws.EoEvents[(desc, evtDelegate)] = (evtCallerPtr, evtCaller); + Eina.Error.RaiseIfUnhandledException(); + } } /// Removes the given event handler for the given event. For internal use only. @@ -247,30 +250,33 @@ public abstract class EoWrapper : IWrapper, IDisposable /// The delegate to be removed. protected void RemoveNativeEventHandler(string lib, string key, object evtDelegate) { - IntPtr desc = Efl.EventDescription.GetNative(lib, key); - if (desc == IntPtr.Zero) + lock (eflBindingEventLock) { - Eina.Log.Error($"Failed to get native event {key}"); - return; - } - - var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); - var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); - var evtPair = (desc, evtDelegate); - if (ws.EoEvents.TryGetValue(evtPair, out var caller)) - { - if (!Efl.Eo.Globals.efl_event_callback_del(handle, desc, caller.evtCallerPtr, wsPtr)) + IntPtr desc = Efl.EventDescription.GetNative(lib, key); + if (desc == IntPtr.Zero) { - Eina.Log.Error($"Failed to remove event proxy for event {key}"); + Eina.Log.Error($"Failed to get native event {key}"); return; } - ws.EoEvents.Remove(evtPair); - Eina.Error.RaiseIfUnhandledException(); - } - else - { - Eina.Log.Error($"Trying to remove proxy for event {key} when it is not registered."); + var wsPtr = Efl.Eo.Globals.efl_mono_wrapper_supervisor_get(handle); + var ws = Efl.Eo.Globals.WrapperSupervisorPtrToManaged(wsPtr); + var evtPair = (desc, evtDelegate); + if (ws.EoEvents.TryGetValue(evtPair, out var caller)) + { + if (!Efl.Eo.Globals.efl_event_callback_del(handle, desc, caller.evtCallerPtr, wsPtr)) + { + Eina.Log.Error($"Failed to remove event proxy for event {key}"); + return; + } + + ws.EoEvents.Remove(evtPair); + Eina.Error.RaiseIfUnhandledException(); + } + else + { + Eina.Log.Error($"Trying to remove proxy for event {key} when it is not registered."); + } } } From 13e856075c787b0f6bfe2e547083b0be4b10e50f Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Sat, 5 Oct 2019 09:32:35 +0200 Subject: [PATCH 24/29] Pyolian gendoc: more links to types need to fix links to Eina types and basic types --- src/scripts/gendoc/doc_macros.include | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/scripts/gendoc/doc_macros.include b/src/scripts/gendoc/doc_macros.include index 9fb07d2ea4..d818363ee9 100644 --- a/src/scripts/gendoc/doc_macros.include +++ b/src/scripts/gendoc/doc_macros.include @@ -157,7 +157,7 @@ interface#! :${n.lower()}$#! -:${type.short_name.lower()}$|${type.name}$]] +:${type.short_name}$|${type.name}$]] #!############################################################################## #!#### FUNC_LINK(func) ####################################################### @@ -250,7 +250,7 @@ interface#! ^ parameters ^ type ^ description ^ -|${PARAM_DIRECTION_TAG(param=par)}$ **${par.name}$**|${par.type.name}$ #! +|${PARAM_DIRECTION_TAG(param=par)}$ **${par.name}$**|${TYPE_LINK(type=par.type)}$ #! |${BEST_SUMMARY(obj=par)}$ ${BEST_DESCRIPTION(obj=par)}$| **This function does not accept any parameter.** @@ -259,7 +259,7 @@ interface#! ${setvar("obj", "func.return_documentation(Eolian_Function_Type.METHOD)")}$#! ^ return ^ description ^ -|**${func.method_return_type.name}$**|${BEST_SUMMARY(obj=obj)}$ ${BEST_DESCRIPTION(obj=obj)}$| +|**${TYPE_LINK(type=func.method_return_type)}$**|${BEST_SUMMARY(obj=obj)}$ ${BEST_DESCRIPTION(obj=obj)}$| **This function does not return anything.** @@ -274,14 +274,14 @@ ${setvar("obj", "func.return_documentation(Eolian_Function_Type.METHOD)")}$#! ^ values ^ type ^ description ^ -|**${val.name}$**|${val.type.name}$|${BEST_SUMMARY(obj=val)}$| +|**${val.name}$**|${TYPE_LINK(type=val.type)}$|${BEST_SUMMARY(obj=val)}$| ^ keys ^ type ^ description ^ -|**${key.name}$**|${key.type.name}$|${BEST_SUMMARY(obj=key)}$| +|**${key.name}$**|${TYPE_LINK(type=key.type)}$|${BEST_SUMMARY(obj=key)}$| From 40676af38390b08518d8f5a24fa2c2cc0aa05723 Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Sat, 5 Oct 2019 10:30:34 +0200 Subject: [PATCH 25/29] Pyolian gendoc: highlight classes in beta state --- src/scripts/gendoc/doc_alias.template | 4 ++++ src/scripts/gendoc/doc_class.template | 4 ++++ src/scripts/gendoc/doc_enum.template | 4 ++++ src/scripts/gendoc/doc_macros.include | 10 ++++++++++ src/scripts/gendoc/doc_start.template | 14 +++++++------- src/scripts/gendoc/doc_struct.template | 4 ++++ 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/scripts/gendoc/doc_alias.template b/src/scripts/gendoc/doc_alias.template index 0f3382344b..4f426be88c 100644 --- a/src/scripts/gendoc/doc_alias.template +++ b/src/scripts/gendoc/doc_alias.template @@ -2,6 +2,10 @@ ~~Title: ${alias.name}$~~ ====== ${alias.name}$ (alias) ====== + +''beta'' This alias is still in beta, api will probably change + + ${BEST_SUMMARY(obj=alias)}$ ${BEST_DESCRIPTION(obj=alias)}$ diff --git a/src/scripts/gendoc/doc_class.template b/src/scripts/gendoc/doc_class.template index 14f1f568a1..04910d619d 100644 --- a/src/scripts/gendoc/doc_class.template +++ b/src/scripts/gendoc/doc_class.template @@ -2,6 +2,10 @@ ~~Title: ${cls.name}$~~ ====== ${cls.name}$ (${CLS_TYPE}$) ====== + +''beta'' This class is still in beta, api will probably change + + ${BEST_SUMMARY(obj=cls)}$ ${BEST_DESCRIPTION(obj=cls)}$ diff --git a/src/scripts/gendoc/doc_enum.template b/src/scripts/gendoc/doc_enum.template index f7a11ee6c4..c097134239 100644 --- a/src/scripts/gendoc/doc_enum.template +++ b/src/scripts/gendoc/doc_enum.template @@ -2,6 +2,10 @@ ~~Title: ${enum.name}$~~ ====== ${enum.name}$ (enum) ====== + +''beta'' This enumeration is still in beta, api will probably change + + ${BEST_SUMMARY(obj=enum)}$ ${BEST_DESCRIPTION(obj=enum)}$ diff --git a/src/scripts/gendoc/doc_macros.include b/src/scripts/gendoc/doc_macros.include index d818363ee9..6dfd45e6d7 100644 --- a/src/scripts/gendoc/doc_macros.include +++ b/src/scripts/gendoc/doc_macros.include @@ -216,6 +216,7 @@ interface#! ''restart'' #! +${OBJ_TAGS(obj=ev)}$ #!############################################################################## #!#### IMPLEMENT_TAGS(impl) ################################################## @@ -228,6 +229,15 @@ interface#! ''write only'' #! +${OBJ_TAGS(obj=impl)}$ + +#!############################################################################## +#!#### OBJ_TAGS(obj) ######################################################### +#!############################################################################## + + + ''beta'' #! + #!############################################################################## #!#### PARAM_DIRECTION_TAG(param) ############################################ diff --git a/src/scripts/gendoc/doc_start.template b/src/scripts/gendoc/doc_start.template index 3a5ebfefbd..ad85ad7bdc 100644 --- a/src/scripts/gendoc/doc_start.template +++ b/src/scripts/gendoc/doc_start.template @@ -17,49 +17,49 @@ so it can be considered valid for all languages. ^ Regular Classes ^^ -| ${CLS_LINK}$ | ${BEST_SUMMARY(obj=cls)}$ | +| ${CLS_LINK}$ ${OBJ_TAGS(obj=cls)}$ | ${BEST_SUMMARY(obj=cls)}$ | #! ^ Abstract Classes ^^ -| ${CLS_LINK}$ | ${BEST_SUMMARY(obj=cls)}$ | +| ${CLS_LINK}$ ${OBJ_TAGS(obj=cls)}$ | ${BEST_SUMMARY(obj=cls)}$ | #! ^ Mixins ^^ -| ${CLS_LINK}$ | ${BEST_SUMMARY(obj=cls)}$ | +| ${CLS_LINK}$ ${OBJ_TAGS(obj=cls)}$ | ${BEST_SUMMARY(obj=cls)}$ | #! ^ Interfaces ^^ -| ${CLS_LINK}$ | ${BEST_SUMMARY(obj=cls)}$ | +| ${CLS_LINK}$ ${OBJ_TAGS(obj=cls)}$ | ${BEST_SUMMARY(obj=cls)}$ | #! ^ Aliases ^^ -| ${TYPEDECL_LINK}$ | ${BEST_SUMMARY(obj=typedecl)}$ | +| ${TYPEDECL_LINK}$ ${OBJ_TAGS(obj=typedecl)}$ | ${BEST_SUMMARY(obj=typedecl)}$ | #! ^ Structures ^^ -| ${TYPEDECL_LINK}$ | ${BEST_SUMMARY(obj=typedecl)}$ | +| ${TYPEDECL_LINK}$ ${OBJ_TAGS(obj=typedecl)}$ | ${BEST_SUMMARY(obj=typedecl)}$ | #! ^ Enumerations ^^ -| ${TYPEDECL_LINK}$ | ${BEST_SUMMARY(obj=typedecl)}$ | +| ${TYPEDECL_LINK}$ ${OBJ_TAGS(obj=typedecl)}$ | ${BEST_SUMMARY(obj=typedecl)}$ | diff --git a/src/scripts/gendoc/doc_struct.template b/src/scripts/gendoc/doc_struct.template index 306dcfd961..e354b6f6a1 100644 --- a/src/scripts/gendoc/doc_struct.template +++ b/src/scripts/gendoc/doc_struct.template @@ -2,6 +2,10 @@ ~~Title: ${struct.name}$~~ ====== ${struct.name}$ (struct) ====== + +''beta'' This struct is still in beta, api will probably change + + ${BEST_SUMMARY(obj=struct)}$ ${BEST_DESCRIPTION(obj=struct)}$ From ac2f3896dfbf275427f7b9ed933fd3cd6f571596 Mon Sep 17 00:00:00 2001 From: Dave Andreoli Date: Sat, 5 Oct 2019 12:20:44 +0200 Subject: [PATCH 26/29] Pyolian gendoc: the last hidden bits of documentation ref tokens Now links works also inside documentation text \o/ --- src/scripts/gendoc/doc_macros.include | 10 ++- src/scripts/pyolian/eolian.py | 101 ++++++++++++++------------ src/scripts/pyolian/eolian_lib.py | 4 +- src/scripts/pyolian/generator.py | 1 + 4 files changed, 68 insertions(+), 48 deletions(-) diff --git a/src/scripts/gendoc/doc_macros.include b/src/scripts/gendoc/doc_macros.include index 6dfd45e6d7..877b7c67bf 100644 --- a/src/scripts/gendoc/doc_macros.include +++ b/src/scripts/gendoc/doc_macros.include @@ -78,7 +78,15 @@ ${'\n\n' if i else ''}$#! %%${token.text}$%%#! -**REF ${token.text}$ ${token.ref}$ ??**#! + +${CLS_LINK(cls=token.ref_obj)}$.${FUNC_LINK(func=token.ref_attr)}$#! + +${TYPEDECL_LINK(typedecl=token.ref_obj)}$#! + +${CLS_LINK(cls=token.ref_obj)}$#! + +**TODO REF ${token.ref_type}$**$#! + ''${token.text}$''#! diff --git a/src/scripts/pyolian/eolian.py b/src/scripts/pyolian/eolian.py index a8b77e15e9..50db1e6f3c 100644 --- a/src/scripts/pyolian/eolian.py +++ b/src/scripts/pyolian/eolian.py @@ -37,6 +37,25 @@ _already_halted = False # Eolian Enums ############################################################## +class Eolian_Object_Type(IntEnum): + UNKNOWN = 0 + CLASS = 1 + TYPEDECL = 2 + STRUCT_FIELD = 3 + ENUM_FIELD = 4 + TYPE = 5 + CONSTANT = 6 + EXPRESSION = 7 + FUNCTION = 8 + FUNCTION_PARAMETER = 9 + EVENT = 10 + PART = 11 + IMPLEMENT = 12 + CONSTRUCTOR = 13 + DOCUMENTATION = 14 + ERROR = 15 + + class Eolian_Function_Type(IntEnum): UNRESOLVED = 0 PROPERTY = 1 @@ -782,7 +801,7 @@ class Constructor(Object): class Event(Object): def __repr__(self): - return "".format(self) + return "".format(self) @cached_property def c_macro(self): @@ -1262,7 +1281,7 @@ class _Eolian_Doc_Token_Struct(ctypes.Structure): ("text_end", c_char_p)] -class Documentation(Object): # OK (1 TODO Unit*) +class Documentation(Object): def __repr__(self): t = self.summary if len(self.summary) < 40 else self.summary[:40] + '...' return "".format(t) @@ -1293,8 +1312,7 @@ class Documentation(Object): # OK (1 TODO Unit*) """ return a list of paragraphs, each one is a list of tokens """ return self._tokenize(self.description) - @classmethod - def _tokenize(cls, full_text): + def _tokenize(self, full_text): paragraphs = [] if not full_text: return paragraphs @@ -1309,8 +1327,10 @@ class Documentation(Object): # OK (1 TODO Unit*) while next_chunk: typ = lib.eolian_doc_token_type_get(byref(tok)) txt = lib.eolian_doc_token_text_get(byref(tok)) - # ref = # TODO ... Stupido parametro '*unit' :( - tokens.append(Documentation_Token(typ, txt)) + ref_obj = c_void_p(0) + ref_attr = c_void_p(0) + ref_type = lib.eolian_doc_token_ref_resolve(byref(tok), self.unit.state, byref(ref_obj), byref(ref_attr)) + tokens.append(Documentation_Token(typ, txt, ref_type, ref_obj, ref_attr)) lib.free(c_void_p(txt)) next_chunk = lib.eolian_documentation_tokenize(c_char_p(next_chunk), byref(tok)) paragraphs.append(tokens) @@ -1319,10 +1339,12 @@ class Documentation(Object): # OK (1 TODO Unit*) class Documentation_Token(object): - def __init__(self, c_token_type, c_text): + def __init__(self, c_token_type, c_text, c_ref_type, c_ref_obj, c_ref_attr): self._type = Eolian_Doc_Token_Type(c_token_type) self._text = _str_to_py(c_text) - self._ref = None # TODO + self._ref_type = Eolian_Object_Type(c_ref_type) + self._ref_obj = Object(c_ref_obj) if c_ref_obj else None + self._ref_attr = Object(c_ref_attr) if c_ref_attr else None def __repr__(self): t = self.text if len(self.text) < 40 else self.text[:40] + '...' @@ -1338,8 +1360,16 @@ class Documentation_Token(object): return self._text @property - def ref(self): - return self._ref + def ref_type(self): + return self._ref_type + + @property + def ref_obj(self): + return self._ref_obj + + @property + def ref_attr(self): + return self._ref_attr class Error(Object): @@ -1382,42 +1412,23 @@ def _str_to_py(s): # internal Object type -> Class mapping ##################################### -class _Eolian_Object_Type(IntEnum): - UNKNOWN = 0 - CLASS = 1 - TYPEDECL = 2 - STRUCT_FIELD = 3 - ENUM_FIELD = 4 - TYPE = 5 - CONSTANT = 6 - EXPRESSION = 7 - FUNCTION = 8 - FUNCTION_PARAMETER = 9 - EVENT = 10 - PART = 11 - IMPLEMENT = 12 - CONSTRUCTOR = 13 - DOCUMENTATION = 14 - ERROR = 15 - - _eolian_type_class_mapping = { - _Eolian_Object_Type.UNKNOWN: Object, - _Eolian_Object_Type.CLASS: Class, - _Eolian_Object_Type.TYPEDECL: Typedecl, - _Eolian_Object_Type.STRUCT_FIELD: Struct_Type_Field, - _Eolian_Object_Type.ENUM_FIELD: Enum_Type_Field, - _Eolian_Object_Type.TYPE: Type, - _Eolian_Object_Type.CONSTANT: Constant, - _Eolian_Object_Type.EXPRESSION: Expression, - _Eolian_Object_Type.FUNCTION: Function, - _Eolian_Object_Type.FUNCTION_PARAMETER: Function_Parameter, - _Eolian_Object_Type.EVENT: Event, - _Eolian_Object_Type.PART: Part, - _Eolian_Object_Type.IMPLEMENT: Implement, - _Eolian_Object_Type.CONSTRUCTOR: Constructor, - _Eolian_Object_Type.DOCUMENTATION: Documentation, - _Eolian_Object_Type.ERROR: Error, + Eolian_Object_Type.UNKNOWN: Object, + Eolian_Object_Type.CLASS: Class, + Eolian_Object_Type.TYPEDECL: Typedecl, + Eolian_Object_Type.STRUCT_FIELD: Struct_Type_Field, + Eolian_Object_Type.ENUM_FIELD: Enum_Type_Field, + Eolian_Object_Type.TYPE: Type, + Eolian_Object_Type.CONSTANT: Constant, + Eolian_Object_Type.EXPRESSION: Expression, + Eolian_Object_Type.FUNCTION: Function, + Eolian_Object_Type.FUNCTION_PARAMETER: Function_Parameter, + Eolian_Object_Type.EVENT: Event, + Eolian_Object_Type.PART: Part, + Eolian_Object_Type.IMPLEMENT: Implement, + Eolian_Object_Type.CONSTRUCTOR: Constructor, + Eolian_Object_Type.DOCUMENTATION: Documentation, + Eolian_Object_Type.ERROR: Error, } diff --git a/src/scripts/pyolian/eolian_lib.py b/src/scripts/pyolian/eolian_lib.py index a92d896972..e73c37e1db 100644 --- a/src/scripts/pyolian/eolian_lib.py +++ b/src/scripts/pyolian/eolian_lib.py @@ -690,8 +690,8 @@ lib.eolian_doc_token_text_get.argtypes = (c_void_p,) lib.eolian_doc_token_text_get.restype = c_void_p # char* TO BE FREED # EAPI Eolian_Object_Type eolian_doc_token_ref_resolve(const Eolian_Doc_Token *tok, const Eolian_State *state, const Eolian_Object **data, const Eolian_Object **data2); -# lib.eolian_doc_token_ref_resolve.argtypes = (c_void_p, c_void_p, ???, ???) -# lib.eolian_doc_token_ref_resolve.restype = c_int +lib.eolian_doc_token_ref_resolve.argtypes = (c_void_p, c_void_p, c_void_p, c_void_p) +lib.eolian_doc_token_ref_resolve.restype = c_int # Eolian_Error ############################################################## diff --git a/src/scripts/pyolian/generator.py b/src/scripts/pyolian/generator.py index 28138f531f..67c636fc9c 100755 --- a/src/scripts/pyolian/generator.py +++ b/src/scripts/pyolian/generator.py @@ -134,6 +134,7 @@ class Template(pyratemp.Template): 'Documentation_Token': eolian.Documentation_Token, 'Error': eolian.Error, # Eolian Enums + 'Eolian_Object_Type': eolian.Eolian_Object_Type, 'Eolian_Function_Type': eolian.Eolian_Function_Type, 'Eolian_Parameter_Direction': eolian.Eolian_Parameter_Direction, 'Eolian_Class_Type': eolian.Eolian_Class_Type, From 9371cdfef8e49bad56afe9e18fd2ed73a043dce0 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sat, 5 Oct 2019 13:14:39 +0100 Subject: [PATCH 27/29] build - bring back loaders and savers as modules and/or static so the evas modules able to be static or not was a bit pointless as it could inline all evas modules (or none) not just the most common or not, but ecore evas modules were still modules, so it really wasn't being useful. image loaders ans savers omn the other hand were *ALL* being statically built in without exception. this was kind of a regression in the build system in the move to meson. some were static due to micro optimizations and performance inlining the most common to save a little extra loading + linking + page fragmentation for loaders you are likely to need in most cases as well as save the drity pages from linking in their dependencies (libgif, libtiff, libwebp and all their dependencies too etc. etc.). this now brings back the ability to decide which are static and which are shared modules (not exposed to the user as options for meson - fixed in meson.build files which i think is good enough given the purpose of this). --- src/modules/evas/image_loaders/meson.build | 75 ++++++++++++---------- src/modules/evas/image_savers/meson.build | 52 +++++++++------ src/modules/evas/meson.build | 16 +++++ 3 files changed, 89 insertions(+), 54 deletions(-) diff --git a/src/modules/evas/image_loaders/meson.build b/src/modules/evas/image_loaders/meson.build index df0d8968ac..4273a25386 100644 --- a/src/modules/evas/image_loaders/meson.build +++ b/src/modules/evas/image_loaders/meson.build @@ -1,42 +1,51 @@ evas_image_loaders_file = [ - ['bmp', []], - ['eet', [eet]], - ['generic', [rt]], - ['gif', [giflib]], - ['ico', []], - ['jpeg', [jpeg]], - ['pmaps', []], - ['png', [png]], - ['psd', []], - ['tga', []], - ['tgv', [rg_etc, lz4]], - ['tiff', [tiff]], - ['wbmp', []], - ['webp', [webp]], - ['xpm', []], + evas_loader_saver_mod_bmp, + evas_loader_saver_mod_eet, + evas_loader_saver_mod_generic, + evas_loader_saver_mod_gif, + evas_loader_saver_mod_ico, + evas_loader_saver_mod_jpeg, + evas_loader_saver_mod_pmaps, + evas_loader_saver_mod_png, + evas_loader_saver_mod_psd, + evas_loader_saver_mod_tga, + evas_loader_saver_mod_tgv, + evas_loader_saver_mod_tiff, + evas_loader_saver_mod_wbmp, + evas_loader_saver_mod_webp, + evas_loader_saver_mod_xpm ] foreach loader_inst : evas_image_loaders_file - loader = loader_inst[0] - loader_deps = loader_inst[1] - - + loader = loader_inst[0] + loader_type = loader_inst[1] + loader_deps = loader_inst[2] if get_option('evas-loaders-disabler').contains(loader) == false - file = join_paths(loader, 'evas_image_load_'+loader+'.c') - - tmp = static_library('image_loader_'+loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps - ) - - evas_static_list += [declare_dependency( - sources: file, - dependencies: loader_deps, - )] - - config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') + file = join_paths(loader, 'evas_image_load_'+loader+'.c') + if loader_type == 'shared' + evas_package_modules = join_paths(dir_lib, 'evas', 'modules') + mod_install_dir = join_paths(evas_package_modules, 'image_loaders', loader, version_name) + shared_module(loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension + ) + module_files += join_paths(mod_install_dir, 'lib'+loader + '.' + sys_mod_extension) + else + config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') + tmp = static_library('image_loader_'+loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps + ) + evas_static_list += [declare_dependency( + sources: file, + dependencies: loader_deps, + )] + endif else message('Image loader '+loader+' disabled') endif -endforeach \ No newline at end of file +endforeach diff --git a/src/modules/evas/image_savers/meson.build b/src/modules/evas/image_savers/meson.build index 81bdbd9f55..35883f2c34 100644 --- a/src/modules/evas/image_savers/meson.build +++ b/src/modules/evas/image_savers/meson.build @@ -1,31 +1,41 @@ - evas_image_savers_file = [ -['eet', [eet]], -['jpeg', [jpeg]], -['png', [png]], -['tgv', [rg_etc, lz4]], -['tiff', [tiff]], -['webp', []] + evas_loader_saver_mod_eet, + evas_loader_saver_mod_jpeg, + evas_loader_saver_mod_png, + evas_loader_saver_mod_tgv, + evas_loader_saver_mod_tiff, + evas_loader_saver_mod_webp ] foreach loader_inst : evas_image_savers_file loader = loader_inst[0] - loader_deps = loader_inst[1] - + loader_type = loader_inst[1] + loader_deps = loader_inst[2] if get_option('evas-loaders-disabler').contains(loader) == false + config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') file = join_paths(loader, 'evas_image_save_'+loader+'.c') - - tmp = static_library('image_saver_'+loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps - ) - - evas_static_list += [declare_dependency( - sources: file, - dependencies: loader_deps, - )] - - config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') + if loader_type == 'shared' + evas_package_modules = join_paths(dir_lib, 'evas', 'modules') + mod_install_dir = join_paths(evas_package_modules, 'image_savers', loader, version_name) + shared_module(loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension + ) + module_files += join_paths(mod_install_dir, 'lib'+loader + '.' + sys_mod_extension) + else + config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') + tmp = static_library('image_saver_'+loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps + ) + evas_static_list += [declare_dependency( + sources: file, + dependencies: loader_deps, + )] + endif else message('Image saver '+loader+' disabled') endif diff --git a/src/modules/evas/meson.build b/src/modules/evas/meson.build index e5973dabad..869665be04 100644 --- a/src/modules/evas/meson.build +++ b/src/modules/evas/meson.build @@ -5,6 +5,22 @@ giflib = cc.find_library('gif') json = dependency('rlottie', required: get_option('evas-loaders-disabler').contains('json') == false) webp = dependency('libwebp', required: get_option('evas-loaders-disabler').contains('webp') == false) +evas_loader_saver_mod_bmp = ['bmp', 'shared', []] +evas_loader_saver_mod_eet = ['eet', 'static', [eet]] +evas_loader_saver_mod_generic = ['generic', 'shared', [rt]] +evas_loader_saver_mod_gif = ['gif', 'shared', [giflib]] +evas_loader_saver_mod_ico = ['ico', 'shared', []] +evas_loader_saver_mod_jpeg = ['jpeg', 'static', [jpeg]] +evas_loader_saver_mod_pmaps = ['pmaps', 'shared', []] +evas_loader_saver_mod_png = ['png', 'static', [png]] +evas_loader_saver_mod_psd = ['psd', 'shared', []] +evas_loader_saver_mod_tga = ['tga', 'shared', []] +evas_loader_saver_mod_tgv = ['tgv', 'shared', [rg_etc, lz4]] +evas_loader_saver_mod_tiff = ['tiff', 'shared', [tiff]] +evas_loader_saver_mod_wbmp = ['wbmp', 'shared', []] +evas_loader_saver_mod_webp = ['webp', 'shared', [webp]] +evas_loader_saver_mod_xpm = ['xpm', 'shared', []] + #there are a few modules that should NEVER be build as a module but rather be build as static lib and linked in later evas_static_list = [] From 0f3bbb51f42edf53b28176c916f8057e4db6acdf Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sat, 5 Oct 2019 18:35:00 +0100 Subject: [PATCH 28/29] build - images loaders and saver modules need to link to evas if your platform is picky enough it won't want to leave unresolved symbols (which wshould be resovled at runtime from the host lib) so we need to link these modules to evas. the problem is due to the complicated build of some modules being static and some shared, evas is declared with evas_goal and this has to be declared after static modules are declared but since i was declaring static and shared at the same time from a table this breaks. so i have to move all the static and shared module stuff into evas_goal into 2 phases. one phase for the static and one for the shared after evas is delcared so evas as a target exists to link to. --- meson.build | 2 + src/lib/evas_goal/meson.build | 143 +++++++++++++++++++++ src/modules/evas/image_loaders/meson.build | 51 -------- src/modules/evas/image_savers/meson.build | 42 ------ src/modules/evas/meson.build | 25 ---- 5 files changed, 145 insertions(+), 118 deletions(-) delete mode 100644 src/modules/evas/image_loaders/meson.build delete mode 100644 src/modules/evas/image_savers/meson.build diff --git a/meson.build b/meson.build index b75bcf3e3f..4de9757946 100644 --- a/meson.build +++ b/meson.build @@ -247,6 +247,8 @@ endif ecore_evas_wayland_engine_include_dir = [] +evas_static_list = [] + evas_lib = ['evas' ,[], false, true, false, false, true, true, ['eina', 'efl', 'eo'], ['vg_common', 'libunibreak']] evas_img_modules = ['evas' ,[], true, false, false, false, false, false, ['eina', 'efl', 'eo'], ['vg_common', 'libunibreak']] evas_engines = [join_paths('evas', 'engines'),[], true, false, false, false, false, false, [], []] diff --git a/src/lib/evas_goal/meson.build b/src/lib/evas_goal/meson.build index 5746006908..59473fea93 100644 --- a/src/lib/evas_goal/meson.build +++ b/src/lib/evas_goal/meson.build @@ -1,3 +1,98 @@ +#fixed dependencies by efl +png = dependency('libpng') +tiff = dependency('libtiff-4', required: get_option('evas-loaders-disabler').contains('tiff') == false) +giflib = cc.find_library('gif') +webp = dependency('libwebp', required: get_option('evas-loaders-disabler').contains('webp') == false) + +evas_loader_saver_mod_bmp = ['bmp', 'shared', []] +evas_loader_saver_mod_eet = ['eet', 'static', [eet]] +evas_loader_saver_mod_generic = ['generic', 'shared', [rt]] +evas_loader_saver_mod_gif = ['gif', 'shared', [giflib]] +evas_loader_saver_mod_ico = ['ico', 'shared', []] +evas_loader_saver_mod_jpeg = ['jpeg', 'static', [jpeg]] +evas_loader_saver_mod_pmaps = ['pmaps', 'shared', []] +evas_loader_saver_mod_png = ['png', 'static', [png]] +evas_loader_saver_mod_psd = ['psd', 'shared', []] +evas_loader_saver_mod_tga = ['tga', 'shared', []] +evas_loader_saver_mod_tgv = ['tgv', 'shared', [rg_etc, lz4]] +evas_loader_saver_mod_tiff = ['tiff', 'shared', [tiff]] +evas_loader_saver_mod_wbmp = ['wbmp', 'shared', []] +evas_loader_saver_mod_webp = ['webp', 'shared', [webp]] +evas_loader_saver_mod_xpm = ['xpm', 'shared', []] + +evas_image_loaders_file = [ + evas_loader_saver_mod_bmp, + evas_loader_saver_mod_eet, + evas_loader_saver_mod_generic, + evas_loader_saver_mod_gif, + evas_loader_saver_mod_ico, + evas_loader_saver_mod_jpeg, + evas_loader_saver_mod_pmaps, + evas_loader_saver_mod_png, + evas_loader_saver_mod_psd, + evas_loader_saver_mod_tga, + evas_loader_saver_mod_tgv, + evas_loader_saver_mod_tiff, + evas_loader_saver_mod_wbmp, + evas_loader_saver_mod_webp, + evas_loader_saver_mod_xpm +] + +evas_image_savers_file = [ + evas_loader_saver_mod_eet, + evas_loader_saver_mod_jpeg, + evas_loader_saver_mod_png, + evas_loader_saver_mod_tgv, + evas_loader_saver_mod_tiff, + evas_loader_saver_mod_webp +] + +foreach loader_inst : evas_image_loaders_file + loader = loader_inst[0] + loader_type = loader_inst[1] + loader_deps = loader_inst[2] + if get_option('evas-loaders-disabler').contains(loader) == false + if loader_type == 'static' + config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') + file = join_paths(meson.source_root(), 'src', 'modules', 'evas', 'image_loaders', loader, 'evas_image_load_'+loader+'.c') + config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') + tmp = static_library('image_loader_'+loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps + ) + evas_static_list += [declare_dependency( + sources: file, + dependencies: loader_deps, + )] + endif + else + message('Image loader '+loader+' disabled') + endif +endforeach + +foreach loader_inst : evas_image_savers_file + loader = loader_inst[0] + loader_type = loader_inst[1] + loader_deps = loader_inst[2] + if get_option('evas-loaders-disabler').contains(loader) == false + if loader_type == 'static' + config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') + file = join_paths(meson.source_root(), 'src', 'modules', 'evas', 'image_savers', loader, 'evas_image_save_'+loader+'.c') + config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') + tmp = static_library('image_saver_'+loader, file, + include_directories : config_dir, + dependencies : [evas_pre] + loader_deps + ) + evas_static_list += [declare_dependency( + sources: file, + dependencies: loader_deps, + )] + endif + else + message('Image saver '+loader+' disabled') + endif +endforeach + evas_lib = library('evas', 'empty.c', #all the source code is coming from evas_pre_lib_dep @@ -34,3 +129,51 @@ pkgconfig.generate(evas_lib, version : version_major + '.' + version_minor + '.' + version_micro, libraries : [eina, ecore, ector, emile, lua], ) + +foreach loader_inst : evas_image_loaders_file + loader = loader_inst[0] + loader_type = loader_inst[1] + loader_deps = loader_inst[2] + if get_option('evas-loaders-disabler').contains(loader) == false + if loader_type == 'shared' + config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') + file = join_paths(meson.source_root(), 'src', 'modules', 'evas', 'image_loaders', loader, 'evas_image_load_'+loader+'.c') + evas_package_modules = join_paths(dir_lib, 'evas', 'modules') + mod_install_dir = join_paths(evas_package_modules, 'image_loaders', loader, version_name) + shared_module('shared_loader_'+loader, file, + include_directories : config_dir, + dependencies : [eina, evas] + loader_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension + ) + module_files += join_paths(mod_install_dir, 'libshared_loader_'+loader + '.' + sys_mod_extension) + endif + else + message('Image loader '+loader+' disabled') + endif +endforeach + +foreach loader_inst : evas_image_savers_file + loader = loader_inst[0] + loader_type = loader_inst[1] + loader_deps = loader_inst[2] + if get_option('evas-loaders-disabler').contains(loader) == false + if loader_type == 'shared' + config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') + file = join_paths(meson.source_root(), 'src', 'modules', 'evas', 'image_savers', loader, 'evas_image_save_'+loader+'.c') + evas_package_modules = join_paths(dir_lib, 'evas', 'modules') + mod_install_dir = join_paths(evas_package_modules, 'image_savers', loader, version_name) + shared_module('shared_saver_'+loader, file, + include_directories : config_dir, + dependencies : [eina, evas] + loader_deps, + install : true, + install_dir : mod_install_dir, + name_suffix : sys_mod_extension + ) + module_files += join_paths(mod_install_dir, 'libshared_saver_'+loader + '.' + sys_mod_extension) + endif + else + message('Image saver '+loader+' disabled') + endif +endforeach diff --git a/src/modules/evas/image_loaders/meson.build b/src/modules/evas/image_loaders/meson.build deleted file mode 100644 index 4273a25386..0000000000 --- a/src/modules/evas/image_loaders/meson.build +++ /dev/null @@ -1,51 +0,0 @@ -evas_image_loaders_file = [ - evas_loader_saver_mod_bmp, - evas_loader_saver_mod_eet, - evas_loader_saver_mod_generic, - evas_loader_saver_mod_gif, - evas_loader_saver_mod_ico, - evas_loader_saver_mod_jpeg, - evas_loader_saver_mod_pmaps, - evas_loader_saver_mod_png, - evas_loader_saver_mod_psd, - evas_loader_saver_mod_tga, - evas_loader_saver_mod_tgv, - evas_loader_saver_mod_tiff, - evas_loader_saver_mod_wbmp, - evas_loader_saver_mod_webp, - evas_loader_saver_mod_xpm -] - -foreach loader_inst : evas_image_loaders_file - loader = loader_inst[0] - loader_type = loader_inst[1] - loader_deps = loader_inst[2] - if get_option('evas-loaders-disabler').contains(loader) == false - config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') - file = join_paths(loader, 'evas_image_load_'+loader+'.c') - if loader_type == 'shared' - evas_package_modules = join_paths(dir_lib, 'evas', 'modules') - mod_install_dir = join_paths(evas_package_modules, 'image_loaders', loader, version_name) - shared_module(loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+loader + '.' + sys_mod_extension) - else - config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') - tmp = static_library('image_loader_'+loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps - ) - evas_static_list += [declare_dependency( - sources: file, - dependencies: loader_deps, - )] - endif - else - message('Image loader '+loader+' disabled') - endif -endforeach diff --git a/src/modules/evas/image_savers/meson.build b/src/modules/evas/image_savers/meson.build deleted file mode 100644 index 35883f2c34..0000000000 --- a/src/modules/evas/image_savers/meson.build +++ /dev/null @@ -1,42 +0,0 @@ -evas_image_savers_file = [ - evas_loader_saver_mod_eet, - evas_loader_saver_mod_jpeg, - evas_loader_saver_mod_png, - evas_loader_saver_mod_tgv, - evas_loader_saver_mod_tiff, - evas_loader_saver_mod_webp -] - -foreach loader_inst : evas_image_savers_file - loader = loader_inst[0] - loader_type = loader_inst[1] - loader_deps = loader_inst[2] - if get_option('evas-loaders-disabler').contains(loader) == false - config_h.set('BUILD_LOADER_'+loader.to_upper(), '1') - file = join_paths(loader, 'evas_image_save_'+loader+'.c') - if loader_type == 'shared' - evas_package_modules = join_paths(dir_lib, 'evas', 'modules') - mod_install_dir = join_paths(evas_package_modules, 'image_savers', loader, version_name) - shared_module(loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps, - install : true, - install_dir : mod_install_dir, - name_suffix : sys_mod_extension - ) - module_files += join_paths(mod_install_dir, 'lib'+loader + '.' + sys_mod_extension) - else - config_h.set('EVAS_STATIC_BUILD_'+loader.to_upper(), '1') - tmp = static_library('image_saver_'+loader, file, - include_directories : config_dir, - dependencies : [evas_pre] + loader_deps - ) - evas_static_list += [declare_dependency( - sources: file, - dependencies: loader_deps, - )] - endif - else - message('Image saver '+loader+' disabled') - endif -endforeach diff --git a/src/modules/evas/meson.build b/src/modules/evas/meson.build index 869665be04..e8f335d50e 100644 --- a/src/modules/evas/meson.build +++ b/src/modules/evas/meson.build @@ -1,31 +1,6 @@ #fixed dependencies by efl -png = dependency('libpng') -tiff = dependency('libtiff-4', required: get_option('evas-loaders-disabler').contains('tiff') == false) -giflib = cc.find_library('gif') json = dependency('rlottie', required: get_option('evas-loaders-disabler').contains('json') == false) -webp = dependency('libwebp', required: get_option('evas-loaders-disabler').contains('webp') == false) -evas_loader_saver_mod_bmp = ['bmp', 'shared', []] -evas_loader_saver_mod_eet = ['eet', 'static', [eet]] -evas_loader_saver_mod_generic = ['generic', 'shared', [rt]] -evas_loader_saver_mod_gif = ['gif', 'shared', [giflib]] -evas_loader_saver_mod_ico = ['ico', 'shared', []] -evas_loader_saver_mod_jpeg = ['jpeg', 'static', [jpeg]] -evas_loader_saver_mod_pmaps = ['pmaps', 'shared', []] -evas_loader_saver_mod_png = ['png', 'static', [png]] -evas_loader_saver_mod_psd = ['psd', 'shared', []] -evas_loader_saver_mod_tga = ['tga', 'shared', []] -evas_loader_saver_mod_tgv = ['tgv', 'shared', [rg_etc, lz4]] -evas_loader_saver_mod_tiff = ['tiff', 'shared', [tiff]] -evas_loader_saver_mod_wbmp = ['wbmp', 'shared', []] -evas_loader_saver_mod_webp = ['webp', 'shared', [webp]] -evas_loader_saver_mod_xpm = ['xpm', 'shared', []] - -#there are a few modules that should NEVER be build as a module but rather be build as static lib and linked in later -evas_static_list = [] - -subdir('image_loaders') -subdir('image_savers') subdir('model_savers') subdir('model_loaders') subdir('vg_savers') From f8e027c3954beaef4c5302402fca4d7715b5cec5 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Sat, 5 Oct 2019 20:00:38 +0100 Subject: [PATCH 29/29] build - efl run in tree - make exception for image loaders/savers due to meson's insistence on naming even moudles libmodule.so, and our complexity of build as in the previous commits ... have a special case for in tree module loading for these. --- src/lib/evas/file/evas_module.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/lib/evas/file/evas_module.c b/src/lib/evas/file/evas_module.c index a1e8b623af..b651ad544a 100644 --- a/src/lib/evas/file/evas_module.c +++ b/src/lib/evas/file/evas_module.c @@ -599,12 +599,27 @@ evas_module_find_type(Evas_Module_Type type, const char *name) { if (run_in_tree == 1) { - char subsystem[PATH_MAX]; + // special cases due to compleixty of meson build and + // putting these in odd places in the tree - do special + // name lookups for build in tree module lookups + if (type == EVAS_MODULE_TYPE_IMAGE_LOADER) + { + snprintf(buffer, sizeof(buffer), + PACKAGE_BUILD_DIR"/src/lib/evas_goal/libshared_loader_%s"MOD_SUFFIX, name); + } + else if (type == EVAS_MODULE_TYPE_IMAGE_SAVER) + { + snprintf(buffer, sizeof(buffer), + PACKAGE_BUILD_DIR"/src/lib/evas_goal/libshared_saver_%s"MOD_SUFFIX, name); + } + else + { + char subsystem[PATH_MAX]; - snprintf(subsystem, sizeof(subsystem), "evas/%s", type_str); - bs_mod_get(buffer, sizeof(buffer), subsystem, name); - if (!evas_file_path_exists(buffer)) - buffer[0] = '\0'; + snprintf(subsystem, sizeof(subsystem), "evas/%s", type_str); + bs_mod_get(buffer, sizeof(buffer), subsystem, name); + } + if (!evas_file_path_exists(buffer)) buffer[0] = '\0'; } } #endif