use the last configured decoration mode...

...to check for decoration mode changes instead
of the current decoration mode
This commit is contained in:
Christian Meissl 2021-11-13 17:38:16 +01:00 committed by Victor Berger
parent 29010d93a4
commit 4849ae3b4a
1 changed files with 24 additions and 14 deletions

View File

@ -981,6 +981,27 @@ impl ToplevelSurface {
.lock() .lock()
.unwrap(); .unwrap();
if let Some(pending) = self.get_pending_state(&mut *attributes) { if let Some(pending) = self.get_pending_state(&mut *attributes) {
// Retrieve the last configured decoration mode
// by checking the last non acked configure,
// if no pending is available the last acked
// and finally fall back to the current state.
// This is necessary as send_configure could be
// called before a client ack's or commits the
// last state. Using the current state could lead
// to unnecessary decoration configures sent to clients.
//
// We have to do this check before adding the pending state
// to the pending configures.
let current_decoration_mode = attributes
.pending_configures
.last()
.map(|c| &c.state)
.or_else(|| attributes.last_acked.as_ref())
.unwrap_or(&attributes.current)
.decoration_mode;
let decoration_mode_changed = current_decoration_mode != pending.decoration_mode;
let configure = ToplevelConfigure { let configure = ToplevelConfigure {
serial: SERIAL_COUNTER.next_serial(), serial: SERIAL_COUNTER.next_serial(),
state: pending, state: pending,
@ -989,25 +1010,14 @@ impl ToplevelSurface {
attributes.pending_configures.push(configure.clone()); attributes.pending_configures.push(configure.clone());
attributes.initial_configure_sent = true; attributes.initial_configure_sent = true;
Some(configure) Some((configure, decoration_mode_changed))
} else { } else {
None None
} }
}) })
.unwrap_or(None); .unwrap_or(None);
if let Some(configure) = configure { if let Some((configure, decoration_mode_changed)) = configure {
let decoration_mode = compositor::with_states(surface, |states| { if decoration_mode_changed {
let attributes = states
.data_map
.get::<Mutex<XdgToplevelSurfaceRoleAttributes>>()
.unwrap()
.lock()
.unwrap();
attributes.current.decoration_mode
})
.unwrap_or(None);
if configure.state.decoration_mode != decoration_mode {
if let Some(data) = self if let Some(data) = self
.shell_surface .shell_surface
.as_ref() .as_ref()