yet more focus fixings. RevertToPointerRoot could mess things up focusing a client...
authorDana Jansens <danakj@orodu.net>
Sun, 30 Mar 2003 22:58:04 +0000 (22:58 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 30 Mar 2003 22:58:04 +0000 (22:58 +0000)
openbox/event.c
openbox/focus.c

index ad14f5c..8d1f444 100644 (file)
@@ -225,16 +225,6 @@ void event_process(XEvent *e)
     case FocusIn:
         g_message("FocusIn on %lx mode %d detail %d", window,
                   e->xfocus.mode, e->xfocus.detail);
-        if (client == NULL) {
-            /* says a client was not found for the event!
-               this is important whether the event is a valid type for us or
-               not! this makes the evil known as mozilla not DESTROY my
-               precious wm!! YES ITS FIVE AM AND I AM NOT SANE RIGHT NOW. FOCUS
-               EVENTS WILL DRIVE YOU MAD.
-             */
-            e->xfocus.window = None;
-        }
-
         /* NotifyAncestor is not ignored in FocusIn like it is in FocusOut
            because of RevertToPointerRoot. If the focus ends up reverting to
            pointer root on a workspace change, then the FocusIn event that we
@@ -242,8 +232,15 @@ void event_process(XEvent *e)
            for FocusOut, so it is safely ignored there.
         */
        if (e->xfocus.detail == NotifyInferior ||
-            e->xfocus.detail > NotifyNonlinearVirtual) return;
-            g_message("FocusIn on %lx", window);
+            e->xfocus.detail > NotifyNonlinearVirtual || client == NULL) {
+            /* says a client was not found for the event (or a valid FocusIn
+               event was not found.
+            */
+            e->xfocus.window = None;
+            return;
+        }
+
+        g_message("FocusIn on %lx", window);
         break;
     case FocusOut:
         g_message("FocusOut on %lx mode %d detail %d", window,
index 9d4f2e6..ab9ac05 100644 (file)
@@ -118,10 +118,17 @@ void focus_fallback(gboolean switching_desks)
     gboolean under = FALSE;
     Client *old = NULL;
 
+    old = focus_client;
+
+    /* unfocus any focused clients.. they can be focused by Pointer events
+       and such, and then when I try focus them, I won't get a FocusIn event
+       at all for them.
+    */
+    focus_set_client(NULL);
+
     if (switching_desks) {
         /* don't skip any windows when switching desktops */
-        old = focus_client;
-        focus_client = NULL;
+        old = NULL;
     } else {
         if (!config_get("focusFollowsMouse", Config_Bool, &focus_follow))
             g_assert_not_reached();
@@ -131,14 +138,11 @@ void focus_fallback(gboolean switching_desks)
 
     if (!under) {
         for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
-            if (it->data != focus_client && client_normal(it->data)) {
+            if (it->data != old && client_normal(it->data)) {
                 /* if we're switching desktops, and we get the already focused
                    window, then we wont get a FocusIn for it, so just restore
                    the focus_client so that we know it is focused */
-                if (it->data == old) {
-                    focus_client = old;
-                    break;
-                } else if (client_focus(it->data))
+                if (client_focus(it->data))
                     break;
             }
         }