aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-05 22:38:02 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-05 22:40:51 +0900
commit25d77bc1d24d9fd539c681fa58db976c1ca65051 (patch)
tree3ccb145660b2dd4eca782ac0263ad0dff24880a2
parentelc_combobox: add/remove item doesn't resize container with genlist (diff)
downloadefl-25d77bc1d24d9fd539c681fa58db976c1ca65051.tar.gz
evas event handling2 - fix incorrect object reporting
this fixes a new bug brought up by 9f0fd66ab818d212fa88faef316ac17625f1a2f5 which fixes event reporting etc. etc. .. this fixes https://phab.enlightenment.org/T4017 @fix
-rw-r--r--src/lib/evas/canvas/evas_events.c70
-rw-r--r--src/lib/evas/canvas/evas_object_smart.c2
-rw-r--r--src/lib/evas/include/evas_inline.x22
3 files changed, 84 insertions, 10 deletions
diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c
index 6d4f24aa72..e94321de52 100644
--- a/src/lib/evas/canvas/evas_events.c
+++ b/src/lib/evas/canvas/evas_events.c
@@ -134,6 +134,15 @@ _efl_event_desc_get(Evas_Callback_Type type)
#define EV_RESET(a) do { if (a) efl_event_reset(a); } while (0)
#define EV_DEL(a) do { if (a) { eo_unref(a); } a = NULL; } while (0)
+#if 0
+# define DDD_DO 1
+# define DDD(...) do { for (i = 0; i < spaces; i++) printf(" "); printf(__VA_ARGS__); } while (0)
+# define D(...) do { printf(__VA_ARGS__); } while (0)
+#else
+# define DDD(...) do { } while (0)
+# define D(...) do { } while (0)
+#endif
+
static Eina_List *
_evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
const Eina_Inlist *list, Evas_Object *stop,
@@ -143,7 +152,15 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
Evas_Object_Protected_Data *obj = NULL;
int inside;
+#ifdef DDD_DO
+ static int spaces = 0;
+ int i;
+#endif
+
if (!list) return in;
+#ifdef DDD_DO
+ spaces++;
+#endif
for (obj = _EINA_INLIST_CONTAINER(obj, eina_inlist_last(list));
obj;
obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
@@ -152,16 +169,39 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
if (eo_obj == stop)
{
*no_rep = 1;
+#ifdef DDD_DO
+ spaces--;
+#endif
+ DDD("***** NO REP - STOP *****\n");
return in;
}
evas_object_clip_recalc(obj);
if ((!RECTS_INTERSECT(x, y, 1, 1,
- obj->cur->cache.clip.x,
- obj->cur->cache.clip.y,
- obj->cur->cache.clip.w,
- obj->cur->cache.clip.h)))
- continue;
+ obj->cur->cache.clip.x,
+ obj->cur->cache.clip.y,
+ obj->cur->cache.clip.w,
+ obj->cur->cache.clip.h)))
+ {
+ DDD("___ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] %s\n",
+ obj->object,
+ obj->cur->geometry.x, obj->cur->geometry.y,
+ obj->cur->geometry.w, obj->cur->geometry.h,
+ obj->cur->cache.clip.x, obj->cur->cache.clip.y,
+ obj->cur->cache.clip.w, obj->cur->cache.clip.h,
+ obj->type);
+ continue;
+ }
+ else
+ {
+ DDD("OBJ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] %s\n",
+ obj->object,
+ obj->cur->geometry.x, obj->cur->geometry.y,
+ obj->cur->geometry.w, obj->cur->geometry.h,
+ obj->cur->cache.clip.x, obj->cur->cache.clip.y,
+ obj->cur->cache.clip.w, obj->cur->cache.clip.h,
+ obj->type);
+ }
if (!source)
{
@@ -174,6 +214,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
{
if (obj->is_smart)
{
+ DDD("CHILDREN ->\n");
Evas_Object_Protected_Data *clip = obj->cur->clipper;
int norep = 0;
@@ -232,6 +273,10 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
if (!obj->repeat_events)
{
*no_rep = 1;
+#ifdef DDD_DO
+ spaces--;
+#endif
+ DDD("***** NO REP1 *****\n");
return in;
}
}
@@ -261,10 +306,17 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
(evas_object_is_inside(eo_obj, obj, x, y))))
{
if (!evas_event_freezes_through(eo_obj, obj))
- in = eina_list_append(in, eo_obj);
+ {
+ DDD("----------------> ADD obj %p\n", obj->object);
+ in = eina_list_append(in, eo_obj);
+ }
if (!obj->repeat_events)
{
*no_rep = 1;
+#ifdef DDD_DO
+ spaces--;
+#endif
+ DDD("***** NO REP2 *****\n");
return in;
}
}
@@ -272,6 +324,9 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
}
}
*no_rep = 0;
+#ifdef DDD_DO
+ spaces--;
+#endif
return in;
}
@@ -1012,9 +1067,11 @@ _evas_event_objects_event_list_no_frozen_check(Evas *eo_e, Evas_Object *stop, in
if (!e->layers) return NULL;
+ D("@@@@@ layer count = %i\n", eina_inlist_count(EINA_INLIST_GET(e->layers)));
EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
{
int no_rep = 0;
+ D("############################# check layer %i\n", lay->layer);
in = _evas_event_object_list_in_get(eo_e, in,
EINA_INLIST_GET(lay->objects),
stop, x, y, &no_rep, EINA_FALSE);
@@ -1035,6 +1092,7 @@ evas_event_objects_event_list(Evas *eo_e, Evas_Object *stop, int x, int y)
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
if ((!e->layers) || (e->is_frozen)) return NULL;
+ D("------------------------------GET EVETNS AT ............... %i %i\n", x, y);
return _evas_event_objects_event_list_no_frozen_check(eo_e, stop, x, y);
}
diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c
index a97112038a..cabdaf26bc 100644
--- a/src/lib/evas/canvas/evas_object_smart.c
+++ b/src/lib/evas/canvas/evas_object_smart.c
@@ -1398,6 +1398,8 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected
if (!os->update_boundingbox_needed) return;
os->update_boundingbox_needed = EINA_FALSE;
+ evas_object_clip_dirty(eo_obj, obj);
+ if (obj->cur->clipper) evas_object_clip_recalc(obj->cur->clipper);
minx = obj->layer->evas->output.w;
miny = obj->layer->evas->output.h;
diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x
index 857a75596e..ff6a95df47 100644
--- a/src/lib/evas/include/evas_inline.x
+++ b/src/lib/evas/include/evas_inline.x
@@ -279,10 +279,24 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj)
}
else
{
- cx = obj->cur->geometry.x;
- cy = obj->cur->geometry.y;
- cw = obj->cur->geometry.w;
- ch = obj->cur->geometry.h;
+ if (obj->is_smart)
+ {
+ Evas_Coord_Rectangle bounding_box = { 0, 0, 0, 0 };
+
+ evas_object_smart_bounding_box_update(eo_obj, obj);
+ evas_object_smart_bounding_box_get(eo_obj, &bounding_box, NULL);
+ cx = bounding_box.x;
+ cy = bounding_box.y;
+ cw = bounding_box.w;
+ ch = bounding_box.h;
+ }
+ else
+ {
+ cx = obj->cur->geometry.x;
+ cy = obj->cur->geometry.y;
+ cw = obj->cur->geometry.w;
+ ch = obj->cur->geometry.h;
+ }
}
if (obj->cur->color.a == 0 && obj->cur->render_op == EVAS_RENDER_BLEND)