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 10 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