From d030f1360ac95b98a78cbae4c67c4e2b7643ed01 Mon Sep 17 00:00:00 2001 From: nevaforget Date: Mon, 6 Apr 2026 22:36:36 +0200 Subject: [PATCH] fix: restore keyboard focus on action buttons after dismiss (v0.8.2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After cancelling a confirmation prompt, the focused widget was removed from the tree without restoring focus to the action buttons. With layer-shell exclusive keyboard mode, GTK does not recover focus automatically — the UI became keyboard-unreachable. --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/panel.rs | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 278717d..41a046d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -616,7 +616,7 @@ dependencies = [ [[package]] name = "moonset" -version = "0.8.1" +version = "0.8.2" dependencies = [ "dirs", "gdk-pixbuf", diff --git a/Cargo.toml b/Cargo.toml index be1204d..76a2fee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "moonset" -version = "0.8.1" +version = "0.8.2" edition = "2024" description = "Wayland session power menu with GTK4 and Layer Shell" license = "MIT" diff --git a/src/panel.rs b/src/panel.rs index e8956d4..f82066a 100644 --- a/src/panel.rs +++ b/src/panel.rs @@ -292,6 +292,7 @@ pub fn create_panel_window(texture: Option<&gdk::Texture>, blur_radius: Option>>, error_label: >k::Label, + button_box: >k::Box, ) -> gtk::Button { let button_content = gtk::Box::new(gtk::Orientation::Vertical, 4); button_content.set_halign(gtk::Align::Center); @@ -404,6 +406,8 @@ fn create_action_button( confirm_box, #[weak] error_label, + #[weak] + button_box, move |_| { on_action_clicked( &action_def, @@ -412,6 +416,7 @@ fn create_action_button( &confirm_area, &confirm_box, &error_label, + &button_box, ); } )); @@ -434,6 +439,7 @@ fn on_action_clicked( confirm_area: >k::Box, confirm_box: &Rc>>, error_label: >k::Label, + button_box: >k::Box, ) { dismiss_confirm(confirm_area, confirm_box); error_label.set_visible(false); @@ -443,7 +449,7 @@ fn on_action_clicked( return; } - show_confirm(action_def, strings, app, confirm_area, confirm_box, error_label); + show_confirm(action_def, strings, app, confirm_area, confirm_box, error_label, button_box); } /// Show inline confirmation below the action buttons. @@ -454,6 +460,7 @@ fn show_confirm( confirm_area: >k::Box, confirm_box: &Rc>>, error_label: >k::Label, + button_box: >k::Box, ) { let new_box = gtk::Box::new(gtk::Orientation::Vertical, 8); new_box.set_halign(gtk::Align::Center); @@ -501,8 +508,13 @@ fn show_confirm( confirm_area, #[strong] confirm_box, + #[weak] + button_box, move |_| { dismiss_confirm(&confirm_area, &confirm_box); + if let Some(first) = button_box.first_child() { + first.grab_focus(); + } } )); button_row.append(&no_btn);