diff -up lesstif-0.95.0/lib/Xm-2.1/CutPaste.c.XxxxProperty-64bit lesstif-0.95.0/lib/Xm-2.1/CutPaste.c --- lesstif-0.95.0/lib/Xm-2.1/CutPaste.c.XxxxProperty-64bit 2004-08-28 21:22:43.000000000 +0200 +++ lesstif-0.95.0/lib/Xm-2.1/CutPaste.c 2007-09-16 18:42:27.000000000 +0200 @@ -62,7 +62,7 @@ static void _XmClipboardDeleteMarked(Dis XmClipboard * clip); static void _XmClipboardDeleteFormat(Display *display, int id); static int _XmClipboardRegisterFormat(Display *display, char *format_name, - int format_len); + long format_len); static void _XmClipboardDeleteFormats(Display *display, Window window, int id); static void _XmClipboardDeleteItem(Display *display, Window window, XmClipboard * clip, unsigned item); @@ -241,7 +241,7 @@ _XmClipboardDeleteItemLabel(Display *dis static int -_XmClipboardRegisterFormat(Display *display, char *format_name, int format_len) +_XmClipboardRegisterFormat(Display *display, char *format_name, long format_len) { Atom fmt; int flen; @@ -606,7 +606,17 @@ _XmClipboardGetWindowProperty(Display *d ret_buf = (unsigned *)XtRealloc((char *)ret_buf, alloc_size + alloc_incr + 1); - memcpy(&ret_buf[offset], prop, alloc_incr); + /* Fixup X*Property long == 32 bits confusion if needed */ + if (actual_format == 32 && sizeof(long) != 4) + { + int i; + unsigned long *in = (unsigned long *)prop; + + for (i = 0; i < nitems; i++) + ret_buf[offset + i] = in[i]; + } + else + memcpy(&ret_buf[offset], prop, alloc_incr); alloc_size += alloc_incr; switch (actual_format) @@ -1001,8 +1011,9 @@ _XmClipboardReplaceItem(Display *display { Window root; Atom item; - int nunits, tstart, tlen; + int i, nunits, tstart, tlen; long transferlen; + long *convert_buf = NULL; root = DefaultRootWindow(display); item = _XmClipboardGetAtomFromId(display, id); @@ -1014,6 +1025,14 @@ _XmClipboardReplaceItem(Display *display case 32: len >>= 2; nunits = transferlen; + /* XChangeProperty expects a buffer of longs when receiving 32 bits + data, MEUHH */ + if (sizeof(long) != 4) + { + convert_buf = XtMalloc(len * sizeof(long)); + for (i = 0; i < len; i++) + convert_buf[i] = data[i]; + } break; case 16: @@ -1040,7 +1059,9 @@ _XmClipboardReplaceItem(Display *display } XChangeProperty(display, root, item, item, format, mode, - (unsigned char *)&data[tstart], tlen); + convert_buf? (unsigned char *)&convert_buf[tstart] : + (unsigned char *)&data[tstart], + tlen); len -= tlen; mode = PropModeAppend; @@ -1160,7 +1181,7 @@ _XmClipboardGetLenFromFormat(Display *di } else { - *format = *((int *)(prop)); + *format = *((long *)(prop)); ret = True; } diff -up lesstif-0.95.0/clients/Motif-2.1/mwm/props.c.XxxxProperty-64bit lesstif-0.95.0/clients/Motif-2.1/mwm/props.c --- lesstif-0.95.0/clients/Motif-2.1/mwm/props.c.XxxxProperty-64bit 2004-08-28 21:25:46.000000000 +0200 +++ lesstif-0.95.0/clients/Motif-2.1/mwm/props.c 2007-09-16 18:41:04.000000000 +0200 @@ -92,15 +92,28 @@ PROP_Initialize(void) void PROP_SetBehavior(ScreenInfo *scr, Boolean custom) { - PropMotifWmInfo info; + long info[PROP_MWM_INFO_ELEMENTS]; - /* set the MWM_INFO property on the Root */ + /* set the MWM_INFO property on the Root, notice that we + use an array of longs here and not the PropMotifWmInfo struct, + this is because this struct looks like this in lesstif: + + typedef struct { + CARD32 flags; + CARD32 wmWindow; + } PropMotifWmInfo; + + But when setting 32 bit properties XChangeProperty expects an array of + longs, which it will convert to 32 bit values if need. Thus passing an + actual PropMotifWmInfo struct will mess things up on archs where longs + are 64 bit. */ + if (custom) - info.flags = MWM_INFO_STARTUP_CUSTOM; + info[0] = MWM_INFO_STARTUP_CUSTOM; /* set flags "member" */ else - info.flags = MWM_INFO_STARTUP_STANDARD; + info[0] = MWM_INFO_STARTUP_STANDARD; /* set flags "member" */ - info.wmWindow = scr->root_win; + info[1] = scr->root_win; /* set wmWindow "member" */ XChangeProperty(dpy, scr->root_win, XA_MWM_INFO, XA_MWM_INFO, 32, PropModeReplace, @@ -129,7 +142,18 @@ PROP_GetBehavior(ScreenInfo *scr) int actual_format, ret; Atom actual_type; unsigned long nitems, bytesafter; - PropMotifWmInfo *info; + /* We use a long pointer here and not a PropMotifWmInfo pointer, + this is because this type looks like this in lesstif: + + typedef struct { + CARD32 flags; + CARD32 wmWindow; + } PropMotifWmInfo; + + But when getting 32 bit properties XGetWindowProperty returns an array + of longs. Thus interpreting the returned data as PropMotifWmInfo will + mess things up on archs where longs are 64 bit. */ + unsigned long *info; if (XGetWindowProperty(dpy, scr->root_win, XA_MWM_INFO, 0L, PROP_MOTIF_WM_INFO_ELEMENTS, False, @@ -138,7 +162,7 @@ PROP_GetBehavior(ScreenInfo *scr) (unsigned char **)&info) == Success) { if (nitems > 0 && info) - ret = info->flags; + ret = info[0]; /* Return flags "member" */ else ret = 0; XFree((char *)info); @@ -284,7 +308,21 @@ PROP_GetMwmHints(MwmWindow *win) { if (nitems >= PROP_MOTIF_WM_HINTS_ELEMENTS) + { + /* Fixup X*Property long == 32 bits confusion if needed */ + if (sizeof(long) != 4) + { + long *prop_hints = (long *)win->mwm_hints; + win->mwm_hints = XtMalloc(sizeof(MwmHints)); + win->mwm_hints->flags = prop_hints[0]; + win->mwm_hints->functions = prop_hints[1]; + win->mwm_hints->decorations = prop_hints[2]; + win->mwm_hints->input_mode = prop_hints[3]; + win->mwm_hints->status = prop_hints[4]; + XFree(prop_hints); + } return; + } XFree((char *)win->mwm_hints); }