live metadata display in UI

This commit is contained in:
2026-08-07 03:27:40 +08:00
parent 81e03ba152
commit 151ff9e5c6
7 changed files with 148 additions and 20 deletions
+24 -4
View File
@@ -2,6 +2,9 @@
UFA: User Focused App
*/
use std::sync::RwLock;
use tauri::{AppHandle, Manager};
use tauri_specta::Event;
pub use types::*;
mod icon_cache;
#[cfg(target_os = "macos")]
@@ -10,6 +13,15 @@ mod types;
#[cfg(target_os = "windows")]
mod windows;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, specta::Type, Event)]
#[serde(rename_all = "camelCase")]
pub struct ForegroundAppChanged {
pub meta: AppMeta,
}
#[derive(Default)]
pub struct ForegroundAppState(RwLock<AppMeta>);
/// Listens for changes in the active (foreground) application and calls the provided callback with metadata.
/// The implementation varies by platform: macOS uses NSWorkspace notifications, Windows uses WinEventHook.
pub fn init_listener<F>(callback: F)
@@ -46,9 +58,17 @@ where
/// Initializes the foreground app change listener
/// and emits events to the Tauri app on changes.
/// Used for app to emit user foreground app to peers.
pub fn init() {
init_listener(|meta: AppMeta| {
// TODO: Emit metadata to the app
println!("EVENT: FOREGROUND APP CHANGED\n({:?})", meta);
pub fn init(handle: &AppHandle) {
let handle = handle.clone();
init_listener(move |meta: AppMeta| {
let state = handle.state::<ForegroundAppState>();
let mut current = state.0.write().expect("Foreground App lock failed");
*current = meta.clone();
drop(current);
if let Err(error) = (ForegroundAppChanged { meta }).emit(&handle) {
eprintln!("Failed to emit foreground app change: {error}");
}
});
}
+2 -1
View File
@@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};
use specta::Type;
pub const ICON_SIZE: u32 = 64;
pub const ICON_CACHE_LIMIT: usize = 50;
@@ -10,7 +11,7 @@ pub const ICON_CACHE_LIMIT: usize = 50;
pub const MAX_ICON_B64_SIZE: usize = 50_000;
/// Metadata for the currently active application, including localized and unlocalized names, and an optional base64-encoded icon.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[derive(Debug, Clone, Serialize, Deserialize, Default, Type)]
#[serde(rename_all = "camelCase")]
pub struct AppMeta {
pub local: Option<String>,