GList *client_list = NULL;
static GSList *client_destructors = NULL;
+static GSList *client_hide_notifies = NULL;
static void client_get_all(ObClient *self, gboolean real);
static void client_toggle_border(ObClient *self, gboolean show);
static GSList *client_search_all_top_parents_internal(ObClient *self,
gboolean bylayer,
ObStackingLayer layer);
+static void client_call_callbacks(ObClient *self, GSList *list);
void client_startup(gboolean reconfig)
{
if (reconfig) return;
}
+static void client_call_callbacks(ObClient *self, GSList *list)
+{
+ GSList *it;
+
+ for (it = list; it; it = g_slist_next(it)) {
+ ClientCallback *d = it->data;
+ d->func(self, d->data);
+ }
+}
+
void client_add_destructor(ObClientCallback func, gpointer data)
{
ClientCallback *d = g_new(ClientCallback, 1);
}
}
+void client_add_hide_notify(ObClientCallback func, gpointer data)
+{
+ ClientCallback *d = g_new(ClientCallback, 1);
+ d->func = func;
+ d->data = data;
+ client_hide_notifies = g_slist_prepend(client_destructors, d);
+}
+
+void client_remove_hide_notify(ObClientCallback func)
+{
+ GSList *it;
+
+ for (it = client_hide_notifies; it; it = g_slist_next(it)) {
+ ClientCallback *d = it->data;
+ if (d->func == func) {
+ g_free(d);
+ client_hide_notifies =
+ g_slist_delete_link(client_hide_notifies, it);
+ break;
+ }
+ }
+}
+
void client_set_list()
{
Window *windows, *win_it;
if (STRUT_EXISTS(self->strut))
screen_update_areas();
- for (it = client_destructors; it; it = g_slist_next(it)) {
- ClientCallback *d = it->data;
- d->func(self, d->data);
- }
+ client_call_callbacks(self, client_destructors);
/* tell our parent(s) that we're gone */
if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */
{
if (!client_should_show(self)) {
frame_hide(self->frame);
+
+ client_call_callbacks(self, client_hide_notifies);
}
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
}
else {
frame_hide(self->frame);
+
+ client_call_callbacks(self, client_hide_notifies);
}
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
void client_add_destructor(ObClientCallback func, gpointer data);
void client_remove_destructor(ObClientCallback func);
+/*! Get notified when the client is hidden */
+void client_add_hide_notify(ObClientCallback func, gpointer data);
+void client_remove_hide_notify(ObClientCallback func);
+
/*! Manages all existing windows */
void client_manage_all();
/*! Manages a given window
gboolean dock_windows,
gboolean desktop_windows);
static void focus_cycle_destructor(ObClient *client, gpointer data);
-static void focus_tried_destructor(ObClient *client, gpointer data);
+static void focus_tried_hide_notify(ObClient *client, gpointer data);
static Window createWindow(Window parent, gulong mask,
XSetWindowAttributes *attrib)
XSetWindowAttributes attr;
client_add_destructor(focus_cycle_destructor, NULL);
- client_add_destructor(focus_tried_destructor, NULL);
+ client_add_hide_notify(focus_tried_hide_notify, NULL);
/* start with nothing focused */
focus_nothing();
if (!reconfig) {
client_remove_destructor(focus_cycle_destructor);
- client_remove_destructor(focus_tried_destructor);
+ client_remove_hide_notify(focus_tried_hide_notify);
/* reset focus to root */
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
return NULL;
}
-static void focus_tried_destructor(ObClient *client, gpointer data)
+static void focus_tried_hide_notify(ObClient *client, gpointer data)
{
XEvent ce;