summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-05 23:34:48 +0000
committerDana Jansens <danakj@orodu.net>2007-05-05 23:34:48 +0000
commitc1a5ad45a8f02cd0728852c3765f411d7b12dec3 (patch)
tree3632c65bfdacb4b8b012940b7d1b72de368faf23 /openbox
parent2f5727ffe9196fe9d4c7442116680254b5e76561 (diff)
fix stupid apps focusing. yah.
Diffstat (limited to 'openbox')
-rw-r--r--openbox/event.c47
1 files changed, 35 insertions, 12 deletions
diff --git a/openbox/event.c b/openbox/event.c
index 25460a71..5ef329c3 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -421,20 +421,43 @@ static void event_process(const XEvent *ec, gpointer data)
event_handle_menu(e);
} else if (e->type == FocusIn) {
if (e->xfocus.detail == NotifyPointerRoot ||
- e->xfocus.detail == NotifyDetailNone)
+ e->xfocus.detail == NotifyDetailNone ||
+ e->xfocus.detail == NotifyInferior)
{
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
- /* Focus has been reverted to the root window or nothing.
- FocusOut events come after UnmapNotify, so we don't need to
- worry about focusing an invalid window
- */
- if (!focus_left_screen)
- focus_fallback(TRUE);
- } else if (e->xfocus.detail == NotifyInferior) {
+ XEvent ce;
ob_debug_type(OB_DEBUG_FOCUS,
- "Focus went to root or our frame window");
- /* Focus has been given to the root window. */
- focus_fallback(TRUE);
+ "Focus went to pointer root/none or to our frame "
+ "window\n");
+
+ /* If another FocusIn is in the queue then don't fallback yet. This
+ fixes the fun case of:
+ window map -> send focusin
+ window unmap -> get focusout
+ window map -> send focusin
+ get first focus out -> fall back to something (new window
+ hasn't received focus yet, so something else) -> send focusin
+ which means the "something else" is the last thing to get a
+ focusin sent to it, so the new window doesn't end up with focus.
+ */
+ if (XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) {
+ XPutBackEvent(ob_display, &ce);
+ ob_debug_type(OB_DEBUG_FOCUS,
+ " but another FocusIn is coming\n)");
+ } else {
+ /* Focus has been reverted to the root window, nothing, or to
+ our frame window.
+
+ FocusOut events come after UnmapNotify, so we don't need to
+ worry about focusing an invalid window
+ */
+
+ /* In this case we know focus is in our screen */
+ if (e->xfocus.detail == NotifyInferior)
+ focus_left_screen = FALSE;
+
+ if (!focus_left_screen)
+ focus_fallback(TRUE);
+ }
} else if (client && client != focus_client) {
focus_left_screen = FALSE;
frame_adjust_focus(client->frame, TRUE);