summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-10-10 16:44:48 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-10-12 11:25:56 +0900
commit62abe2cbff0aa809a474f7a89452256f5371ebc3 (patch)
tree53cfa5e16676b4c7987d3267d4cabcee817ea757
parentc60cc50f5a0cf76a287380eb89df117efc71cca8 (diff)
downloadefl-62abe2cbff0aa809a474f7a89452256f5371ebc3.tar.gz
evas: Move clip_unset to legacy, remove group_clip
Similarly to group_color_set, group_clip_[un]set should not exist and should be a result of efl_super and inheritance. This patch also removes clip_unset from the EO API and keeps only clip_set(NULL). The reason is that it will avoid bad overrides of clip_unset() vs. clip_unset(NULL). This also simplifies the code a bit. Ideally we should be able to reintroduce clip_unset in EO if we can have a "@final" tag (like java's final keyword), to prevent overrides.
-rw-r--r--src/examples/evas/evas-object-manipulation-eo.c2
-rw-r--r--src/lib/elementary/efl_ui_image.c16
-rw-r--r--src/lib/elementary/efl_ui_image.eo3
-rw-r--r--src/lib/elementary/elm_widget.c20
-rw-r--r--src/lib/elementary/elm_widget.eo3
-rw-r--r--src/lib/emotion/efl_canvas_video.eo3
-rw-r--r--src/lib/emotion/emotion_smart.c14
-rw-r--r--src/lib/evas/Evas_Legacy.h15
-rw-r--r--src/lib/evas/canvas/efl_canvas_group.eo13
-rw-r--r--src/lib/evas/canvas/efl_canvas_group_clipped.eo3
-rw-r--r--src/lib/evas/canvas/efl_canvas_object.eo47
-rw-r--r--src/lib/evas/canvas/evas_clip.c132
-rw-r--r--src/lib/evas/canvas/evas_object_intercept.c68
-rw-r--r--src/lib/evas/canvas/evas_object_smart.c20
-rw-r--r--src/lib/evas/canvas/evas_object_smart_clipped.c21
-rw-r--r--src/lib/evas/include/evas_private.h3
16 files changed, 171 insertions, 212 deletions
diff --git a/src/examples/evas/evas-object-manipulation-eo.c b/src/examples/evas/evas-object-manipulation-eo.c
index fc7621597a..035fb04d7e 100644
--- a/src/examples/evas/evas-object-manipulation-eo.c
+++ b/src/examples/evas/evas-object-manipulation-eo.c
@@ -129,7 +129,7 @@ _on_keydown(void *data EINA_UNUSED,
clip = efl_canvas_object_clip_get(d.img);
if (clip == d.clipper)
{
- efl_canvas_object_clip_unset(d.img);
+ efl_canvas_object_clip_set(d.img, NULL);
fprintf(stdout, "off\n");
}
else
diff --git a/src/lib/elementary/efl_ui_image.c b/src/lib/elementary/efl_ui_image.c
index 4ee2e14fef..a74bce5731 100644
--- a/src/lib/elementary/efl_ui_image.c
+++ b/src/lib/elementary/efl_ui_image.c
@@ -634,23 +634,17 @@ _efl_ui_image_efl_gfx_color_set(Eo *obj, Efl_Ui_Image_Data *sd, int r, int g, in
}
EOLIAN static void
-_efl_ui_image_efl_canvas_group_group_clip_set(Eo *obj, Efl_Ui_Image_Data *sd, Evas_Object *clip)
+_efl_ui_image_efl_canvas_object_clip_set(Eo *obj, Efl_Ui_Image_Data *sd, Evas_Object *clip)
{
- efl_canvas_group_clip_set(efl_super(obj, MY_CLASS), clip);
+ if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
+ return;
+
+ efl_canvas_object_clip_set(efl_super(obj, MY_CLASS), clip);
evas_object_clip_set(sd->img, clip);
if (sd->prev_img) evas_object_clip_set(sd->prev_img, clip);
}
-EOLIAN static void
-_efl_ui_image_efl_canvas_group_group_clip_unset(Eo *obj, Efl_Ui_Image_Data *sd)
-{
- efl_canvas_group_clip_unset(efl_super(obj, MY_CLASS));
-
- evas_object_clip_unset(sd->img);
- if (sd->prev_img) evas_object_clip_unset(sd->prev_img);
-}
-
EOLIAN static Elm_Theme_Apply
_efl_ui_image_elm_widget_theme_apply(Eo *obj, Efl_Ui_Image_Data *sd EINA_UNUSED)
{
diff --git a/src/lib/elementary/efl_ui_image.eo b/src/lib/elementary/efl_ui_image.eo
index 9f04fe30a4..bc6d822ce3 100644
--- a/src/lib/elementary/efl_ui_image.eo
+++ b/src/lib/elementary/efl_ui_image.eo
@@ -140,9 +140,8 @@ class Efl.Ui.Image (Elm.Widget, Efl.Ui.Clickable, Efl.Ui.Draggable,
Edje.Object.size_max.get;
Edje.Object.size_min_calc;
Edje.Object.calc_force;
+ Efl.Canvas.Object.clip.set;
Efl.Canvas.Group.group_hide;
- Efl.Canvas.Group.group_clip.set;
- Efl.Canvas.Group.group_clip_unset;
Efl.Canvas.Group.group_show;
Efl.Canvas.Group.group_move;
Efl.Canvas.Group.group_add;
diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c
index 937de3a925..78150863ac 100644
--- a/src/lib/elementary/elm_widget.c
+++ b/src/lib/elementary/elm_widget.c
@@ -599,31 +599,21 @@ _elm_widget_efl_canvas_object_no_render_set(Eo *obj, Elm_Widget_Smart_Data *_pd
}
EOLIAN static void
-_elm_widget_efl_canvas_group_group_clip_set(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Evas_Object *clip)
+_elm_widget_efl_canvas_object_clip_set(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Evas_Object *clip)
{
Eina_Iterator *it;
Evas_Object *o;
- it = evas_object_smart_iterator_new(obj);
- EINA_ITERATOR_FOREACH(it, o)
- {
- if (evas_object_data_get(o, "_elm_leaveme")) continue;
- evas_object_clip_set(o, clip);
- }
- eina_iterator_free(it);
-}
+ if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
+ return;
-EOLIAN static void
-_elm_widget_efl_canvas_group_group_clip_unset(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
-{
- Eina_Iterator *it;
- Evas_Object *o;
+ efl_canvas_object_clip_set(efl_super(obj, MY_CLASS), clip);
it = evas_object_smart_iterator_new(obj);
EINA_ITERATOR_FOREACH(it, o)
{
if (evas_object_data_get(o, "_elm_leaveme")) continue;
- evas_object_clip_unset(o);
+ evas_object_clip_set(o, clip);
}
eina_iterator_free(it);
}
diff --git a/src/lib/elementary/elm_widget.eo b/src/lib/elementary/elm_widget.eo
index ac6def3bbb..1bb684fa12 100644
--- a/src/lib/elementary/elm_widget.eo
+++ b/src/lib/elementary/elm_widget.eo
@@ -848,16 +848,15 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible, Elm.Inter
Efl.Object.dbg_info_get;
Efl.Object.provider_find;
Efl.Gfx.color.set;
+ Efl.Canvas.Object.clip.set;
Efl.Canvas.Object.no_render.set;
Efl.Canvas.Group.group_hide;
Efl.Canvas.Group.group_calculate;
- Efl.Canvas.Group.group_clip_unset;
Efl.Canvas.Group.group_show;
Efl.Canvas.Group.group_move;
Efl.Canvas.Group.group_member_del;
Efl.Canvas.Group.group_add;
Efl.Canvas.Group.group_del;
- Efl.Canvas.Group.group_clip.set;
Efl.Canvas.Group.group_member_add;
Efl.Canvas.Group.group_resize;
Elm.Interface.Atspi_Accessible.name.get;
diff --git a/src/lib/emotion/efl_canvas_video.eo b/src/lib/emotion/efl_canvas_video.eo
index 64b920c1d0..0e554adb79 100644
--- a/src/lib/emotion/efl_canvas_video.eo
+++ b/src/lib/emotion/efl_canvas_video.eo
@@ -52,14 +52,13 @@ class Efl.Canvas.Video (Efl.Canvas.Group, Efl.File, Efl.Player, Efl.Image, Efl.I
implements {
Efl.Object.constructor;
Efl.Gfx.color.set;
+ Efl.Canvas.Object.clip.set;
Efl.Canvas.Group.group_add;
Efl.Canvas.Group.group_del;
Efl.Canvas.Group.group_move;
Efl.Canvas.Group.group_resize;
Efl.Canvas.Group.group_show;
Efl.Canvas.Group.group_hide;
- Efl.Canvas.Group.group_clip.set;
- Efl.Canvas.Group.group_clip_unset;
Efl.File.file.set;
Efl.File.file.get;
Efl.Player.play.set;
diff --git a/src/lib/emotion/emotion_smart.c b/src/lib/emotion/emotion_smart.c
index 3a9ebdeec0..36228ca143 100644
--- a/src/lib/emotion/emotion_smart.c
+++ b/src/lib/emotion/emotion_smart.c
@@ -1977,20 +1977,14 @@ _efl_canvas_video_efl_gfx_color_set(Evas_Object *obj, Efl_Canvas_Video_Data *sd,
}
EOLIAN static void
-_efl_canvas_video_efl_canvas_group_group_clip_set(Evas_Object *obj EINA_UNUSED, Efl_Canvas_Video_Data *sd, Evas_Object * clip)
+_efl_canvas_video_efl_canvas_object_clip_set(Evas_Object *obj, Efl_Canvas_Video_Data *sd, Evas_Object *clip)
{
+ if (_evas_object_intercept_call(obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
+ return;
+
if (sd->crop.clipper) evas_object_clip_set(sd->crop.clipper, clip);
else evas_object_clip_set(sd->obj, clip);
evas_object_clip_set(sd->bg, clip);
}
-EOLIAN static void
-_efl_canvas_video_efl_canvas_group_group_clip_unset(Evas_Object *obj EINA_UNUSED, Efl_Canvas_Video_Data *sd)
-{
- if (sd->crop.clipper) evas_object_clip_unset(sd->crop.clipper);
- else evas_object_clip_unset(sd->obj);
- evas_object_clip_unset(sd->bg);
-
-}
-
#include "efl_canvas_video.eo.c"
diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h
index 65a65f373d..937d08f74e 100644
--- a/src/lib/evas/Evas_Legacy.h
+++ b/src/lib/evas/Evas_Legacy.h
@@ -1012,6 +1012,21 @@ EAPI void evas_object_size_hint_request_get(const Evas_Object *obj, Evas_Coord *
EAPI void evas_object_size_hint_min_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h);
/**
+ * @brief Disable/cease clipping on a clipped @c obj object.
+ *
+ * This function disables clipping for the object @c obj, if it was already
+ * clipped, i.e., its visibility and color get detached from the previous
+ * clipper. If it wasn't, this has no effect. The object @c obj must be a valid
+ * Evas_Object.
+ *
+ * See also @ref evas_object_clip_set, @ref evas_object_clipees_get and
+ * @ref evas_object_clip_get.
+ *
+ * @ingroup Evas_Object
+ */
+EAPI void evas_object_clip_unset(Evas_Object *obj);
+
+/**
* @brief Retrieves the hints for an object's minimum size.
*
* These are hints on the minimum sizes @c obj should have. This is not a size
diff --git a/src/lib/evas/canvas/efl_canvas_group.eo b/src/lib/evas/canvas/efl_canvas_group.eo
index 32b1168472..d7181752d8 100644
--- a/src/lib/evas/canvas/efl_canvas_group.eo
+++ b/src/lib/evas/canvas/efl_canvas_group.eo
@@ -78,15 +78,6 @@ class Efl.Canvas.Group (Efl.Canvas.Object)
return: free(own(iterator<Efl.Gfx>), eina_iterator_free);
legacy: evas_object_smart_iterator_new;
}
- @property group_clip {
- set {
- [[No description supplied by the EAPI.]]
- legacy: null;
- }
- values {
- clip: Efl.Canvas.Object;
- }
- }
group_show {
[[No description supplied by the EAPI.]]
legacy: null;
@@ -140,10 +131,6 @@ class Efl.Canvas.Group (Efl.Canvas.Object)
@in h: Evas.Coord;
}
}
- group_clip_unset {
- [[No description supplied by the EAPI.]]
- legacy: null;
- }
group_member_del {
[[Removes a member object from a given smart object.
diff --git a/src/lib/evas/canvas/efl_canvas_group_clipped.eo b/src/lib/evas/canvas/efl_canvas_group_clipped.eo
index 6e04df518a..ce716aa3c0 100644
--- a/src/lib/evas/canvas/efl_canvas_group_clipped.eo
+++ b/src/lib/evas/canvas/efl_canvas_group_clipped.eo
@@ -4,10 +4,9 @@ abstract Efl.Canvas.Group.Clipped (Efl.Canvas.Group)
data: Evas_Object_Smart_Clipped_Data;
implements {
Efl.Gfx.color.set;
+ Efl.Canvas.Object.clip.set;
Efl.Canvas.Object.no_render.set;
Efl.Canvas.Group.group_hide;
- Efl.Canvas.Group.group_clip.set;
- Efl.Canvas.Group.group_clip_unset;
Efl.Canvas.Group.group_show;
Efl.Canvas.Group.group_move;
Efl.Canvas.Group.group_member_del;
diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo
index c7d1bf4be1..84c7f8dd8f 100644
--- a/src/lib/evas/canvas/efl_canvas_object.eo
+++ b/src/lib/evas/canvas/efl_canvas_object.eo
@@ -131,27 +131,13 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
is called, it gets implicitly removed from the old clipper's
domain and is made now to be clipped by its new clipper.
- Note: At the moment the only objects that can validly be used
- to clip other objects are rectangle objects. All other object
- types are invalid and the result of using them is undefined.
- The clip object $clip must be a valid object, but can also be
- $null, in which case the effect of this function is the same
- as @.clip_unset on the $obj object.
- ]]
- /* FIXME-doc
- The following figure illustrates some clipping in Evas:
-
- @image html clipping.png
- @image rtf clipping.png
- @image latex clipping.eps
- ---
- Example:
- @dontinclude evas-object-manipulation.c
- @skip solid white clipper (note that it's the default color for a
- @until evas_object_show(d.clipper);
+ If $clip is $null, this call will disable clipping for the object
+ i.e. its visibility and color get detached from the previous
+ clipper. If it wasn't, this has no effect.
- See the full @ref Example_Evas_Object_Manipulation "example".
- */
+ Note: Only rectangle and image (masks) objects can be used
+ as clippers. Anything else will result in undefined behaviour.
+ ]]
}
get {
[[Get the object clipping $obj (if any).
@@ -160,14 +146,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
not being clipped at all, $null is returned. The object $obj
must be a valid Evas_Object.
]]
- /* FIXME-doc
- Example:
- @dontinclude evas-object-manipulation.c
- @skip if (evas_object_clip_get(d.img) == d.clipper)
- @until return
-
- See the full @ref Example_Evas_Object_Manipulation "example".
- */
}
values {
clip: Efl.Canvas.Object @nonull; [[The object to clip $obj by.]]
@@ -381,7 +359,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
anymore after that point. Any use of the list after this
may have undefined results, possibly leading to crashes.
- See also @.clip and @.clip_unset.
+ See also @.clip.
]]
legacy: null;
return: iterator<Efl.Canvas.Object> @warn_unused; [[An iterator over the
@@ -498,17 +476,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
]]
}
}
- clip_unset {
- [[Disable/cease clipping on a clipped $obj object.
-
- This function disables clipping for the object $obj, if it was
- already clipped, i.e., its visibility and color get detached from
- the previous clipper. If it wasn't, this has no effect. The
- object $obj must be a valid Evas_Object.
-
- See also @.clip.set, @.clipees.get and @.clip.get.
- ]]
- }
@property no_render {
get {
[[Returns the state of the "no-render" flag, which means, when
diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c
index 8a734d5879..66523c60f7 100644
--- a/src/lib/evas/canvas/evas_clip.c
+++ b/src/lib/evas/canvas/evas_clip.c
@@ -1,6 +1,8 @@
#include "evas_common_private.h"
#include "evas_private.h"
+static void _clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj);
+
void
evas_object_clip_dirty(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
{
@@ -215,6 +217,47 @@ extern const char *o_image_type;
static void _clipper_del_cb(void *data, const Efl_Event *event);
+Eina_Bool
+_efl_canvas_object_clip_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj,
+ Evas_Object *eo_clip, Evas_Object_Protected_Data *clip)
+{
+ if (!obj) obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ if (!clip) clip = efl_data_scope_get(eo_clip, EFL_CANVAS_OBJECT_CLASS);
+
+ evas_object_async_block(obj);
+
+ if (obj->cur->clipper && (obj->cur->clipper->object == eo_clip)) return EINA_TRUE;
+ if (eo_obj == eo_clip) goto err_same;
+ if (clip->delete_me) goto err_clip_deleted;
+ if (obj->delete_me) goto err_obj_deleted;
+ if (!obj->layer || !clip->layer) goto err_no_layer;
+ if (obj->layer->evas != clip->layer->evas) goto err_diff_evas;
+ if ((clip->type != o_rect_type) && (clip->type != o_image_type)) goto err_type;
+
+ return EINA_FALSE;
+
+err_same:
+ CRI("Setting clip %p on itself", eo_obj);
+ return EINA_TRUE;
+err_clip_deleted:
+ CRI("Setting deleted object %p as clip obj %p", eo_clip, eo_obj);
+ return EINA_TRUE;
+err_obj_deleted:
+ CRI("Setting object %p as clip to deleted obj %p", eo_clip, eo_obj);
+ return EINA_TRUE;
+err_no_layer:
+ CRI("Object %p or clip %p layer is not set !", obj, clip);;
+ return EINA_TRUE;
+err_diff_evas:
+ CRI("Setting object %p from Evas (%p) to another Evas (%p)",
+ obj, obj->layer->evas, clip->layer->evas);
+ return EINA_TRUE;
+err_type:
+ CRI("A clipper can only be an evas rectangle or image (got %s)",
+ efl_class_name_get(eo_clip));
+ return EINA_TRUE;
+}
+
EOLIAN void
_efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object *eo_clip)
{
@@ -223,62 +266,18 @@ _efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Ob
if (!eo_clip)
{
- evas_object_clip_unset(eo_obj);
+ _clip_unset(eo_obj, obj);
return;
}
- MAGIC_CHECK(eo_clip, Evas_Object, MAGIC_OBJ);
- return;
- MAGIC_CHECK_END();
-
- evas_object_async_block(obj);
-
clip = efl_data_scope_get(eo_clip, EFL_CANVAS_OBJECT_CLASS);
- if (obj->cur->clipper && obj->cur->clipper->object == eo_clip) return;
- if (eo_obj == eo_clip)
- {
- CRI("Setting clip %p on itself", eo_obj);
- return;
- }
- if (clip->delete_me)
- {
- CRI("Setting deleted object %p as clip obj %p", eo_clip, eo_obj);
- return;
- }
- if (obj->delete_me)
- {
- CRI("Setting object %p as clip to deleted obj %p", eo_clip, eo_obj);
- return;
- }
- if (!obj->layer)
- {
- CRI("No evas surface associated with object (%p)", eo_obj);
- return;
- }
- if ((obj->layer && clip->layer) &&
- (obj->layer->evas != clip->layer->evas))
- {
- CRI("Setting object %p from Evas (%p) to another Evas (%p)", obj, obj->layer->evas, clip->layer->evas);
- return;
- }
- if (!obj->layer || !clip->layer)
- {
- CRI("Object %p or clip %p layer is not set !", obj, clip);
- return;
- }
+ if (_efl_canvas_object_clip_set_block(eo_obj, obj, eo_clip, clip)) return;
+ if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 1, eo_clip)) return;
- if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 1, eo_clip))
- return;
-
- // illegal to set anything but a rect or an image as a clip
- if (clip->type != o_rect_type && clip->type != o_image_type)
+ if (obj->is_smart && obj->smart.smart && obj->smart.smart->smart_class &&
+ obj->smart.smart->smart_class->clip_set)
{
- ERR("For now a clip on other object than a rectangle or an image is disabled");
- return;
- }
- if (obj->is_smart)
- {
- efl_canvas_group_clip_set(eo_obj, eo_clip);
+ obj->smart.smart->smart_class->clip_set(eo_obj, eo_clip);
}
if (obj->cur->clipper)
{
@@ -402,18 +401,27 @@ _efl_canvas_object_clip_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *
return NULL;
}
-EOLIAN void
-_efl_canvas_object_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj)
+Eina_Bool
+_efl_canvas_object_clip_unset_block(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
{
- if (!obj->cur->clipper) return;
+ if (!obj->cur->clipper)
+ return EINA_TRUE;
+
evas_object_async_block(obj);
obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer);
- /* unclip */
+ return EINA_FALSE;
+}
+
+static void
+_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj)
+{
+ if (_efl_canvas_object_clip_unset_block(eo_obj, obj)) return;
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_UNSET, 1)) return;
- if (obj->is_smart)
+ if (obj->is_smart && obj->smart.smart && obj->smart.smart->smart_class &&
+ obj->smart.smart->smart_class->clip_unset)
{
- efl_canvas_group_clip_unset(eo_obj);
+ obj->smart.smart->smart_class->clip_unset(eo_obj);
}
if (obj->cur->clipper)
{
@@ -478,6 +486,16 @@ _efl_canvas_object_clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj)
evas_object_clip_across_check(eo_obj, obj);
}
+EAPI void
+evas_object_clip_unset(Evas_Object *eo_obj)
+{
+ Evas_Object_Protected_Data *obj;
+
+ if (!efl_isa(eo_obj, EFL_CANVAS_OBJECT_CLASS)) return;
+ obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ _clip_unset(eo_obj, obj);
+}
+
static void
_clipper_del_cb(void *data, const Efl_Event *event)
{
@@ -486,7 +504,7 @@ _clipper_del_cb(void *data, const Efl_Event *event)
if (!obj) return;
- _efl_canvas_object_clip_unset(eo_obj, obj);
+ _clip_unset(eo_obj, obj);
if (obj->prev->clipper && (obj->prev->clipper->object == event->object))
{
// not removing cb since it's the del cb... it can't be called again!
diff --git a/src/lib/evas/canvas/evas_object_intercept.c b/src/lib/evas/canvas/evas_object_intercept.c
index 0f62746cdb..2f286057c8 100644
--- a/src/lib/evas/canvas/evas_object_intercept.c
+++ b/src/lib/evas/canvas/evas_object_intercept.c
@@ -104,101 +104,111 @@ _evas_object_intercept_call(Evas_Object *eo_obj, Evas_Object_Intercept_Cb_Type c
case EVAS_OBJECT_INTERCEPT_CB_SHOW:
if (obj->cur->visible) return 1;
if (!obj->interceptors) return 0;
- blocked = evas_object_intercept_call_show(eo_obj, obj);
- break;
+ return evas_object_intercept_call_show(eo_obj, obj);
case EVAS_OBJECT_INTERCEPT_CB_HIDE:
if (!obj->cur->visible) return 1;
if (!obj->interceptors) return 0;
- blocked = evas_object_intercept_call_hide(eo_obj, obj);
- break;
+ return evas_object_intercept_call_hide(eo_obj, obj);
case EVAS_OBJECT_INTERCEPT_CB_MOVE:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
i = va_arg(args, int);
j = va_arg(args, int);
blocked = evas_object_intercept_call_move(eo_obj, obj, i, j);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_RESIZE:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
i = va_arg(args, int);
j = va_arg(args, int);
blocked = evas_object_intercept_call_resize(eo_obj, obj, i, j);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_RAISE:
if (!obj->interceptors) return 0;
- blocked = evas_object_intercept_call_raise(eo_obj, obj);
- break;
+ return evas_object_intercept_call_raise(eo_obj, obj);
case EVAS_OBJECT_INTERCEPT_CB_LOWER:
if (!obj->interceptors) return 0;
- blocked = evas_object_intercept_call_lower(eo_obj, obj);
- break;
+ return evas_object_intercept_call_lower(eo_obj, obj);
case EVAS_OBJECT_INTERCEPT_CB_STACK_ABOVE:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
eo_other = va_arg(args, Evas_Object *);
blocked = evas_object_intercept_call_stack_above(eo_obj, obj, eo_other);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_STACK_BELOW:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
eo_other = va_arg(args, Evas_Object *);
blocked = evas_object_intercept_call_stack_below(eo_obj, obj, eo_other);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_LAYER_SET:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
i = va_arg(args, int);
blocked = evas_object_intercept_call_layer_set(eo_obj, obj, i);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_FOCUS_SET:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
i = va_arg(args, int);
blocked = evas_object_intercept_call_focus_set(eo_obj, obj, !!i);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_COLOR_SET:
if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
r = va_arg(args, int);
g = va_arg(args, int);
b = va_arg(args, int);
a = va_arg(args, int);
blocked = evas_object_intercept_call_color_set(eo_obj, obj, r, g, b, a);
- va_end(args);
break;
case EVAS_OBJECT_INTERCEPT_CB_CLIP_SET:
- if (!obj->interceptors) return 0;
- va_start(args, cb_type);
+ va_start(args, internal);
eo_other = va_arg(args, Evas_Object *);
- blocked = evas_object_intercept_call_clip_set(eo_obj, obj, eo_other);
- va_end(args);
- break;
+ if (eo_other)
+ {
+ if (!internal)
+ {
+ if (_efl_canvas_object_clip_set_block(eo_obj, obj, eo_other, NULL))
+ goto end_block;
+ }
+ if (!obj->interceptors) goto end_noblock;
+ blocked = evas_object_intercept_call_clip_set(eo_obj, obj, eo_other);
+ break;
+ }
+ // else: fallthrough to unset
case EVAS_OBJECT_INTERCEPT_CB_CLIP_UNSET:
+ if (!internal)
+ {
+ if (_efl_canvas_object_clip_unset_block(eo_obj, obj))
+ return 1;
+ }
if (!obj->interceptors) return 0;
- blocked = evas_object_intercept_call_clip_unset(eo_obj, obj);
- break;
+ return evas_object_intercept_call_clip_unset(eo_obj, obj);
}
+ va_end(args);
return blocked;
+
+end_block:
+ va_end(args);
+ return 1;
+
+end_noblock:
+ va_end(args);
+ return 0;
}
/* public calls */
diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c
index 5e13239d63..6008f9380f 100644
--- a/src/lib/evas/canvas/evas_object_smart.c
+++ b/src/lib/evas/canvas/evas_object_smart.c
@@ -650,26 +650,6 @@ _efl_canvas_group_group_hide(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED)
}
EOLIAN static void
-_efl_canvas_group_group_clip_set(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED, Evas_Object *clip)
-{
- // If this function is reached, so we do nothing except trying to call
- // the function of the legacy smart class.
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Evas_Smart *s = obj->smart.smart;
- if (s && s->smart_class->clip_set) s->smart_class->clip_set(eo_obj, clip);
-}
-
-EOLIAN static void
-_efl_canvas_group_group_clip_unset(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED)
-{
- // If this function is reached, so we do nothing except trying to call
- // the function of the legacy smart class.
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Evas_Smart *s = obj->smart.smart;
- if (s && s->smart_class->clip_unset) s->smart_class->clip_unset(eo_obj);
-}
-
-EOLIAN static void
_efl_canvas_group_efl_canvas_object_no_render_set(Eo *eo_obj, Evas_Smart_Data *o EINA_UNUSED, Eina_Bool enable)
{
Evas_Object_Protected_Data *obj2;
diff --git a/src/lib/evas/canvas/evas_object_smart_clipped.c b/src/lib/evas/canvas/evas_object_smart_clipped.c
index b0f1a09e80..545db3a16e 100644
--- a/src/lib/evas/canvas/evas_object_smart_clipped.c
+++ b/src/lib/evas/canvas/evas_object_smart_clipped.c
@@ -175,12 +175,6 @@ evas_object_smart_clipped_smart_clip_set(Evas_Object *eo_obj, Evas_Object *clip)
evas_object_clip_set(cso->clipper, clip);
}
-EOLIAN static void
-_efl_canvas_group_clipped_efl_canvas_group_group_clip_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Object *clip)
-{
- evas_object_smart_clipped_smart_clip_set(eo_obj, clip);
-}
-
static void
evas_object_smart_clipped_smart_clip_unset(Evas_Object *eo_obj)
{
@@ -189,9 +183,20 @@ evas_object_smart_clipped_smart_clip_unset(Evas_Object *eo_obj)
}
EOLIAN static void
-_efl_canvas_group_clipped_efl_canvas_group_group_clip_unset(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED)
+_efl_canvas_group_clipped_efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Smart_Clipped_Data *obj EINA_UNUSED, Evas_Object *clip)
{
- evas_object_smart_clipped_smart_clip_unset(eo_obj);
+ if (clip)
+ {
+ if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_SET, 0, clip))
+ return;
+ evas_object_smart_clipped_smart_clip_set(eo_obj, clip);
+ }
+ else
+ {
+ if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_CLIP_UNSET, 0))
+ return;
+ evas_object_smart_clipped_smart_clip_unset(eo_obj);
+ }
}
static void
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 518b74dd76..91602d96c8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1652,6 +1652,9 @@ void evas_font_draw_async_check(Evas_Object_Protected_Data *obj,
void _efl_canvas_object_clip_prev_reset(Evas_Object_Protected_Data *obj, Eina_Bool cur_prev);
+Eina_Bool _efl_canvas_object_clip_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object *eo_clip, Evas_Object_Protected_Data *clip);
+Eina_Bool _efl_canvas_object_clip_unset_block(Eo *eo_obj, Evas_Object_Protected_Data *obj);
+
void _canvas_event_default_flags_set(Eo *e, void *_pd, va_list *list);
void _canvas_event_default_flags_get(Eo *e, void *_pd, va_list *list);
void _canvas_event_freeze(Eo *e, void *_pd, va_list *list);