[PATCH xwd] Translate window by -geometry

Matt Vollrath matt at endpoint.com
Fri Nov 2 11:40:56 PDT 2012


This is intended to allow dumps of arbitrary sections of the root window.

Particularly, this is useful in RANDR 1.2+ multi-head setups where the 
root window spans all screens.  By specifying the geometry of a single 
screen we can get a clean grab without post-cropping.

Patch is attached.

Thanks
--
Matt Vollrath   matt at endpoint.com   423.202.0957
End Point Corporation    http://www.endpoint.com
-------------- next part --------------
>From c851a7b1e8c817853210be85beb34c8679a004d1 Mon Sep 17 00:00:00 2001
From: Matt Vollrath <matt at endpoint.com>
Date: Fri, 2 Nov 2012 17:55:12 +0000
Subject: [PATCH xwd] Translate window by -geometry

This is intended to allow dumps of arbitrary sections of the root
window.

Signed-off-by: Matt Vollrath <matt at endpoint.com>
---
 xwd.c |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/xwd.c b/xwd.c
index 5b40121..05b8a7b 100644
--- a/xwd.c
+++ b/xwd.c
@@ -98,11 +98,12 @@ static Bool standard_out = True;
 static Bool debug = False;
 static Bool silent = False;
 static Bool use_installed = False;
+static char *geom = NULL;
 static long add_pixel_value = 0;
 
 
 extern int main(int, char **);
-extern void Window_Dump(Window, FILE *);
+extern void Window_Dump(Window, FILE *, char *);
 extern int Image_Size(XImage *);
 extern int Get_XColors(XWindowAttributes *, XColor **);
 extern void _swapshort(register char *, register unsigned);
@@ -196,6 +197,11 @@ main(int argc, char **argv)
 	    silent = True;
 	    continue;
 	}
+        if (!strcmp(argv[i], "-geometry")) {
+             if (++i >= argc) usage();
+             geom = argv[i];
+             continue;
+        }
 	usage();
     }
 #ifdef WIN32
@@ -212,7 +218,7 @@ main(int argc, char **argv)
     /*
      * Dump it!
      */
-    Window_Dump(target_win, out_file);
+    Window_Dump(target_win, out_file, geom);
 
     XCloseDisplay(dpy);
     if (fclose(out_file)) {
@@ -246,7 +252,7 @@ Get24bitDirectColors(XColor **colors)
  */
 
 void
-Window_Dump(Window window, FILE *out)
+Window_Dump(Window window, FILE *out, char *geometry)
 {
     unsigned long swaptest = 1;
     XColor *colors;
@@ -260,6 +266,8 @@ Window_Dump(Window window, FILE *out)
     XImage *image;
     int absx, absy, x, y;
     unsigned width, height;
+    int gbits, gx, gy;
+    unsigned gwidth, gheight;
     int dwidth, dheight;
     Window dummywin;
     XWDFileHeader header;
@@ -309,6 +317,15 @@ Window_Dump(Window window, FILE *out)
     width = win_info.width;
     height = win_info.height;
 
+    /* translate geometry if provided */
+    if (geometry) {
+        gbits = XParseGeometry( geometry, &gx, &gy, &gwidth, &gheight );
+        if (gbits & XValue) absx += gx;
+        if (gbits & YValue) absy += gy;
+        if (gbits & WidthValue) width = gwidth;
+        if (gbits & HeightValue) height = gheight;
+    }
+
     if (!nobdrs) {
 	absx -= win_info.border_width;
 	absy -= win_info.border_width;
@@ -522,7 +539,7 @@ usage(void)
     fprintf (stderr,
 "usage: %s [-display host:dpy] [-debug] [-help] %s [-nobdrs] [-out <file>]",
 	   program_name, "[{-root|-id <id>|-name <name>}]");
-    fprintf (stderr, " [-xy] [-add value] [-frame]\n");
+    fprintf (stderr, " [-xy] [-add value] [-frame] [-geometry <geom>]\n");
     exit(1);
 }
 
-- 
1.7.9.5



More information about the xorg-devel mailing list