[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