all repos — openbox @ e93ce605685968ca9c48ca2141dd458f9457a6db

openbox fork - make it a bit more like ryudo

sync with the 2.0 branch (make XAtom::getValue not use an XGrabServer)
Dana Jansens danakj@orodu.net
commit

e93ce605685968ca9c48ca2141dd458f9457a6db

parent

923c381dc177aa64b1da847ae6a27bff19ec817c

1 files changed, 11 insertions(+), 10 deletions(-)

jump to
M src/XAtom.ccsrc/XAtom.cc

@@ -364,14 +364,8 @@ Atom ret_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,

@@ -395,13 +389,20 @@ 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); + 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; }