]> Dogcows Code - chaz/openbox/commitdiff
sync with the 2.0 branch (make XAtom::getValue not use an XGrabServer)
authorDana Jansens <danakj@orodu.net>
Sun, 1 Sep 2002 09:51:54 +0000 (09:51 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 1 Sep 2002 09:51:54 +0000 (09:51 +0000)
src/XAtom.cc

index f751743b060fde14e9e641bb5bc3873751612a22..bfd58483e7bb6f1b41995408ec18d8df15e2623e 100644 (file)
@@ -364,15 +364,9 @@ bool XAtom::getValue(Window win, Atom atom, Atom type,
   int ret_size;
   unsigned long ret_bytes;
   int result;
-  const unsigned long maxread = nelements;
+  unsigned long maxread = nelements;
   bool ret = False;
 
-  /*
-    Grab the server because this takes 2 reads and if it changes between, it
-    totally screws everything up.
-  */
-  XGrabServer(_display);
-
   // try get the first element
   result = XGetWindowProperty(_display, win, atom, 0l, 1l, False,
                               AnyPropertyType, &ret_type, &ret_size,
@@ -395,13 +389,20 @@ bool XAtom::getValue(Window win, Atom atom, Atom type,
       result = XGetWindowProperty(_display, win, atom, 0l, remain, False, type,
                                   &ret_type, &ret_size, &nelements, &ret_bytes,
                                   &c_val);
-      assert(result == Success);
-      assert(ret_bytes == 0);
+      ret = (result == Success && ret_type == type && ret_size == size &&
+             ret_bytes == 0);
+      /*
+        If the property has changed type/size, or has grown since our first
+        read of it, then stop here and try again. If it shrank, then this will
+        still work.
+      */
+      if (! ret)
+        return getValue(win, atom, type, maxread, value, size);
+  
       *value = new unsigned char[nelements * size/8 + 1];
       memcpy(*value, c_val, nelements * size/8 + 1);
     }    
   }
-  XUngrabServer(_display);
   if (c_val) XFree(c_val);
   return ret;
 }
This page took 0.030211 seconds and 4 git commands to generate.