GList *client_list = NULL;
static GSList *client_destroy_notifies = 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);
}
}
-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_hide_notifies, 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;
void client_hide(ObClient *self)
{
- if (!client_should_show(self)) {
+ if (!client_should_show(self))
frame_hide(self->frame);
- client_call_notifies(self, client_hide_notifies);
- }
-
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
needs to be in IconicState. This includes when it is on another
desktop!
void client_showhide(ObClient *self)
{
- if (client_should_show(self)) {
+ if (client_should_show(self))
frame_show(self->frame);
- }
- else {
+ else
frame_hide(self->frame);
- client_call_notifies(self, client_hide_notifies);
- }
-
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
needs to be in IconicState. This includes when it is on another
desktop!
GList *focus_order = NULL;
ObClient *focus_cycle_target = NULL;
-/*! This variable is used for focus fallback. If we fallback to a window, we
- set this to the window. And when focus goes somewhere after that, it will
- be set to NULL. If between falling back to that window and something
- getting focused, the window gets unmanaged, then if there are no incoming
- FocusIn events, we fallback again because focus has just gotten itself lost.
- */
-static ObClient *focus_tried = NULL;
-
struct {
InternalWindow top;
InternalWindow left;
gboolean dock_windows,
gboolean desktop_windows);
static void focus_cycle_destroy_notify(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_destroy_notify(focus_cycle_destroy_notify, NULL);
- client_add_destroy_notify(focus_tried_hide_notify, NULL);
- client_add_hide_notify(focus_tried_hide_notify, NULL);
/* start with nothing focused */
focus_nothing();
if (!reconfig) {
client_remove_destroy_notify(focus_cycle_destroy_notify);
- client_remove_destroy_notify(focus_tried_hide_notify);
- client_remove_hide_notify(focus_tried_hide_notify);
/* reset focus to root */
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
PROP_SET32(RootWindow(ob_display, ob_screen),
net_active_window, window, active);
}
-
-
- focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
- ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
}
static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
event at all for them. */
focus_nothing();
- if (new) {
+ if (new)
client_focus(new);
- /* remember that we tried to send focus here */
- focus_tried = new;
-
- ob_debug_type(OB_DEBUG_FOCUS, "focus tried = %s\n", new->title);
- }
return new;
}
focus_client = NULL;
*/
- focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
- ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
-
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events
and ignore them !
}
return NULL;
}
-
-static void focus_tried_hide_notify(ObClient *client, gpointer data)
-{
- XEvent ce;
-
- ob_debug_type(OB_DEBUG_FOCUS, "checking focus tried (%s) against %s\n",
- (focus_tried?focus_tried->title:"(null)"), client->title);
-
- if (client == focus_tried) {
- /* we were trying to focus this window but it's gone */
-
- focus_tried = NULL;
-
- ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
- "is being unmanaged:\n");
- if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,NULL))
- {
- XPutBackEvent(ob_display, &ce);
- ob_debug_type(OB_DEBUG_FOCUS, " but another FocusIn is coming\n");
- } else {
- ob_debug_type(OB_DEBUG_FOCUS, " so falling back focus again.\n");
- focus_fallback(TRUE);
- }
- }
-}