diff options
author | martin <martin.sandsmark@kde.org> | 2017-03-26 15:01:23 +0200 |
---|---|---|
committer | Michael Stapelberg <stapelberg@users.noreply.github.com> | 2017-03-26 09:01:23 -0400 |
commit | 80d4452ec680bcb0e57418f69d44d88ded82047c (patch) | |
tree | dde180cf001c4d371d0d810fc9060256e35816e5 /xcb.c | |
parent | 9c8ae8b5d1dcf67ee34969068f4068b5c6b9ce62 (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.
Diffstat (limited to 'xcb.c')
-rw-r--r-- | xcb.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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 */ |