Add some options:

-id <drawable> to grab other than root window.
 -w/width       set output image width.
 -h/height      set output image height.
 -noshape       do not use window shape.
 -help          show usage.
 -v             show info about the grabbed drawable.


SVN revision: 22718
This commit is contained in:
Kim Woelders 2006-05-18 20:59:17 +00:00
parent 7f1bc6088f
commit 42d0f19674
1 changed files with 101 additions and 14 deletions

View File

@ -20,18 +20,87 @@ Colormap cm;
int depth;
int image_width = 0, image_height = 0;
static void
usage(void)
{
printf("Usage: imlib2_grab [-v] [-id <drawable id>] [-width <width>] [-height <height>] [-noshape] <output file>\n");
}
int
main(int argc, char **argv)
{
char *s;
Imlib_Image *im = NULL;
char *file = NULL;
int no = 1;
int verbose;
int get_alpha;
const char *display_name = getenv("DISPLAY");
Drawable draw;
int x, y;
unsigned int w, h, bw, depth;
unsigned int wo, ho;
Window rr;
if (argc < 2)
return 1;
verbose = 0;
get_alpha = 1;
draw = None;
wo = ho = 0;
for (;;)
{
argc--;
argv++;
if (argc <= 0)
break;
s = argv[0];
if (*s++ != '-')
break;
if (!strcmp(s, "id"))
{
argc--;
argv++;
if (argc <= 1)
break;
draw = strtoul(argv[0], NULL, 0);
}
else if (!strcmp(s, "w") || !strcmp(s, "width"))
{
argc--;
argv++;
if (argc <= 1)
break;
wo = strtoul(argv[0], NULL, 0);
}
else if (!strcmp(s, "h") || !strcmp(s, "height"))
{
argc--;
argv++;
if (argc <= 1)
break;
ho = strtoul(argv[0], NULL, 0);
}
else if (!strcmp(s, "noshape"))
{
get_alpha = 0;
}
else if (!strcmp(s, "v"))
{
verbose = 1;
}
else if (!strcmp(s, "help"))
{
usage();
return 0;
}
}
if (argc <= 0)
{
usage();
return 1;
}
file = argv[0];
file = argv[no];
if (display_name == NULL)
display_name = ":0";
disp = XOpenDisplay(display_name);
@ -40,26 +109,44 @@ main(int argc, char **argv)
fprintf(stderr, "Can't open display %s\n", display_name);
return 1;
}
vis = DefaultVisual(disp, DefaultScreen(disp));
depth = DefaultDepth(disp, DefaultScreen(disp));
cm = DefaultColormap(disp, DefaultScreen(disp));
imlib_context_set_display(disp);
imlib_context_set_visual(vis);
imlib_context_set_colormap(cm);
imlib_context_set_drawable(DefaultRootWindow(disp));
im = imlib_create_image_from_drawable(0, 0, 0,
DisplayWidth(disp, DefaultScreen(disp)),
DisplayHeight(disp, DefaultScreen(disp)),
1);
if (draw == None)
draw = DefaultRootWindow(disp);
imlib_context_set_drawable(draw);
XGetGeometry(disp, draw, &rr, &x, &y, &w, &h, &bw, &depth);
if (wo == 0)
wo = w;
if (ho == 0)
ho = h;
if (verbose)
{
printf("Drawable: %#lx: x,y: %d,%d wxh=%ux%u bw=%u depth=%u\n",
draw, x, y, w, h, bw, depth);
if ((wo != w) || (ho != h))
printf("Output : wxh=%ux%u\n", wo, ho);
}
if ((wo != w) || (ho != h))
im = imlib_create_scaled_image_from_drawable(None, 0, 0, w, h, wo, ho, 1,
(get_alpha) ? 1 : 0);
else
im = imlib_create_image_from_drawable((get_alpha) ? 1 : 0, 0, 0, w, h, 1);
if (!im)
{
fprintf(stderr, "Cannot grab image!\n");
exit(0);
}
if (argc > 1)
{
imlib_context_set_image(im);
imlib_save_image(argv[1]);
}
imlib_context_set_image(im);
imlib_save_image(file);
return 0;
}