]> git.eshelyaron.com Git - emacs.git/commitdiff
* xselect.c (selection_data_to_lisp_data): For the special case
authorJan Djärv <jan.h.d@swipnet.se>
Tue, 8 Feb 2005 21:27:01 +0000 (21:27 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Tue, 8 Feb 2005 21:27:01 +0000 (21:27 +0000)
type == XA_ATOM, data contains array of int, not array of Atom.
(x_property_data_to_lisp, selection_data_to_lisp_data): Comment
update: data must be array of int for format == 32.

src/ChangeLog
src/xselect.c

index 4c628e025aae6a2d664c6d673051eff1cd6e32f1..aaf0ac1e3d0b2459c1bd75c71db2c24fa3218158 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-08  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * xselect.c (selection_data_to_lisp_data): For the special case
+       type == XA_ATOM, data contains array of int, not array of Atom.
+       (x_property_data_to_lisp, selection_data_to_lisp_data): Comment
+       update: data must be array of int for format == 32.
+
 2005-02-08  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * undo.c (Fprimitive_undo): Check veracity of delta,start,end.
index f54e685873a162cef0020c80a030d82c52eefb7a..bf37cde4d0bfbd0be00c733b00bde2da315da94e 100644 (file)
@@ -1769,7 +1769,11 @@ x_get_window_property_as_lisp_data (display, window, property, target_type,
 
    When converting an object to C, it may be of the form (SYMBOL . <data>)
    where SYMBOL is what we should claim that the type is.  Format and
-   representation are as above.  */
+   representation are as above.
+
+   Important: When format is 32, data should contain an array of int,
+   not an array of long as the X library returns.  This makes a difference
+   when sizeof(long) != sizeof(int).  */
 
 
 
@@ -1811,15 +1815,21 @@ selection_data_to_lisp_data (display, data, size, type, format)
   else if (type == XA_ATOM)
     {
       int i;
-      if (size == sizeof (Atom))
-       return x_atom_to_symbol (display, *((Atom *) data));
+      /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
+         But the callers of these function has made sure the data for
+         format == 32 is an array of int.  Thus, use int instead
+         of Atom.  */
+      int *idata = (int *) data;
+
+      if (size == sizeof (int))
+       return x_atom_to_symbol (display, (Atom) idata[0]);
       else
        {
-         Lisp_Object v = Fmake_vector (make_number (size / sizeof (Atom)),
+         Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
                                        make_number (0));
-         for (i = 0; i < size / sizeof (Atom); i++)
+         for (i = 0; i < size / sizeof (int); i++)
            Faset (v, make_number (i),
-                  x_atom_to_symbol (display, ((Atom *) data) [i]));
+                   x_atom_to_symbol (display, (Atom) idata[i]));
          return v;
        }
     }
@@ -2560,6 +2570,10 @@ x_fill_property_data (dpy, data, ret, format)
    be stored in RET.
    SIZE is the number of elements in DATA.
 
+   Important: When format is 32, data should contain an array of int,
+   not an array of long as the X library returns.  This makes a difference
+   when sizeof(long) != sizeof(int).
+
    Also see comment for selection_data_to_lisp_data above.  */
 
 Lisp_Object