aboutsummaryrefslogtreecommitdiff
path: root/src/x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/x11.c')
-rw-r--r--src/x11.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/x11.c b/src/x11.c
new file mode 100644
index 0000000..4779c08
--- /dev/null
+++ b/src/x11.c
@@ -0,0 +1,81 @@
+#ifdef X11
+#include <stdio.h>
+#include <time.h>
+#include <X11/Xlib.h>
+
+#include <X11/extensions/Xcomposite.h>
+#include <X11/extensions/Xfixes.h>
+#include <X11/extensions/shape.h>
+
+#include <cairo.h>
+#include <cairo-xlib.h>
+
+Display *d;
+Window overlay;
+Window root;
+int width, height;
+
+void allow_input_passthrough(Window w)
+{
+ XserverRegion region = XFixesCreateRegion(d, NULL, 0);
+
+ XFixesSetWindowShapeRegion(d, w, ShapeBounding, 0, 0, 0);
+ XFixesSetWindowShapeRegion(d, w, ShapeInput, 0, 0, region);
+
+ XFixesDestroyRegion(d, region);
+}
+
+void prep_overlay(void)
+{
+ overlay = XCompositeGetOverlayWindow(d, root);
+ allow_input_passthrough(overlay);
+}
+
+void draw(cairo_t *cr)
+{
+ int quarter_w = width / 4;
+ int quarter_h = height / 4;
+ cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
+ cairo_rectangle(cr, quarter_w, quarter_h, quarter_w * 2, quarter_h * 2);
+ cairo_fill(cr);
+}
+
+int main()
+{
+ printf("X11\n");
+
+ struct timespec ts = { 0, 5000 };
+
+ d = XOpenDisplay(NULL);
+
+ int s = DefaultScreen(d);
+ root = RootWindow(d, s);
+
+ XCompositeRedirectSubwindows(d, root, CompositeRedirectAutomatic);
+ XSelectInput(d, root, SubstructureNotifyMask);
+
+ width = DisplayWidth(d, s);
+ height = DisplayHeight(d, s);
+
+ prep_overlay();
+
+ cairo_surface_t *surf = cairo_xlib_surface_create(d, overlay, DefaultVisual(d, s), width, height);
+ cairo_t *cr = cairo_create(surf);
+
+ XSelectInput(d, overlay, ExposureMask);
+
+ XEvent ev;
+ while (1) {
+ overlay = XCompositeGetOverlayWindow(d, root);
+ draw(cr);
+ XCompositeReleaseOverlayWindow(d, root);
+ nanosleep(&ts, NULL);
+ }
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surf);
+ XCloseDisplay(d);
+
+ return 0;
+}
+#endif