srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/crates/core/src/theme.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core/src/theme.rs')
-rw-r--r--crates/core/src/theme.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/crates/core/src/theme.rs b/crates/core/src/theme.rs
index 026688a..649ec64 100644
--- a/crates/core/src/theme.rs
+++ b/crates/core/src/theme.rs
@@ -175,6 +175,28 @@ pub struct ThemeConfig {
/// Asked for as titlebars able to use "decorations/buttons of the
/// program/dynamic".
pub dynamic_buttons: bool,
+ /// Enforce server-side decoration on every client that negotiates it,
+ /// instead of honouring what the client asked for.
+ ///
+ /// `xdg-decoration` explicitly allows this: "The compositor can decide
+ /// not to use the client's mode and enforce a different mode instead",
+ /// and "the specified mode must be obeyed by the client". So a toolkit
+ /// that asks for client-side - winit does, measured - can be given
+ /// srdwm's titlebar anyway, which is what makes every negotiating
+ /// window look the same.
+ ///
+ /// Off by default, because it cannot help the case it looks like it
+ /// should. A client that never creates a decoration object at all is
+ /// outside the protocol: "if compositor and client do not negotiate
+ /// the use of a server-side decoration ... clients continue to
+ /// self-decorate as they see fit". GTK is exactly that client - it
+ /// creates no decoration object, measured directly - so forcing this
+ /// on cannot move a single GTK button, while it *can* stack srdwm's
+ /// titlebar on top of a client that draws its own regardless (the
+ /// Firefox case this project already hit once). Turn it on to make
+ /// negotiating toolkits uniform; use `rules.lua`'s `decorated = false`
+ /// for the ones that draw their own anyway.
+ pub force_server_side: bool,
}
impl Default for ThemeConfig {
@@ -194,6 +216,7 @@ impl Default for ThemeConfig {
button_glyph_always: false,
traffic_light_buttons: true,
dynamic_buttons: true,
+ force_server_side: false,
}
}
}