1 #include "config.h"
2 #ifdef CAMERA
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <X11/Xlib.h>
6 #include <Imlib2.h>
7 #include "defs.h"
8 
9 /* internal context */
10 static Display *disp = NULL;
11 static Visual *vis = NULL;
12 static Screen *scr = NULL;
13 static Colormap cm;
14 static Window rw, tw;
15 static int rx, ry;
16 static unsigned int rdx, rdy;
17 static int frame;
18 static int initialised = 0;
19 
20 /* maximum file name size */
21 #define MAXFRAMEFILENAMESIZE 80
22 
camera_init(Display * arg_disp,Window arg_window)23 void camera_init(Display *arg_disp, Window arg_window) {
24   if (initialised) return;
25   disp = arg_disp;
26   tw = arg_window;
27 
28   scr = ScreenOfDisplay(disp, DefaultScreen(disp));
29   vis = DefaultVisual(disp, XScreenNumberOfScreen(scr));
30   cm = DefaultColormap(disp, XScreenNumberOfScreen(scr));
31   rw = RootWindow(disp, XScreenNumberOfScreen(scr));
32 
33   imlib_context_set_display(disp);
34   imlib_context_set_visual(vis);
35   imlib_context_set_colormap(cm);
36   imlib_context_set_color_modifier(NULL);
37   imlib_context_set_operation(IMLIB_OP_COPY);
38   frame = 0;
39 
40   rx = 0;
41   ry = 0;
42   rdx = TWINSIDE;	/* restrict to tactical */
43   rdy = TWINSIDE;
44   imlib_context_set_drawable(tw);
45 
46   initialised++;
47 }
48 
camera_snap(Display * arg_disp,Window arg_window)49 void camera_snap(Display *arg_disp, Window arg_window)
50 {
51   Imlib_Image image;
52   char *name;
53 
54   camera_init(arg_disp, arg_window);
55   image = imlib_create_image_from_drawable(rw, rx, ry, rdx, rdy, 0);
56   imlib_context_set_image(image);
57   imlib_image_attach_data_value("quality", NULL, 15, NULL);
58   name = malloc(MAXFRAMEFILENAMESIZE);
59   snprintf(name, MAXFRAMEFILENAMESIZE-1, "netrek-%03d.png", frame++);
60   imlib_save_image(name);
61   imlib_free_image_and_decache();
62   fprintf(stderr, "camera_snap: %s\n", name);
63   free(name);
64 }
65 #endif
66