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 }