Hello, So top posting as answering your mail inline is really hard. First of, I think you are confused by the state of toolkit and application. There is two big set of application.
The first one, have their unique user interface design and their own world. It is the case for many standalone application like Calaos that control the screen as one application. It is also the case for almost all website. They have their own look like Facebook is different from Gmail and so on. There are also a few application like blender, that have historical reason to have their own ui style. In this scenario, they can still use elementary and will need to use edje to do a full customization. Nothing prevent them from providing a themability capability for there application only. Meaning instead of making a theme for elementary, you make a theme for Calaos that include all the style calaos use. In that first case, developers need to know edc and need to care about it. So obviously you won't use your new widget in this kind of application as this will just not fit in. The second use case, it is the classic desktop application. Something KDE/Qt do with native theme and maybe with QML now (not so sure) and GNOME/GTK does with CSS. Something firefox also does provide. Something we try to provide with the default theme of Elementary, an easy way to have the same theme for every application using EFL and a way to change the look in a conserted meaningful way. In that scenario, the developer should never care about the look of his application and just use default style. User and designer will provide alternate theme. In that second case, developers sure should not know edc and should not care at all about it. Sadly efl and elementary are not yet on par of what a desktop application require, so they will need to dig in to do the missing style and widget, but still in this case your widget should not be used as it will break the user experience when the user change the default theme that provide all the default style. That's why my assumption of the need of this widget was, this is for Tizen Samsung way of doing things as it doesn't make sense for anyone else outside. Also the policy for brand new widget in Elementary has been to push application to develop their own widget to prove that they are useful (terminology and its tab, edi and elm_code). This was a good idea as it prove their is a need for a certain type of widget before pushing something new. Now, please show me an application that can make use of your widget and that make sense in our eco system. I still fail to see the point of this widget wich doesn't fit in at all. Cedric On Wed, May 20, 2015 at 4:48 AM, ChunEon Park <her...@naver.com> wrote: > And additionally saying, > > EDC will break app theme compatibility acutally. > > If applications want to develop the system based themeable apps, > they should not touch the edc, they should write the gui with only elm > widgets. > > See the efl applications, the most application may write the layouts with edc. > they design the layout look&feel compatible with current elm theme. > > Now say, if there new elm theme come? > How they guarantee their edj gui compatbile with new elm theme? > > The application gui will be totally broken or ugly. > > App should not use the edc as possible, > Writing edc is harmful potentially, app should depend on the gui with elm > controls more than edc. > We should not guide using edc in apps as possible. > > ------------------------------------ > -Regards, Hermet- > > -----Original Message----- > From: "ChunEon Park"<her...@naver.com> > To: "Enlightenment developer list"<enlightenment-devel@lists.sourceforge.net>; > Cc: > Sent: 2015-05-20 (수) 11:30:50 > Subject: Re: [E-devel] [EGIT] [core/elementary] master 01/01: elementary: > Create new widget for image masking > > why people do the virtual group for masking? > > there are a lots of simple gui applications in the world. > > Frankly, Please tell me how many apps in the word supports various themes? > See your mobile phone or desktop applications. > > Im sure more than 90 % apps in the world doesn't care the themeable but just > one gui look is enough to them. > They don't want it. They just want a application. > > Even if they write the mask with the edc, they won't care the cheageable > theme nor the system theme neither. > In reality, Your opinion is nothing more than those application hard to make > gui. > > You just force to more than 90% app develop application guis only for less > 10 % scenario. > and you're forcing the app developers to develop difficult only. > > > ------------------------------------ > -Regards, Hermet- > > -----Original Message----- > From: "Cedric BAIL"<cedric.b...@free.fr> > To: "e-devel"<enlightenment-devel@lists.sourceforge.net>; > Cc: > Sent: 2015-05-16 (토) 02:56:37 > Subject: Re: [E-devel] [EGIT] [core/elementary] master 01/01: elementary: > Create new widget for image masking > > Le 15 mai 2015 16:26, "jiin.moon" <jiin.m...@samsung.com> a écrit : >> >> hermet pushed a commit to branch master. >> >> > http://git.enlightenment.org/core/elementary.git/commit/?id=e707aa3efb0b4a0b7d6169755075a9943793e4f5 >> >> commit e707aa3efb0b4a0b7d6169755075a9943793e4f5 >> Author: jiin.moon <jiin.m...@samsung.com> >> Date: Fri May 15 23:09:41 2015 +0900 >> >> elementary: Create new widget for image masking >> >> Summary: >> For now, if apply image mask to smart obejct, masking does not work > except to implement in edc file. >> @feature >> >> Reviewers: Jaehyun_Cho, Jaehyun, jpeg, raster, cedric, Hermet > > As per my comment during review this brash all the concept of efl, edge and > elementary for no good reason. It should not have landed. If you want to > implement theme in c do it properly by providing a virtual edje file that > impotent a group in c. > >> Subscribers: raster, jpeg, cedric >> >> Projects: #elementary >> >> Differential Revision: https://phab.enlightenment.org/D2055 >> --- >> src/lib/Elementary.h.in 1 + >> src/lib/Makefile.am 6 ++ >> src/lib/elm_clipper.c 225 > +++++++++++++++++++++++++++++++++++++++++++ >> src/lib/elm_clipper.eo 78 +++++++++++++++ >> src/lib/elm_clipper.h 41 ++++++++ >> src/lib/elm_clipper_eo.h 11 +++ >> src/lib/elm_clipper_legacy.h 12 +++ >> src/lib/elm_widget_clipper.h 66 +++++++++++++ >> 8 files changed, 440 insertions(+) >> >> diff --git a/src/lib/Elementary.h.in b/src/lib/Elementary.h.in >> index cd17bbf..87d9045 100644 >> --- a/src/lib/Elementary.h.in >> +++ b/src/lib/Elementary.h.in >> @@ -195,6 +195,7 @@ EAPI extern Elm_Version *elm_version; >> #include <elm_cache.h> >> #include <elm_calendar.h> >> #include <elm_check.h> >> +#include <elm_clipper.h> >> #include <elm_clock.h> >> #include <elm_cnp.h> >> #include <elm_colorselector.h> >> diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am >> index 859b0ef..a488e76 100644 >> --- a/src/lib/Makefile.am >> +++ b/src/lib/Makefile.am >> @@ -48,6 +48,7 @@ elm_widget_bubble.h \ >> elm_widget_button.h \ >> elm_widget_calendar.h \ >> elm_widget_check.h \ >> +elm_widget_clipper.h \ >> elm_widget_clock.h \ >> elm_widget_colorselector.h \ >> elm_widget_conform.h \ >> @@ -177,6 +178,9 @@ elm_calendar_common.h \ >> elm_check.h \ >> elm_check_eo.h \ >> elm_check_legacy.h \ >> +elm_clipper.h \ >> +elm_clipper_eo.h \ >> +elm_clipper_legacy.h \ >> elm_clock.h \ >> elm_clock_eo.h \ >> elm_clock_legacy.h \ >> @@ -424,6 +428,7 @@ elm_bubble.c \ >> elm_button.c \ >> elm_calendar.c \ >> elm_check.c \ >> +elm_clipper.c \ >> elm_clock.c \ >> elm_cnp.c \ >> elm_colorselector.c \ >> @@ -545,6 +550,7 @@ elm_bubble.eo \ >> elm_button.eo \ >> elm_calendar.eo \ >> elm_check.eo \ >> +elm_clipper.eo \ >> elm_clock.eo \ >> elm_colorselector.eo \ >> elm_conformant.eo \ >> diff --git a/src/lib/elm_clipper.c b/src/lib/elm_clipper.c >> new file mode 100644 >> index 0000000..374f9bf >> --- /dev/null >> +++ b/src/lib/elm_clipper.c >> @@ -0,0 +1,225 @@ >> +#ifdef HAVE_CONFIG_H >> +# include "elementary_config.h" >> +#endif >> + >> +#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED >> + >> +#include <Elementary.h> >> + >> +#include "elm_priv.h" >> +#include "elm_widget_clipper.h" >> +#include "elm_widget_container.h" >> + >> +#define MY_CLASS ELM_CLIPPER_CLASS >> + >> +#define MY_CLASS_NAME "Elm_Clipper" >> +#define MY_CLASS_NAME_LEGACY "elm_clipper" >> + >> +static void >> +_calc_region(Eo *obj) >> +{ >> + int x, y, w, h; >> + int calx1, caly1, calx2, caly2; >> + >> + ELM_CLIPPER_DATA_GET(obj, sd); >> + evas_object_geometry_get(sd->content, &x, &y, &w, &h); >> + >> + calx1 = (int)(w * sd->region_x1 + x); >> + caly1 = (int)(h * sd->region_y1 + y); >> + >> + if (sd->region_x2 < sd->region_x1) calx2 = 0; >> + else calx2 = (int)(w * (sd->region_x2 - sd->region_x1)); >> + if (sd->region_y2 < sd->region_y1) caly2 = 0; >> + else caly2 = (int)(h * (sd->region_y2 - sd->region_y1)); >> + >> + evas_object_move(sd->clipper, calx1, caly1); >> + evas_object_resize(sd->clipper, calx2, caly2); >> +} >> + >> +EOLIAN static void >> +_elm_clipper_clip_set(Eo *obj, Elm_Clipper_Data *sd, Evas_Object *clip) >> +{ >> + if (sd->clipper != clip) >> + { >> + if (sd->clipper) >> + { >> + elm_widget_sub_object_del(obj, sd->clipper); >> + if (sd->content) evas_object_clip_unset(sd->content); >> + sd->clipper = NULL; >> + } >> + if (clip) >> + { >> + elm_widget_sub_object_add(obj, clip); >> + evas_object_smart_member_add(clip, obj); >> + _calc_region(obj); >> + if (sd->content) evas_object_clip_set(sd->content, clip); >> + sd->clipper = clip; >> + } >> + } >> +} >> + >> +EOLIAN static Evas_Object * >> +_elm_clipper_clip_get(Eo *obj EINA_UNUSED, Elm_Clipper_Data *sd) >> +{ >> + return sd->clipper; >> +} >> + >> +EOLIAN static void >> +_elm_clipper_region_set(Eo *obj, Elm_Clipper_Data *sd, double x1, double > y1, double x2, double y2) >> +{ >> + if (x2 < x1 y2 < y1) >> + ERR("Clipper region x2/y2 should be greater than or equal to > x1/y1!\n"); >> + >> + if (sd->region_x1 != x1 sd->region_y1 != y1 >> + sd->region_x2 != x2 sd->region_y2 != y2) >> + { >> + sd->region_x1 = x1; >> + sd->region_y1 = y1; >> + sd->region_x2 = x2; >> + sd->region_y2 = y2; >> + _calc_region(obj); >> + } >> +} >> + >> +EOLIAN static void >> +_elm_clipper_region_get(Eo *obj EINA_UNUSED, Elm_Clipper_Data *sd, > double *x1, double *y1, double *x2, double *y2) >> +{ >> + if (x1) *x1 = sd->region_x1; >> + if (y1) *y1 = sd->region_y1; >> + if (x2) *x2 = sd->region_x2; >> + if (y2) *y2 = sd->region_y2; >> +} >> + >> +EOLIAN static Eina_Bool >> +_elm_clipper_elm_widget_sub_object_del(Eo *obj, Elm_Clipper_Data *sd, > Evas_Object *sobj) >> +{ >> + Eina_Bool int_ret = EINA_FALSE; >> + eo_do_super(obj, MY_CLASS, int_ret = > elm_obj_widget_sub_object_del(sobj)); >> + if (!int_ret) return EINA_FALSE; >> + if (sobj == sd->content) evas_object_data_del(sobj, "_elm_leaveme"); >> + evas_object_smart_member_del(sobj); >> + return EINA_TRUE; >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_resize(Eo *obj, Elm_Clipper_Data *sd > EINA_UNUSED, Evas_Coord w, Evas_Coord h) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_resize(w, h)); >> + if(sd->content) evas_object_resize(sd->content, w, h); >> + _calc_region(obj); >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_move(Eo *obj, Elm_Clipper_Data *sd > EINA_UNUSED, Evas_Coord x, Evas_Coord y) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_move(x, y)); >> + evas_object_move(sd->content, x, y); >> + _calc_region(obj); >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_show(Eo *obj, Elm_Clipper_Data *sd) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_show()); >> + if(sd->content) evas_object_show(sd->content); >> + if(sd->clipper) evas_object_show(sd->clipper); >> + >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_hide(Eo *obj, Elm_Clipper_Data *sd) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_hide()); >> + if(sd->content) evas_object_hide(sd->content); >> + if(sd->clipper) evas_object_hide(sd->clipper); >> +} >> + >> +EOLIAN static Eina_Bool >> +_elm_clipper_elm_container_content_set(Eo *obj, Elm_Clipper_Data *sd, > const char *part, Evas_Object *content) >> +{ >> + if (part && strcmp(part, "default")) return EINA_FALSE; >> + if (sd->content != content) >> + { >> + if (sd->content) >> + { >> + elm_widget_sub_object_del(obj, sd->content); >> + sd->content = NULL; >> + } >> + if (content) >> + { >> + elm_widget_sub_object_add(content,obj); >> + evas_object_data_set(content, "_elm_leaveme", (void *)1); >> + evas_object_smart_member_add(content, obj); >> + _calc_region(obj); >> + if (sd->clipper) evas_object_clip_set(content, sd->clipper); >> + sd->content = content; >> + } >> + } >> + return EINA_TRUE; >> +} >> + >> +EOLIAN static Evas_Object* >> +_elm_clipper_elm_container_content_get(Eo *obj EINA_UNUSED, > Elm_Clipper_Data *sd, const char *part) >> +{ >> + if (part && strcmp(part, "default")) return NULL; >> + return sd->content; >> +} >> + >> +EOLIAN static Evas_Object* >> +_elm_clipper_elm_container_content_unset(Eo *obj, Elm_Clipper_Data *sd, > const char *part) >> +{ >> + Evas_Object *content; >> + if (part && strcmp(part, "default")) return NULL; >> + content = sd->content; >> + elm_widget_sub_object_del(obj, sd->content); >> + sd->content = NULL; >> + return content; >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_add(Eo *obj, Elm_Clipper_Data *priv) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_add()); >> + elm_widget_sub_object_parent_add(obj); >> + elm_widget_can_focus_set(obj, EINA_FALSE); >> + priv->content = NULL; >> + priv->clipper = NULL; >> + priv->region_x1 = 0; >> + priv->region_y1 = 0; >> + priv->region_x2 = 1; >> + priv->region_y2 = 1; >> +} >> + >> +EOLIAN static void >> +_elm_clipper_evas_object_smart_del(Eo *obj, Elm_Clipper_Data *sd) >> +{ >> + eo_do_super(obj, MY_CLASS, evas_obj_smart_del()); >> + ELM_SAFE_FREE(sd->content, evas_object_del); >> + ELM_SAFE_FREE(sd->clipper, evas_object_del); >> + sd->content = NULL; >> + sd->clipper = NULL; >> +} >> + >> + >> +EAPI Evas_Object * >> +elm_clipper_add(Evas_Object *parent) >> +{ >> + EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL); >> + Evas_Object *obj = eo_add(MY_CLASS, parent); >> + return obj; >> +} >> + >> +EOLIAN static void >> +_elm_clipper_eo_base_constructor(Eo *obj, Elm_Clipper_Data *sd > EINA_UNUSED) >> +{ >> + eo_do_super(obj, MY_CLASS, eo_constructor()); >> + eo_do(obj, evas_obj_type_set(MY_CLASS_NAME_LEGACY)); >> +} >> + >> +static void >> +_elm_clipper_class_constructor(Eo_Class *klass) >> +{ >> + evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass); >> +} >> + >> +#include "elm_clipper.eo.c" >> diff --git a/src/lib/elm_clipper.eo b/src/lib/elm_clipper.eo >> new file mode 100644 >> index 0000000..fa31eb2 >> --- /dev/null >> +++ b/src/lib/elm_clipper.eo >> @@ -0,0 +1,78 @@ >> +class Elm.Clipper (Elm.Container) >> +{ >> + eo_prefix: elm_obj_clipper; >> + methods { >> + @property clip { >> + set { >> + /*@ >> + @brief Set the clip object of the clipper >> + >> + Sets the clip object for clipping >> + >> + @note >> + Allow setting only an Evas_Object_Rectangle and an > Evas_Object_Image as clip on 1.14 >> + >> + @since 1.15 >> + >> + @ingroup Clipper */ >> + } >> + get { >> + /*@ >> + @brief Get the mask object of the clipper >> + >> + @see elm_clipper_mask_set() >> + >> + @since 1.15 >> + >> + @ingroup Clipper */ >> + } >> + values { >> + Evas_Object *mask; >> + } >> + } >> + @property region { >> + set { >> + /*@ >> + @brief Set the region of the clipper >> + >> + Sets the position and the size of the clipper on clipper > object >> + >> + @note The value should be normalized. (0 ~ 1) >> + >> + @since 1.15 >> + >> + @ingroup Clipper */ >> + } >> + get { >> + /*@ >> + @brief Get the region of the clipper >> + >> + @see elm_clipper_region_align_set() >> + >> + @since 1.15 >> + >> + @ingroup Clipper */ >> + } >> + values { >> + double x1; /*@ left edge of the clipper on elm_clipper > widget */ >> + double y1; /*@ top edge of the clipper on elm_clipper widget > */ >> + double x2; /*@ right edge of the clipper on elm_clipper > widget */ >> + double y2; /*@ bottom edge of the clipper on elm_clipper > widget */ >> + } >> + } >> + } >> + implements { >> + class.constructor; >> + Eo.Base.constructor; >> + Evas.Object_Smart.hide; >> + Evas.Object_Smart.show; >> + Evas.Object_Smart.move; >> + Evas.Object_Smart.add; >> + Evas.Object_Smart.del; >> + Evas.Object_Smart.resize; >> + Elm.Widget.sub_object_del; >> + Elm.Container.content_get; >> + Elm.Container.content_set; >> + Elm.Container.content_unset; >> + } >> +} >> diff --git a/src/lib/elm_clipper.h b/src/lib/elm_clipper.h >> new file mode 100644 >> index 0000000..2ae4dd5 >> --- /dev/null >> +++ b/src/lib/elm_clipper.h >> @@ -0,0 +1,41 @@ >> +/** >> + * @defgroup Clipper Clipper >> + * @ingroup Elementary >> + * >> + * This widget display a clipped object. >> + * For this widget, need a clipper object and a content object. >> + * The content would be clipped out by the clipper. >> + * If clipper is not set, you would see the content without cuts >> + * >> + * The Evas_Object_Rectangle and the Evas_Object_Image object can be a > clipper. >> + * A content can have only a clipper even if user set some objects as > the clipper. >> + * >> + * This widget can display a clipped object into many shapes according > to the clipper. >> + * The shape of the clipped object be decided by pixel's transparency of > the clipper object. >> + * If you want to cut out the content into a circle, >> + * the clipper's pixel should have non-zero as alpha value into the > circle. >> + * In case of outside of the circle, should have zero as alpha value. >> + * >> + * This widget inherits from @ref elm-container-class, >> + * So you can use are: >> + * >> + * @li @ref elm_object_part_content_set >> + * @li @ref elm_object_part_content_get >> + * @li @ref elm_object_part_content_unset >> + * >> + * Default content parts of the clipper widget that you can use are: >> + * @li @c "default" - The content to be clipped off >> + * >> + * @{ >> + */ >> + >> +#ifdef EFL_EO_API_SUPPORT >> +#include <elm_clipper_eo.h> >> +#endif >> +#ifndef EFL_NOLEGACY_API_SUPPORT >> +#include <elm_clipper_legacy.h> >> +#endif >> + >> +/** >> + * @} >> + */ >> diff --git a/src/lib/elm_clipper_eo.h b/src/lib/elm_clipper_eo.h >> new file mode 100644 >> index 0000000..3b9a71c >> --- /dev/null >> +++ b/src/lib/elm_clipper_eo.h >> @@ -0,0 +1,11 @@ >> +/** >> + * @ingroup Clipper >> + * >> + * @{ >> + */ >> + >> +#include "elm_clipper.eo.h" >> + >> +/** >> + * @} >> + */ >> diff --git a/src/lib/elm_clipper_legacy.h b/src/lib/elm_clipper_legacy.h >> new file mode 100644 >> index 0000000..0972573 >> --- /dev/null >> +++ b/src/lib/elm_clipper_legacy.h >> @@ -0,0 +1,12 @@ >> +/** >> + * @brief Add a new clipper object to the parent >> + * >> + * @param parent The parent object >> + * @return The new object or NULL if it cannot be created >> + * @since 1.14 >> + * >> + * @ingroup Clipper >> + */ >> +EAPI Evas_Object *elm_clipper_add(Evas_Object *parent); >> + >> +#include "elm_clipper.eo.legacy.h" >> diff --git a/src/lib/elm_widget_clipper.h b/src/lib/elm_widget_clipper.h >> new file mode 100644 >> index 0000000..08bb5e8 >> --- /dev/null >> +++ b/src/lib/elm_widget_clipper.h >> @@ -0,0 +1,66 @@ >> +#ifndef ELM_WIDGET_CLIPPER_H >> +#define ELM_WIDGET_CLIPPER_H >> + >> +#include "Elementary.h" >> + >> +/* DO NOT USE THIS HEADER UNLESS YOU ARE PREPARED FOR BREAKING OF YOUR >> + * CODE. THIS IS ELEMENTARY'S INTERNAL WIDGET API (for now) AND IS NOT >> + * FINAL. CALL elm_widget_api_check(ELM_INTERNAL_API_VERSION) TO CHECK >> + * IT AT RUNTIME. >> + */ >> + >> +/** >> + * @addtogroup Widget >> + * @{ >> + * >> + * @section elm-clipper-class The Elementary Clipper Class >> + * >> + * Elementary, besides having the @ref Clipper widget, exposes its >> + * foundation -- the Elementary Clipper Class -- in order to create other >> + * widgets which are a clipper object with some more logic on top. >> + */ >> + >> + >> +/** >> + * Base widget smart data extended with clipper instance data. >> + */ >> +typedef struct _Elm_Clipper_Data Elm_Clipper_Data; >> +struct _Elm_Clipper_Data >> +{ >> + Evas_Object *content, *clipper; >> + float region_x1; >> + float region_y1; >> + float region_x2; >> + float region_y2; >> +}; >> + >> +/** >> + * @} >> + */ >> + >> +#define ELM_CLIPPER_DATA_GET(o, sd) \ >> + Elm_Clipper_Data * sd = eo_data_scope_get(o, ELM_CLIPPER_CLASS) >> + >> +#define ELM_CLIPPER_DATA_GET_OR_RETURN(o, ptr) \ >> + ELM_CLIPPER_DATA_GET(o, ptr); \ >> + if (EINA_UNLIKELY(!ptr)) \ >> + { \ >> + CRI("No widget data for object %p (%s)", \ >> + o, evas_object_type_get(o)); \ >> + return; \ >> + } >> + >> +#define ELM_CLIPPER_DATA_GET_OR_RETURN_VAL(o, ptr, val) \ >> + ELM_CLIPPER_DATA_GET(o, ptr); \ >> + if (EINA_UNLIKELY(!ptr)) \ >> + { \ >> + CRI("No widget data for object %p (%s)", \ >> + o, evas_object_type_get(o)); \ >> + return val; \ >> + } >> + >> +#define ELM_CLIPPER_CHECK(obj) \ >> + if (EINA_UNLIKELY(!eo_isa((obj), ELM_CLIPPER_CLASS))) \ >> + return >> + >> +#endif >> >> -- >> >> >> > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel -- Cedric BAIL ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel