macos: hide Reenable warning row once Accessibility is granted

The yellow "input capture is disabled" / "input emulation is disabled"
rows were showing simultaneously with the Relaunch toast after a
live AX grant, double-prompting the user for the same action.

Gate the warning row visibility on Accessibility actually being
missing: when AX is granted but capture/emulation remain inactive,
we're in the pending-relaunch state and the Relaunch toast is the
authoritative prompt. Trigger a status refresh from the AX watcher
so the rows hide the instant AX flips to granted, not when the
daemon next reports status.

On non-macOS platforms the visibility logic is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jon Kinney
2026-04-24 08:54:23 -05:00
parent 06e0c96d67
commit a9cccd95ec
2 changed files with 28 additions and 3 deletions

View File

@@ -274,6 +274,12 @@ fn show_macos_relaunch_dialog(app: &Application, window: &Window) {
// otherwise fires into a surface the user can't see. // otherwise fires into a surface the user can't see.
window.present(); window.present();
// Refresh the capture/emulation status rows so the yellow
// "Reenable" warning disappears. It was showing because the daemon
// reports capture/emulation inactive; now that AX is granted the
// Relaunch toast is the right prompt and the warning is redundant.
window.refresh_capture_emulation_status();
let toast = adw::Toast::builder() let toast = adw::Toast::builder()
.title( .title(
"Accessibility granted. Relaunch Lan Mouse so capture and \ "Accessibility granted. Relaunch Lan Mouse so capture and \

View File

@@ -450,14 +450,33 @@ impl Window {
self.update_capture_emulation_status(); self.update_capture_emulation_status();
} }
#[cfg(target_os = "macos")]
pub(super) fn refresh_capture_emulation_status(&self) {
self.update_capture_emulation_status();
}
fn update_capture_emulation_status(&self) { fn update_capture_emulation_status(&self) {
let capture = self.imp().capture_active.get(); let capture = self.imp().capture_active.get();
let emulation = self.imp().emulation_active.get(); let emulation = self.imp().emulation_active.get();
self.imp().capture_status_row.set_visible(!capture);
self.imp().emulation_status_row.set_visible(!emulation); // On macOS the yellow "Reenable" row only makes sense when
// Accessibility is actually missing. When AX is granted but
// capture/emulation are still off, the daemon simply hasn't been
// restarted yet — the Relaunch toast covers that state, and a
// yellow "grant permission" warning on top of it would be
// redundant and confusing.
#[cfg(target_os = "macos")]
let show_warning = !crate::macos_privacy::accessibility_granted();
#[cfg(not(target_os = "macos"))]
let show_warning = true;
let show_capture_row = !capture && show_warning;
let show_emulation_row = !emulation && show_warning;
self.imp().capture_status_row.set_visible(show_capture_row);
self.imp().emulation_status_row.set_visible(show_emulation_row);
self.imp() self.imp()
.capture_emulation_group .capture_emulation_group
.set_visible(!capture || !emulation); .set_visible(show_capture_row || show_emulation_row);
} }
pub(super) fn set_authorized_keys(&self, fingerprints: HashMap<String, String>) { pub(super) fn set_authorized_keys(&self, fingerprints: HashMap<String, String>) {