move crate root feature module files into folders

This commit is contained in:
2026-09-01 22:04:36 +08:00
parent 9041283b65
commit 3c1cc256c7
11 changed files with 25 additions and 17 deletions
+108
View File
@@ -0,0 +1,108 @@
use std::{
sync::atomic::{AtomicBool, Ordering},
time::Duration,
};
use tauri::{AppHandle, Manager};
pub struct AccessibilityPermissionState(AtomicBool);
impl AccessibilityPermissionState {
fn new(granted: bool) -> Self {
Self(AtomicBool::new(granted))
}
fn replace(&self, granted: bool) -> bool {
self.0.swap(granted, Ordering::AcqRel) != granted
}
fn granted(&self) -> bool {
self.0.load(Ordering::Acquire)
}
}
#[cfg(target_os = "macos")]
fn system_accessibility_permission_granted() -> bool {
macos_accessibility_client::accessibility::application_is_trusted()
}
#[cfg(not(target_os = "macos"))]
fn system_accessibility_permission_granted() -> bool {
true
}
#[cfg(target_os = "macos")]
fn request_system_accessibility_permission() -> bool {
macos_accessibility_client::accessibility::application_is_trusted_with_prompt()
}
#[cfg(not(target_os = "macos"))]
fn request_system_accessibility_permission() -> bool {
true
}
pub fn accessibility_permission_granted(handle: &AppHandle) -> bool {
if !cfg!(target_os = "macos") {
return true;
}
handle.state::<AccessibilityPermissionState>().granted()
}
async fn apply_permission_state(handle: &AppHandle, granted: bool) -> Result<bool, String> {
if handle.state::<AccessibilityPermissionState>().granted() == granted {
crate::application::reconcile_cursor(handle);
return Ok(false);
}
if !handle
.state::<AccessibilityPermissionState>()
.replace(granted)
{
return Ok(false);
}
let database = handle.state();
let status = crate::onboarding::emit_status(handle, &database).await?;
if status.onboarding_done {
if granted {
crate::application::reconcile_cursor(handle);
} else {
crate::ui::onboarding::show_accessibility_page(handle)?;
}
}
Ok(true)
}
pub async fn init(handle: &AppHandle) -> Result<bool, String> {
let granted = system_accessibility_permission_granted();
handle.manage(AccessibilityPermissionState::new(granted));
#[cfg(target_os = "macos")]
{
let handle = handle.clone();
tauri::async_runtime::spawn(async move {
let mut interval = tokio::time::interval(Duration::from_secs(1));
interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip);
interval.tick().await;
loop {
interval.tick().await;
let granted = system_accessibility_permission_granted();
if let Err(error) = apply_permission_state(&handle, granted).await {
eprintln!("failed to update macOS Accessibility permission: {error}");
}
}
});
}
Ok(granted)
}
#[tauri::command]
#[specta::specta]
pub async fn request_accessibility_permission(handle: AppHandle) -> Result<bool, String> {
let granted = tauri::async_runtime::spawn_blocking(request_system_accessibility_permission)
.await
.map_err(|error| error.to_string())?;
apply_permission_state(&handle, granted).await?;
Ok(granted)
}