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:
parent
1e957a1688
commit
685dca1c5f
3 changed files with 48 additions and 8 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue