xscreenshot.c - xscreenshot - screen capture tool
(HTM) git clone git://git.codemadness.org/xscreenshot
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
xscreenshot.c (2158B)
---
1 #include <arpa/inet.h>
2
3 #include <err.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdint.h>
7 #include <stdlib.h>
8 #include <string.h>
9
10 #include <X11/X.h>
11 #include <X11/Xlib.h>
12 #include <X11/Xutil.h>
13
14 int
15 main(int argc, char *argv[])
16 {
17 XImage *img;
18 Display *dpy;
19 Window win;
20 XWindowAttributes attr;
21 uint32_t tmp, w, h;
22 uint16_t rgba[4];
23 int sr, sg, fr, fg, fb;
24 char *ep;
25
26 if (!(dpy = XOpenDisplay(NULL)))
27 errx(1, "XOpenDisplay");
28
29 /* identify window */
30 if (argc > 1) {
31 if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "-v")) {
32 fprintf(stderr, "usage: %s [winid]\n", argv[0]);
33 return 1;
34 }
35 errno = 0;
36
37 win = (Window)strtol(argv[1], &ep, 0);
38 if (errno || argv[1] == ep || *ep != '\0') {
39 fprintf(stderr, "strtol: invalid number: \"%s\"%s%s\n",
40 argv[1],
41 errno ? ": " : "",
42 errno ? strerror(errno) : "");
43 exit(1);
44 }
45 } else {
46 win = RootWindow(dpy, 0);
47 }
48
49 XGrabServer(dpy);
50 XGetWindowAttributes(dpy, win, &attr);
51 img = XGetImage(dpy, win, 0, 0, attr.width, attr.height, 0xffffffff,
52 ZPixmap);
53 XUngrabServer(dpy);
54 XCloseDisplay(dpy);
55 if (!img)
56 errx(1, "XGetImage");
57
58 switch (img->bits_per_pixel) {
59 case 16: /* only 5-6-5 format supported */
60 sr = 11;
61 sg = 5;
62 fr = fb = 2047;
63 fg = 1023;
64 break;
65 case 24:
66 case 32: /* ignore alpha in case of 32-bit */
67 sr = 16;
68 sg = 8;
69 fr = fg = fb = 257;
70 break;
71 default:
72 errx(1, "unsupported bpp: %d", img->bits_per_pixel);
73 }
74
75 /* write header with big endian width and height-values */
76 fprintf(stdout, "farbfeld");
77 tmp = htonl(img->width);
78 fwrite(&tmp, sizeof(uint32_t), 1, stdout);
79 tmp = htonl(img->height);
80 fwrite(&tmp, sizeof(uint32_t), 1, stdout);
81
82 /* write pixels */
83 for (h = 0; h < (uint32_t)img->height; h++) {
84 for (w = 0; w < (uint32_t)img->width; w++) {
85 tmp = XGetPixel(img, w, h);
86 rgba[0] = htons(((tmp & img->red_mask) >> sr) * fr);
87 rgba[1] = htons(((tmp & img->green_mask) >> sg) * fg);
88 rgba[2] = htons((tmp & img->blue_mask) * fb);
89 rgba[3] = htons(65535);
90
91 if (fwrite(&rgba, 4 * sizeof(uint16_t), 1, stdout) != 1)
92 err(1, "fwrite");
93 }
94 }
95 XDestroyImage(img);
96
97 return 0;
98 }