From 685dca1c5fb1fac160ad845a710bc2c30ff87751 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 13 May 2007 07:38:35 +0000 Subject: [PATCH] likewise if a window is unmanaged and we were trying to give it focus, we want to know about it - also if the window gets hidden for some other reason, we also want to know about it. add a notifier for windows being hidden, and use that instead - it handles both cases. --- openbox/client.c | 44 ++++++++++++++++++++++++++++++++++++++++---- openbox/client.h | 4 ++++ openbox/focus.c | 8 ++++---- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 208024cf..112b8d8b 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -65,6 +65,7 @@ typedef struct 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); @@ -91,6 +92,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise); 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) { @@ -104,6 +106,16 @@ void client_shutdown(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); @@ -126,6 +138,29 @@ void client_remove_destructor(ObClientCallback func) } } +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; @@ -565,10 +600,7 @@ void client_unmanage(ObClient *self) 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 */ @@ -2383,6 +2415,8 @@ void client_hide(ObClient *self) { 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 @@ -2400,6 +2434,8 @@ void client_showhide(ObClient *self) } 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 diff --git a/openbox/client.h b/openbox/client.h index bc7c32e8..1a2273f4 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -312,6 +312,10 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data); 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 diff --git a/openbox/focus.c b/openbox/focus.c index 92cd7662..39b12d00 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -68,7 +68,7 @@ static gboolean valid_focus_target(ObClient *ft, 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) @@ -87,7 +87,7 @@ void focus_startup(gboolean reconfig) 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(); @@ -141,7 +141,7 @@ void focus_shutdown(gboolean reconfig) 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); @@ -942,7 +942,7 @@ ObClient *focus_order_find_first(guint desktop) return NULL; } -static void focus_tried_destructor(ObClient *client, gpointer data) +static void focus_tried_hide_notify(ObClient *client, gpointer data) { XEvent ce; -- 2.39.2