stacking: Correctly restore decoration state

This commit is contained in:
Victoria Brekenfeld 2023-06-14 16:43:13 +02:00
parent 5cdf614692
commit 5884e287a5
4 changed files with 47 additions and 14 deletions

View file

@ -505,6 +505,8 @@ impl CosmicMapped {
outputs: impl Iterator<Item = (&'a Output, Rectangle<i32, Logical>)>, outputs: impl Iterator<Item = (&'a Output, Rectangle<i32, Logical>)>,
) { ) {
let handle = self.loop_handle(); let handle = self.loop_handle();
surface.try_force_undecorated(false);
surface.set_tiled(false);
let window = CosmicWindow::new(surface, handle); let window = CosmicWindow::new(surface, handle);
if let Some(geo) = self.last_geometry.lock().unwrap().clone() { if let Some(geo) = self.last_geometry.lock().unwrap().clone() {

View file

@ -1,4 +1,4 @@
use std::{cell::RefCell, time::Duration}; use std::time::Duration;
use smithay::{ use smithay::{
backend::renderer::{ backend::renderer::{
@ -38,7 +38,7 @@ use smithay::{
xwayland::{xwm::X11Relatable, X11Surface}, xwayland::{xwm::X11Relatable, X11Surface},
}; };
use crate::state::SurfaceDmabufFeedback; use crate::{state::SurfaceDmabufFeedback, wayland::handlers::decoration::PreferredDecorationMode};
space_elements! { space_elements! {
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
@ -195,22 +195,14 @@ impl CosmicSurface {
if enable { if enable {
let previous_decoration_state = let previous_decoration_state =
window.toplevel().current_state().decoration_mode.clone(); window.toplevel().current_state().decoration_mode.clone();
window if PreferredDecorationMode::is_unset(window) {
.user_data() PreferredDecorationMode::update(window, previous_decoration_state);
.insert_if_missing(|| RefCell::new(Option::<DecorationMode>::None)); }
*window
.user_data()
.get::<RefCell<Option<DecorationMode>>>()
.unwrap()
.borrow_mut() = previous_decoration_state;
window.toplevel().with_pending_state(|pending| { window.toplevel().with_pending_state(|pending| {
pending.decoration_mode = Some(DecorationMode::ServerSide); pending.decoration_mode = Some(DecorationMode::ServerSide);
}); });
} else { } else {
let previous_mode = window let previous_mode = PreferredDecorationMode::mode(window);
.user_data()
.get::<RefCell<Option<DecorationMode>>>()
.and_then(|m| m.borrow().clone());
window.toplevel().with_pending_state(|pending| { window.toplevel().with_pending_state(|pending| {
pending.decoration_mode = previous_mode; pending.decoration_mode = previous_mode;
}); });

View file

@ -1217,6 +1217,8 @@ impl TilingLayout {
// map the rest // map the rest
for other in surfaces { for other in surfaces {
other.try_force_undecorated(false);
other.set_tiled(false);
let window = let window =
CosmicMapped::from(CosmicWindow::new(other, handle.clone())); CosmicMapped::from(CosmicWindow::new(other, handle.clone()));
window.output_enter(&output, window.bbox()); window.output_enter(&output, window.bbox());

View file

@ -1,5 +1,8 @@
use std::cell::RefCell;
use smithay::{ use smithay::{
delegate_kde_decoration, delegate_xdg_decoration, delegate_kde_decoration, delegate_xdg_decoration,
desktop::Window,
reexports::{ reexports::{
wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode as XdgMode, wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode as XdgMode,
wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration::{ wayland_protocols_misc::server_decoration::server::org_kde_kwin_server_decoration::{
@ -22,6 +25,38 @@ use crate::{
state::State, state::State,
}; };
pub struct PreferredDecorationMode(RefCell<Option<XdgMode>>);
impl PreferredDecorationMode {
pub fn is_unset(window: &Window) -> bool {
window
.user_data()
.get::<PreferredDecorationMode>()
.is_none()
}
pub fn mode(window: &Window) -> Option<XdgMode> {
let user_data = window.user_data();
user_data.insert_if_missing(|| PreferredDecorationMode(RefCell::new(None)));
user_data
.get::<PreferredDecorationMode>()
.unwrap()
.0
.borrow()
.clone()
}
pub fn update(window: &Window, update: Option<XdgMode>) {
let user_data = window.user_data();
user_data.insert_if_missing(|| PreferredDecorationMode(RefCell::new(None)));
*user_data
.get::<PreferredDecorationMode>()
.unwrap()
.0
.borrow_mut() = update;
}
}
impl State { impl State {
pub fn new_decoration(mapped: &CosmicMapped, surface: &WlSurface) -> KdeMode { pub fn new_decoration(mapped: &CosmicMapped, surface: &WlSurface) -> KdeMode {
if mapped.is_stack() { if mapped.is_stack() {
@ -54,6 +89,7 @@ impl State {
.windows() .windows()
.find(|(window, _)| window.wl_surface().as_ref() == Some(surface)) .find(|(window, _)| window.wl_surface().as_ref() == Some(surface))
{ {
PreferredDecorationMode::update(&window, Some(mode));
window.toplevel().with_pending_state(|state| { window.toplevel().with_pending_state(|state| {
state.decoration_mode = Some(mode); state.decoration_mode = Some(mode);
}); });
@ -66,6 +102,7 @@ impl State {
.windows() .windows()
.find(|(window, _)| window.wl_surface().as_ref() == Some(surface)) .find(|(window, _)| window.wl_surface().as_ref() == Some(surface))
{ {
PreferredDecorationMode::update(&window, None);
window.toplevel().with_pending_state(|state| { window.toplevel().with_pending_state(|state| {
state.decoration_mode = None; state.decoration_mode = None;
}); });