evas: Move clip_unset to legacy, remove group_clip
authorJean-Philippe Andre <jp.andre@samsung.com>
Mon, 10 Oct 2016 07:44:48 +0000 (16:44 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 12 Oct 2016 02:25:56 +0000 (11:25 +0900)
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.

16 files changed:
src/examples/evas/evas-object-manipulation-eo.c
src/lib/elementary/efl_ui_image.c
src/lib/elementary/efl_ui_image.eo
src/lib/elementary/elm_widget.c
src/lib/elementary/elm_widget.eo
src/lib/emotion/efl_canvas_video.eo
src/lib/emotion/emotion_smart.c
src/lib/evas/Evas_Legacy.h
src/lib/evas/canvas/efl_canvas_group.eo
src/lib/evas/canvas/efl_canvas_group_clipped.eo
src/lib/evas/canvas/efl_canvas_object.eo
src/lib/evas/canvas/evas_clip.c
src/lib/evas/canvas/evas_object_intercept.c
src/lib/evas/canvas/evas_object_smart.c
src/lib/evas/canvas/evas_object_smart_clipped.c
src/lib/evas/include/evas_private.h

index fc76215..035fb04 100644 (file)
@@ -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
index 4ee2e14..a74bce5 100644 (file)
@@ -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)
 {
index 9f04fe3..bc6d822 100644 (file)
@@ -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;
index 937de3a..7815086 100644 (file)
@@ -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);
 }
index ac6def3..1bb684f 100644 (file)
@@ -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;
index 64b920c..0e554ad 100644 (file)
@@ -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;
index 3a9ebde..36228ca 100644 (file)
@@ -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"
index 65a65f3..937d08f 100644 (file)
@@ -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
index 32b1168..d718175 100644 (file)
@@ -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.
 
index 6e04df5..ce716aa 100644 (file)
@@ -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;
index c7d1bf4..84c7f8d 100644 (file)
@@ -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
index 8a734d5..66523c6 100644 (file)
@@ -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!
index 0f62746..2f28605 100644 (file)
@@ -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 */
index 5e13239..6008f93 100644 (file)
@@ -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;
index b0f1a09..545db3a 100644 (file)
@@ -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
index 518b74d..91602d9 100644 (file)
@@ -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);