all repos — openbox @ 415ce6e5de964ad4dda6b58694c73f45aa38c3b7

openbox fork - make it a bit more like ryudo

watch for errors while setting focus on windows, return false if there was an error, so fallback and keep looking
Dana Jansens danakj@orodu.net
commit

415ce6e5de964ad4dda6b58694c73f45aa38c3b7

parent

2e7359a2fd4fa7cad349651392348553c9623053

1 files changed, 11 insertions(+), 12 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -3355,6 +3355,8 @@ }

gboolean client_focus(ObClient *self) { + gboolean error; + /* choose the correct target */ self = client_focus_target(self);

@@ -3380,13 +3382,14 @@ */

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 @@ ce.xclient.data.l[4] = 0l;

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.