{
Evas_Object_Smart_Clipped_Data base;
Eina_List *handlers;
+ Eina_List *hooks;
+ Eina_List *cp_hooks;
+ Eina_List *wl_hooks;
E_Desk *desk;
+ E_Client *owner;
int stand_alone_mode;
E_Magnifier_Zoom_Ratio ratio;
- struct
+ struct
{
struct
{
evas_object_smart_clipped_class_get, NULL);
-static void _e_magnifier_smart_init(void);
+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(E_Desk *desk);
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 void
+static Eina_Bool
_e_magnifier_smart_init(void)
{
E_Zone *zone;
_e_magnifier_mgr = evas_object_smart_add(e_comp->evas, _e_magnifier_smart_class_new());
- E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+ E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
ELOGF("MAGNIFIER", "INIT Magnifier (%p)", NULL, _e_magnifier_mgr);
evas_object_move(_e_magnifier_mgr, zone->x, zone->y);
evas_object_resize(_e_magnifier_mgr, zone->w, zone->h);
+
+ return EINA_TRUE;
}
static Eina_Bool
ev = event;
ec = ev->ec;
if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
- if (ec->magnifier_proxy)
- {
- e_magnifier_smart_member_del(ec->magnifier_proxy);
- _e_magnifier_proxy_ec_del(ec);
- }
+ e_magnifier_smart_member_del(ec->magnifier_proxy);
+ _e_magnifier_proxy_ec_del(ec);
end:
return ECORE_CALLBACK_PASS_ON;
ev = event;
ec = ev->ec;
if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
- if (ec->magnifier_proxy)
- {
- evas_object_show(ec->magnifier_proxy);
- }
+ evas_object_show(ec->magnifier_proxy);
end:
return ECORE_CALLBACK_PASS_ON;
ev = event;
ec = ev->ec;
if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
- if (ec->magnifier_proxy)
- {
- evas_object_hide(ec->magnifier_proxy);
- }
+ evas_object_hide(ec->magnifier_proxy);
end:
return ECORE_CALLBACK_PASS_ON;
}
+static Eina_Bool
+_e_magnifier_smart_client_cb_move(void *data, int type, void *event)
+{
+ E_Event_Client *ev;
+ E_Client *ec = NULL;
+
+ if (!data) goto end;
+ if (!event) goto end;
+
+ ev = event;
+ ec = ev->ec;
+ if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
+ if (ec->is_magnifier) goto end;
+
+ evas_object_move(ec->magnifier_proxy, ec->x, ec->y);
+
+end:
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_magnifier_smart_client_cb_resize(void *data, int type, void *event)
+{
+ E_Event_Client *ev;
+ E_Client *ec = NULL;
+
+ if (!data) goto end;
+ if (!event) goto end;
+
+ ev = event;
+ ec = ev->ec;
+ if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
+ if (ec->is_magnifier) goto end;
+
+ evas_object_resize(ec->magnifier_proxy, ec->w, ec->h);
+
+end:
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_magnifier_smart_cb_hook_effect_end(void *data, E_Client *ec)
+{
+ if (!ec) goto end;
+ if (!ec->magnifier_proxy) goto end;
+ if (ec->is_magnifier) goto end;
+
+ _e_magnifier_smart_member_reorder(ec->desk);
+
+end:
+ return EINA_TRUE;
+}
+
+static void
+_e_magnifier_smart_cb_hook_client_reuse(void *data, E_Client *ec)
+{
+ Eina_Bool ret;
+ if (!ec) return;
+
+ _e_magnifier_proxy_ec_del(ec);
+ ret = _e_magnifier_proxy_ec_new(ec);
+ if (ret)
+ e_magnifier_smart_member_add(ec->desk, ec->magnifier_proxy);
+}
+
+static void
+_e_magnifier_smart_cb_hook_client_del(void *data, E_Client *ec)
+{
+ if (!data) return;
+ if (!ec) return;
+
+ if (!_e_magnifier_mgr) return;
+ E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+ if (sd->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);
- /* to apply zoom transformation whenever the client's size is changed. */
+ // 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);
- /* FIXME hard coded, it will be laid upper than unpacked clients */
evas_object_layer_set(obj, E_LAYER_DESK_OBJECT_BELOW);
_e_magnifier_parent_sc->add(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);
E_API Eina_Bool
e_magnifier_new(void)
{
+ Eina_Bool ret;
ELOGF("MAGNIFIER", "NEW Magnifier", NULL);
- _e_magnifier_smart_init();
+ if (_e_magnifier_mgr)
+ {
+ ELOGF("MAGNIFIER", "Already exist Magnifier", NULL);
+ return EINA_TRUE;
+ }
+
+ ret = _e_magnifier_smart_init();
+ if (!ret)
+ {
+ ELOGF("MAGNIFIER", "Fail to NEW Magnifier", NULL);
+ return EINA_FALSE;
+ }
E_Zone *zone;
E_Desk *desk;
{
ELOGF("MAGNIFIER", "DELETE Magnifier", NULL);
- _e_magnifier_proxy_ec_all_remove();
+ if (!_e_magnifier_mgr) return;
+ E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
- if (_e_magnifier_mgr)
+ if (sd->owner)
{
- evas_object_del(_e_magnifier_mgr);
- _e_magnifier_mgr = NULL;
+ ELOGF("MAGNIFIER", "Fail to DELETE Magnifier.. Owner (win:0x%08zx, ec:%p) exists",
+ NULL, e_client_util_win_get(sd->owner), sd->owner);
+ return;
}
+
+ _e_magnifier_proxy_ec_all_remove();
+
+ evas_object_del(_e_magnifier_mgr);
+ _e_magnifier_mgr = NULL;
}
-E_API void
-e_magnifier_show(void)
+E_API Eina_Bool
+e_magnifier_show(E_Client *ec)
{
Evas_Object *target_obj;
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)
+ {
+ ELOGF("MAGNIFIER", "Not owner... Failed to show...", ec);
+ return EINA_FALSE;
+ }
+
evas_object_show(_e_magnifier_mgr);
_e_magnifier_apply_zoom(_e_magnifier_mgr);
- E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
-
if (sd->stand_alone_mode)
{
target_obj = _e_magnifier_mgr;
evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy, NULL);
evas_object_event_callback_add(target_obj, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy, NULL);
}
+
+ return EINA_TRUE;
}
E_API void
-e_magnifier_hide(void)
+e_magnifier_hide(E_Client *ec)
{
Evas_Object *target_obj;
ELOGF("MAGNIFIER", "HIDE Magnifier", NULL);
- evas_object_hide(_e_magnifier_mgr);
+ if (!_e_magnifier_mgr) return;
E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+ if (sd->owner != ec)
+ {
+ ELOGF("MAGNIFIER", "Not owner... Failed to hide...", ec);
+ return;
+ }
+
+ evas_object_hide(_e_magnifier_mgr);
+
if (sd->stand_alone_mode)
{
target_obj = _e_magnifier_mgr;
evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_DOWN, _e_magnifier_cb_mouse_down_proxy);
evas_object_event_callback_del(target_obj, EVAS_CALLBACK_MOUSE_UP, _e_magnifier_cb_mouse_up_proxy);
}
+
}
E_API Eina_Bool
return EINA_FALSE;
E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) EINA_FALSE;
+ if (sd->owner != ec)
+ {
+ ELOGF("MAGNIFIER", "Not owner... Failed to set ratio...", ec);
+ return EINA_FALSE;
+ }
+
sd->ratio = ratio;
_e_magnifier_apply_zoom(_e_magnifier_mgr);
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)
+ {
+ ELOGF("MAGNIFIER", "Not owner... Failed to set geometry...", ec);
+ return EINA_FALSE;
+ }
+
E_Desk *desk = NULL;
int tx, ty, tw, th;
E_OBJECT_CHECK_RETURN(desk, EINA_FALSE);
E_OBJECT_TYPE_CHECK_RETURN(desk, E_DESK_TYPE, EINA_FALSE);
- ELOGF("WAYFORU", "MAGNIFIER.... SMART MEMBER ADD... obj:%p", NULL, obj);
+ ELOGF("MAGNIFIER", "SMART MEMBER ADD.. obj :%p", NULL, obj);
evas_object_smart_member_add(obj, _e_magnifier_mgr);
return EINA_TRUE;
if (!obj) return EINA_FALSE;
parent = evas_object_smart_parent_get(obj);
- ELOGF("WAYFORU", "MAGNIFIER.... SMART MEMBER DEL... obj:%p", NULL, obj);
-
if (parent != _e_magnifier_mgr)
return EINA_FALSE;
- ELOGF("WAYFORU", "MAGNIFIER.... SMART MEMBER DEL... obj:%p", NULL, obj);
+ ELOGF("MAGNIFIER", "SMART MEMBER DEL.. obj :%p", NULL, obj);
evas_object_smart_member_del(obj);
return EINA_TRUE;
}
-E_API Eina_Bool
-e_magnifier_owner_set(E_Client *ec)
+static void
+_e_magnifier_owner_set(E_Client *ec)
{
- if (!ec) return EINA_FALSE;
-
- ELOGF("MAGNIFIER", "SET Magnifier Owner", ec);
+ if (!ec) return;
ec->is_magnifier = EINA_TRUE;
ec->exp_iconify.deiconify_update = EINA_FALSE;
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, _e_magnifier_cb_owner_move_resize, NULL);
evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, _e_magnifier_cb_owner_move_resize, NULL);
+}
+
+static void
+_e_magnifier_owner_unset(E_Client *ec)
+{
+ if (!ec) return;
+
+ ec->is_magnifier = EINA_FALSE;
+
+ evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_MOVE, _e_magnifier_cb_owner_move_resize);
+ evas_object_event_callback_del(ec->frame, EVAS_CALLBACK_RESIZE, _e_magnifier_cb_owner_move_resize);
+}
+
+E_API Eina_Bool
+e_magnifier_owner_set(E_Client *ec)
+{
+ ELOGF("MAGNIFIER", "SET Magnifier Owner", ec);
+ if (!_e_magnifier_mgr)
+ {
+ 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)
+ {
+ ELOGF("MAGNIFIER", "Already exist owner (win:0x%08zx, ec:%p)", ec, e_client_util_win_get(sd->owner), sd->owner);
+ return EINA_FALSE;
+ }
+
+ sd->owner = ec;
+ _e_magnifier_owner_set(ec);
return EINA_TRUE;
}
+
+E_API void
+e_magnifier_owner_unset(E_Client *ec)
+{
+ ELOGF("MAGNIFIER", "UNSET Magnifier Owner", ec);
+ if (!ec) return;
+
+ _e_magnifier_owner_unset(ec);
+
+ if (!_e_magnifier_mgr)
+ {
+ ELOGF("MAGNIFIER", "Magnifier is not exist", ec);
+ return;
+ }
+
+ E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd);
+
+ if (sd->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);
+
+ return;
+ }
+
+ sd->owner = NULL;
+}
+
+E_API E_Client *
+e_magnifier_owner_get(void)
+{
+ E_Client *ec = NULL;
+
+ if (!_e_magnifier_mgr)
+ return NULL;
+
+ E_MAGNIFIER_SMART_DATA_GET_OR_RETURN(_e_magnifier_mgr, sd) NULL;
+
+ ec = sd->owner;
+
+ ELOGF("MAGNIFIER", "Current Magnifier owner (win:0x%08zx, ec:%p)",
+ NULL, e_client_util_win_get(ec), ec);
+
+ return ec;
+}