all repos — openbox @ fd382fcc36552614176c929c1a1a687fb52c0da0

openbox fork - make it a bit more like ryudo

allow focus to disappear to black holes. (that is, windows not managed by openbox). the black hole may just be a window on another monitor. keyboard events aren't going to work in this scenario, though.
Dana Jansens danakj@orodu.net
commit

fd382fcc36552614176c929c1a1a687fb52c0da0

parent

e227ac841e1fc7423c90fbd2c13ba379461a39c1

2 files changed, 19 insertions(+), 6 deletions(-)

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

@@ -333,6 +333,11 @@ /* This means focus moved from one client to another */

if (detail == NotifyNonlinearVirtual) return TRUE; + /* This means focus reverted off of a client */ + if (detail == NotifyPointerRoot || detail == NotifyDetailNone || + detail == NotifyInferior) + return TRUE; + /* Otherwise.. */ return FALSE; } else {

@@ -657,17 +662,25 @@ case FocusOut:

/* Look for the followup FocusIn */ if (!XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) { /* There is no FocusIn, this means focus went to a window that - is not being managed. most likely, this went to PointerRoot - or None, meaning the window is no longer around so fallback - focus, but not to that window */ + is not being managed, or a window on another screen. */ ob_debug("Focus went to a black hole !\n"); - focus_fallback(FALSE); } else if (ce.xany.window == e->xany.window) { /* If focus didn't actually move anywhere, there is nothing to do*/ break; + } else if (ce.xfocus.detail == NotifyPointerRoot || + ce.xfocus.detail == NotifyDetailNone) { + ob_debug("Focus went to root\n"); + /* Focus has been reverted to the root window or nothing, so fall + back to something other than the window which just had it. */ + focus_fallback(FALSE); + } else if (ce.xfocus.detail == NotifyInferior) { + ob_debug("Focus went to parent\n"); + /* Focus has been reverted to parent, which is our frame window, + so fall back to something other than the window which had it. */ + focus_fallback(FALSE); } else { /* Focus did move, so process the FocusIn event */ - ObEventData ed; + ObEventData ed = { .ignored = FALSE }; event_process(&ce, &ed); if (ed.ignored) { /* The FocusIn was ignored, this means it was on a window
M openbox/screen.copenbox/screen.c

@@ -45,7 +45,7 @@

/*! The event mask to grab on the root window */ #define ROOT_EVENTMASK (StructureNotifyMask | PropertyChangeMask | \ EnterWindowMask | LeaveWindowMask | \ - SubstructureRedirectMask | \ + SubstructureRedirectMask | FocusChangeMask | \ ButtonPressMask | ButtonReleaseMask | ButtonMotionMask) guint screen_num_desktops;