diff --git a/man/compton.1.asciidoc b/man/compton.1.asciidoc index 37d30e0..dc77fbd 100644 --- a/man/compton.1.asciidoc +++ b/man/compton.1.asciidoc @@ -256,6 +256,9 @@ May also be one of the predefined kernels: `3x3box` (default), `5x5box`, `7x7box *--benchmark-wid* 'WINDOW_ID':: Specify window ID to repaint in benchmark mode. If omitted or is 0, the whole screen is repainted. +*--no-ewmh-fullscreen*:: + Do not use EWMH to detect fullscreen windows. Reverts to checking if a window is fullscreen based only on its size and coordinates. + FORMAT OF CONDITIONS -------------------- Some options accept a condition string to match certain windows. A condition string is formed by one or more conditions, joined by logical operators. diff --git a/src/config.c b/src/config.c index 536c1b3..97ee9da 100644 --- a/src/config.c +++ b/src/config.c @@ -554,6 +554,7 @@ char *parse_config(options_t *opt, const char *config_file, bool *shadow_enable, .focus_blacklist = NULL, .detect_transient = false, .detect_client_leader = false, + .no_ewmh_fullscreen = false, .track_wdata = false, .track_leader = false, diff --git a/src/config.h b/src/config.h index ceb8785..f8e1dd0 100644 --- a/src/config.h +++ b/src/config.h @@ -224,6 +224,9 @@ typedef struct options { bool track_wdata; /// Whether compton needs to track window leaders. bool track_leader; + + // Don't use EWMH to detect fullscreen applications + bool no_ewmh_fullscreen; } options_t; extern const char *const BACKEND_STRS[NUM_BKEND + 1]; diff --git a/src/config_libconfig.c b/src/config_libconfig.c index 4a6bbb5..0083ab5 100644 --- a/src/config_libconfig.c +++ b/src/config_libconfig.c @@ -355,6 +355,8 @@ char *parse_config_libconfig(options_t *opt, const char *config_file, bool *shad lcfg_lookup_bool(&cfg, "detect-transient", &opt->detect_transient); // --detect-client-leader lcfg_lookup_bool(&cfg, "detect-client-leader", &opt->detect_client_leader); + // --no-ewmh-fullscreen + lcfg_lookup_bool(&cfg, "no-ewmh-fullscreen", &opt->no_ewmh_fullscreen); // --shadow-exclude parse_cfg_condlst(&cfg, &opt->shadow_blacklist, "shadow-exclude"); // --fade-exclude diff --git a/src/options.c b/src/options.c index 569df20..7c1c016 100644 --- a/src/options.c +++ b/src/options.c @@ -315,7 +315,11 @@ static void usage(int ret) { "\n" "--debug-mode\n" " Render into a separate window, and don't take over the screen. Useful\n" - " when you want to attach a debugger to compton\n"; + " when you want to attach a debugger to compton\n" + "\n" + "--no-ewmh-fullscreen\n" + " Do not use EWMH to detect fullscreen windows. Reverts to checking\n" + " if a window is fullscreen based only on its size and coordinates.\n"; FILE *f = (ret ? stderr : stdout); fputs(usage_text, f); #undef WARNING_DISABLED @@ -412,6 +416,7 @@ static const struct option longopts[] = { {"monitor-repaint", no_argument, NULL, 800}, {"diagnostics", no_argument, NULL, 801}, {"debug-mode", no_argument, NULL, 802}, + {"no-ewmh-fullscreen", no_argument, NULL, 803}, // Must terminate with a NULL entry {NULL, 0, NULL, 0}, }; @@ -784,6 +789,7 @@ void get_cfg(options_t *opt, int argc, char *const *argv, bool shadow_enable, P_CASEBOOL(800, monitor_repaint); case 801: opt->print_diagnostics = true; break; P_CASEBOOL(802, debug_mode); + P_CASEBOOL(803, no_ewmh_fullscreen); default: usage(1); break; #undef P_CASEBOOL } diff --git a/src/win.c b/src/win.c index ab88f8b..da1f365 100644 --- a/src/win.c +++ b/src/win.c @@ -2179,7 +2179,7 @@ static inline bool win_is_fullscreen_xcb(xcb_connection_t *c, const struct atom * 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)) + if(!ps->o.no_ewmh_fullscreen && 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);