From 80d4452ec680bcb0e57418f69d44d88ded82047c Mon Sep 17 00:00:00 2001 From: martin Date: Sun, 26 Mar 2017 15:01:23 +0200 Subject: [PATCH] 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. --- .travis.yml | 1 + Makefile | 4 ++-- README.md | 1 + xcb.c | 28 ++++++++++++++++++++++++++-- 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 #include #include +#include #include #include #include @@ -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 */ -- 2.39.5