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.
This commit is contained in:
Dana Jansens 2007-05-13 07:38:35 +00:00
parent 1e957a1688
commit 685dca1c5f
3 changed files with 48 additions and 8 deletions

View file

@ -65,6 +65,7 @@ typedef struct
GList *client_list = NULL; GList *client_list = NULL;
static GSList *client_destructors = NULL; static GSList *client_destructors = NULL;
static GSList *client_hide_notifies = NULL;
static void client_get_all(ObClient *self, gboolean real); static void client_get_all(ObClient *self, gboolean real);
static void client_toggle_border(ObClient *self, gboolean show); 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, static GSList *client_search_all_top_parents_internal(ObClient *self,
gboolean bylayer, gboolean bylayer,
ObStackingLayer layer); ObStackingLayer layer);
static void client_call_callbacks(ObClient *self, GSList *list);
void client_startup(gboolean reconfig) void client_startup(gboolean reconfig)
{ {
@ -104,6 +106,16 @@ void client_shutdown(gboolean reconfig)
if (reconfig) return; 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) void client_add_destructor(ObClientCallback func, gpointer data)
{ {
ClientCallback *d = g_new(ClientCallback, 1); 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() void client_set_list()
{ {
Window *windows, *win_it; Window *windows, *win_it;
@ -565,10 +600,7 @@ void client_unmanage(ObClient *self)
if (STRUT_EXISTS(self->strut)) if (STRUT_EXISTS(self->strut))
screen_update_areas(); screen_update_areas();
for (it = client_destructors; it; it = g_slist_next(it)) { client_call_callbacks(self, client_destructors);
ClientCallback *d = it->data;
d->func(self, d->data);
}
/* tell our parent(s) that we're gone */ /* tell our parent(s) that we're gone */
if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */
@ -2383,6 +2415,8 @@ void client_hide(ObClient *self)
{ {
if (!client_should_show(self)) { if (!client_should_show(self)) {
frame_hide(self->frame); 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 /* 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 { else {
frame_hide(self->frame); 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 /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it

View file

@ -312,6 +312,10 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data);
void client_add_destructor(ObClientCallback func, gpointer data); void client_add_destructor(ObClientCallback func, gpointer data);
void client_remove_destructor(ObClientCallback func); 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 */ /*! Manages all existing windows */
void client_manage_all(); void client_manage_all();
/*! Manages a given window /*! Manages a given window

View file

@ -68,7 +68,7 @@ static gboolean valid_focus_target(ObClient *ft,
gboolean dock_windows, gboolean dock_windows,
gboolean desktop_windows); gboolean desktop_windows);
static void focus_cycle_destructor(ObClient *client, gpointer data); 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, static Window createWindow(Window parent, gulong mask,
XSetWindowAttributes *attrib) XSetWindowAttributes *attrib)
@ -87,7 +87,7 @@ void focus_startup(gboolean reconfig)
XSetWindowAttributes attr; XSetWindowAttributes attr;
client_add_destructor(focus_cycle_destructor, NULL); 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 */ /* start with nothing focused */
focus_nothing(); focus_nothing();
@ -141,7 +141,7 @@ void focus_shutdown(gboolean reconfig)
if (!reconfig) { if (!reconfig) {
client_remove_destructor(focus_cycle_destructor); client_remove_destructor(focus_cycle_destructor);
client_remove_destructor(focus_tried_destructor); client_remove_hide_notify(focus_tried_hide_notify);
/* reset focus to root */ /* reset focus to root */
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime); XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
@ -942,7 +942,7 @@ ObClient *focus_order_find_first(guint desktop)
return NULL; return NULL;
} }
static void focus_tried_destructor(ObClient *client, gpointer data) static void focus_tried_hide_notify(ObClient *client, gpointer data)
{ {
XEvent ce; XEvent ce;