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);
E_View_Rect *clip_rect;
Eina_List *handlers;
- Eina_List *hooks;
Eina_List *cp_hooks;
Eina_List *wl_hooks;
E_Desk *desk;
Eina_Bool enabled;
struct wl_listener show;
+
+ // client listeners
+ struct wl_listener client_destroy_listener;
} E_Magnifier_Manager;
static E_Magnifier_Manager *_e_magnifier_mgr = NULL;
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);
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_magnifier_proxy_ec_new(ec);
}
-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;
-
- if (_e_magnifier_mgr->owner == ec)
- {
- ELOGF("MAGNIFIER", "Deleted Owner.. So, Unset owner", ec);
- e_magnifier_owner_unset(ec);
- }
-}
-
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)
{
return EINA_TRUE;
}
+
+static void
+_e_magnifier_owner_cb_client_destroy(struct wl_listener *listener, void *data)
+{
+ E_Magnifier_Manager *emm;
+ E_Client *ec;
+
+ emm = wl_container_of(listener, emm, client_destroy_listener);
+ ec = emm->owner;
+
+ ELOGF("MAGNIFIER", "Deleted Owner.. So, Unset owner", ec);
+
+ e_magnifier_owner_unset(ec);
+}
+
EINTERN Eina_Bool
e_magnifier_owner_set(E_Client *ec)
{
_e_magnifier_stand_alone_mode_set(_e_magnifier_mgr, EINA_FALSE);
}
+ // e_client listeners
+ emm->client_destroy_listener.notify = _e_magnifier_owner_cb_client_destroy;
+ e_client_destroy_listener_add(ec, &emm->client_destroy_listener);
+
return EINA_TRUE;
}
return;
}
+ wl_list_remove(&emm->client_destroy_listener.link);
+
emm->owner = NULL;
}