X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FXAtom.cc;h=bfd58483e7bb6f1b41995408ec18d8df15e2623e;hb=fa3fb793e7e8a4d7dfdc1d4997983ea59a8b6924;hp=f751743b060fde14e9e641bb5bc3873751612a22;hpb=d139e299d5c247fec472f177c4bca9b8d2bcbd06;p=chaz%2Fopenbox diff --git a/src/XAtom.cc b/src/XAtom.cc index f751743b..bfd58483 100644 --- a/src/XAtom.cc +++ b/src/XAtom.cc @@ -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; }