server: don't crash if set_fullscreen fails.

Gotta stop assuming that the X server has my best interests at heart.
Fixes #95
This commit is contained in:
Shawn Wallace 2025-01-25 15:24:11 -05:00
parent 9de1334c0c
commit 3a981c5249

View file

@ -670,7 +670,10 @@ impl<C: XConnection> ServerState<C> {
} }
pub fn set_window_serial(&mut self, window: x::Window, serial: [u32; 2]) { pub fn set_window_serial(&mut self, window: x::Window, serial: [u32; 2]) {
let win = self.windows.get_mut(&window).unwrap(); let Some(win) = self.windows.get_mut(&window) else {
warn!("Tried to set serial for unknown window {window:?}");
return;
};
win.surface_serial = Some(serial); win.surface_serial = Some(serial);
} }
@ -768,7 +771,10 @@ impl<C: XConnection> ServerState<C> {
} }
pub fn set_fullscreen(&mut self, window: x::Window, state: super::xstate::SetState) { pub fn set_fullscreen(&mut self, window: x::Window, state: super::xstate::SetState) {
let win = self.windows.get(&window).unwrap(); let Some(win) = self.windows.get(&window) else {
warn!("Tried to set unknown window {window:?} fullscreen");
return;
};
let Some(key) = win.surface_key else { let Some(key) = win.surface_key else {
warn!("Tried to set window without surface fullscreen: {window:?}"); warn!("Tried to set window without surface fullscreen: {window:?}");
return; return;
@ -783,10 +789,11 @@ impl<C: XConnection> ServerState<C> {
return; return;
}; };
use crate::xstate::SetState;
match state { match state {
crate::xstate::SetState::Add => toplevel.toplevel.set_fullscreen(None), SetState::Add => toplevel.toplevel.set_fullscreen(None),
crate::xstate::SetState::Remove => toplevel.toplevel.unset_fullscreen(), SetState::Remove => toplevel.toplevel.unset_fullscreen(),
crate::xstate::SetState::Toggle => { SetState::Toggle => {
if toplevel.fullscreen { if toplevel.fullscreen {
toplevel.toplevel.unset_fullscreen() toplevel.toplevel.unset_fullscreen()
} else { } else {
@ -829,7 +836,7 @@ impl<C: XConnection> ServerState<C> {
self.clientside self.clientside
.queue .queue
.dispatch_pending(&mut self.clientside.globals) .dispatch_pending(&mut self.clientside.globals)
.unwrap(); .expect("Failed dispatching client side Wayland events");
self.handle_clientside_events(); self.handle_clientside_events();
} }
@ -867,7 +874,10 @@ impl<C: XConnection> ServerState<C> {
} }
self.handle_clipboard_events(); self.handle_clipboard_events();
self.clientside.queue.flush().unwrap(); self.clientside
.queue
.flush()
.expect("Failed flushing clientside events");
} }
pub fn new_selection(&mut self) -> Option<ForeignSelection> { pub fn new_selection(&mut self) -> Option<ForeignSelection> {