rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <unistd.h>
|
nuclear@0
|
4 #include <X11/Xlib.h>
|
nuclear@0
|
5 #include <X11/Xutil.h>
|
nuclear@0
|
6 #include <X11/Xatom.h>
|
nuclear@0
|
7 #include <X11/extensions/Xcomposite.h>
|
nuclear@1
|
8 #include <X11/extensions/Xdamage.h>
|
nuclear@0
|
9 #include <GL/glew.h>
|
nuclear@0
|
10 #include "cwin.h"
|
nuclear@1
|
11 #include "logger.h"
|
nuclear@1
|
12
|
nuclear@1
|
13 static bool register_compositor();
|
nuclear@1
|
14
|
nuclear@1
|
15 static Display *dpy;
|
nuclear@1
|
16 static int scr;
|
nuclear@1
|
17 static Window root_win;
|
nuclear@1
|
18 static int root_width, root_height;
|
nuclear@1
|
19
|
nuclear@1
|
20 int main(int argc, char **argv)
|
nuclear@1
|
21 {
|
nuclear@1
|
22 if(!(dpy = XOpenDisplay(0))) {
|
nuclear@1
|
23 log_error("failed to open X display\n");
|
nuclear@1
|
24 return 1;
|
nuclear@1
|
25 }
|
nuclear@1
|
26 scr = DefaultScreen(dpy);
|
nuclear@1
|
27 root_win = RootWindow(dpy, scr);
|
nuclear@1
|
28 root_width = DisplayWidth(dpy, scr);
|
nuclear@1
|
29 root_height = DisplayHeight(dpy, scr);
|
nuclear@1
|
30 log_info("display size %dx%d\n", root_width, root_height);
|
nuclear@1
|
31
|
nuclear@1
|
32 int xcomp_ev_base, xcomp_err_base, xcomp_ver_major, xcomp_ver_minor;
|
nuclear@1
|
33 if(!XCompositeQueryExtension(dpy, &xcomp_ev_base, &xcomp_err_base)) {
|
nuclear@1
|
34 log_error("X server doesn't support the composite extension\n");
|
nuclear@1
|
35 return 1;
|
nuclear@1
|
36 }
|
nuclear@1
|
37 XCompositeQueryVersion(dpy, &xcomp_ver_major, &xcomp_ver_minor);
|
nuclear@1
|
38 log_info("Found composite extension version %d.%d\n", xcomp_ver_major, xcomp_ver_minor);
|
nuclear@1
|
39 if(xcomp_ver_major <= 10 && xcomp_ver_minor < 2) {
|
nuclear@1
|
40 log_error("I need at least version 1.2\n"); // for NameWindowPixmap
|
nuclear@1
|
41 return 1;
|
nuclear@1
|
42 }
|
nuclear@1
|
43
|
nuclear@1
|
44 int xdmg_ev_base, xdmg_err_base;
|
nuclear@1
|
45 if(!XDamageQueryExtension(dpy, &xdmg_ev_base, &xdmg_err_base)) {
|
nuclear@1
|
46 log_error("X server doesn't support the damage extension\n");
|
nuclear@1
|
47 return 1;
|
nuclear@1
|
48 }
|
nuclear@1
|
49 // TODO also XFixes ?
|
nuclear@1
|
50
|
nuclear@1
|
51 if(!register_compositor()) {
|
nuclear@1
|
52 return 1;
|
nuclear@1
|
53 }
|
nuclear@1
|
54
|
nuclear@1
|
55 XGrabServer(dpy);
|
nuclear@1
|
56 XCompositeRedirectSubwindows(dpy, root_win, CompositeRedirectAutomatic);
|
nuclear@1
|
57 XUngrabServer(dpy);
|
nuclear@1
|
58
|
nuclear@1
|
59 for(;;) {
|
nuclear@1
|
60 XEvent ev;
|
nuclear@1
|
61 XNextEvent(dpy, &ev);
|
nuclear@1
|
62 // TODO
|
nuclear@1
|
63 }
|
nuclear@1
|
64 }
|
nuclear@1
|
65
|
nuclear@1
|
66 static bool register_compositor()
|
nuclear@1
|
67 {
|
nuclear@1
|
68 char atom_name[64];
|
nuclear@1
|
69 sprintf(atom_name, "_NET_WM_CM_S%d", scr);
|
nuclear@1
|
70 Atom xa_wm_cm = XInternAtom(dpy, atom_name, False);
|
nuclear@1
|
71
|
nuclear@1
|
72 Window win = XGetSelectionOwner(dpy, xa_wm_cm);
|
nuclear@1
|
73 if(win != None) {
|
nuclear@1
|
74 log_error("Another compositor is running. Stop it and try again.\n");
|
nuclear@1
|
75 return false;
|
nuclear@1
|
76 }
|
nuclear@1
|
77
|
nuclear@1
|
78 win = XCreateSimpleWindow(dpy, root_win, 0, 0, 1, 1, 0, None, None);
|
nuclear@1
|
79 XSetSelectionOwner(dpy, xa_wm_cm, win, 0);
|
nuclear@1
|
80 return true;
|
nuclear@1
|
81 }
|