deskulpt/
lib.rs

1#![doc = include_str!("../README.md")]
2#![doc(
3    html_logo_url = "https://github.com/CSCI-SHU-410-SE-Project/Deskulpt/raw/main/src/public/deskulpt.svg",
4    html_favicon_url = "https://github.com/CSCI-SHU-410-SE-Project/Deskulpt/raw/main/src/public/deskulpt.svg"
5)]
6
7use deskulpt_core::path::PathExt;
8use deskulpt_core::states::{
9    CanvasImodeStateExt, InitialRenderStateExt, SettingsStateExt, WidgetConfigMapStateExt,
10};
11use deskulpt_core::tray::TrayExt;
12use deskulpt_core::window::WindowExt;
13use tauri::image::Image;
14use tauri::{generate_context, include_image, Builder, Wry};
15use tauri_specta::{collect_commands, collect_events};
16
17/// Image object for the Deskulpt icon.
18const DESKULPT_ICON: Image = include_image!("./icons/icon.png");
19
20/// Get the builder of bindings for Deskulpt commands and events.
21pub fn get_bindings_builder() -> tauri_specta::Builder {
22    tauri_specta::Builder::<Wry>::new()
23        .commands(collect_commands![
24            deskulpt_core::commands::bundle_widget::<Wry>,
25            deskulpt_core::commands::call_plugin::<Wry>,
26            deskulpt_core::commands::emit_on_render_ready::<Wry>,
27            deskulpt_core::commands::exit_app::<Wry>,
28            deskulpt_core::commands::open_widget::<Wry>,
29            deskulpt_core::commands::rescan_widgets::<Wry>,
30            deskulpt_core::commands::set_render_ready::<Wry>,
31            deskulpt_core::commands::update_settings::<Wry>,
32        ])
33        .events(collect_events![
34            deskulpt_core::events::ExitAppEvent,
35            deskulpt_core::events::RemoveWidgetsEvent,
36            deskulpt_core::events::RenderWidgetsEvent,
37            deskulpt_core::events::ShowToastEvent,
38            deskulpt_core::events::SwitchThemeEvent,
39            deskulpt_core::events::UpdateSettingsEvent,
40        ])
41        .typ::<deskulpt_core::window::DeskulptWindow>()
42}
43
44/// Entry point for the Deskulpt backend.
45pub fn run() {
46    let bindings_builder = get_bindings_builder();
47
48    Builder::default()
49        .invoke_handler(bindings_builder.invoke_handler())
50        .setup(move |app| {
51            bindings_builder.mount_events(app);
52
53            app.init_widgets_dir()?;
54            app.init_persist_dir()?;
55
56            app.manage_settings();
57            app.manage_initial_render();
58            app.manage_widget_config_map();
59            app.manage_canvas_imode();
60
61            // Hide the application from the dock on macOS because skipping
62            // taskbar is not applicable for macOS
63            #[cfg(target_os = "macos")]
64            app.set_activation_policy(tauri::ActivationPolicy::Accessory);
65
66            app.create_manager()?;
67            app.create_canvas()?;
68            app.create_tray(DESKULPT_ICON)?;
69
70            Ok(())
71        })
72        .on_window_event(deskulpt_core::window::on_window_event)
73        .plugin(tauri_plugin_clipboard_manager::init())
74        .plugin(tauri_plugin_global_shortcut::Builder::new().build())
75        // Prevent the opener plugin from registering handler for click event
76        // so we can register our own that opens non-_blank anchors in new tab
77        .plugin(
78            tauri_plugin_opener::Builder::new()
79                .open_js_links_on_click(false)
80                .build(),
81        )
82        .run(generate_context!())
83        .expect("Error running the Deskulpt application");
84}