don't manage override_redirect windows.
authorDana Jansens <danakj@orodu.net>
Wed, 29 Jan 2003 08:59:13 +0000 (08:59 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 29 Jan 2003 08:59:13 +0000 (08:59 +0000)
don't manage windows for whome get attributes fails.
validate the client before managing it.

src/screen.cc

index b0c071a..e2bab5c 100644 (file)
@@ -433,16 +433,34 @@ void Screen::manageWindow(Window window)
   Client *client = 0;
   XWMHints *wmhint;
   XSetWindowAttributes attrib_set;
+  XEvent e;
+  XWindowAttributes attrib;
 
   otk::display->grab();
 
+  // check if it has already been unmapped by the time we started mapping
+  // the grab does a sync so we don't have to here
+  if (XCheckTypedWindowEvent(**otk::display, window, DestroyNotify, &e) ||
+      XCheckTypedWindowEvent(**otk::display, window, UnmapNotify, &e)) {
+    XPutBackEvent(**otk::display, &e);
+    
+    otk::display->ungrab();
+    return; // don't manage it
+  }
+  
+  if (!XGetWindowAttributes(**otk::display, window, &attrib) ||
+      attrib.override_redirect) {
+    otk::display->ungrab();
+    return; // don't manage it
+  }
+  
   // is the window a docking app
   if ((wmhint = XGetWMHints(**otk::display, window))) {
     if ((wmhint->flags & StateHint) &&
         wmhint->initial_state == WithdrawnState) {
       //slit->addClient(w); // XXX: make dock apps work!
-      otk::display->ungrab();
 
+      otk::display->ungrab();
       XFree(wmhint);
       return;
     }