xglcomp

annotate src/main.cc @ 1:b2b7cb950c28

window list and compositor registration
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 21 Jan 2016 22:50:10 +0200
parents d9b3fba68705
children 876efea9424c
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 }