use the last configured decoration mode...
...to check for decoration mode changes instead of the current decoration mode
This commit is contained in:
parent
29010d93a4
commit
4849ae3b4a
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue