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