[Xquartz-dev] Suggested patch for 64-bit pbproxy in SL

Jeremy Huddleston jeremyhu at apple.com
Sat Sep 5 13:40:09 PDT 2009


Hey Martin, could you give this patch a try?  I think it should do the  
trick.

diff --git a/hw/xquartz/pbproxy/x-selection.h b/hw/xquartz/pbproxy/x- 
selection.h
index d5bfcb5..fc903d0 100644
--- a/hw/xquartz/pbproxy/x-selection.h
+++ b/hw/xquartz/pbproxy/x-selection.h
@@ -41,6 +41,7 @@
  struct propdata {
  	unsigned char *data;
  	size_t length;
+	int format;
  };

  struct atom_list {
diff --git a/hw/xquartz/pbproxy/x-selection.m b/hw/xquartz/pbproxy/x- 
selection.m
index cd540be..4f2d848 100644
--- a/hw/xquartz/pbproxy/x-selection.m
+++ b/hw/xquartz/pbproxy/x-selection.m
@@ -77,7 +77,7 @@ static struct {

  @implementation x_selection

-static struct propdata null_propdata = {NULL, 0};
+static struct propdata null_propdata = {NULL, 0, 0};

  #ifdef DEBUG
  static void
@@ -212,6 +212,7 @@ get_property(Window win, Atom property, struct  
propdata *pdata, Bool delete, Ato

      pdata->data = buf;
      pdata->length = buflen;
+    pdata->format = format;

      return /*success*/ False;
  }
@@ -223,21 +224,20 @@ get_property(Window win, Atom property, struct  
propdata *pdata, Bool delete, Ato
  - (Atom) find_preferred:(struct propdata *)pdata
  {
      Atom a = None;
-    size_t i;
+    size_t i, step;
      Bool png = False, jpeg = False, utf8 = False, string = False;

      TRACE ();

-    if (pdata->length % sizeof (a))
+    if (pdata->format != 32)
      {
-	fprintf(stderr, "Atom list is not a multiple of the size of an atom! 
\n");
+	fprintf(stderr, "Atom list is expected to be formatted as an array  
of 32bit values.\n");
  	return None;
      }

-    for (i = 0; i < pdata->length; i += sizeof (a))
+    for (i = 0, step = pdata->format >> 3; i < pdata->length; i +=  
step)
      {
-	a = None;
-	memcpy (&a, pdata->data + i, sizeof (a));
+	a = (Atom)*(uint32_t *)(pdata->data + i);

  	if (a == atoms->image_png)
  	{




On Sep 4, 2009, at 07:41, Martin Otte wrote:

> Hi,
>
> After upgrading to SL, when using X11 I kept seeing "Atom list is  
> not a multiple of the size of an atom!" in my system logs, and also  
> noticed that copying between OSX and X11 was sometimes not working  
> (especially when "Update Pasteboard immediately" was checked).
>
> The problem is with the following lines in x-selection.m:
>    Atom a = None;
>
>    if (pdata->length % sizeof (a))
>    {
>       fprintf(stderr, "Atom list is not a multiple of the size of an  
> atom!\n");
>       return None;
>    }
>
> On i386, sizeof(a)=4, but on x86_64, sizeof(a)=8. However, it looks  
> like pdata->length is always a multiple of an int (4 bytes) even on  
> x86_64, so about half the time this check gets flagged and the code  
> to check the clipboard type is not run.
>
> My suggestion is just to use sizeof(int) instead of sizeof(a).  
> Looking through the server code, it looks like Atoms are always 32- 
> bit anyway when compiling the rest of the server, and are  
> sizeof(long) outside of the server.
>
> Here's a copy of the patch I used to fix pbproxy:
>
> --- xorg-server-1.4.2-apple47/hw/xquartz/pbproxy/x-selection.m.orig
> +++ xorg-server-1.4.2-apple47/hw/xquartz/pbproxy/x-selection.m
> @@ -228,16 +228,16 @@ get_property(Window win, Atom property,
>
>     TRACE ();
>
> -    if (pdata->length % sizeof (a))
> +    if (pdata->length % sizeof (int))
>     {
>        fprintf(stderr, "Atom list is not a multiple of the size of  
> an atom!\n");
>        return None;
>     }
>
> -    for (i = 0; i < pdata->length; i += sizeof (a))
> +    for (i = 0; i < pdata->length; i += sizeof (int))
>     {
>        a = None;
> -       memcpy (&a, pdata->data + i, sizeof (a));
> +       memcpy (&a, pdata->data + i, sizeof (int));
>
>        if (a == atoms->image_png)
>        {
> @@ -440,10 +440,6 @@ get_property(Window win, Atom property,
>            [self x_copy_request_targets];
>        }
>     }
> -    else
> -    {
> -       XBell (xpbproxy_dpy, 0);
> -    }
> }
>
> /* Set pbproxy as owner of the SELECTION_MANAGER selection.
>
>
> With this patch, I was able to copy an image from the OSX clipboard  
> to an X11 application (gnumeric), and later select this image in X11  
> and copy it back to OSX properly.
>
> I also removed a call to XBell in x-selection.m. For some reason,  
> when I selected some text in an xterm (or other Xaw applications),  
> whenever I clicked anywhere to un-highlight the selection the system  
> would beep. This only seems to be happening in Xaw-based apps with  
> "Update Pasteboard immediately" checked. The bell ringing was  
> driving me crazy, so I removed the call to XBell which is probably  
> not needed anyway.
>
> I hope this is useful,
> Martin
> _______________________________________________
> Xquartz-dev mailing list
> Xquartz-dev at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/xquartz-dev



More information about the Xquartz-dev mailing list