diff options
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 */ |