- XGetWindowProperty(_display, win, atom, 0l, 1l, False, AnyPropertyType,
- &ret_type, &ret_size, &nelements, &ret_bytes, &c_val);
- if (ret_type == None || nelements < 1)
- // the property does not exist on the window or is empty
- return false;
- if (ret_type != type || ret_size != size) {
- // wrong data in property
- XFree(c_val);
- return false;
+ result = XGetWindowProperty(_display, win, atom, 0l, 1l, False,
+ AnyPropertyType, &ret_type, &ret_size,
+ &nelements, &ret_bytes, &c_val);
+ 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);
+ }