]> Dogcows Code - chaz/openbox/commitdiff
cleanups and add a server grab in getValue
authorDana Jansens <danakj@orodu.net>
Tue, 27 Aug 2002 12:49:04 +0000 (12:49 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 27 Aug 2002 12:49:04 +0000 (12:49 +0000)
src/XAtom.cc

index 27912abdeee02145bfedcdee907410695862d415..f751743b060fde14e9e641bb5bc3873751612a22 100644 (file)
@@ -365,41 +365,45 @@ bool XAtom::getValue(Window win, Atom atom, Atom type,
   unsigned long ret_bytes;
   int result;
   const 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,
                               &nelements, &ret_bytes, &c_val);
-  if (result != Success || ret_type != type || ret_size != size ||
-      nelements < 1) {
-    // an error occured, the property does not exist on the window, or is empty,
-    // or the wrong data is in property for the request
-    if (c_val) XFree(c_val);
-    return False;
-  }
-  // the data is correct, now, is there more elements left?
-  if (ret_bytes == 0 || maxread <= nelements) {
-    // we got the whole property's value
-    *value = new unsigned char[nelements * size/8 + 1];
-    memcpy(*value, c_val, nelements * size/8 + 1);
-    XFree(c_val);
-    return True;    
+  ret = (result == Success && ret_type == type && ret_size == size &&
+         nelements > 0);
+  if (ret) {
+    if (ret_bytes == 0 || maxread <= nelements) {
+      // we got the whole property's value
+      *value = new unsigned char[nelements * size/8 + 1];
+      memcpy(*value, c_val, nelements * size/8 + 1);
+    } else {
+      // get the entire property since it is larger than one long
+      XFree(c_val);
+      // the number of longs that need to be retreived to get the property's
+      // entire value. The last + 1 is the first long that we retrieved above.
+      int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
+      if (remain > size/8 * (signed)maxread) // dont get more than the max
+        remain = size/8 * (signed)maxread;
+      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);
+      *value = new unsigned char[nelements * size/8 + 1];
+      memcpy(*value, c_val, nelements * size/8 + 1);
+    }    
   }
-  // get the entire property since it is larger than one long
-  XFree(c_val);
-  // the number of longs that need to be retreived to get the property's entire
-  // value. The last + 1 is the first long that we retrieved above.
-  int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
-  if (remain > size/8 * (signed)maxread) // dont get more than the max
-    remain = size/8 * (signed)maxread;
-  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);
-  *value = new unsigned char[nelements * size/8 + 1];
-  memcpy(*value, c_val, nelements * size/8 + 1);
-  XFree(c_val);
-  return True;    
+  XUngrabServer(_display);
+  if (c_val) XFree(c_val);
+  return ret;
 }
 
 
This page took 0.029458 seconds and 4 git commands to generate.