summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-14 22:52:40 +0000
committerDana Jansens <danakj@orodu.net>2007-05-14 22:52:40 +0000
commit415ce6e5de964ad4dda6b58694c73f45aa38c3b7 (patch)
tree4edd0b0a349876b09b6ec46f2f6f24c5993f2fdd
parent2e7359a2fd4fa7cad349651392348553c9623053 (diff)
watch for errors while setting focus on windows, return false if there was an error, so fallback and keep looking
-rw-r--r--openbox/client.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 16c24937..888e532b 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -3355,6 +3355,8 @@ gboolean client_can_focus(ObClient *self)
gboolean client_focus(ObClient *self)
{
+ gboolean error;
+
/* choose the correct target */
self = client_focus_target(self);
@@ -3380,13 +3382,14 @@ gboolean client_focus(ObClient *self)
if (keyboard_interactively_grabbed())
keyboard_interactive_cancel();
+ error = FALSE;
+ xerror_set_ignore(TRUE);
+
if (self->can_focus) {
/* This can cause a BadMatch error with CurrentTime, or if an app
passed in a bad time for _NET_WM_ACTIVE_WINDOW. */
- xerror_set_ignore(TRUE);
XSetInputFocus(ob_display, self->window, RevertToPointerRoot,
event_curtime);
- xerror_set_ignore(FALSE);
}
if (self->focus_notify) {
@@ -3404,17 +3407,13 @@ gboolean client_focus(ObClient *self)
XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
}
-#ifdef DEBUG_FOCUS
- ob_debug("%sively focusing %lx at %d\n",
- (self->can_focus ? "act" : "pass"),
- self->window, (gint) event_curtime);
-#endif
+ /* This calls XSync, which will cause the FocusIn to come back to us.
+ That's important for desktop switches, since otherwise we'll have no
+ FocusIn on the queue and end up falling back again. */
+ xerror_set_ignore(FALSE);
+ if (!xerror_occured) error = TRUE;
- /* Cause the FocusIn to come back to us. Important for desktop switches,
- since otherwise we'll have no FocusIn on the queue and send it off to
- the focus_backup. */
- XSync(ob_display, FALSE);
- return TRUE;
+ return !error;
}
/*! Present the client to the user.