Browse Source

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.
master
martin 8 years ago
committed by Michael Stapelberg
parent
commit
80d4452ec6
  1. 1
      .travis.yml
  2. 4
      Makefile
  3. 1
      README.md
  4. 28
      xcb.c

1
.travis.yml

@ -19,6 +19,7 @@ addons:
- libev-dev - libev-dev
- libxcb-xinerama0-dev - libxcb-xinerama0-dev
- libxcb-xkb-dev - libxcb-xkb-dev
- libxcb-composite0-dev
before_install: before_install:
- "echo 'APT::Default-Release \"trusty\";' | sudo tee /etc/apt/apt.conf.d/default-release" - "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" - "echo 'deb http://archive.ubuntu.com/ubuntu/ wily main universe' | sudo tee /etc/apt/sources.list.d/wily.list"

4
Makefile

@ -14,8 +14,8 @@ CFLAGS += -std=c99
CFLAGS += -pipe CFLAGS += -pipe
CFLAGS += -Wall CFLAGS += -Wall
CPPFLAGS += -D_GNU_SOURCE CPPFLAGS += -D_GNU_SOURCE
CFLAGS += $(shell $(PKG_CONFIG) --cflags 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-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 += -lpam
LIBS += -lev LIBS += -lev
LIBS += -lm LIBS += -lm

1
README.md

@ -24,6 +24,7 @@ Requirements
- libxcb-util - libxcb-util
- libpam-dev - libpam-dev
- libcairo-dev - libcairo-dev
- libxcb-composite0
- libxcb-xinerama - libxcb-xinerama
- libev - libev
- libx11-dev - libx11-dev

28
xcb.c

@ -11,6 +11,7 @@
#include <xcb/xcb_image.h> #include <xcb/xcb_image.h>
#include <xcb/xcb_atom.h> #include <xcb/xcb_atom.h>
#include <xcb/xcb_aux.h> #include <xcb/xcb_aux.h>
#include <xcb/composite.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.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 mask = 0;
uint32_t values[3]; uint32_t values[3];
xcb_window_t win = xcb_generate_id(conn); 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) { if (pixmap == XCB_NONE) {
mask |= XCB_CW_BACK_PIXEL; 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_create_window(conn,
XCB_COPY_FROM_PARENT, XCB_COPY_FROM_PARENT,
win, /* the window id */ win, /* the window id */
scr->root, /* parent == root */ parent_win,
0, 0, 0, 0,
scr->width_in_pixels, scr->width_in_pixels,
scr->height_in_pixels, /* dimensions */ scr->height_in_pixels, /* dimensions */

Loading…
Cancel
Save