summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@samsung.com>2019-08-30 14:47:46 -0400
committerMike Blumenkrantz <zmike@samsung.com>2019-08-30 14:47:46 -0400
commit23220764e27ed84698914cc7739b363bf2ed1c69 (patch)
treea19a04b48bc369fa56f36d67db27a7d6ed822215
parent228bed4c8c8ab00773151dc67ea80fe261997d3b (diff)
downloadefl-23220764e27ed84698914cc7739b363bf2ed1c69.tar.gz
efl_ui/pan: remove pan content,changed event
Summary: this was being emitted as a catch-all for pan changes, where something else should have been monitored/used instead ref T7708 Reviewers: bu5hm4n Reviewed By: bu5hm4n Subscribers: bu5hm4n, cedric, #reviewers, #committers Tags: #efl_widgets Maniphest Tasks: T7708 Differential Revision: https://phab.enlightenment.org/D9787
-rw-r--r--src/lib/elementary/efl_ui_image_zoomable.c12
-rw-r--r--src/lib/elementary/efl_ui_list_view.c2
-rw-r--r--src/lib/elementary/efl_ui_pan.c13
-rw-r--r--src/lib/elementary/efl_ui_pan.eo1
-rw-r--r--src/lib/elementary/efl_ui_scroll_manager.c65
-rw-r--r--src/lib/elementary/efl_ui_widget_scroll_manager.h1
6 files changed, 56 insertions, 38 deletions
diff --git a/src/lib/elementary/efl_ui_image_zoomable.c b/src/lib/elementary/efl_ui_image_zoomable.c
index ee9ad073da..9ab2238b5d 100644
--- a/src/lib/elementary/efl_ui_image_zoomable.c
+++ b/src/lib/elementary/efl_ui_image_zoomable.c
@@ -143,7 +143,7 @@ _calc_job_cb(void *data)
sd->minw = minw;
sd->minh = minh;
- efl_event_callback_call(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
+ efl_event_callback_call(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_POSITION_CHANGED, NULL);
_sizing_eval(obj);
}
sd->calc_job = NULL;
@@ -1823,17 +1823,17 @@ _efl_ui_image_zoomable_efl_canvas_group_group_add(Eo *obj, Efl_Ui_Image_Zoomable
priv->pan_obj = efl_add(MY_PAN_CLASS, obj);
+ pan_data = efl_data_scope_get(priv->pan_obj, MY_PAN_CLASS);
+ efl_data_ref(obj, MY_CLASS);
+ pan_data->wobj = obj;
+ pan_data->wsd = priv;
+
efl_ui_scroll_manager_pan_set(priv->smanager, priv->pan_obj);
if (elm_widget_is_legacy(obj))
edje_object_part_swallow(edje, "elm.swallow.content", priv->pan_obj);
else
edje_object_part_swallow(edje, "efl.content", priv->pan_obj);
- pan_data = efl_data_scope_get(priv->pan_obj, MY_PAN_CLASS);
- efl_data_ref(obj, MY_CLASS);
- pan_data->wobj = obj;
- pan_data->wsd = priv;
-
efl_event_callback_add(obj, EFL_UI_EVENT_SCROLL, _scroll_cb, obj);
priv->g_layer_start = 1.0;
diff --git a/src/lib/elementary/efl_ui_list_view.c b/src/lib/elementary/efl_ui_list_view.c
index 25ef87fc94..d992a3fafd 100644
--- a/src/lib/elementary/efl_ui_list_view.c
+++ b/src/lib/elementary/efl_ui_list_view.c
@@ -863,7 +863,7 @@ _efl_ui_list_view_efl_ui_list_view_model_min_size_set(Eo *obj, Efl_Ui_List_View_
pd->min.h = min.h;
efl_gfx_hint_size_min_set(wd->resize_obj, EINA_SIZE2D(pd->min.w, pd->min.h));
- efl_event_callback_call(pd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
+ efl_event_callback_call(pd->pan_obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, NULL);
}
EOLIAN static void
diff --git a/src/lib/elementary/efl_ui_pan.c b/src/lib/elementary/efl_ui_pan.c
index 753793606d..9fb68eed2c 100644
--- a/src/lib/elementary/efl_ui_pan.c
+++ b/src/lib/elementary/efl_ui_pan.c
@@ -122,12 +122,7 @@ _efl_ui_pan_content_del_cb(void *data,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
- Evas_Object *pobj = data;
- EFL_UI_PAN_DATA_GET_OR_RETURN(pobj, psd);
-
- psd->content = NULL;
- psd->content_w = psd->content_h = psd->px = psd->py = 0;
- efl_event_callback_call(pobj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
+ efl_content_unset(data);
}
static void
@@ -146,7 +141,6 @@ _efl_ui_pan_content_resize_cb(void *data,
psd->content_h = sz.h;
evas_object_smart_changed(pobj);
}
- efl_event_callback_call(pobj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
efl_event_callback_call(pobj, EFL_UI_PAN_EVENT_PAN_POSITION_CHANGED, NULL);
}
@@ -160,7 +154,7 @@ _efl_ui_pan_efl_content_content_set(Evas_Object *obj, Efl_Ui_Pan_Data *psd, Evas
{
efl_content_unset(obj);
}
- if (!content) goto end;
+ if (!content) return EINA_TRUE;
psd->content = content;
efl_canvas_group_member_add(obj, content);
@@ -179,9 +173,7 @@ _efl_ui_pan_efl_content_content_set(Evas_Object *obj, Efl_Ui_Pan_Data *psd, Evas
evas_object_smart_changed(obj);
-end:
efl_event_callback_call(obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, content);
- efl_event_callback_call(obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
return EINA_TRUE;
}
@@ -205,7 +197,6 @@ _efl_ui_pan_efl_content_content_unset(Eo *obj EINA_UNUSED, Efl_Ui_Pan_Data *pd)
pd->content = NULL;
pd->content_w = pd->content_h = pd->px = pd->py = 0;
efl_event_callback_call(obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, NULL);
- efl_event_callback_call(obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, NULL);
return old_content;
}
diff --git a/src/lib/elementary/efl_ui_pan.eo b/src/lib/elementary/efl_ui_pan.eo
index 894fd719ad..db06b48e71 100644
--- a/src/lib/elementary/efl_ui_pan.eo
+++ b/src/lib/elementary/efl_ui_pan.eo
@@ -64,7 +64,6 @@ class @beta Efl.Ui.Pan extends Efl.Canvas.Group implements Efl.Content
Efl.Canvas.Group.group_calculate;
}
events {
- pan,content,changed: void; [[The content has changed.]]
pan,viewport,changed: void; [[This widget's position or size has changed.]]
pan,position,changed: void; [[The content's position has changed.]]
}
diff --git a/src/lib/elementary/efl_ui_scroll_manager.c b/src/lib/elementary/efl_ui_scroll_manager.c
index 393f5eef45..b8d3cdeaf6 100644
--- a/src/lib/elementary/efl_ui_scroll_manager.c
+++ b/src/lib/elementary/efl_ui_scroll_manager.c
@@ -1964,25 +1964,46 @@ _scroll_event_object_attach(Evas_Object *obj)
}
static void
-_efl_ui_scroll_manager_pan_content_changed_cb(void *data, const Efl_Event *event EINA_UNUSED)
+_efl_ui_scroll_manager_content_resized(Efl_Ui_Scroll_Manager_Data *sd, Eina_Size2D content)
+{
+ sd->content_info.w = content.w;
+ sd->content_info.h = content.h;
+
+ sd->content_info.resized = EINA_TRUE;
+ efl_event_callback_call(sd->parent, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, NULL);
+ efl_event_callback_call(sd->parent, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, NULL);
+ efl_ui_scrollbar_bar_visibility_update(sd->obj);
+ _efl_ui_scroll_manager_wanted_region_set(sd->obj);
+}
+
+static void
+_efl_ui_scroll_manager_pan_content_resized_cb(void *data, const Efl_Event *event)
{
Efl_Ui_Scroll_Manager_Data *sd = data;
- Eina_Size2D content = {0, 0};
+ Eina_Size2D *content = event->info;
- if (!sd->pan_obj) return;
+ _efl_ui_scroll_manager_content_resized(sd, *content);
+}
- content = efl_ui_pan_content_size_get(sd->pan_obj);
- if ((content.w != sd->content_info.w) || (content.h != sd->content_info.h))
- {
- sd->content_info.w = content.w;
- sd->content_info.h = content.h;
+static void
+_efl_ui_scroll_manager_pan_content_changed(Efl_Ui_Scroll_Manager_Data *sd, Eo *content)
+{
+ Eina_Size2D sz = {0, 0};
- sd->content_info.resized = EINA_TRUE;
- efl_event_callback_call(sd->parent, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, NULL);
- efl_event_callback_call(sd->parent, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, NULL);
- efl_ui_scrollbar_bar_visibility_update(sd->obj);
- _efl_ui_scroll_manager_wanted_region_set(sd->obj);
- }
+ /* protect against widgets that synthesize these events to trigger this codepath */
+ if (content && (content != sd->pan_content))
+ efl_event_callback_add(sd->pan_content, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _efl_ui_scroll_manager_pan_content_resized_cb, sd);
+ else if (sd->pan_content)
+ efl_event_callback_del(sd->pan_content, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _efl_ui_scroll_manager_pan_content_resized_cb, sd);
+ sd->pan_content = content;
+ sz = efl_ui_pan_content_size_get(sd->pan_obj);
+ _efl_ui_scroll_manager_content_resized(sd, sz);
+}
+
+static void
+_efl_ui_scroll_manager_pan_content_changed_cb(void *data, const Efl_Event *event)
+{
+ _efl_ui_scroll_manager_pan_content_changed(data, event->info);
}
static void
@@ -2248,23 +2269,25 @@ _efl_ui_scroll_manager_efl_ui_scrollbar_bar_size_get(const Eo *obj EINA_UNUSED,
EOLIAN static void
_efl_ui_scroll_manager_pan_set(Eo *obj, Efl_Ui_Scroll_Manager_Data *sd, Eo *pan)
{
+ if (sd->pan_obj == pan) return;
+
if (sd->pan_obj)
{
efl_event_callback_del
- (sd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
+ (sd->pan_obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
efl_event_callback_del
(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_VIEWPORT_CHANGED, _efl_ui_scroll_manager_pan_viewport_changed_cb, sd);
efl_event_callback_del
(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_POSITION_CHANGED, _efl_ui_scroll_manager_pan_position_changed_cb, sd);
+ _efl_ui_scroll_manager_pan_content_changed(sd, NULL);
}
+ sd->pan_obj = pan;
if (!pan)
return;
- sd->pan_obj = pan;
-
efl_event_callback_add
- (sd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
+ (sd->pan_obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
efl_event_callback_add
(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_VIEWPORT_CHANGED, _efl_ui_scroll_manager_pan_viewport_changed_cb, sd);
efl_event_callback_add
@@ -2273,6 +2296,7 @@ _efl_ui_scroll_manager_pan_set(Eo *obj, Efl_Ui_Scroll_Manager_Data *sd, Eo *pan)
_efl_ui_scroll_manager_pan_resized_cb, obj);
evas_object_event_callback_add(sd->pan_obj, EVAS_CALLBACK_MOVE,
_efl_ui_scroll_manager_pan_moved_cb, obj);
+ _efl_ui_scroll_manager_pan_content_changed(sd, efl_content_get(pan));
}
EOLIAN static Eina_Bool
@@ -2457,11 +2481,14 @@ _efl_ui_scroll_manager_efl_object_destructor(Eo *obj, Efl_Ui_Scroll_Manager_Data
evas_object_event_callback_del_full(sd->pan_obj, EVAS_CALLBACK_MOVE,
_efl_ui_scroll_manager_pan_moved_cb, obj);
efl_event_callback_del
- (sd->pan_obj, EFL_UI_PAN_EVENT_PAN_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
+ (sd->pan_obj, EFL_CONTENT_EVENT_CONTENT_CHANGED, _efl_ui_scroll_manager_pan_content_changed_cb, sd);
efl_event_callback_del
(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_VIEWPORT_CHANGED, _efl_ui_scroll_manager_pan_viewport_changed_cb, sd);
efl_event_callback_del
(sd->pan_obj, EFL_UI_PAN_EVENT_PAN_POSITION_CHANGED, _efl_ui_scroll_manager_pan_position_changed_cb, sd);
+ if (sd->pan_content)
+ efl_event_callback_del(sd->pan_content, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _efl_ui_scroll_manager_pan_content_resized_cb, sd);
+ sd->pan_content = NULL;
}
efl_destructor(efl_super(obj, MY_CLASS));
}
diff --git a/src/lib/elementary/efl_ui_widget_scroll_manager.h b/src/lib/elementary/efl_ui_widget_scroll_manager.h
index d6c478eb6e..4001255c6f 100644
--- a/src/lib/elementary/efl_ui_widget_scroll_manager.h
+++ b/src/lib/elementary/efl_ui_widget_scroll_manager.h
@@ -18,6 +18,7 @@ typedef struct _Efl_Ui_Scroll_Manager_Data
Evas_Object *obj;
Evas_Object *pan_obj;
+ Evas_Object *pan_content;
Evas_Object *event_rect;
Evas_Object *parent;