# HG changeset patch # User John Tsiombikas # Date 1454055778 -7200 # Node ID 86e57e56a4545fc0cf6b056b71d77cde6b5aaafb # Parent 57050ca14de609bb667bfbb13c1776b2fe515bc9 passing events through the overlay window diff -r 57050ca14de6 -r 86e57e56a454 Makefile --- a/Makefile Fri Jan 22 22:33:34 2016 +0200 +++ b/Makefile Fri Jan 29 10:22:58 2016 +0200 @@ -13,7 +13,7 @@ CFLAGS = $(warn) $(dbg) $(opt) $(incpaths) CXXFLAGS = -std=c++11 $(warn) $(dbg) $(opt) $(incpaths) -LDFLAGS = -lGL -lGLEW -lX11 -lXext -lXcomposite -lXdamage -lm -lpthread +LDFLAGS = -lGL -lGLEW -lX11 -lXext -lXcomposite -lXdamage -lXfixes -lm -lpthread $(bin): $(obj) $(CXX) -o $@ $(obj) $(LDFLAGS) diff -r 57050ca14de6 -r 86e57e56a454 src/main.cc --- a/src/main.cc Fri Jan 22 22:33:34 2016 +0200 +++ b/src/main.cc Fri Jan 29 10:22:58 2016 +0200 @@ -6,10 +6,12 @@ #include #include #include +#include #include "cwin.h" #include "opengl.h" #include "logger.h" +static bool query_extensions(); static bool register_compositor(); static void start_comp(); static void manage_window(Window xwin); @@ -23,6 +25,9 @@ Window root_win, comp_win; int root_width, root_height; +static int xdmg_ev_base, xdmg_err_base; +static int xshape_ev_base, xshape_err_base; + int main(int argc, char **argv) { if(!(dpy = XOpenDisplay(0))) { @@ -35,26 +40,9 @@ root_height = DisplayHeight(dpy, screen_num); log_info("display size %dx%d\n", root_width, root_height); - int xcomp_ev_base, xcomp_err_base; - if(!XCompositeQueryExtension(dpy, &xcomp_ev_base, &xcomp_err_base)) { - log_error("X server doesn't support the composite extension\n"); + if(!query_extensions()) { return 1; } - int xcomp_ver_major = 0, xcomp_ver_minor = 4; - XCompositeQueryVersion(dpy, &xcomp_ver_major, &xcomp_ver_minor); - log_info("Found composite extension version %d.%d\n", xcomp_ver_major, xcomp_ver_minor); - if(xcomp_ver_major <= 0 && xcomp_ver_minor < 3) { - // for NameWindowPixmap & CompositeGetoverlayWindow - log_error("I need at least version 0.3\n"); - return 1; - } - - int xdmg_ev_base, xdmg_err_base; - if(!XDamageQueryExtension(dpy, &xdmg_ev_base, &xdmg_err_base)) { - log_error("X server doesn't support the damage extension\n"); - return 1; - } - // TODO also XFixes ? if(!register_compositor()) { return 1; @@ -80,6 +68,11 @@ break; case ConfigureNotify: + // XXX is this right? + if((cwin = find_window_xid(ev.xconfigure.window))) { + log_debug("updating window attributes\n"); + XGetWindowAttributes(dpy, cwin->xwin, &cwin->attr); + } break; case DestroyNotify: @@ -117,9 +110,54 @@ if(ev.type == xdmg_ev_base + XDamageNotify) { } } + + redraw(); } } +static bool query_extensions() +{ + int xcomp_ev_base, xcomp_err_base; + if(!XCompositeQueryExtension(dpy, &xcomp_ev_base, &xcomp_err_base)) { + log_error("X server doesn't support the composite extension\n"); + return false; + } + int xcomp_ver_major, xcomp_ver_minor; + XCompositeQueryVersion(dpy, &xcomp_ver_major, &xcomp_ver_minor); + log_info("Found composite extension version %d.%d\n", xcomp_ver_major, xcomp_ver_minor); + if(xcomp_ver_major <= 0 && xcomp_ver_minor < 3) { + // for NameWindowPixmap & CompositeGetoverlayWindow + log_error("I need at least version 0.3\n"); + return false; + } + + if(!XDamageQueryExtension(dpy, &xdmg_ev_base, &xdmg_err_base)) { + log_error("X server doesn't support the damage extension\n"); + return false; + } + + if(!XShapeQueryExtension(dpy, &xshape_ev_base, &xshape_err_base)) { + log_error("X server doesn't support the shape extension\n"); + return false; + } + + int xfix_ev_base, xfix_err_base; + if(!XFixesQueryExtension(dpy, &xfix_ev_base, &xfix_err_base)) { + log_error("X server doesn't support the Xfixes extension\n"); + return false; + } + + int xfix_ver_major, xfix_ver_minor; + XFixesQueryVersion(dpy, &xfix_ver_major, &xfix_ver_minor); + log_info("Found xfixes version %d.%d\n", xfix_ver_major, xfix_ver_minor); + if(xfix_ver_major < 2) { + // for SetWindowShapeRegion + log_error("I need at least version 2.0\n"); + return false; + } + return true; +} + static bool register_compositor() { char atom_name[64]; @@ -154,8 +192,14 @@ } log_info("starting compositor, managing %u top-level windows\n", num_children); XFree(children); + XUngrabServer(dpy); - XUngrabServer(dpy); + /* set a zero-area input-shape for the overlay window to let events + * through to the windows under it + */ + XserverRegion region = XFixesCreateRegion(dpy, 0, 0); + XFixesSetWindowShapeRegion(dpy, comp_win, ShapeInput, 0, 0, region); + XFixesDestroyRegion(dpy, region); } static void manage_window(Window xwin)