From 10d5c9b2f93fa040156e98eddd5972cdc992bcc7 Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Thu, 6 Jun 2019 04:37:06 +0300 Subject: [PATCH] Use XCB to check if an application is fullscreen --- src/atom.h | 4 +++- src/win.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/atom.h b/src/atom.h index 69a5e5c..2164afd 100644 --- a/src/atom.h +++ b/src/atom.h @@ -34,7 +34,9 @@ _NET_WM_WINDOW_TYPE_TOOLTIP, \ _NET_WM_WINDOW_TYPE_NOTIFICATION, \ _NET_WM_WINDOW_TYPE_COMBO, \ - _NET_WM_WINDOW_TYPE_DND + _NET_WM_WINDOW_TYPE_DND, \ + _NET_WM_STATE, \ + _NET_WM_STATE_FULLSCREEN #define ATOM_DEF(x) xcb_atom_t a##x diff --git a/src/win.c b/src/win.c index e42ff9b..ab88f8b 100644 --- a/src/win.c +++ b/src/win.c @@ -2151,12 +2151,36 @@ static inline bool rect_is_fullscreen(const session_t *ps, int x, int y, int wid return (x <= 0 && y <= 0 && (x + wid) >= ps->root_width && (y + hei) >= ps->root_height); } +/** + * Check if a window is fulscreen using EWMH + */ +static inline bool win_is_fullscreen_xcb(xcb_connection_t *c, const struct atom *a, const xcb_window_t w) { + xcb_get_property_cookie_t prop = xcb_get_property(c, 0, w, a->a_NET_WM_STATE, XCB_ATOM_ATOM, 0, 12); + xcb_get_property_reply_t *reply = xcb_get_property_reply(c, prop, NULL); + if(!reply) + return false; + + if(reply->length) { + xcb_atom_t *val = xcb_get_property_value(reply); + for(uint32_t i = 0; i < reply->length; i++) { + if(val[i] != a->a_NET_WM_STATE_FULLSCREEN) + continue; + free(reply); + return true; + } + } + free(reply); + return false; +} + /** * Check if a window is a fullscreen window. * * It's not using w->border_size for performance measures. */ bool win_is_fullscreen(const session_t *ps, const struct managed_win *w) { + if(win_is_fullscreen_xcb(ps->c, ps->atoms, w->client_win)) + return true; return rect_is_fullscreen(ps, w->g.x, w->g.y, w->widthb, w->heightb) && (!w->bounding_shaped || w->rounded_corners); }