Commit fede04ef authored by Jan Djärv's avatar Jan Djärv
Browse files

* xfns.c (Fx_change_window_property): Use long array when format is 32.

(Fx_window_property): If format is 32 and long is bigger than 32 bits,
convert long array returned from XGetWindowProperty to an int array.
parent e22cf39c
......@@ -4067,8 +4067,13 @@ Value is VALUE. */)
data = (unsigned char *) xmalloc (nelements);
else if (element_format == 16)
data = (unsigned char *) xmalloc (nelements*2);
data = (unsigned char *) xmalloc (nelements*4);
else /* format == 32 */
/* The man page for XChangeProperty:
"If the specified format is 32, the property data must be a
long array."
This applies even if long is more than 64 bits. The X library
converts to 32 bits before sending to the X server. */
data = (unsigned char *) xmalloc (nelements * sizeof(long));
x_fill_property_data (FRAME_X_DISPLAY (f), value, data, element_format);
......@@ -4203,6 +4208,30 @@ no value of TYPE. */)
(unsigned char **) &tmp_data);
if (rc == Success && tmp_data)
/* The man page for XGetWindowProperty says:
"If the returned format is 32, the returned data is represented
as a long array and should be cast to that type to obtain the
This applies even if long is more than 32 bits, the X library
converts from 32 bit elements received from the X server to long
and passes the long array to us. Thus, for that case bcopy can not
be used. We convert to a 32 bit type here, because so much code
assume on that.
The bytes and offsets passed to XGetWindowProperty refers to the
property and those are indeed in 32 bit quantities if format is
32. */
if (actual_format == 32 && actual_format < BITS_PER_LONG)
unsigned long i;
int *idata = (int *) tmp_data;
long *ldata = (long *) tmp_data;
for (i = 0; i < actual_size; ++i)
idata[i]= (int) ldata[i];
if (NILP (vector_ret_p))
prop_value = make_string (tmp_data, size);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment