aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dbus/mutter_service_channel.rs9
-rw-r--r--src/handlers/xdg_shell.rs16
-rw-r--r--src/niri.rs30
3 files changed, 32 insertions, 23 deletions
diff --git a/src/dbus/mutter_service_channel.rs b/src/dbus/mutter_service_channel.rs
index 646bc4c5..6dd69598 100644
--- a/src/dbus/mutter_service_channel.rs
+++ b/src/dbus/mutter_service_channel.rs
@@ -25,9 +25,12 @@ impl ServiceChannel {
}
let (sock1, sock2) = UnixStream::pair().unwrap();
- self.display
- .insert_client(sock2, Arc::new(ClientState::default()))
- .unwrap();
+ let data = Arc::new(ClientState {
+ compositor_state: Default::default(),
+ // Would be nice to thread config here but for now it's fine.
+ can_view_decoration_globals: false,
+ });
+ self.display.insert_client(sock2, data).unwrap();
Ok(unsafe { zbus::zvariant::OwnedFd::from_raw_fd(sock1.into_raw_fd()) })
}
}
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs
index 9df4274f..221ca222 100644
--- a/src/handlers/xdg_shell.rs
+++ b/src/handlers/xdg_shell.rs
@@ -277,13 +277,9 @@ delegate_xdg_shell!(State);
impl XdgDecorationHandler for State {
fn new_decoration(&mut self, toplevel: ToplevelSurface) {
- let mode = if self.niri.config.borrow().prefer_no_csd {
- Some(zxdg_toplevel_decoration_v1::Mode::ServerSide)
- } else {
- None
- };
+ // If we want CSD, we hide this global altogether.
toplevel.with_pending_state(|state| {
- state.decoration_mode = mode;
+ state.decoration_mode = Some(zxdg_toplevel_decoration_v1::Mode::ServerSide);
});
}
@@ -308,13 +304,9 @@ impl XdgDecorationHandler for State {
}
fn unset_mode(&mut self, toplevel: ToplevelSurface) {
- let mode = if self.niri.config.borrow().prefer_no_csd {
- Some(zxdg_toplevel_decoration_v1::Mode::ServerSide)
- } else {
- None
- };
+ // If we want CSD, we hide this global altogether.
toplevel.with_pending_state(|state| {
- state.decoration_mode = mode;
+ state.decoration_mode = Some(zxdg_toplevel_decoration_v1::Mode::ServerSide);
});
// A configure is required in response to this event. However, if an initial configure
diff --git a/src/niri.rs b/src/niri.rs
index a39530a4..3c9cfecf 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -695,13 +695,22 @@ impl Niri {
&display_handle,
[WmCapabilities::Fullscreen],
);
- let xdg_decoration_state = XdgDecorationState::new::<State>(&display_handle);
- let kde_decoration_state = KdeDecorationState::new::<State>(
+ let xdg_decoration_state =
+ XdgDecorationState::new_with_filter::<State, _>(&display_handle, |client| {
+ client
+ .get_data::<ClientState>()
+ .unwrap()
+ .can_view_decoration_globals
+ });
+ let kde_decoration_state = KdeDecorationState::new_with_filter::<State, _>(
&display_handle,
- if config_.prefer_no_csd {
- KdeDecorationsMode::Server
- } else {
- KdeDecorationsMode::Client
+ // If we want CSD we will hide the global.
+ KdeDecorationsMode::Server,
+ |client| {
+ client
+ .get_data::<ClientState>()
+ .unwrap()
+ .can_view_decoration_globals
},
);
let layer_shell_state = WlrLayerShellState::new::<State>(&display_handle);
@@ -768,7 +777,12 @@ impl Niri {
let socket_name = socket_source.socket_name().to_os_string();
event_loop
.insert_source(socket_source, move |client, _, state| {
- let data = Arc::new(ClientState::default());
+ let config = state.niri.config.borrow();
+ let data = Arc::new(ClientState {
+ compositor_state: Default::default(),
+ can_view_decoration_globals: config.prefer_no_csd,
+ });
+
if let Err(err) = state.niri.display_handle.insert_client(client, data) {
error!("error inserting client: {err}");
}
@@ -2518,9 +2532,9 @@ impl Niri {
}
}
-#[derive(Default)]
pub struct ClientState {
pub compositor_state: CompositorClientState,
+ pub can_view_decoration_globals: bool,
}
impl ClientData for ClientState {