summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin <martin.sandsmark@kde.org>2017-03-26 15:01:23 +0200
committerMichael Stapelberg <stapelberg@users.noreply.github.com>2017-03-26 09:01:23 -0400
commit80d4452ec680bcb0e57418f69d44d88ded82047c (patch)
treedde180cf001c4d371d0d810fc9060256e35816e5
parent9c8ae8b5d1dcf67ee34969068f4068b5c6b9ce62 (diff)
Fix covering of composited notifications (#96)
Use the XComposite extension to get the composite overlay window, instead of just using the normal root window. This ensures that composited windows are covered.
-rw-r--r--.travis.yml1
-rw-r--r--Makefile4
-rw-r--r--README.md1
-rw-r--r--xcb.c28
4 files changed, 30 insertions, 4 deletions
diff --git a/.travis.yml b/.travis.yml
index 5129c27..67f7558 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,6 +19,7 @@ addons:
- libev-dev
- libxcb-xinerama0-dev
- libxcb-xkb-dev
+ - libxcb-composite0-dev
before_install:
- "echo 'APT::Default-Release \"trusty\";' | sudo tee /etc/apt/apt.conf.d/default-release"
- "echo 'deb http://archive.ubuntu.com/ubuntu/ wily main universe' | sudo tee /etc/apt/sources.list.d/wily.list"
diff --git a/Makefile b/Makefile
index 26ec990..a826909 100644
--- a/Makefile
+++ b/Makefile
@@ -14,8 +14,8 @@ CFLAGS += -std=c99
CFLAGS += -pipe
CFLAGS += -Wall
CPPFLAGS += -D_GNU_SOURCE
-CFLAGS += $(shell $(PKG_CONFIG) --cflags cairo xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
-LIBS += $(shell $(PKG_CONFIG) --libs cairo xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
+CFLAGS += $(shell $(PKG_CONFIG) --cflags cairo xcb-composite xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
+LIBS += $(shell $(PKG_CONFIG) --libs cairo xcb-composite xcb-dpms xcb-xinerama xcb-atom xcb-image xcb-xkb xkbcommon xkbcommon-x11)
LIBS += -lpam
LIBS += -lev
LIBS += -lm
diff --git a/README.md b/README.md
index eea54ea..fcecbfa 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ Requirements
- libxcb-util
- libpam-dev
- libcairo-dev
+- libxcb-composite0
- libxcb-xinerama
- libev
- libx11-dev
diff --git a/xcb.c b/xcb.c
index e0b7811..73ebb7e 100644
--- a/xcb.c
+++ b/xcb.c
@@ -11,6 +11,7 @@
#include <xcb/xcb_image.h>
#include <xcb/xcb_atom.h>
#include <xcb/xcb_aux.h>
+#include <xcb/composite.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
@@ -106,6 +107,29 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c
uint32_t mask = 0;
uint32_t values[3];
xcb_window_t win = xcb_generate_id(conn);
+ xcb_window_t parent_win = scr->root;
+
+ /* Check whether the composite extension is available */
+ const xcb_query_extension_reply_t *extension_query = NULL;
+ xcb_generic_error_t *error = NULL;
+ xcb_composite_get_overlay_window_cookie_t cookie;
+ xcb_composite_get_overlay_window_reply_t *composite_reply = NULL;
+
+ extension_query = xcb_get_extension_data(conn, &xcb_composite_id);
+ if (extension_query && extension_query->present) {
+ /* When composition is used, we need to use the composite overlay
+ * window instead of the normal root window to be able to cover
+ * composited windows */
+ cookie = xcb_composite_get_overlay_window(conn, scr->root);
+ composite_reply = xcb_composite_get_overlay_window_reply(conn, cookie, &error);
+
+ if (!error && composite_reply) {
+ parent_win = composite_reply->overlay_win;
+ }
+
+ free(composite_reply);
+ free(error);
+ }
if (pixmap == XCB_NONE) {
mask |= XCB_CW_BACK_PIXEL;
@@ -127,8 +151,8 @@ xcb_window_t open_fullscreen_window(xcb_connection_t *conn, xcb_screen_t *scr, c
xcb_create_window(conn,
XCB_COPY_FROM_PARENT,
- win, /* the window id */
- scr->root, /* parent == root */
+ win, /* the window id */
+ parent_win,
0, 0,
scr->width_in_pixels,
scr->height_in_pixels, /* dimensions */