// Copyright 2019-2024 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT use tauri_utils::{Theme, config::BundleType}; use crate::{ AppHandle, Manager, ResourceId, Runtime, Webview, command, plugin::{Builder, TauriPlugin}, }; #[command(root = "crate")] pub fn version(app: AppHandle) -> String { app.package_info().version.to_string() } #[command(root = "crate")] pub fn name(app: AppHandle) -> String { app.package_info().name.clone() } #[command(root = "crate")] pub fn tauri_version() -> &'static str { crate::VERSION } #[command(root = "crate")] pub fn identifier(app: AppHandle) -> String { app.config().identifier.clone() } #[command(root = "crate")] #[allow(unused_variables)] pub fn app_show(app: AppHandle) -> crate::Result<()> { #[cfg(target_os = "macos")] app.show()?; Ok(()) } #[command(root = "crate")] #[allow(unused_variables)] pub fn app_hide(app: AppHandle) -> crate::Result<()> { #[cfg(target_os = "macos")] app.hide()?; Ok(()) } #[command(root = "crate")] pub fn exit(app: AppHandle, code: i32) { app.exit(code) } #[command(root = "crate")] #[allow(unused_variables)] pub async fn fetch_data_store_identifiers( app: AppHandle, ) -> crate::Result> { #[cfg(target_vendor = "apple")] return app.fetch_data_store_identifiers().await; #[cfg(not(target_vendor = "apple"))] return Ok(Vec::new()); } #[command(root = "crate")] #[allow(unused_variables)] pub async fn remove_data_store(app: AppHandle, uuid: [u8; 16]) -> crate::Result<()> { #[cfg(target_vendor = "apple")] app.remove_data_store(uuid).await?; #[cfg(not(target_vendor = "apple"))] let _ = uuid; Ok(()) } #[command(root = "crate")] pub fn default_window_icon( webview: Webview, app: AppHandle, ) -> Option { app.default_window_icon().cloned().map(|icon| { let mut resources_table = webview.resources_table(); resources_table.add(icon.to_owned()) }) } #[command(root = "crate")] pub async fn set_app_theme(app: AppHandle, theme: Option) { app.set_theme(theme); } #[command(root = "crate")] pub async fn set_dock_visibility( app: AppHandle, visible: bool, ) -> crate::Result<()> { #[cfg(target_os = "macos")] { let mut focused_window = None; for window in app.manager.windows().into_values() { if window.is_focused().unwrap_or_default() { focused_window.replace(window); break; } } app.set_dock_visibility(visible)?; // retain focus if let Some(focused_window) = focused_window { let _ = focused_window.set_focus(); } } #[cfg(not(target_os = "macos"))] let (_app, _visible) = (app, visible); Ok(()) } #[command(root = "crate")] pub fn bundle_type() -> Option { tauri_utils::platform::bundle_type() } #[command(root = "crate")] pub fn supports_multiple_windows(app: AppHandle) -> bool { app.supports_multiple_windows() } pub fn init() -> TauriPlugin { Builder::new("app") .invoke_handler(crate::generate_handler![ #![plugin(app)] version, name, tauri_version, identifier, app_show, app_hide, exit, fetch_data_store_identifiers, remove_data_store, default_window_icon, set_app_theme, set_dock_visibility, bundle_type, supports_multiple_windows, ]) .setup(|_app, _api| { #[cfg(target_os = "android")] { let handle = _api.register_android_plugin("app.tauri", "AppPlugin")?; _app.manage(AppPlugin(handle)); } Ok(()) }) .build() } #[cfg(target_os = "android")] pub(crate) struct AppPlugin(pub crate::plugin::PluginHandle);