From: Jan Djärv Date: Mon, 7 Feb 2005 20:00:07 +0000 (+0000) Subject: * xfns.c (Fx_change_window_property): Use long array when format is 32. X-Git-Tag: ttn-vms-21-2-B4~2367 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=fede04ef9f8e5625d353b38ea067706e446ea1a5;p=emacs.git * 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. --- diff --git a/src/xfns.c b/src/xfns.c index bc9b4a5c993..bf1b0273a0f 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -4067,8 +4067,13 @@ Value is VALUE. */) data = (unsigned char *) xmalloc (nelements); else if (element_format == 16) data = (unsigned char *) xmalloc (nelements*2); - else - 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 + elements." + 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); else