]> git.eshelyaron.com Git - emacs.git/commitdiff
* xfns.c (Fx_change_window_property): Use long array when format is 32.
authorJan Djärv <jan.h.d@swipnet.se>
Mon, 7 Feb 2005 20:00:07 +0000 (20:00 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Mon, 7 Feb 2005 20:00:07 +0000 (20:00 +0000)
(Fx_window_property): If format is 32 and long is bigger than 32 bits,
convert long array returned from XGetWindowProperty to an int array.

src/xfns.c

index bc9b4a5c9936b631fd620796edd94f93b24522b7..bf1b0273a0f177bd3c574d829a79df476cdd2634 100644 (file)
@@ -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