Eina_List *intercept_hooks;
Eina_List *events;
+ // client listeners
+ struct wl_listener client_destroy_listener;
+
+ // view listeners
struct wl_listener show_listener;
};
cbhm->show_listener.notify = NULL;
}
+ wl_list_remove(&cbhm->client_destroy_listener.link);
+
E_FREE_LIST(cbhm->events, ecore_event_handler_del);
- E_FREE_LIST(cbhm->hooks, e_client_hook_del);
E_FREE_LIST(cbhm->intercept_hooks, e_comp_object_intercept_hook_del);
E_FREE(_pol_cbhm);
}
cbhm->show_block = EINA_TRUE;
}
-static void
-_cbhm_hook_client_del(void *d, E_Client *ec)
-{
- E_Policy_Cbhm *cbhm;
-
- cbhm = d;
- if (EINA_UNLIKELY(!cbhm))
- return;
-
- if (!ec) return;
-
- if (cbhm->ec != ec)
- return;
-
- _cbhm_free(cbhm);
-}
-
static Eina_Bool
_cbhm_cb_client_zone_set(void *data, int type EINA_UNUSED, void *event)
{
EC_CHANGED(ec);
}
+static void
+_cbhm_cb_client_destroy(struct wl_listener *listener, void *data)
+{
+ E_Policy_Cbhm *cbhm;
+
+ cbhm = wl_container_of(listener, cbhm, client_destroy_listener);
+
+ _cbhm_free(cbhm);
+}
+
/* NOTE: supported single client for cbhm for now. */
EINTERN void
e_service_cbhm_client_set(E_Client *ec)
e_view_event_listener_add(view, E_VIEW_SHOW, &cbhm->show_listener);
}
- E_CLIENT_HOOK_APPEND(cbhm->hooks, E_CLIENT_HOOK_DEL, _cbhm_hook_client_del, cbhm);
+ // e_client listeners
+ cbhm->client_destroy_listener.notify = _cbhm_cb_client_destroy;
+ e_client_destroy_listener_add(ec, &cbhm->client_destroy_listener);
+
E_LIST_HANDLER_APPEND(cbhm->events, E_EVENT_CLIENT_ZONE_SET, _cbhm_cb_client_zone_set, cbhm);
E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(cbhm->intercept_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _cbhm_intercept_hook_show, cbhm);
}