#include "e.h"
+#include "e_client_intern.h"
+
+#define PRI(ec) ((E_Client_Private *)e_object_data_get(E_OBJECT(ec)))
+
+#define API_ENTRY \
+ EINA_SAFETY_ON_NULL_RETURN(ec); \
+ E_Client_Private *priv = PRI(ec)
+
+#define API_ENTRY_VAL(ret) \
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ret); \
+ E_Client_Private *priv = PRI(ec)
+
+typedef struct _E_Client_Private E_Client_Private;
+
+struct _E_Client_Private
+{
+ struct
+ {
+ struct wl_signal destroy;
+ } events;
+};
static int _e_client_hooks_delete = 0;
static int _e_client_hooks_walking = 0;
return EINA_FALSE;
}
+static Eina_Bool
+_e_client_private_init(E_Client *ec)
+{
+ E_Client_Private *priv;
+
+ priv = E_NEW(E_Client_Private, 1);
+ if (!priv)
+ return EINA_FALSE;
+
+ wl_signal_init(&priv->events.destroy);
+
+ e_object_data_set(E_OBJECT(ec), priv);
+
+ return EINA_TRUE;
+}
+
+static void
+_e_client_private_finish(E_Client *ec)
+{
+ E_Client_Private *priv;
+
+ priv = PRI(ec);
+ e_object_data_set(E_OBJECT(ec), NULL);
+
+ free(priv);
+}
+
static void
_e_client_free(E_Client *ec)
{
#else
e_desk_client_del(ec->desk, ec);
#endif
+
+ _e_client_private_finish(ec);
free(ec);
}
/* must be called before parent/child clear */
_e_client_hook_call(E_CLIENT_HOOK_DEL, ec);
+ wl_signal_emit_mutable(&PRI(ec)->events.destroy, ec);
+
_e_client_event_remove(ec);
ELOGF("COMP", "CLIENT DEL", ec);
if (!ec) return NULL;
e_object_del_func_set(E_OBJECT(ec), E_OBJECT_CLEANUP_FUNC(_e_client_del));
+ if (!_e_client_private_init(ec))
+ {
+ e_object_del(E_OBJECT(ec));
+ return NULL;
+ }
+
uuid_generate(ec->uuid);
ec->focus_policy_override = E_FOCUS_LAST;
}
#endif
+EINTERN void
+e_client_destroy_listener_add(E_Client *ec, struct wl_listener *listener)
+{
+ API_ENTRY;
+ wl_signal_add(&priv->events.destroy, listener);
+}
+
+EINTERN struct wl_listener *
+e_client_destroy_listener_get(E_Client *ec, wl_notify_func_t notify)
+{
+ API_ENTRY_VAL(NULL);
+ return wl_signal_get(&priv->events.destroy, notify);
+}
\ No newline at end of file