From: Doyoun Kang Date: Mon, 3 Feb 2025 07:00:46 +0000 (+0900) Subject: e_magnifier: change code to use e_view system X-Git-Tag: accepted/tizen/unified/20250206.153713~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F78%2F319178%2F1;p=platform%2Fupstream%2Fenlightenment.git e_magnifier: change code to use e_view system I changed code to use e_view system instead of evas_object directly. However, since there is no way to group multiple e_view_images within one e_view_image in current e_view system, we have applied zoom to each e_view_images. We will need to find another way to appliy zoom functionality. Change-Id: Ic1e5db4f1fcbbe7f377f9a02191cf6eb8d7d70b4 --- diff --git a/src/bin/windowmgr/e_magnifier.c b/src/bin/windowmgr/e_magnifier.c index c4ee0d832a..e3340ce36d 100644 --- a/src/bin/windowmgr/e_magnifier.c +++ b/src/bin/windowmgr/e_magnifier.c @@ -2,6 +2,8 @@ #include "e_client_intern.h" #include "e_view_intern.h" #include "e_view_client_intern.h" +#include "e_view_rect.h" +#include "e_utils.h" #define E_MAGNIFIER_SMART_DATA_GET(obj, ptr) \ E_Magnifier_Smart_Data *ptr = evas_object_smart_data_get(obj); @@ -48,14 +50,17 @@ struct _E_Magnifier_Listener struct wl_listener resize_listener; }; -EVAS_SMART_SUBCLASS_NEW(E_MAGNIFIER_SMART_OBJ_TYPE, _e_magnifier, - Evas_Smart_Class, Evas_Smart_Class, - evas_object_smart_clipped_class_get, NULL); +static Eina_Bool _e_magnifier_smart_client_cb_add(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_remove(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_stack(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_show(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_hide(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_move(void *data, int type, void *event); +static Eina_Bool _e_magnifier_smart_client_cb_resize(void *data, int type, void *event); +static void _e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec); +static Eina_Bool _e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec); +static void _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec); - -static Eina_Bool _e_magnifier_smart_init(void); -static void _e_magnifier_smart_add(Evas_Object *obj); -static void _e_magnifier_smart_del(Evas_Object *obj); static Eina_Bool _e_magnifier_proxy_ec_new(E_Client *ec); static void _e_magnifier_proxy_ec_del(E_Client *ec); static Eina_Bool _e_magnifier_proxy_ec_all_add(void); @@ -63,39 +68,126 @@ static Eina_Bool _e_magnifier_proxy_ec_all_remove(void); static void _e_magnifier_owner_set(E_Client *ec); static void _e_magnifier_owner_unset(E_Client *ec); -static Evas_Object *_e_magnifier_mgr = NULL; static E_Magnifier_Listener *_e_magnifier_listener = NULL; -static Eina_Bool -_e_magnifier_smart_init(void) +typedef struct _E_Magnifier_Manager { - E_Zone *zone; + E_View_Tree tree; + E_View_Rect *base_rect; + E_View_Rect *clip_rect; + + Eina_List *handlers; + Eina_List *hooks; + Eina_List *cp_hooks; + Eina_List *wl_hooks; + E_Desk *desk; + E_Client *owner; - zone = e_zone_current_get(); - EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE); + int stand_alone_mode; + E_Magnifier_Zoom_Ratio ratio; + struct + { + struct + { + int x, y, w, h; + } user; + struct + { + int x, y, w, h; + } system; + } geom; + Eina_Bool enabled; - _e_magnifier_mgr = evas_object_smart_add(e_comp_evas_get(), _e_magnifier_smart_class_new()); - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; + struct wl_listener show; +} E_Magnifier_Manager; - ELOGF("MAGNIFIER", "INIT Magnifier (%p)", NULL, _e_magnifier_mgr); +static E_Magnifier_Manager *_e_magnifier_mgr = NULL; - sd->ratio = E_MAGNIFIER_ZOOM_RATIO_150; +static E_View_Tree *_e_magnifier_tree_get(E_Magnifier_Manager *emm) +{ + E_View_Tree *tree; + tree = &_e_magnifier_mgr->tree; - sd->geom.system.x = 0; - sd->geom.system.y = 0; - sd->geom.system.w = 360; - sd->geom.system.h = 360; + return tree; +} - evas_object_move(_e_magnifier_mgr, zone->x, zone->y); - evas_object_resize(_e_magnifier_mgr, zone->w, zone->h); +static void +_clip_rect_geometry_set(E_Magnifier_Manager *emm, int x, int y, int w, int h) +{ + e_view_rect_size_set(emm->clip_rect, w, h); + e_view_position_set(e_view_rect_view_get(emm->clip_rect), x, y); +} - return EINA_TRUE; +static E_Magnifier_Manager * +_e_magnifier_manager_create(E_Zone *zone) +{ + E_Magnifier_Manager *emm = NULL; + + emm = E_NEW(E_Magnifier_Manager, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(emm, NULL); + + ELOGF("MAGNIFIER", "===== START Create Magnifier Manager(%p)", NULL, emm); + + emm->ratio = E_MAGNIFIER_ZOOM_RATIO_100; + + emm->geom.system.x = 0; + emm->geom.system.y = 0; + emm->geom.system.w = 360; + emm->geom.system.h = 360; + + E_View_Tree *layer_tree = e_canvas_layer_view_tree_get(e_comp_canvas_get(), E_CANVAS_LAYER_DESK_OBJECT_BELOW); + e_view_tree_init(&emm->tree, NULL, layer_tree); + e_view_show(e_view_tree_view_get(&emm->tree)); + + // for clipping + const int color[4] = {255, 255, 255, 255}; + emm->clip_rect = e_view_rect_create(layer_tree, zone->w, zone->h, color); + e_view_show(e_view_rect_view_get(emm->clip_rect)); + + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_ADD, _e_magnifier_smart_client_cb_add, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_REMOVE, _e_magnifier_smart_client_cb_remove, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_STACK, _e_magnifier_smart_client_cb_stack, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_SHOW, _e_magnifier_smart_client_cb_show, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_HIDE, _e_magnifier_smart_client_cb_hide, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_MOVE, _e_magnifier_smart_client_cb_move, emm); + E_LIST_HANDLER_APPEND(emm->handlers, E_EVENT_CLIENT_RESIZE, _e_magnifier_smart_client_cb_resize, emm); + + // e_client hooks + E_LIST_HOOK_APPEND(emm->hooks, E_CLIENT_HOOK_DEL, _e_magnifier_smart_cb_hook_client_del, emm); + + // e_comp_object hooks + E_COMP_COMP_HOOK_APPEND(emm->cp_hooks, E_COMP_OBJECT_HOOK_EFFECT_END, _e_magnifier_smart_cb_hook_effect_end, emm); + + // e_comp_wl hooks + E_COMP_WL_HOOK_APPEND(emm->wl_hooks, E_COMP_WL_HOOK_CLIENT_REUSE, _e_magnifier_smart_cb_hook_client_reuse, emm); + + + ELOGF("MAGNIFIER", "===== END Create Magnifier Manager(%p)", NULL, emm); + + return emm; +} + +static void +_e_magnifier_manager_destroy(E_Magnifier_Manager *emm) +{ + if (!emm) return; + + E_FREE_LIST(emm->handlers, ecore_event_handler_del); + E_FREE_LIST(emm->hooks, e_client_hook_del); + E_FREE_LIST(emm->cp_hooks, e_comp_object_hook_del); + E_FREE_LIST(emm->wl_hooks, e_comp_wl_hook_del); + + e_view_destroy(e_view_rect_view_get(emm->clip_rect)); + e_view_destroy(e_view_tree_view_get(&emm->tree)); + + E_FREE(emm); } static Eina_Bool _e_magnifier_proxy_ec_new(E_Client *ec) { Eina_Bool ret; + E_View *proxy_view; if (!ec) return EINA_FALSE; if (!e_client_view_get(ec)) return EINA_FALSE; @@ -106,29 +198,35 @@ _e_magnifier_proxy_ec_new(E_Client *ec) return EINA_FALSE; } - ec->magnifier_proxy = evas_object_image_filled_add(e_comp_evas_get()); + ec->magnifier_proxy = e_view_image_create(_e_magnifier_tree_get(_e_magnifier_mgr)); if (!ec->magnifier_proxy) { ELOGF("MAGNIFIER", "CAN NOT make PROXY object..", ec); return EINA_FALSE; } + e_view_image_filled_set(ec->magnifier_proxy, true); + proxy_view = e_view_image_view_get(ec->magnifier_proxy); - ELOGF("MAGNIFIER", "New PROXY object.. proxy:%p", ec, ec->magnifier_proxy); + ELOGF("MAGNIFIER", "New PROXY object.. proxy:(view_image:%p view:%p, evas_object:%p", ec, ec->magnifier_proxy, proxy_view, proxy_view->eo); - ret = evas_object_image_source_set(ec->magnifier_proxy, ec->frame); + E_View_Client *evc = e_client_view_get(ec); + E_View *ev = e_view_client_view_get(evc); + + ret = e_view_image_source_set(ec->magnifier_proxy, ev); if (!ret) { ELOGF("MAGNIFIER", "Fail to set image source to PROXY object..", ec); return EINA_FALSE; } - evas_object_image_source_events_set(ec->magnifier_proxy, EINA_TRUE); - evas_object_image_source_clip_set(ec->magnifier_proxy, EINA_FALSE); + // doesn't support below APIs + // evas_object_image_source_events_set(ec->magnifier_proxy, EINA_TRUE); + // evas_object_image_source_clip_set(ec->magnifier_proxy, EINA_FALSE); - evas_object_move(ec->magnifier_proxy, ec->x, ec->y); - evas_object_resize(ec->magnifier_proxy, ec->w, ec->h); + e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h); - evas_object_show(ec->magnifier_proxy); + e_view_clip_set(proxy_view, e_view_rect_view_get(_e_magnifier_mgr->clip_rect)); + e_view_show(proxy_view); return EINA_TRUE; } @@ -141,7 +239,9 @@ _e_magnifier_proxy_ec_del(E_Client *ec) ELOGF("MAGNIFIER", "Delete PROXY object.. proxy:%p", ec, ec->magnifier_proxy); - evas_object_del(ec->magnifier_proxy); + E_View *view = e_view_image_view_get(ec->magnifier_proxy); + e_view_destroy(view); + ec->magnifier_proxy = NULL; } @@ -149,7 +249,6 @@ static Eina_Bool _e_magnifier_proxy_ec_all_add(void) { E_Client *ec = NULL; - Eina_Bool ret; E_Zone *zone; E_Desk *desk, *desk2; @@ -166,10 +265,7 @@ _e_magnifier_proxy_ec_all_add(void) if (!e_client_view_get(ec)) continue; if (ec->is_magnifier) continue; - ret = _e_magnifier_proxy_ec_new(ec); - if (!ret) continue; - - e_magnifier_smart_member_add(desk, ec->magnifier_proxy); + _e_magnifier_proxy_ec_new(ec); } return EINA_TRUE; @@ -182,7 +278,6 @@ _e_magnifier_proxy_ec_all_remove(void) E_CLIENT_FOREACH(ec) { - e_magnifier_smart_member_del(ec->magnifier_proxy); _e_magnifier_proxy_ec_del(ec); } @@ -190,31 +285,36 @@ _e_magnifier_proxy_ec_all_remove(void) } static void -_e_magnifier_smart_member_reorder(E_Desk *desk) +_e_magnifier_view_member_reorder(E_Desk *desk) { E_Client *ec; - Evas_Object *proxy; - Evas_Object *smart_parent; + E_View_Image *proxy; + E_View_Tree *parent; + E_View *proxy_view; E_CLIENT_FOREACH(ec) { proxy = ec->magnifier_proxy; if (!proxy) continue; - smart_parent = evas_object_smart_parent_get(proxy); - if (smart_parent == _e_magnifier_mgr) + proxy_view = e_view_image_view_get(proxy); + parent = e_view_parent_get(proxy_view); + if (parent == _e_magnifier_tree_get(_e_magnifier_mgr)) { - evas_object_raise(proxy); + e_view_raise_to_top(proxy_view); } } } static void -_e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, int w, int h, int *nx, int *ny, int *nw, int *nh) +_e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, int w, int h, int *nx, int *ny, int *nw, int *nh, int *gapx, int *gapy) { if (!nx || !ny || !nw || !nh) return; + if (gapx) *gapx = 0; + if (gapy) *gapy = 0; + switch (ratio) { case E_MAGNIFIER_ZOOM_RATIO_100: @@ -223,6 +323,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, *ny = y; *nw = w; *nh = h; + if (gapx) *gapx = 0; + if (gapy) *gapy = 0; break; case E_MAGNIFIER_ZOOM_RATIO_110: // TODO: need to implement @@ -242,6 +344,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, *ny = y + (h/8); *nw = w * 0.67; *nh = h * 0.67; + if (gapx) *gapx = w/8; + if (gapy) *gapy = h/8; break; case E_MAGNIFIER_ZOOM_RATIO_160: // TODO: need to implement @@ -260,6 +364,8 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, *ny = y + (h/4); *nw = w/2; *nh = h/2; + if (gapx) *gapx = w/4; + if (gapy) *gapy = h/4; break; default: break; @@ -267,62 +373,105 @@ _e_magnifier_calculate_zoom_geometry(E_Magnifier_Zoom_Ratio ratio, int x, int y, } static void -_e_magnifier_apply_zoom(Evas_Object *zoom_obj) +_e_magnifier_apply_zoom(E_Magnifier_Manager *emm) { - if (!zoom_obj) return; + if (!emm) return; E_Magnifier_Zoom_Ratio zoom_ratio; int x, y, w, h; int mx, my, mw, mh; E_Map *map; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); + int gapx, gapy; + int cx, cy, cw, ch; + E_View_Image *evi; //Evas Map map = e_map_new(); - x = sd->geom.system.x; - y = sd->geom.system.y; - w = sd->geom.system.w; - h = sd->geom.system.h; + E_View *child; + E_View_Tree *tree; - mx = sd->geom.system.x; - my = sd->geom.system.y; - mw = sd->geom.system.w; - mh = sd->geom.system.h; + tree = &emm->tree; - e_map_point_coord_set(map, 0, x, y, 0); - e_map_point_coord_set(map, 1, x + w, y, 0); - e_map_point_coord_set(map, 2, x + w, y + h, 0); - e_map_point_coord_set(map, 3, x, y + h, 0); + wl_list_for_each(child, &tree->children, link) + { + evi = e_view_image_try_from_view(child); + if (!evi) continue; + + e_view_image_geometry_get(evi, &cx, &cy, &cw, &ch); + + x = emm->geom.system.x; + y = emm->geom.system.y; + w = emm->geom.system.w; + h = emm->geom.system.h; + + mx = emm->geom.system.x; + my = emm->geom.system.y; + mw = emm->geom.system.w; + mh = emm->geom.system.h; + + //ELOGF("MAGNIFIER", "zoom_obj(%p) sd->geom.system(%d,%d,%d,%d)", NULL, zoom_obj, x, y, w, h); + + zoom_ratio = emm->ratio; + _e_magnifier_calculate_zoom_geometry(zoom_ratio, x, y, w, h, &mx, &my, &mw, &mh, &gapx, &gapy); + + //ELOGF("MAGNIFIER", "zoom_obj(%p) uv set(%d,%d,%d,%d)", NULL, zoom_obj, mx, my, mw, mh); + + if (mx >= cx) + { + if (mx+mw > cx+cw) + { + mx = cw - mw; + x = cx + mx - gapx; + } + else + mx -= cx; + } + else + { + x = (x - (mx - cx)); + mx = 0; + } - //ELOGF("MAGNIFIER", "zoom_obj(%p) sd->geom.system(%d,%d,%d,%d)", NULL, zoom_obj, x, y, w, h); + if (my >= cy) + { + if (my+mh > cy+ch) + { + my = ch - mh; + y = cy + my - gapy; + } + else + { + my -= cy; + } + } + else + { + y = (y - (my - cy)); + my = 0; - zoom_ratio = sd->ratio; - _e_magnifier_calculate_zoom_geometry(zoom_ratio, x, y, w, h, &mx, &my, &mw, &mh); + } - //ELOGF("MAGNIFIER", "zoom_obj(%p) uv set(%d,%d,%d,%d)", NULL, zoom_obj, mx, my, mw, mh); + e_map_point_coord_set(map, 0, x, y, 0); + e_map_point_coord_set(map, 1, x + w, y, 0); + e_map_point_coord_set(map, 2, x + w, y + h, 0); + e_map_point_coord_set(map, 3, x, y + h, 0); - e_map_point_image_uv_set(map, 0, mx, my); - e_map_point_image_uv_set(map, 1, mx+mw, my); - e_map_point_image_uv_set(map, 2, mx+mw, my+mh); - e_map_point_image_uv_set(map, 3, mx, my+mh); + e_map_point_image_uv_set(map, 0, mx, my); + e_map_point_image_uv_set(map, 1, mx+mw, my); + e_map_point_image_uv_set(map, 2, mx+mw, my+mh); + e_map_point_image_uv_set(map, 3, mx, my+mh); - // apply Evas Map to btn - e_comp_object_map_set(zoom_obj, map); - e_comp_object_map_enable_set(zoom_obj, EINA_TRUE); + // apply Evas Map + e_view_map_set(child, map); + e_view_map_enable_set(child, EINA_TRUE); + } // Remove Map e_map_free(map); } -static void -_e_magnifier_smart_set_user(Evas_Smart_Class *sc) -{ - sc->add = _e_magnifier_smart_add; - sc->del = _e_magnifier_smart_del; -} - static Eina_Bool _e_magnifier_smart_client_cb_add(void *data, int type, void *event) { @@ -343,7 +492,6 @@ _e_magnifier_smart_client_cb_add(void *data, int type, void *event) if (!desk) goto end; _e_magnifier_proxy_ec_new(ec); - e_magnifier_smart_member_add(desk, ec->magnifier_proxy); end: return ECORE_CALLBACK_PASS_ON; @@ -363,7 +511,6 @@ _e_magnifier_smart_client_cb_remove(void *data, int type, void *event) if (!ec) goto end; if (!ec->magnifier_proxy) goto end; - e_magnifier_smart_member_del(ec->magnifier_proxy); _e_magnifier_proxy_ec_del(ec); end: @@ -389,7 +536,7 @@ _e_magnifier_smart_client_cb_stack(void *data, int type, void *event) desk = e_zone_desk_find_by_ec(zone, ec); if (!desk) goto end; - _e_magnifier_smart_member_reorder(desk); + _e_magnifier_view_member_reorder(desk); end: return ECORE_CALLBACK_PASS_ON; @@ -409,7 +556,8 @@ _e_magnifier_smart_client_cb_show(void *data, int type, void *event) if (!ec) goto end; if (!ec->magnifier_proxy) goto end; - evas_object_show(ec->magnifier_proxy); + E_View *proxy_view = e_view_image_view_get(ec->magnifier_proxy); + e_view_show(proxy_view); end: return ECORE_CALLBACK_PASS_ON; @@ -429,7 +577,8 @@ _e_magnifier_smart_client_cb_hide(void *data, int type, void *event) if (!ec) goto end; if (!ec->magnifier_proxy) goto end; - evas_object_hide(ec->magnifier_proxy); + E_View *proxy_view = e_view_image_view_get(ec->magnifier_proxy); + e_view_hide(proxy_view); end: return ECORE_CALLBACK_PASS_ON; @@ -450,7 +599,7 @@ _e_magnifier_smart_client_cb_move(void *data, int type, void *event) if (!ec->magnifier_proxy) goto end; if (ec->is_magnifier) goto end; - evas_object_move(ec->magnifier_proxy, ec->x, ec->y); + e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h); end: return ECORE_CALLBACK_PASS_ON; @@ -471,7 +620,7 @@ _e_magnifier_smart_client_cb_resize(void *data, int type, void *event) if (!ec->magnifier_proxy) goto end; if (ec->is_magnifier) goto end; - evas_object_resize(ec->magnifier_proxy, ec->w, ec->h); + e_view_image_geometry_set(ec->magnifier_proxy, ec->x, ec->y, ec->w, ec->h); end: return ECORE_CALLBACK_PASS_ON; @@ -491,7 +640,7 @@ _e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec) desk = e_zone_desk_find_by_ec(zone, ec); if (!desk) goto end; - _e_magnifier_smart_member_reorder(desk); + _e_magnifier_view_member_reorder(desk); end: return EINA_TRUE; @@ -500,7 +649,6 @@ end: static void _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec) { - Eina_Bool ret; E_Zone *zone; E_Desk *desk; @@ -511,9 +659,7 @@ _e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec) if (!desk) return; _e_magnifier_proxy_ec_del(ec); - ret = _e_magnifier_proxy_ec_new(ec); - if (ret) - e_magnifier_smart_member_add(desk, ec->magnifier_proxy); + _e_magnifier_proxy_ec_new(ec); } static void @@ -523,128 +669,23 @@ _e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec) if (!ec) return; if (!_e_magnifier_mgr) return; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - if (sd->owner == ec) + if (_e_magnifier_mgr->owner == ec) { ELOGF("MAGNIFIER", "Deleted Owner.. So, Unset owner", ec); e_magnifier_owner_unset(ec); } } -static void -_e_magnifier_smart_add(Evas_Object *obj) -{ - EVAS_SMART_DATA_ALLOC(obj, E_Magnifier_Smart_Data); - - // e_client event handler - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_ADD, _e_magnifier_smart_client_cb_add, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_REMOVE, _e_magnifier_smart_client_cb_remove, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_STACK, _e_magnifier_smart_client_cb_stack, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_SHOW, _e_magnifier_smart_client_cb_show, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_HIDE, _e_magnifier_smart_client_cb_hide, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_MOVE, _e_magnifier_smart_client_cb_move, priv); - E_LIST_HANDLER_APPEND(priv->handlers, E_EVENT_CLIENT_RESIZE, _e_magnifier_smart_client_cb_resize, priv); - - // e_client hooks - E_LIST_HOOK_APPEND(priv->hooks, E_CLIENT_HOOK_DEL, _e_magnifier_smart_cb_hook_client_del, priv); - - // e_comp_object hooks - E_COMP_COMP_HOOK_APPEND(priv->cp_hooks, E_COMP_OBJECT_HOOK_EFFECT_END, _e_magnifier_smart_cb_hook_effect_end, priv); - - // e_comp_wl hooks - E_COMP_WL_HOOK_APPEND(priv->wl_hooks, E_COMP_WL_HOOK_CLIENT_REUSE, _e_magnifier_smart_cb_hook_client_reuse, priv); - - evas_object_layer_set(obj, E_LAYER_DESK_OBJECT_BELOW); - - _e_magnifier_parent_sc->add(obj); -} - -static void -_e_magnifier_smart_del(Evas_Object *obj) -{ - _e_magnifier_parent_sc->del(obj); - - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(obj, sd); - - E_FREE_LIST(sd->handlers, ecore_event_handler_del); - E_FREE_LIST(sd->hooks, e_client_hook_del); - E_FREE_LIST(sd->cp_hooks, e_comp_object_hook_del); - E_FREE_LIST(sd->wl_hooks, e_comp_wl_hook_del); - free(sd); - - evas_object_smart_data_set(obj, NULL); -} - -static void -_e_magnifier_cb_mouse_move_proxy(void *data, - Evas *e EINA_UNUSED, - Evas_Object *obj, - void *event_info) -{ - Evas_Event_Mouse_Move *ev = event_info; - Evas_Object *target_obj; - int w, h; - int nx, ny; - - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; - - target_obj = _e_magnifier_mgr; - if (!target_obj) return; - - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - - w = sd->geom.system.w; - h = sd->geom.system.h; - - nx = ev->cur.output.x - (w/2); - ny = ev->cur.output.y - (h/2); - - sd->geom.system.x = nx; - sd->geom.system.y = ny; - - _e_magnifier_apply_zoom(_e_magnifier_mgr); -} - -static void -_e_magnifier_cb_mouse_down_proxy(void *data, - Evas *e EINA_UNUSED, - Evas_Object *obj, - void *event_info) -{ - Evas_Object *target_obj; - Evas_Event_Mouse_Down *ev = event_info; - - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; - - target_obj = _e_magnifier_mgr; - if (!target_obj) return; - - evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_magnifier_cb_mouse_move_proxy, NULL); -} - -static void -_e_magnifier_cb_mouse_up_proxy(void *data, - Evas *e EINA_UNUSED, - Evas_Object *obj, - void *event_info) -{ - Evas_Object *target_obj; - Evas_Event_Mouse_Up *ev = event_info; - - if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; - - target_obj = _e_magnifier_mgr; - if (!target_obj) return; - - evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_MOVE, _e_magnifier_cb_mouse_move_proxy); -} - static void _e_magnifier_zoom_obj_geometry_convert_set(int angle, int x, int y, int w, int h, int tx, int ty, int tw, int th) { + E_Magnifier_Manager *emm; int nx, ny, nw, nh; + emm = _e_magnifier_mgr; + if (!emm) return; + switch (angle) { case 90: @@ -665,40 +706,43 @@ _e_magnifier_zoom_obj_geometry_convert_set(int angle, int x, int y, int w, int h break; } - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - - sd->geom.user.x = nx; - sd->geom.user.y = ny; - sd->geom.user.w = nw; - sd->geom.user.h = nh; + emm->geom.user.x = nx; + emm->geom.user.y = ny; + emm->geom.user.w = nw; + emm->geom.user.h = nh; - // ELOGF("MAGNIFIER", "New position.. (%d,%d,%dx%d)", NULL, nx, ny, nw, nh); - _e_magnifier_apply_zoom(_e_magnifier_mgr); + //ELOGF("MAGNIFIER", "New position.. (%d,%d,%dx%d)", NULL, nx, ny, nw, nh); + _e_magnifier_apply_zoom(emm); } static void _e_magnifier_cb_owner_move_resize(E_Client *ec) { + E_Magnifier_Manager *emm; int x, y, w, h; int nx, ny, nw, nh; - e_view_client_geometry_get(e_client_view_get(ec), &x, &y, &w, &h); + emm = _e_magnifier_mgr; + if (!emm) return; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); + e_view_client_geometry_get(e_client_view_get(ec), &x, &y, &w, &h); // TODO: Need to check rotation... - nx = x + sd->geom.user.x; - ny = y + sd->geom.user.y; - nw = sd->geom.user.w; - nh = sd->geom.user.h; + nx = x + emm->geom.user.x; + ny = y + emm->geom.user.y; + nw = emm->geom.user.w; + nh = emm->geom.user.h; - sd->geom.system.x = nx; - sd->geom.system.y = ny; - sd->geom.system.w = nw; - sd->geom.system.h = nh; + emm->geom.system.x = nx; + emm->geom.system.y = ny; + emm->geom.system.w = nw; + emm->geom.system.h = nh; - //ELOGF("MAGNIFIER", "Magnifier Owner MoveResize (%,%d,%dx%d). Apply Geometry (%d,%d,%dx%d)", NULL, x, y, w, h, nx, ny, nw, nh); - _e_magnifier_apply_zoom(_e_magnifier_mgr); + // for clip rect + _clip_rect_geometry_set(emm, nx, ny, nw, nh); + + //ELOGF("MAGNIFIER", "Magnifier Owner MoveResize (%d,%d,%dx%d). Apply Geometry (%d,%d,%dx%d)", NULL, x, y, w, h, nx, ny, nw, nh); + _e_magnifier_apply_zoom(emm); } static void @@ -742,7 +786,6 @@ e_magnifier_shutdown(void) EINTERN Eina_Bool e_magnifier_new(void) { - Eina_Bool ret; ELOGF("MAGNIFIER", "NEW Magnifier", NULL); if (_e_magnifier_mgr) @@ -751,10 +794,15 @@ e_magnifier_new(void) return EINA_TRUE; } - ret = _e_magnifier_smart_init(); - if (!ret) + E_Zone *zone; + + zone = e_zone_current_get(); + EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE); + + _e_magnifier_mgr = _e_magnifier_manager_create(zone); + if (!_e_magnifier_mgr) { - ELOGF("MAGNIFIER", "Fail to NEW Magnifier", NULL); + ELOGF("MAGNIFIER", "FAIL to Create Magnifier!!!", NULL); return EINA_FALSE; } @@ -769,19 +817,16 @@ e_magnifier_del(void) ELOGF("MAGNIFIER", "DELETE Magnifier", NULL); if (!_e_magnifier_mgr) return; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - if (sd->owner) + if (_e_magnifier_mgr->owner) { - ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx, ec:%p) exists", - NULL, e_client_util_win_get(sd->owner), sd->owner); + ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx_e_magnifier_mgr ec:%p) exists", + NULL, e_client_util_win_get(_e_magnifier_mgr->owner), _e_magnifier_mgr->owner); return; } _e_magnifier_proxy_ec_all_remove(); - - evas_object_del(_e_magnifier_mgr); - _e_magnifier_mgr = NULL; + _e_magnifier_manager_destroy(_e_magnifier_mgr); } EINTERN Eina_Bool @@ -790,16 +835,14 @@ e_magnifier_show(E_Client *ec) ELOGF("MAGNIFIER", "SHOW Magnifier", NULL); if (!_e_magnifier_mgr) return EINA_FALSE; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; - if (sd->owner != ec) + if (_e_magnifier_mgr->owner != ec) { ELOGF("MAGNIFIER", "Not owner... Failed to show...", ec); return EINA_FALSE; } - evas_object_show(_e_magnifier_mgr); - + e_view_show(e_view_tree_view_get(_e_magnifier_tree_get(_e_magnifier_mgr))); _e_magnifier_apply_zoom(_e_magnifier_mgr); return EINA_TRUE; @@ -811,15 +854,14 @@ e_magnifier_hide(E_Client *ec) ELOGF("MAGNIFIER", "HIDE Magnifier", NULL); if (!_e_magnifier_mgr) return; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - if (sd->owner != ec) + if (_e_magnifier_mgr->owner != ec) { ELOGF("MAGNIFIER", "Not owner... Failed to hide...", ec); return; } - evas_object_hide(_e_magnifier_mgr); + e_view_hide(e_view_tree_view_get(_e_magnifier_tree_get(_e_magnifier_mgr))); } EINTERN Eina_Bool @@ -829,14 +871,15 @@ e_magnifier_zoom_obj_ratio_set(E_Client* ec, E_Magnifier_Zoom_Ratio ratio) (ratio > E_MAGNIFIER_ZOOM_RATIO_200)) return EINA_FALSE; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; - if (sd->owner != ec) + if (!_e_magnifier_mgr) return EINA_FALSE; + + if (_e_magnifier_mgr->owner != ec) { ELOGF("MAGNIFIER", "Not owner... Failed to set ratio...", ec); return EINA_FALSE; } - sd->ratio = ratio; + _e_magnifier_mgr->ratio = ratio; _e_magnifier_apply_zoom(_e_magnifier_mgr); @@ -850,8 +893,9 @@ e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w, ELOGF("MAGNIFIER", "Zoom obj geometry set (%d,%d,%dx%d)", ec, x, y, w, h); - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; - if (sd->owner != ec) + if (!_e_magnifier_mgr) return EINA_FALSE; + + if (_e_magnifier_mgr->owner != ec) { ELOGF("MAGNIFIER", "Not owner... Failed to set geometry...", ec); return EINA_FALSE; @@ -883,35 +927,6 @@ e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w, return EINA_TRUE; } -EINTERN Eina_Bool -e_magnifier_smart_member_add(E_Desk *desk, Evas_Object *obj) -{ - E_OBJECT_CHECK_RETURN(desk, EINA_FALSE); - E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE); - - ELOGF("MAGNIFIER", "SMART MEMBER ADD.. obj :%p", NULL, obj); - evas_object_smart_member_add(obj, _e_magnifier_mgr); - - return EINA_TRUE; -} - -EINTERN Eina_Bool -e_magnifier_smart_member_del(Evas_Object *obj) -{ - Evas_Object *parent = NULL; - - if (!obj) return EINA_FALSE; - parent = evas_object_smart_parent_get(obj); - - if (parent != _e_magnifier_mgr) - return EINA_FALSE; - - ELOGF("MAGNIFIER", "SMART MEMBER DEL.. obj :%p", NULL, obj); - - evas_object_smart_member_del(obj); - return EINA_TRUE; -} - static void _e_magnifier_owner_set(E_Client *ec) { @@ -961,26 +976,26 @@ _e_magnifier_owner_unset(E_Client *ec) } static Eina_Bool -_e_magnifier_stand_alone_mode_set(Evas_Object *magnifier_mgr, Eina_Bool set) +_e_magnifier_stand_alone_mode_set(E_Magnifier_Manager *emm, Eina_Bool set) { - if (!magnifier_mgr) return EINA_FALSE; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(magnifier_mgr, sd) EINA_FALSE; + if (!emm) return EINA_FALSE; - if (sd->stand_alone_mode == set) + if (emm->stand_alone_mode == set) return EINA_TRUE; - sd->stand_alone_mode = set; - if (sd->stand_alone_mode) + emm->stand_alone_mode = set; + if (emm->stand_alone_mode) { - evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL); - evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL); + // TODO: change below functions to relative e_view's API + //evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL); + //evas_object_event_callback_add(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL); } else { - evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy); - evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy); + // TODO: change below functions to relative e_view's API + //evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy); + //evas_object_event_callback_del(magnifier_mgr, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy); } - return EINA_TRUE; } @@ -988,24 +1003,25 @@ EINTERN Eina_Bool e_magnifier_owner_set(E_Client *ec) { ELOGF("MAGNIFIER", "SET Magnifier Owner", ec); - if (!_e_magnifier_mgr) + + E_Magnifier_Manager *emm; + emm = _e_magnifier_mgr; + if (!emm) { ELOGF("MAGNIFIER", "Magnifier is not exist", ec); return EINA_FALSE; } - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; - - if (sd->owner) + if (emm->owner) { - ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(sd->owner), sd->owner); + ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(emm->owner), emm->owner); return EINA_FALSE; } - sd->owner = ec; + emm->owner = ec; _e_magnifier_owner_set(ec); - if (ec && sd->stand_alone_mode) + if (ec && emm->stand_alone_mode) { _e_magnifier_stand_alone_mode_set(_e_magnifier_mgr, EINA_FALSE); } @@ -1021,23 +1037,23 @@ e_magnifier_owner_unset(E_Client *ec) _e_magnifier_owner_unset(ec); - if (!_e_magnifier_mgr) + E_Magnifier_Manager *emm; + emm = _e_magnifier_mgr; + if (!emm) { ELOGF("MAGNIFIER", "Magnifier is not exist", ec); return; } - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd); - - if (sd->owner != ec) + if (emm->owner != ec) { ELOGF("MAGNIFIER", "Owner is not matched.. current owner (win:0x%08zx, ec:%p)", - ec, e_client_util_win_get(sd->owner), sd->owner); + ec, e_client_util_win_get(emm->owner), emm->owner); return; } - sd->owner = NULL; + emm->owner = NULL; } EINTERN E_Client * @@ -1048,9 +1064,7 @@ e_magnifier_owner_get(void) if (!_e_magnifier_mgr) return NULL; - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) NULL; - - ec = sd->owner; + ec = _e_magnifier_mgr->owner; ELOGF("MAGNIFIER", "Current Magnifier owner (win:0x%08zx, ec:%p)", NULL, e_client_util_win_get(ec), ec); @@ -1074,11 +1088,9 @@ e_magnifier_stand_alone_mode_set(Eina_Bool stand_alone) } else { - E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE; - - if (sd->owner) + if (_e_magnifier_mgr->owner) { - ELOGF("MAGNIFIER", "Failed to Stand_Alone mode. Magnifier window exists...", sd->owner); + ELOGF("MAGNIFIER", "Failed to Stand_Alone mode. Magnifier window exists...", _e_magnifier_mgr->owner); return EINA_FALSE; } diff --git a/src/bin/windowmgr/e_magnifier_intern.h b/src/bin/windowmgr/e_magnifier_intern.h index b52a9faab1..04faae61d6 100644 --- a/src/bin/windowmgr/e_magnifier_intern.h +++ b/src/bin/windowmgr/e_magnifier_intern.h @@ -4,6 +4,7 @@ #include "e_intern.h" #include "e_client_intern.h" #include "e_desk_intern.h" +#include "e_comp_canvas.h" #include @@ -33,8 +34,6 @@ EINTERN Eina_Bool e_magnifier_show(E_Client *ec); EINTERN void e_magnifier_hide(E_Client *ec); EINTERN Eina_Bool e_magnifier_zoom_obj_ratio_set(E_Client *ec, E_Magnifier_Zoom_Ratio ratio); EINTERN Eina_Bool e_magnifier_zoom_obj_geometry_set(E_Client *ec, int angle, int x, int y, int w, int h); -EINTERN Eina_Bool e_magnifier_smart_member_add(E_Desk *desk, Evas_Object *obj); -EINTERN Eina_Bool e_magnifier_smart_member_del(Evas_Object *obj); EINTERN Eina_Bool e_magnifier_owner_set(E_Client *ec); EINTERN void e_magnifier_owner_unset(E_Client *ec); EINTERN E_Client *e_magnifier_owner_get(void); diff --git a/src/include/e_client.h b/src/include/e_client.h index b88da5c349..dadf6339cb 100644 --- a/src/include/e_client.h +++ b/src/include/e_client.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -794,7 +795,7 @@ struct _E_Client Eina_Bool show : 1; // SHOW / HIDE } reg_ev; - Evas_Object *magnifier_proxy; // The proxy object used by magnifier + E_View_Image *magnifier_proxy; // The proxy object used by magnifier Eina_Bool is_magnifier : 1; // The client is a magnifier client struct