diff options
| author | Kirill Chibisov <contact@kchibisov.com> | 2024-06-14 21:40:41 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-06-19 17:42:29 +0300 |
| commit | 226273f6607ae83b17c06e0e094ace64ed7a4f7c (patch) | |
| tree | b885868061e84a55c022bf034e7ca2a2b1a15638 | |
| parent | c0ded35783f1ab4f3cc687d857ed7ee44ecb60bb (diff) | |
| download | niri-226273f6607ae83b17c06e0e094ace64ed7a4f7c.tar.gz niri-226273f6607ae83b17c06e0e094ace64ed7a4f7c.tar.bz2 niri-226273f6607ae83b17c06e0e094ace64ed7a4f7c.zip | |
Handle KDE decorations in Mapped::has_ssd
This fixes an issue with default CSD border being drawn for SSD
rendering firefox, because only xdg decorations were checked.
| -rw-r--r-- | src/handlers/mod.rs | 1 | ||||
| -rw-r--r-- | src/handlers/xdg_shell.rs | 39 | ||||
| -rw-r--r-- | src/window/mapped.rs | 18 |
3 files changed, 55 insertions, 3 deletions
diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 74be4df3..845faf08 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -62,6 +62,7 @@ use smithay::{ delegate_virtual_keyboard_manager, delegate_xdg_activation, }; +pub use crate::handlers::xdg_shell::KdeDecorationsModeState; use crate::niri::{ClientState, State}; use crate::protocols::foreign_toplevel::{ self, ForeignToplevelHandler, ForeignToplevelManagerState, diff --git a/src/handlers/xdg_shell.rs b/src/handlers/xdg_shell.rs index 3e6234fa..30b2f5d8 100644 --- a/src/handlers/xdg_shell.rs +++ b/src/handlers/xdg_shell.rs @@ -1,3 +1,5 @@ +use std::cell::Cell; + use smithay::desktop::{ find_popup_root_surface, get_popup_toplevel_coords, layer_map_for_output, utils, LayerSurface, PopupKeyboardGrab, PopupKind, PopupManager, PopupPointerGrab, PopupUngrabStrategy, Window, @@ -8,10 +10,11 @@ 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_positioner::ConstraintAdjustment; use smithay::reexports::wayland_protocols::xdg::shell::server::xdg_toplevel::{self}; +use smithay::reexports::wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration; 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::reexports::wayland_server::Resource; +use smithay::reexports::wayland_server::{self, Resource, WEnum}; use smithay::utils::{Logical, Rectangle, Serial}; use smithay::wayland::compositor::{ add_pre_commit_hook, with_states, BufferAssignment, HookId, SurfaceAttributes, @@ -544,10 +547,44 @@ impl XdgDecorationHandler for State { } delegate_xdg_decoration!(State); +/// Whether KDE server decorations are in use. +#[derive(Default)] +pub struct KdeDecorationsModeState { + server: Cell<bool>, +} + +impl KdeDecorationsModeState { + pub fn is_server(&self) -> bool { + self.server.get() + } +} + impl KdeDecorationHandler for State { fn kde_decoration_state(&self) -> &KdeDecorationState { &self.niri.kde_decoration_state } + + fn request_mode( + &mut self, + surface: &WlSurface, + decoration: &org_kde_kwin_server_decoration::OrgKdeKwinServerDecoration, + mode: wayland_server::WEnum<org_kde_kwin_server_decoration::Mode>, + ) { + let WEnum::Value(mode) = mode else { + return; + }; + + decoration.mode(mode); + + with_states(surface, |states| { + let state = states + .data_map + .get_or_insert(KdeDecorationsModeState::default); + state + .server + .set(mode == org_kde_kwin_server_decoration::Mode::Server); + }); + } } delegate_kde_decoration!(State); diff --git a/src/window/mapped.rs b/src/window/mapped.rs index 6db13ad9..ae5204ea 100644 --- a/src/window/mapped.rs +++ b/src/window/mapped.rs @@ -17,6 +17,7 @@ use smithay::wayland::compositor::{remove_pre_commit_hook, with_states, HookId}; use smithay::wayland::shell::xdg::{SurfaceCachedState, ToplevelSurface}; use super::{ResolvedWindowRules, WindowRef}; +use crate::handlers::KdeDecorationsModeState; use crate::layout::{ InteractiveResizeData, LayoutElement, LayoutElementRenderElement, LayoutElementRenderSnapshot, }; @@ -422,8 +423,21 @@ impl LayoutElement for Mapped { } fn has_ssd(&self) -> bool { - self.toplevel().current_state().decoration_mode - == Some(zxdg_toplevel_decoration_v1::Mode::ServerSide) + let toplevel = self.toplevel(); + let mode = toplevel.current_state().decoration_mode; + + match mode { + Some(zxdg_toplevel_decoration_v1::Mode::ServerSide) => true, + // Check KDE decorations when XDG are not in use. + None => with_states(toplevel.wl_surface(), |states| { + states + .data_map + .get::<KdeDecorationsModeState>() + .map(KdeDecorationsModeState::is_server) + == Some(true) + }), + _ => false, + } } fn output_enter(&self, output: &Output) { |
