From d76d5db5cbfe98eebb2f59d8227bb429d1b867f7 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Tue, 9 Jul 2019 08:49:12 -0400 Subject: [PATCH] Introduce efl_ui_scroll_util files. Summary: this brings API that connects the theme to the object. This reduces the amount of code that you need to write in order to develop a widget that can be scrollable. For now efl_ui_grid and efl_ui_scroller are replaced with it. efl_ui_list / efl_ui_list_view are not handeled with this, as they will be replaced with newer widgets. Right now this is only avaiable in the C API. However, wrapping this into a mixin should be easy. Reviewers: zmike, segfaultxavi Reviewed By: zmike Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D9245 --- src/lib/elementary/efl_ui_grid.c | 220 +-------------- src/lib/elementary/efl_ui_scroll_util.c | 329 ++++++++++++++++++++++ src/lib/elementary/efl_ui_scroller.c | 351 +----------------------- src/lib/elementary/elm_priv.h | 14 + src/lib/elementary/meson.build | 1 + 5 files changed, 350 insertions(+), 565 deletions(-) create mode 100644 src/lib/elementary/efl_ui_scroll_util.c diff --git a/src/lib/elementary/efl_ui_grid.c b/src/lib/elementary/efl_ui_grid.c index 5e1f50638d..d27899d907 100644 --- a/src/lib/elementary/efl_ui_grid.c +++ b/src/lib/elementary/efl_ui_grid.c @@ -263,138 +263,6 @@ _item_scroll_internal(Eo *obj, efl_ui_scrollable_scroll(pd->smanager, ipos, anim); } -static void -_efl_ui_grid_bar_read_and_update(Eo *obj) -{ - EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - double vx = 0.0, vy = 0.0; - - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.vbar", NULL, &vy); - - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.hbar", &vx, NULL); - - efl_ui_scrollbar_bar_position_set(pd->smanager, vx, vy); -} - -static void -_efl_ui_grid_reload_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *list = data; - EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd); - - efl_ui_scrollbar_bar_visibility_update(pd->smanager); -} - -static void -_efl_ui_grid_vbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_grid_bar_read_and_update(data); - - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); -} - -static void -_efl_ui_grid_vbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); -} - -static void -_efl_ui_grid_vbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); -} - -static void -_efl_ui_grid_edje_drag_start_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *list = data; - EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd); - - _efl_ui_grid_bar_read_and_update(list); - - pd->freeze_want = efl_ui_scrollable_scroll_freeze_get(pd->smanager); - efl_ui_scrollable_scroll_freeze_set(pd->smanager, EINA_TRUE); - efl_event_callback_call(list, EFL_UI_EVENT_SCROLL_DRAG_START, NULL); -} - -static void -_efl_ui_grid_edje_drag_stop_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *list = data; - EFL_UI_GRID_DATA_GET_OR_RETURN(list, pd); - - _efl_ui_grid_bar_read_and_update(list); - - efl_ui_scrollable_scroll_freeze_set(pd->smanager, pd->freeze_want); - efl_event_callback_call(list, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL); -} - -static void -_efl_ui_grid_edje_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_grid_bar_read_and_update(data); -} - -static void -_efl_ui_grid_hbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_grid_bar_read_and_update(data); - - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); -} - -static void -_efl_ui_grid_hbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); -} - -static void -_efl_ui_grid_hbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); -} - static void _efl_ui_grid_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) { @@ -452,90 +320,6 @@ _efl_ui_grid_bar_hide_cb(void *data, const Efl_Event *event) edje_object_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl"); } -static void -_scroll_edje_object_attach(Eo *obj) -{ - EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd); - - efl_layout_signal_callback_add(obj, "reload", "efl", - obj, _efl_ui_grid_reload_cb, NULL); - efl_layout_signal_callback_add(obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_grid_vbar_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "efl,vbar,press", "efl", - obj, _efl_ui_grid_vbar_press_cb, NULL); - efl_layout_signal_callback_add(obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_grid_vbar_unpress_cb, NULL); - - efl_layout_signal_callback_add(obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_grid_hbar_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_add(obj, "efl,hbar,press", "efl", - obj, _efl_ui_grid_hbar_press_cb, NULL); - efl_layout_signal_callback_add(obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_grid_hbar_unpress_cb, NULL); -} - -static void -_scroll_edje_object_detach(Eo *obj) -{ - EFL_UI_GRID_DATA_GET_OR_RETURN(obj, pd); - - efl_layout_signal_callback_del(obj, "reload", "efl", - obj, _efl_ui_grid_reload_cb, NULL); - efl_layout_signal_callback_del(obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_grid_vbar_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "efl,vbar,press", "efl", - obj, _efl_ui_grid_vbar_press_cb, NULL); - efl_layout_signal_callback_del(obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_grid_vbar_unpress_cb, NULL); - - efl_layout_signal_callback_del(obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_grid_hbar_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_grid_edje_drag_cb, NULL); - efl_layout_signal_callback_del(obj, "efl,hbar,press", "efl", - obj, _efl_ui_grid_hbar_press_cb, NULL); - efl_layout_signal_callback_del(obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_grid_hbar_unpress_cb, NULL); -} - static void _efl_ui_grid_content_moved_cb(void *data, const Efl_Event *ev EINA_UNUSED) { @@ -608,7 +392,7 @@ _efl_ui_grid_efl_object_finalize(Eo *obj, pd->item.size.h = 1; } - _scroll_edje_object_attach(obj); + efl_ui_scroll_connector_bind(obj, pd->smanager); //FIXME: Workaround code! fake Content for pan resize. // to remove this code, we need to customize pan class. @@ -642,7 +426,7 @@ _efl_ui_grid_efl_object_finalize(Eo *obj, EOLIAN static void _efl_ui_grid_efl_object_invalidate(Eo *obj, Efl_Ui_Grid_Data *pd) { - _scroll_edje_object_detach(obj); + efl_ui_scroll_connector_unbind(obj); efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, _efl_ui_grid_bar_size_changed_cb, obj); diff --git a/src/lib/elementary/efl_ui_scroll_util.c b/src/lib/elementary/efl_ui_scroll_util.c new file mode 100644 index 0000000000..45ba2d3f6e --- /dev/null +++ b/src/lib/elementary/efl_ui_scroll_util.c @@ -0,0 +1,329 @@ +#ifdef HAVE_CONFIG_H +#include "elementary_config.h" +#endif +#define EFL_UI_SCROLL_MANAGER_PROTECTED +#define EFL_UI_SCROLLBAR_PROTECTED + +#include +#include +#include "elm_priv.h" + +typedef struct { + Eo *obj; + Eo *smanager; + int freeze_want; +} Scroll_Connector_Context; + +static void +_scroll_connector_bar_read_and_update(Scroll_Connector_Context *ctx) +{ + ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd); + double vx = 0.0, vy = 0.0; + + edje_object_part_drag_value_get + (wd->resize_obj, "efl.dragable.vbar", NULL, &vy); + + edje_object_part_drag_value_get + (wd->resize_obj, "efl.dragable.hbar", &vx, NULL); + + efl_ui_scrollbar_bar_position_set(ctx->smanager, vx, vy); +} + +static void +_scroll_connector_reload_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + + efl_ui_scrollbar_bar_visibility_update(ctx->smanager); +} + + +static void +_scroll_connector_edje_drag_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + + _scroll_connector_bar_read_and_update(ctx); +} + +static void +_scroll_connector_edje_drag_start_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + + _scroll_connector_bar_read_and_update(ctx); + + ctx->freeze_want = efl_ui_scrollable_scroll_freeze_get(ctx->smanager); + efl_ui_scrollable_scroll_freeze_set(ctx->smanager, EINA_TRUE); + efl_event_callback_call(ctx->obj, EFL_UI_EVENT_SCROLL_DRAG_START, NULL); +} + +static void +_scroll_connector_edje_drag_stop_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + + _scroll_connector_bar_read_and_update(ctx); + EINA_SAFETY_ON_TRUE_RETURN(ctx->freeze_want == -1); + efl_ui_scrollable_scroll_freeze_set(ctx->smanager, ctx->freeze_want); + ctx->freeze_want = -1; + efl_event_callback_call(ctx->obj, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL); +} + +static void +_scroll_connector_vbar_drag_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type; + + _scroll_connector_bar_read_and_update(ctx); + + type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); +} + +static void +_scroll_connector_vbar_press_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; + + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); +} + +static void +_scroll_connector_vbar_unpress_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; + + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); +} + +static void +_scroll_connector_hbar_drag_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; + + _scroll_connector_bar_read_and_update(ctx); + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); +} + +static void +_scroll_connector_hbar_press_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; + + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); +} + +static void +_scroll_connector_hbar_unpress_cb(void *data, + Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; + + efl_event_callback_call(ctx->obj, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); +} + +static void +_scroll_connector_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd); + + double width = 0.0, height = 0.0; + + edje_object_calc_force(wd->resize_obj); + efl_ui_scrollbar_bar_size_get(ctx->smanager, &width, &height); + edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.hbar", width, 1.0); + edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.vbar", 1.0, height); +} + +static void +_scroll_connector_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd); + + double posx = 0.0, posy = 0.0; + + efl_ui_scrollbar_bar_position_get(ctx->smanager, &posx, &posy); + edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.hbar", posx, 0.0); + edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, posy); +} + +static void +_scroll_connector_bar_show_cb(void *data, const Efl_Event *event) +{ + Scroll_Connector_Context *ctx = data; + ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd); + Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); + + if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) + efl_layout_signal_emit(wd->resize_obj, "efl,action,show,hbar", "efl"); + else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) + efl_layout_signal_emit(wd->resize_obj, "efl,action,show,vbar", "efl"); +} + +static void +_scroll_connector_bar_hide_cb(void *data, const Efl_Event *event) +{ + Scroll_Connector_Context *ctx = data; + ELM_WIDGET_DATA_GET_OR_RETURN(ctx->obj, wd); + Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); + + if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) + efl_layout_signal_emit(wd->resize_obj, "efl,action,hide,hbar", "efl"); + else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) + efl_layout_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl"); +} +static void +_scroll_connector_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + elm_layout_sizing_eval(ctx->obj); +} + +static void +_scroll_connector_size_hint_changed_cb(void *data, const Efl_Event *ev EINA_UNUSED) +{ + Scroll_Connector_Context *ctx = data; + elm_layout_sizing_eval(ctx->obj); +} + +void +efl_ui_scroll_connector_bind(Eo *obj, Eo *manager) +{ + Scroll_Connector_Context *ctx = calloc(1, sizeof(Scroll_Connector_Context)); + ctx->obj = obj; + ctx->smanager = manager; + efl_key_data_set(obj, "__context", ctx); + + //from the theme to the object + efl_layout_signal_callback_add(obj, "reload", "efl", + ctx, _scroll_connector_reload_cb, NULL); + efl_layout_signal_callback_add(obj, "drag", "efl.dragable.vbar", + ctx, _scroll_connector_vbar_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_start_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_stop_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "efl,vbar,press", "efl", + ctx, _scroll_connector_vbar_press_cb, NULL); + efl_layout_signal_callback_add(obj, "efl,vbar,unpress", "efl", + ctx, _scroll_connector_vbar_unpress_cb, NULL); + efl_layout_signal_callback_add(obj, "drag", "efl.dragable.hbar", + ctx, _scroll_connector_hbar_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,set", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,start", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_start_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,stop", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_stop_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,step", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "drag,page", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_add(obj, "efl,hbar,press", "efl", + ctx, _scroll_connector_hbar_press_cb, NULL); + efl_layout_signal_callback_add(obj, "efl,hbar,unpress", "efl", + ctx, _scroll_connector_hbar_unpress_cb, NULL); + //from the object to the theme + efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, + _scroll_connector_bar_size_changed_cb, ctx); + efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, + _scroll_connector_bar_pos_changed_cb, ctx); + efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, + _scroll_connector_bar_show_cb, ctx); + efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, + _scroll_connector_bar_hide_cb, ctx); + efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, + _scroll_connector_resized_cb, ctx); + efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED, + _scroll_connector_size_hint_changed_cb, ctx); +} + +void +efl_ui_scroll_connector_unbind(Eo *obj) +{ + Scroll_Connector_Context *ctx; + + ctx = efl_key_data_get(obj, "__context"); + EINA_SAFETY_ON_NULL_RETURN(ctx); + + efl_layout_signal_callback_del(obj, "reload", "efl", + ctx, _scroll_connector_reload_cb, NULL); + efl_layout_signal_callback_del(obj, "drag", "efl.dragable.vbar", + ctx, _scroll_connector_vbar_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_start_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_stop_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.vbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "efl,vbar,press", "efl", + ctx, _scroll_connector_vbar_press_cb, NULL); + efl_layout_signal_callback_del(obj, "efl,vbar,unpress", "efl", + ctx, _scroll_connector_vbar_unpress_cb, NULL); + + efl_layout_signal_callback_del(obj, "drag", "efl.dragable.hbar", + ctx, _scroll_connector_hbar_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,set", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,start", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_start_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,stop", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_stop_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,step", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "drag,page", "efl.dragable.hbar", + ctx, _scroll_connector_edje_drag_cb, NULL); + efl_layout_signal_callback_del(obj, "efl,hbar,press", "efl", + ctx, _scroll_connector_hbar_press_cb, NULL); + efl_layout_signal_callback_del(obj, "efl,hbar,unpress", "efl", + ctx, _scroll_connector_hbar_unpress_cb, NULL); + free(ctx); +} diff --git a/src/lib/elementary/efl_ui_scroller.c b/src/lib/elementary/efl_ui_scroller.c index 50113c12b1..c731fe6572 100644 --- a/src/lib/elementary/efl_ui_scroller.c +++ b/src/lib/elementary/efl_ui_scroller.c @@ -211,329 +211,12 @@ _efl_ui_scroller_efl_content_content_unset(Eo *obj EINA_UNUSED, Efl_Ui_Scroller_ return old_content; } -static void -_efl_ui_scroller_bar_read_and_update(Eo *obj) -{ - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - double vx, vy; - - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.vbar", NULL, &vy); - edje_object_part_drag_value_get - (wd->resize_obj, "efl.dragable.hbar", &vx, NULL); - - efl_ui_scrollbar_bar_position_set(sd->smanager, vx, vy); -} - -static void -_efl_ui_scroller_reload_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *scroller = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); - - efl_ui_scrollbar_bar_visibility_update(sd->smanager); -} - -static void -_efl_ui_scroller_vbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_scroller_bar_read_and_update(data); - - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); -} - -static void -_efl_ui_scroller_vbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); -} - -static void -_efl_ui_scroller_vbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_VERTICAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); -} - -static void -_efl_ui_scroller_edje_drag_start_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *scroller = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); - - _efl_ui_scroller_bar_read_and_update(scroller); - - sd->freeze_want = efl_ui_scrollable_scroll_freeze_get(sd->smanager); - efl_ui_scrollable_scroll_freeze_set(sd->smanager, EINA_TRUE); - efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_START, NULL); -} - -static void -_efl_ui_scroller_edje_drag_stop_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Eo *scroller = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(scroller, sd); - - _efl_ui_scroller_bar_read_and_update(scroller); - - efl_ui_scrollable_scroll_freeze_set(sd->smanager, sd->freeze_want); - efl_event_callback_call(scroller, EFL_UI_EVENT_SCROLL_DRAG_STOP, NULL); -} - -static void -_efl_ui_scroller_edje_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_scroller_bar_read_and_update(data); -} - -static void -_efl_ui_scroller_hbar_drag_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - _efl_ui_scroller_bar_read_and_update(data); - - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_DRAG, &type); -} - -static void -_efl_ui_scroller_hbar_press_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_PRESS, &type); -} - -static void -_efl_ui_scroller_hbar_unpress_cb(void *data, - Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, - const char *source EINA_UNUSED) -{ - Efl_Ui_Scrollbar_Direction type = EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL; - efl_event_callback_call(data, EFL_UI_SCROLLBAR_EVENT_BAR_UNPRESS, &type); -} - -static void -_efl_ui_scroller_bar_size_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) -{ - Eo *obj = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - double width = 0.0, height = 0.0; - - edje_object_calc_force(wd->resize_obj); - efl_ui_scrollbar_bar_size_get(sd->smanager, &width, &height); - edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.hbar", width, 1.0); - edje_object_part_drag_size_set(wd->resize_obj, "efl.dragable.vbar", 1.0, height); -} - -static void -_efl_ui_scroller_bar_pos_changed_cb(void *data, const Efl_Event *event EINA_UNUSED) -{ - Eo *obj = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - - double posx = 0.0, posy = 0.0; - - efl_ui_scrollbar_bar_position_get(sd->smanager, &posx, &posy); - edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.hbar", posx, 0.0); - edje_object_part_drag_value_set(wd->resize_obj, "efl.dragable.vbar", 0.0, posy); - edje_object_signal_emit(wd->resize_obj, "efl,action,scroll", "efl"); -} - -static void -_efl_ui_scroller_bar_show_cb(void *data, const Efl_Event *event) -{ - Eo *obj = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); - - if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,show,hbar", "efl"); - else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,show,vbar", "efl"); -} - -static void -_efl_ui_scroller_bar_hide_cb(void *data, const Efl_Event *event) -{ - Eo *obj = data; - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd); - Efl_Ui_Scrollbar_Direction type = *(Efl_Ui_Scrollbar_Direction *)(event->info); - - if (type == EFL_UI_SCROLLBAR_DIRECTION_HORIZONTAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,hide,hbar", "efl"); - else if (type == EFL_UI_SCROLLBAR_DIRECTION_VERTICAL) - edje_object_signal_emit(wd->resize_obj, "efl,action,hide,vbar", "efl"); -} - -static void -_scroll_edje_object_attach(Eo *obj) -{ - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - - efl_layout_signal_callback_add - (obj, "reload", "efl", - obj, _efl_ui_scroller_reload_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_scroller_vbar_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,vbar,press", "efl", - obj, _efl_ui_scroller_vbar_press_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_scroller_vbar_unpress_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_scroller_hbar_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_start_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,hbar,press", "efl", - obj, _efl_ui_scroller_hbar_press_cb, NULL); - efl_layout_signal_callback_add - (obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_scroller_hbar_unpress_cb, NULL); -} - -static void -_scroll_edje_object_detach(Evas_Object *obj) -{ - EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, sd); - - efl_layout_signal_callback_del - (obj, "reload", "efl", - obj, _efl_ui_scroller_reload_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag", "efl.dragable.vbar", - obj, _efl_ui_scroller_vbar_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,set", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,start", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,stop", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,step", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,page", "efl.dragable.vbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,vbar,press", "efl", - obj, _efl_ui_scroller_vbar_press_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,vbar,unpress", "efl", - obj, _efl_ui_scroller_vbar_unpress_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag", "efl.dragable.hbar", - obj, _efl_ui_scroller_hbar_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,set", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,start", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_start_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,stop", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_stop_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,step", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "drag,page", "efl.dragable.hbar", - obj, _efl_ui_scroller_edje_drag_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,hbar,press", "efl", - obj, _efl_ui_scroller_hbar_press_cb, NULL); - efl_layout_signal_callback_del - (obj, "efl,hbar,unpress", "efl", - obj, _efl_ui_scroller_hbar_unpress_cb, NULL); -} - static void _efl_ui_scroller_pan_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED) { elm_layout_sizing_eval(data); } -static void -_efl_ui_scroller_resized_cb(void *data, const Efl_Event *ev EINA_UNUSED) -{ - elm_layout_sizing_eval(data); -} - -static void -_efl_ui_scroller_size_hint_changed_cb(void *data, const Efl_Event *ev EINA_UNUSED) -{ - elm_layout_sizing_eval(data); -} - static void _focused_element(void *data, const Efl_Event *event) { @@ -566,7 +249,7 @@ _efl_ui_scroller_efl_object_constructor(Eo *obj, EOLIAN static Eo * _efl_ui_scroller_efl_object_finalize(Eo *obj, - Efl_Ui_Scroller_Data *sd EINA_UNUSED) + Efl_Ui_Scroller_Data *sd) { obj = efl_finalize(efl_super(obj, MY_CLASS)); @@ -583,20 +266,7 @@ _efl_ui_scroller_efl_object_finalize(Eo *obj, elm_widget_can_focus_set(obj, EINA_TRUE); - _scroll_edje_object_attach(obj); - - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, - _efl_ui_scroller_bar_size_changed_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, - _efl_ui_scroller_bar_pos_changed_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, - _efl_ui_scroller_bar_show_cb, obj); - efl_event_callback_add(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, - _efl_ui_scroller_bar_hide_cb, obj); - efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, - _efl_ui_scroller_resized_cb, obj); - efl_event_callback_add(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED, - _efl_ui_scroller_size_hint_changed_cb, obj); + efl_ui_scroll_connector_bind(obj, sd->smanager); efl_event_callback_add(sd->pan_obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _efl_ui_scroller_pan_resized_cb, obj); @@ -606,22 +276,9 @@ _efl_ui_scroller_efl_object_finalize(Eo *obj, EOLIAN static void _efl_ui_scroller_efl_object_destructor(Eo *obj, - Efl_Ui_Scroller_Data *sd EINA_UNUSED) + Efl_Ui_Scroller_Data *sd) { - _scroll_edje_object_detach(obj); - - efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SIZE_CHANGED, - _efl_ui_scroller_bar_size_changed_cb, obj); - efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_POS_CHANGED, - _efl_ui_scroller_bar_pos_changed_cb, obj); - efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_SHOW, - _efl_ui_scroller_bar_show_cb, obj); - efl_event_callback_del(obj, EFL_UI_SCROLLBAR_EVENT_BAR_HIDE, - _efl_ui_scroller_bar_hide_cb, obj); - efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, - _efl_ui_scroller_resized_cb, obj); - efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_HINTS_CHANGED, - _efl_ui_scroller_size_hint_changed_cb, obj); + efl_ui_scroll_connector_unbind(obj); efl_event_callback_del(sd->pan_obj, EFL_GFX_ENTITY_EVENT_SIZE_CHANGED, _efl_ui_scroller_pan_resized_cb, obj); efl_del(sd->pan_obj); diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index 6af1ae3744..e621edf3c0 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -1025,5 +1025,19 @@ void _efl_ui_focus_event_redirector(Efl_Ui_Focus_Object *obj, Efl_Ui_Focus_Objec void efl_ui_widget_internal_set(Eo *obj, Eina_Bool internal); Eina_Bool efl_ui_widget_internal_get(Eo *obj); +/** + * Connect the default scrollable theme signals with the object events and vice versa + * + * @param obj The object where to listen for theme signals + * @param manager The scroll manager object where to listen for events + */ +void efl_ui_scroll_connector_bind(Eo *obj, Eo *manager); + +/** + * Connect the default scrollable theme signals with the object events and vice versa + * + * @param obj The object where we are listening for events + */ +void efl_ui_scroll_connector_unbind(Eo *obj); #endif diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build index 59d355cc71..92e780d728 100644 --- a/src/lib/elementary/meson.build +++ b/src/lib/elementary/meson.build @@ -937,6 +937,7 @@ elementary_src = [ 'efl_ui_clickable.c', 'efl_ui_clickable_util.c', 'efl_ui_format.c', + 'efl_ui_scroll_util.c', ] elementary_deps = [emile, eo, efl, edje, ethumb, ethumb_client, emotion, ecore_imf, ecore_con, eldbus, efreet, efreet_mime, efreet_trash, eio, atspi, dl, intl]