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::{
8    PathExt, Settings, ShortcutsExt, StatesExtCanvasClickThrough, StatesExtInitialRender,
9    StatesExtWidgetConfigMap, TrayExt, WindowExt,
10};
11use tauri::image::Image;
12use tauri::{generate_context, generate_handler, include_image, Builder};
13
14/// Image object for the Deskulpt icon.
15const DESKULPT_ICON: Image = include_image!("./icons/icon.png");
16
17/// Entry point for the Deskulpt backend.
18pub fn run() {
19    Builder::default()
20        .setup(|app| {
21            app.init_widgets_dir()?;
22            app.init_persist_dir()?;
23
24            let mut settings = match Settings::load(app.persist_dir()?) {
25                Ok(settings) => settings,
26                Err(e) => {
27                    eprintln!("Failed to load settings: {e}");
28                    Settings::default()
29                },
30            };
31
32            app.manage_initial_render();
33            app.manage_widget_config_map();
34            app.manage_canvas_click_through();
35
36            // Hide the application from the dock on macOS because skipping
37            // taskbar is not applicable for macOS
38            #[cfg(target_os = "macos")]
39            app.set_activation_policy(tauri::ActivationPolicy::Accessory);
40
41            app.init_shortcuts(&mut settings);
42
43            app.create_manager(&settings)?;
44            app.create_canvas(&settings)?;
45            app.create_tray(DESKULPT_ICON)?;
46
47            Ok(())
48        })
49        .on_window_event(deskulpt_core::on_window_event)
50        .invoke_handler(generate_handler![
51            deskulpt_core::commands::call_plugin,
52            deskulpt_core::commands::bundle_widget,
53            deskulpt_core::commands::emit_on_render_ready,
54            deskulpt_core::commands::exit_app,
55            deskulpt_core::commands::open_widget,
56            deskulpt_core::commands::rescan_widgets,
57            deskulpt_core::commands::set_render_ready,
58            deskulpt_core::commands::update_shortcut,
59        ])
60        .plugin(tauri_plugin_clipboard_manager::init())
61        .plugin(tauri_plugin_global_shortcut::Builder::new().build())
62        // Prevent the opener plugin from registering handler for click event
63        // so we can register our own that opens non-_blank anchors in new tab
64        .plugin(
65            tauri_plugin_opener::Builder::new()
66                .open_js_links_on_click(false)
67                .build(),
68        )
69        .run(generate_context!())
70        .expect("Error running the Deskulpt application");
71}