diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/input/mod.rs | 39 | ||||
| -rw-r--r-- | src/niri.rs | 16 | ||||
| -rw-r--r-- | src/ui/exit_confirm_dialog.rs | 41 |
3 files changed, 46 insertions, 50 deletions
diff --git a/src/input/mod.rs b/src/input/mod.rs index 711a09dd..74290692 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -116,12 +116,8 @@ impl State { let hide_hotkey_overlay = self.niri.hotkey_overlay.is_open() && should_hide_hotkey_overlay(&event); - let hide_exit_confirm_dialog = self - .niri - .exit_confirm_dialog - .as_ref() - .is_some_and(|d| d.is_open()) - && should_hide_exit_confirm_dialog(&event); + let hide_exit_confirm_dialog = + self.niri.exit_confirm_dialog.is_open() && should_hide_exit_confirm_dialog(&event); use InputEvent::*; match event { @@ -159,10 +155,8 @@ impl State { self.niri.queue_redraw_all(); } - if let Some(dialog) = &mut self.niri.exit_confirm_dialog { - if hide_exit_confirm_dialog && dialog.hide() { - self.niri.queue_redraw_all(); - } + if hide_exit_confirm_dialog && self.niri.exit_confirm_dialog.hide() { + self.niri.queue_redraw_all(); } } @@ -381,15 +375,14 @@ impl State { let modified = keysym.modified_sym(); let raw = keysym.raw_latin_sym_or_raw_current_sym(); - if let Some(dialog) = &this.niri.exit_confirm_dialog { - if dialog.is_open() && pressed && raw == Some(Keysym::Return) { - info!("quitting after confirming exit dialog"); - this.niri.stop_signal.stop(); + if this.niri.exit_confirm_dialog.is_open() && pressed && raw == Some(Keysym::Return) + { + info!("quitting after confirming exit dialog"); + this.niri.stop_signal.stop(); - // Don't send this Enter press to any clients. - this.niri.suppressed_keys.insert(key_code); - return FilterResult::Intercept(None); - } + // Don't send this Enter press to any clients. + this.niri.suppressed_keys.insert(key_code); + return FilterResult::Intercept(None); } if pressed @@ -552,13 +545,9 @@ impl State { match action { Action::Quit(skip_confirmation) => { - if !skip_confirmation { - if let Some(dialog) = &mut self.niri.exit_confirm_dialog { - if dialog.show() { - self.niri.queue_redraw_all(); - } - return; - } + if !skip_confirmation && self.niri.exit_confirm_dialog.show() { + self.niri.queue_redraw_all(); + return; } info!("quitting as requested"); diff --git a/src/niri.rs b/src/niri.rs index 889705c6..c59a3df8 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -377,7 +377,7 @@ pub struct Niri { pub screenshot_ui: ScreenshotUi, pub config_error_notification: ConfigErrorNotification, pub hotkey_overlay: HotkeyOverlay, - pub exit_confirm_dialog: Option<ExitConfirmDialog>, + pub exit_confirm_dialog: ExitConfirmDialog, pub pick_window: Option<async_channel::Sender<Option<MappedId>>>, pub pick_color: Option<async_channel::Sender<Option<niri_ipc::PickedColor>>>, @@ -2450,13 +2450,7 @@ impl Niri { hotkey_overlay.show(); } - let exit_confirm_dialog = match ExitConfirmDialog::new() { - Ok(x) => Some(x), - Err(err) => { - warn!("error creating the exit confirm dialog: {err:?}"); - None - } - }; + let exit_confirm_dialog = ExitConfirmDialog::new(); event_loop .insert_source( @@ -4123,10 +4117,8 @@ impl Niri { } // Next, the exit confirm dialog. - if let Some(dialog) = &self.exit_confirm_dialog { - if let Some(element) = dialog.render(renderer, output) { - elements.push(element.into()); - } + if let Some(element) = self.exit_confirm_dialog.render(renderer, output) { + elements.push(element.into()); } // Next, the config error notification too. diff --git a/src/ui/exit_confirm_dialog.rs b/src/ui/exit_confirm_dialog.rs index 6458558f..11c9a9e2 100644 --- a/src/ui/exit_confirm_dialog.rs +++ b/src/ui/exit_confirm_dialog.rs @@ -27,23 +27,34 @@ pub struct ExitConfirmDialog { } impl ExitConfirmDialog { - pub fn new() -> anyhow::Result<Self> { - Ok(Self { + pub fn new() -> Self { + let buffer = match render(1.) { + Ok(x) => Some(x), + Err(err) => { + warn!("error creating the exit confirm dialog: {err:?}"); + None + } + }; + + Self { is_open: false, - buffers: RefCell::new(HashMap::from([( - NotNan::new(1.).unwrap(), - Some(render(1.)?), - )])), - }) + buffers: RefCell::new(HashMap::from([(NotNan::new(1.).unwrap(), buffer)])), + } + } + + pub fn can_show(&self) -> bool { + let buffers = self.buffers.borrow(); + let fallback = &buffers[&NotNan::new(1.).unwrap()]; + fallback.is_some() } pub fn show(&mut self) -> bool { - if !self.is_open { - self.is_open = true; - true - } else { - false + if !self.can_show() { + return false; } + + self.is_open = true; + true } pub fn hide(&mut self) -> bool { @@ -72,7 +83,11 @@ impl ExitConfirmDialog { let output_size = output_size(output); let mut buffers = self.buffers.borrow_mut(); - let fallback = buffers[&NotNan::new(1.).unwrap()].clone().unwrap(); + let Some(fallback) = buffers[&NotNan::new(1.).unwrap()].clone() else { + error!("exit confirm dialog opened without fallback buffer"); + return None; + }; + let buffer = buffers .entry(NotNan::new(scale).unwrap()) .or_insert_with(|| render(scale).ok()); |
