aboutsummaryrefslogtreecommitdiff
path: root/src/handlers
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-26 13:44:37 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-26 13:45:03 +0400
commit80928632ba38210242832e316b57e2e153da7efd (patch)
tree2ed62ffc89913f060dc4633b3f75aa7ff1740540 /src/handlers
parentdc10e464ad3bd95007873875bf44e9280392e15a (diff)
downloadniri-80928632ba38210242832e316b57e2e153da7efd.tar.gz
niri-80928632ba38210242832e316b57e2e153da7efd.tar.bz2
niri-80928632ba38210242832e316b57e2e153da7efd.zip
Add prefer-no-csd option
Diffstat (limited to 'src/handlers')
-rw-r--r--src/handlers/xdg_shell.rs38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs
index b1dd9d4f..75b03add 100644
--- a/src/handlers/xdg_shell.rs
+++ b/src/handlers/xdg_shell.rs
@@ -1,16 +1,18 @@
-use smithay::delegate_xdg_shell;
use smithay::desktop::{find_popup_root_surface, PopupKind, Window};
use smithay::output::Output;
+use smithay::reexports::wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1;
use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::{self, ResizeEdge};
use smithay::reexports::wayland_server::protocol::wl_output;
use smithay::reexports::wayland_server::protocol::wl_seat::WlSeat;
use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface;
use smithay::utils::Serial;
use smithay::wayland::compositor::with_states;
+use smithay::wayland::shell::xdg::decoration::XdgDecorationHandler;
use smithay::wayland::shell::xdg::{
PopupSurface, PositionerState, ToplevelSurface, XdgPopupSurfaceData, XdgShellHandler,
XdgShellState, XdgToplevelSurfaceData,
};
+use smithay::{delegate_xdg_decoration, delegate_xdg_shell};
use crate::layout::{configure_new_window, output_size};
use crate::niri::State;
@@ -164,6 +166,40 @@ impl XdgShellHandler for State {
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
+ };
+ toplevel.with_pending_state(|state| {
+ state.decoration_mode = mode;
+ });
+ toplevel.send_configure();
+ }
+
+ fn request_mode(&mut self, toplevel: ToplevelSurface, mode: zxdg_toplevel_decoration_v1::Mode) {
+ toplevel.with_pending_state(|state| {
+ state.decoration_mode = Some(mode);
+ });
+ toplevel.send_configure();
+ }
+
+ 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
+ };
+ toplevel.with_pending_state(|state| {
+ state.decoration_mode = mode;
+ });
+ toplevel.send_configure();
+ }
+}
+delegate_xdg_decoration!(State);
+
pub fn send_initial_configure_if_needed(window: &Window) {
let initial_configure_sent = with_states(window.toplevel().wl_surface(), |states| {
states