have to fallback in client_unmanage, until we figure out a way to hear those focusin...
authorDana Jansens <danakj@orodu.net>
Thu, 26 Apr 2007 06:10:13 +0000 (06:10 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 26 Apr 2007 06:10:13 +0000 (06:10 +0000)
openbox/client.c

index 84f739a..7fcc066 100644 (file)
@@ -493,9 +493,22 @@ void client_unmanage(ObClient *self)
 
     /* update the focus lists */
     focus_order_remove(self);
-    /* don't leave an invalid focus_client */
-    if (self == focus_client)
+    if (self == focus_client) {
+        /* we have to fall back here because we might not get a focus out.
+           1. we need to xselectinput off the window before we unmap it because
+           otherwise we end up getting unmapnotifies we don't want and they
+           can mess up mapping it again quickly
+           2. this means that if we unmanage from a synthetic unmapnotify, we
+              are the ones unmapped it, and causing the focusout. so we won't
+              get the focusout event.
+           3. we can't handle focusin events on the root window because they
+              come from all screens, so the focus change gets lost
+        */
+        focus_fallback(FALSE);
+
+        /* don't leave an invalid focus_client */
         focus_client = NULL;
+    }
 
     client_list = g_list_remove(client_list, self);
     stacking_remove(self);