Index: xli-1.17+git20170726.0bb4fb4/root.c
===================================================================
--- xli-1.17+git20170726.0bb4fb4.orig/root.c
+++ xli-1.17+git20170726.0bb4fb4/root.c
@@ -16,17 +16,6 @@
 
 #define RETAIN_PROP_NAME	"_XSETROOT_ID"
 
-static void updateProperty(Display * dpy, Window w, char *name, Atom type, int format, int data, int nelem)
-{
-	/* intern the property name */
-	Atom atom = XInternAtom(dpy, name, 0);
-
-	/* create or replace the property */
-	XChangeProperty(dpy, w, atom, type, format, PropModeReplace,
-			(unsigned char *) &data, nelem);
-}
-
-
 /* Sets the close-down mode of the client to 'RetainPermanent'
  * so all client resources will be preserved after the client
  * exits.  Puts a property on the default root window containing
@@ -37,9 +26,15 @@ static void preserveResource(Display * d
 {
 	/* create dummy resource */
 	Pixmap pm = XCreatePixmap(dpy, w, 1, 1, 1);
+        unsigned char *data = (unsigned char *) &pm;
 
-	/* create/replace the property */
-	updateProperty(dpy, w, RETAIN_PROP_NAME, XA_PIXMAP, 32, (int) pm, 1);
+        /* intern the property name */
+        char *name = RETAIN_PROP_NAME;
+        Atom atom = XInternAtom(dpy, name, 0);
+
+        /* create or replace the property */
+        XChangeProperty(dpy, w, atom, XA_PIXMAP, 32, PropModeReplace,
+                 data, sizeof(Pixmap)/4);
 
 	/* retain all client resources until explicitly killed */
 	XSetCloseDownMode(dpy, RetainPermanent);
@@ -50,33 +45,61 @@ static void preserveResource(Display * d
  * if any exist.
  */
 
-static void freePrevious(Display * dpy, Window w)
+static void freePrevious(Display * dpy, Window w, unsigned int verbose)
 {
-	Pixmap *pm;
-	Atom actual_type;	/* NOTUSED */
 	int format;
-       unsigned long	nitems;
-       unsigned long	bytes_after;
+        Pixmap *pm;
+        unsigned char *charpm;
+        Atom actual_type;
+        unsigned long	nitems;
+        unsigned long	bytes_after;
+        int returncode;
 
 	/* intern the property name */
 	Atom atom = XInternAtom(dpy, RETAIN_PROP_NAME, 0);
 
 	/* look for existing resource allocation */
-	if ((XGetWindowProperty(dpy, w, atom, 0, 1, 1 /*delete */ ,
-				AnyPropertyType, &actual_type, &format,
-				&nitems, &bytes_after,
-				(unsigned char **) &pm) == Success) &&
-	    nitems == 1) {
-		if ((actual_type == XA_PIXMAP) && (format == 32) &&
-		    (nitems == 1) && (bytes_after == 0)) {
-			/* blast it away */
-			XKillClient(dpy, (XID) * pm);
-			XFree((caddr_t) pm);
-		} else if (actual_type != None) {
-			fprintf(stderr, "%s: warning: invalid format encountered for property %s\n",
-				"xli", RETAIN_PROP_NAME);
-		}
-	}
+        nitems = sizeof(Pixmap)/4;
+        returncode = XGetWindowProperty(dpy, w, atom,
+                                        0, nitems, 1/*delete*/,
+                                        XA_PIXMAP, &actual_type,
+                                        &format, &nitems,
+                                        &bytes_after, &charpm);
+        if (returncode != Success) {
+          if (verbose)
+            fprintf(stderr, "failed to look for %s with return code %i.\n",
+                    RETAIN_PROP_NAME, returncode);
+          return;
+        }
+
+        /* Check if the property was found */
+        if (actual_type == None) {
+          if (verbose)
+            fprintf(stderr, "didn't find evidence of prior run.\n");
+          return;
+        }
+      
+        /* Make sure the dummy value is still present */
+        if (actual_type != XA_PIXMAP) {
+          if (verbose)
+            fprintf(stderr, "found wrong data type - skipped.\n");
+          return;
+        }
+      
+        /* Check size, in case we're a different architecture */
+        if ((nitems != sizeof(Pixmap)/4) ||
+            (format != 32) ||
+            (bytes_after != 0)) {
+          if (verbose)
+            fprintf(stderr, "saw wrong %li / word size %i / architecture %li.\n",
+                    bytes_after, format, nitems);
+          return;
+         }
+      
+        /* blast it away */
+        pm = (Pixmap*) charpm;
+        XKillClient(dpy, (XID) *pm);
+        XFree(charpm);
 }
 
 /* this returns the root window for DECWindows servers.  this is right
@@ -135,6 +158,7 @@ void imageOnRoot(DisplayInfo * dinfo, Im
 	unsigned int numChildren;
 	int i;
 	char *s;
+	unsigned int verbose = 0;
 
 	if (globals.dest_window)
 		root = globals.dest_window;
@@ -161,22 +185,21 @@ void imageOnRoot(DisplayInfo * dinfo, Im
 		for (i = 0; i < numChildren; i++) {
 			Atom actual_type;
 			int actual_format;
-			unsigned long nitems, bytesafter;
-			Window *newRoot = NULL;
-
-			if (XGetWindowProperty(disp, children[i], __SWM_VROOT,
-					0, 1, FALSE, XA_WINDOW, &actual_type,
-					&actual_format,
-					&nitems, &bytesafter,
-					(unsigned char **) &newRoot)
-					== Success && newRoot) {
-				root = *newRoot;
+                        unsigned long nitems, bytesafter;
+                        unsigned char *newRoot = 0;
+                  
+                        if ((XGetWindowProperty (disp, children[i], __SWM_VROOT,0,1,
+                                               False, XA_WINDOW,
+                                               &actual_type, &actual_format,
+                                               &nitems, &bytesafter, &newRoot) == Success) &&
+                            newRoot) {
+                                root = *((Window*) newRoot);
 				break;
 			}
 		}
 		XFree((caddr_t) children);
 	}
-	freePrevious(disp, root);
+        freePrevious(disp, root, verbose);
 
 	if (!(ximageinfo = imageToXImage(disp, scrn,
 			DefaultVisual(disp, scrn),
