Package: xbase-clients Version: 4.2.1-12.1 Severity: wishlist File: /usr/X11R6/bin/xwd Tags: patch
Bonjour, I would like to take snapshots of an animated window. Searching the net, I could not find a program to do so. But I found evidence that other people where looking for the same functionnality. It is possible but very slow to use a shell loop to do so. I could whip a small patch to enable this feature. I you are interested, I maybe could update the man page. The new option are : -n number of snapshots (defaults to 1) -w number of microseconds to wait between snapshots -out file is now mandatory if more than one snapshots are to be taken. It is then prefixed with the image number. Be indulgent with my code, I haven't coded in C for ages. I could be more efficient, but I went for the simple approach. Hoping to be helpful, Bernard -- System Information: Debian Release: testing/unstable Architecture: i386 Kernel: Linux 2.2.18pre21 #1 Sat Nov 18 18:47:15 EST 2000 i686 Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (ignored: LC_ALL set to [EMAIL PROTECTED]) Versions of packages xbase-clients depends on: ii cpp-3.2 1:3.2.3-8 The GNU C preprocessor ii libc6 2.3.2-8 GNU C Library: Shared libraries an ii libdps1 4.2.1-12.1 Display PostScript (DPS) client li ii libfreetype6 2.1.5-2 FreeType 2 font engine, shared lib ii libncurses5 5.3.20030719-3 Shared libraries for terminal hand ii libxaw7 4.2.1-12.1 X Athena widget set library ii xlibmesa3-gl [libgl1] 4.2.1-12.1 Mesa 3D graphics library [XFree86] ii xlibmesa3-glu [libglu1] 4.2.1-12.1 Mesa OpenGL utility library [XFree ii xlibs 4.2.1-12.1 X Window System client libraries -- debconf information: * xbase-clients/default_100dpi: * xbase-clients/default_nolisten_tcp:
--- xwd.c 2002-09-19 02:19:56.000000000 +0200 +++ myxwd.c 2003-10-22 14:50:13.000000000 +0200 @@ -1,5 +1,4 @@ /* $Xorg: xwd.c,v 1.5 2001/02/09 02:06:03 xorgcvs Exp $ */ - /* Copyright 1987, 1998 The Open Group @@ -70,7 +69,8 @@ #include <errno.h> #include <X11/Xos.h> #include <stdlib.h> - +#include <string.h> +#include <unistd.h> #include <X11/Xlib.h> #include <X11/Xutil.h> @@ -108,10 +108,36 @@ extern int Get_XColors(XWindowAttributes *, XColor **); extern void _swapshort(register char *, register unsigned); extern void _swaplong(register char *, register unsigned); +static char *make_filename(char *, long, long); static long parse_long(char *); static int Get24bitDirectColors(XColor **); static int ReadColors(Visual *, Colormap, XColor **); +/* + * If necessary (limit >1), prefixes filename with numbers starting from 0. + * Number of digits is computed to represent the maximum value. + */ + +static char *make_filename(char *filename, long current, long limit){ + /* + * if only one take, filename is to be used unprefixed + */ + if (limit == 1) + return strdup(filename); + /* + * compute number of digit to represent (max-1) + * I know it's dumb to recompute nb_digits and realloc result every time + */ + int nb_digits=1; + long i; + for(i=10; i <limit; i*=10) + ++nb_digits; + char *result=(char*)malloc(nb_digits+strlen(filename)+1); + if(!result) + Fatal_Error("Out of memory!"); + sprintf(result,"%0*ld%s", nb_digits, current, filename); + return result; +} static long parse_long (s) char *s; @@ -138,7 +164,9 @@ Window target_win; FILE *out_file = stdout; Bool frame_only = False; - + long wait_value = 0L; + long nb_takes = 1L; + char* filename=NULL; INIT_NAME; Setup_Display_And_Screen(&argc, argv); @@ -159,8 +187,7 @@ usage(); if (!strcmp(argv[i], "-out")) { if (++i >= argc) usage(); - if (!(out_file = fopen(argv[i], "wb"))) - Fatal_Error("Can't open output file as specified."); + filename=argv[i]; standard_out = False; continue; } @@ -181,6 +208,16 @@ add_pixel_value = parse_long (argv[i]); continue; } + if (!strcmp(argv[i], "-w")){ + if (++i >= argc) usage(); + wait_value = parse_long (argv[i]); + continue; + } + if (!strcmp(argv[i], "-n")){ + if (++i >= argc) usage(); + nb_takes = parse_long (argv[i]); + continue; + } if (!strcmp(argv[i], "-frame")) { frame_only = True; continue; @@ -195,6 +232,10 @@ if (standard_out) _setmode(fileno(out_file), _O_BINARY); #endif + /* + * Standard output is not allowed if nb_takes >1 + */ + if( standard_out && (nb_takes >1)) usage(); /* * Let the user select the target window. @@ -214,18 +255,29 @@ target_win = XmuClientWindow (dpy, target_win); } } - - - /* - * Dump it! - */ - Window_Dump(target_win, out_file); - - XCloseDisplay(dpy); - if (fclose(out_file)) { + long current_take; + for(current_take=0; current_take != nb_takes; ++current_take){ + if (!standard_out){ + char *current_filename=make_filename(filename, current_take, nb_takes); + if (!(out_file = fopen(current_filename, "wb"))) + Fatal_Error("Can't open output file as specified."); + free(current_filename); + } + + /* + * Dump it! + */ + + Window_Dump(target_win, out_file); + + if (fclose(out_file)) { perror("xwd"); exit(1); + } + if(wait_value) + usleep(wait_value); } + XCloseDisplay(dpy); exit(0); } @@ -535,7 +587,8 @@ 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] [-w microsecs delay] [-n nb of takes]\n"); + fprintf(stderr," -out <file> is mandatory if nb of takes > 1 it will then be prefixed\n"); exit(1); }