Module Name:    xsrc
Committed By:   jmcneill
Date:           Sat Mar 24 19:43:32 UTC 2018

Modified Files:
        xsrc/local/programs/xsetwallpaper: xsetwallpaper.c

Log Message:
Support BE and 24-bpp displays.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 xsrc/local/programs/xsetwallpaper/xsetwallpaper.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/local/programs/xsetwallpaper/xsetwallpaper.c
diff -u xsrc/local/programs/xsetwallpaper/xsetwallpaper.c:1.1 xsrc/local/programs/xsetwallpaper/xsetwallpaper.c:1.2
--- xsrc/local/programs/xsetwallpaper/xsetwallpaper.c:1.1	Sat Oct 22 22:05:27 2011
+++ xsrc/local/programs/xsetwallpaper/xsetwallpaper.c	Sat Mar 24 19:43:31 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: xsetwallpaper.c,v 1.1 2011/10/22 22:05:27 jmcneill Exp $ */
+/* $NetBSD: xsetwallpaper.c,v 1.2 2018/03/24 19:43:31 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -26,7 +26,9 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: xsetwallpaper.c,v 1.1 2011/10/22 22:05:27 jmcneill Exp $");
+__RCSID("$NetBSD: xsetwallpaper.c,v 1.2 2018/03/24 19:43:31 jmcneill Exp $");
+
+#include <sys/endian.h>
 
 #include <err.h>
 #include <stdio.h>
@@ -57,7 +59,7 @@ main(int argc, char *argv[])
 	int bitmap_pad, srcx, srcy, dstx, dsty;
 	int imagew, imageh, imagebpp;
 	int ch, i;
-	int screen, default_depth;
+	int screen, default_depth, byte_order;
 	Display *display;
 	Colormap colormap;
 	XImage *image;
@@ -96,6 +98,13 @@ main(int argc, char *argv[])
 		data[i + 2] = p;
 	}
 
+#if _BYTE_ORDER == _BIG_ENDIAN
+	for (i = 0; i < imagew * imageh * 4; i += 4) {
+		uint32_t *p = (uint32_t *)&data[i];
+		*p = bswap32(*p);
+	}
+#endif
+
 #ifdef DEBUG
 	printf("%s: %dx%d %dbpp\n", argv[0], imagew, imageh, imagebpp * 8);
 #endif
@@ -109,6 +118,7 @@ main(int argc, char *argv[])
 	screen = DefaultScreen(display);
 	default_depth = DefaultDepth(display, screen);
 	colormap = DefaultColormap(display, 0);
+	byte_order = ImageByteOrder(display);
 
 	/* get root window geometry */
 	if (!XGetGeometry(display, XDefaultRootWindow(display), &window,
@@ -138,13 +148,13 @@ main(int argc, char *argv[])
 		bitmap_pad = 16;
 	else
 		bitmap_pad = 8;
-	image = XCreateImage(display, CopyFromParent, imagebpp * 8,
+	image = XCreateImage(display, CopyFromParent, default_depth,
 	    ZPixmap, 0, (char *)data, imagew, imageh, bitmap_pad, 0);
 	if (image == NULL) {
 		errx(EXIT_FAILURE, "XCreateImage failed");
 	}
 	XInitImage(image);
-	image->byte_order = LSBFirst;	/* ??? */
+	image->byte_order = byte_order;
 
 	/* Create a graphics context for our new pixmap */
 	gc = XCreateGC(display, window, 0, NULL);

Reply via email to