{
assert(win != None); assert(atom != None); assert(type != None);
assert(size == 8 || size == 16 || size == 32);
- assert(*nelements > 0);
unsigned char *c_val = 0; // value alloc'd in Xlib, must be XFree()d
Atom ret_type;
int ret_size;
unsigned long ret_bytes;
int result;
- unsigned long maxread = *nelements;
bool ret = false;
// try get the first element
ret = (result == Success && ret_type == type && ret_size == size &&
*nelements > 0);
if (ret) {
- if (ret_bytes == 0 || maxread <= *nelements) {
+ if (ret_bytes == 0) {
// 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);
// 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 * (signed)maxread / 32) // dont get more than the max
- remain = size * (signed)maxread / 32;
+ long remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
result = XGetWindowProperty(**display, win, atom, 0l,
remain, false, type, &ret_type, &ret_size,
nelements, &ret_bytes, &c_val);
read of it, then stop here and try again. If it shrank, then this will
still work.
*/
- if (! ret)
- return get(win, atom, type, &maxread, value, size);
+ if (! ret) {
+ return get(win, atom, type, nelements, value, size);
+ }
*value = new unsigned char[*nelements * size/8 + 1];
memcpy(*value, c_val, *nelements * size/8 + 1);
bool Property::get(Window win, Atom atom, Atom type, unsigned long *value)
{
unsigned long *temp;
- unsigned long num = 1;
+ unsigned long num;
if (! get(win, atom, type, &num, (unsigned char **) &temp, 32))
return false;
- *value = temp[0];
- delete [] temp;
- return true;
+ if (num >= 1) {
+ *value = temp[0];
+ delete [] temp;
+ return true;
+ }
+ return false;
}
bool Property::get(Window win, Atom atom, StringType type, ustring *value)
{
- unsigned long n = 1;
+ unsigned long n;
StringVect s;
- if (get(win, atom, type, &n, &s)) {
+ if (get(win, atom, type, &n, &s) && n > 0) {
*value = s[0];
return true;
}
bool Property::get(Window win, Atom atom, StringType type,
unsigned long *nelements, StringVect *strings)
{
- assert(*nelements > 0);
-
Atom t;
bool u; // utf8 encoded?
switch (type) {
}
unsigned char *value;
- unsigned long elements = (unsigned) -1;
+ unsigned long elements;;
if (!get(win, atom, t, &elements, &value, 8) || elements < 1)
return false;
std::string::const_iterator it = s.begin(), end = s.end();
unsigned long num = 0;
- while(num < *nelements) {
+ while(true) {
std::string::const_iterator tmp = it; // current string.begin()
it = std::find(tmp, end, '\0'); // look for null between tmp and end
strings->push_back(std::string(tmp, it)); // s[tmp:it)
struct returned by Property::atoms.
@param type The Atom value of the property type. This can be found in the
struct returned by Property::atoms.
- @param nelements The maximum number of elements to retrieve from the
- property (assuming it has more than 1 value in it). To
- retrieve all possible elements, use "(unsigned) -1".<br>
- When the function returns, if it returns true, this will
+ @param nelements When the function returns, if it returns true, this will
contain the actual number of elements retrieved.<br>
@param value If the function returns true, then this contains an array of
retrieved values for the property.<br>
struct returned by Property::atoms.
@param type A member of the Property::StringType enum that specifies the
type of the string property to retrieve
- @param nelements The maximum number of strings to retrieve from the
- property (assuming it has more than 1 string in it). To
- retrieve all possible strings, use "(unsigned) -1".<br>
- When the function returns, if it returns true, this will
+ @param nelements When the function returns, if it returns true, this will
contain the actual number of strings retrieved.<br>
@param strings If the function returns true, then this contains all of the
strings retrieved from the property's value.