@bghitcode/bghitapp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/cli.js +2995 -0
- package/package.json +104 -0
- package/src-tauri/Cargo.lock +5966 -0
- package/src-tauri/Cargo.toml +59 -0
- package/src-tauri/Info.plist +14 -0
- package/src-tauri/assets/macos/dmg/background.png +0 -0
- package/src-tauri/assets/main.wxs +350 -0
- package/src-tauri/bghitapp.json +42 -0
- package/src-tauri/build.rs +5 -0
- package/src-tauri/capabilities/default.json +29 -0
- package/src-tauri/entitlements.plist +7 -0
- package/src-tauri/icons/chatgpt.icns +0 -0
- package/src-tauri/icons/deepseek.icns +0 -0
- package/src-tauri/icons/excalidraw.icns +0 -0
- package/src-tauri/icons/flomo.icns +0 -0
- package/src-tauri/icons/gemini.icns +0 -0
- package/src-tauri/icons/grok.icns +0 -0
- package/src-tauri/icons/icon.icns +0 -0
- package/src-tauri/icons/icon.png +0 -0
- package/src-tauri/icons/lizhi.icns +0 -0
- package/src-tauri/icons/programmusic.icns +0 -0
- package/src-tauri/icons/qwerty.icns +0 -0
- package/src-tauri/icons/twitter.icns +0 -0
- package/src-tauri/icons/wechat.icns +0 -0
- package/src-tauri/icons/weekly.icns +0 -0
- package/src-tauri/icons/weread.icns +0 -0
- package/src-tauri/icons/xiaohongshu.icns +0 -0
- package/src-tauri/icons/youtube.icns +0 -0
- package/src-tauri/icons/youtubemusic.icns +0 -0
- package/src-tauri/rust_proxy.toml +10 -0
- package/src-tauri/src/app/config.rs +100 -0
- package/src-tauri/src/app/invoke.rs +242 -0
- package/src-tauri/src/app/menu.rs +324 -0
- package/src-tauri/src/app/mod.rs +6 -0
- package/src-tauri/src/app/setup.rs +172 -0
- package/src-tauri/src/app/window.rs +577 -0
- package/src-tauri/src/inject/auth.js +75 -0
- package/src-tauri/src/inject/custom.js +0 -0
- package/src-tauri/src/inject/event.js +1111 -0
- package/src-tauri/src/inject/find.js +708 -0
- package/src-tauri/src/inject/fullscreen.js +253 -0
- package/src-tauri/src/inject/offline.js +68 -0
- package/src-tauri/src/inject/splash-transition.js +13 -0
- package/src-tauri/src/inject/style.js +505 -0
- package/src-tauri/src/inject/theme_refresh.js +59 -0
- package/src-tauri/src/inject/toast.js +22 -0
- package/src-tauri/src/lib.rs +227 -0
- package/src-tauri/src/main.rs +8 -0
- package/src-tauri/src/util.rs +245 -0
- package/src-tauri/tauri.conf.json +20 -0
- package/src-tauri/tauri.linux.conf.json +12 -0
- package/src-tauri/tauri.macos.conf.json +28 -0
- package/src-tauri/tauri.windows.conf.json +15 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
use crate::app::window::open_additional_window_safe;
|
|
2
|
+
use std::str::FromStr;
|
|
3
|
+
use std::sync::{Arc, Mutex};
|
|
4
|
+
use std::time::{Duration, Instant};
|
|
5
|
+
use tauri::{
|
|
6
|
+
menu::{MenuBuilder, MenuItemBuilder},
|
|
7
|
+
tray::{TrayIconBuilder, TrayIconEvent},
|
|
8
|
+
AppHandle, Manager,
|
|
9
|
+
};
|
|
10
|
+
use tauri_plugin_global_shortcut::{GlobalShortcutExt, Shortcut};
|
|
11
|
+
use tauri_plugin_window_state::{AppHandleExt, StateFlags};
|
|
12
|
+
|
|
13
|
+
pub fn set_system_tray(
|
|
14
|
+
app: &AppHandle,
|
|
15
|
+
show_system_tray: bool,
|
|
16
|
+
tray_icon_path: &str,
|
|
17
|
+
_init_fullscreen: bool,
|
|
18
|
+
allow_multi_window: bool,
|
|
19
|
+
) -> tauri::Result<()> {
|
|
20
|
+
if !show_system_tray {
|
|
21
|
+
app.remove_tray_by_id("bghitapp-tray");
|
|
22
|
+
return Ok(());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let new_window = MenuItemBuilder::with_id("new_window", "New Window").build(app)?;
|
|
26
|
+
let hide_app = MenuItemBuilder::with_id("hide_app", "Hide").build(app)?;
|
|
27
|
+
let show_app = MenuItemBuilder::with_id("show_app", "Show").build(app)?;
|
|
28
|
+
let quit = MenuItemBuilder::with_id("quit", "Quit").build(app)?;
|
|
29
|
+
|
|
30
|
+
let menu = if allow_multi_window {
|
|
31
|
+
MenuBuilder::new(app)
|
|
32
|
+
.items(&[&new_window, &hide_app, &show_app, &quit])
|
|
33
|
+
.build()?
|
|
34
|
+
} else {
|
|
35
|
+
MenuBuilder::new(app)
|
|
36
|
+
.items(&[&hide_app, &show_app, &quit])
|
|
37
|
+
.build()?
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
app.app_handle().remove_tray_by_id("bghitapp-tray");
|
|
41
|
+
|
|
42
|
+
let mut tray_builder = TrayIconBuilder::new()
|
|
43
|
+
.menu(&menu)
|
|
44
|
+
.on_menu_event(move |app, event| match event.id().as_ref() {
|
|
45
|
+
"new_window" => {
|
|
46
|
+
open_additional_window_safe(app);
|
|
47
|
+
}
|
|
48
|
+
"hide_app" => {
|
|
49
|
+
if let Some(window) = app.get_webview_window("bghitapp") {
|
|
50
|
+
let _ = window.minimize();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
"show_app" => {
|
|
54
|
+
if let Some(window) = app.get_webview_window("bghitapp") {
|
|
55
|
+
let _ = window.show();
|
|
56
|
+
#[cfg(target_os = "linux")]
|
|
57
|
+
if _init_fullscreen && !window.is_fullscreen().unwrap_or(false) {
|
|
58
|
+
let _ = window.set_fullscreen(true);
|
|
59
|
+
let _ = window.set_focus();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
"quit" => {
|
|
64
|
+
let _ = app.save_window_state(StateFlags::all());
|
|
65
|
+
app.exit(0);
|
|
66
|
+
}
|
|
67
|
+
_ => (),
|
|
68
|
+
})
|
|
69
|
+
.on_tray_icon_event(move |tray, event| match event {
|
|
70
|
+
TrayIconEvent::Click { button, .. } => {
|
|
71
|
+
if button == tauri::tray::MouseButton::Left {
|
|
72
|
+
if let Some(window) = tray.app_handle().get_webview_window("bghitapp") {
|
|
73
|
+
let is_visible = window.is_visible().unwrap_or(false);
|
|
74
|
+
if is_visible {
|
|
75
|
+
let _ = window.hide();
|
|
76
|
+
} else {
|
|
77
|
+
let _ = window.show();
|
|
78
|
+
let _ = window.set_focus();
|
|
79
|
+
#[cfg(target_os = "linux")]
|
|
80
|
+
if _init_fullscreen && !window.is_fullscreen().unwrap_or(false) {
|
|
81
|
+
let _ = window.set_fullscreen(true);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
_ => {}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
let resolved_icon = if tray_icon_path.is_empty() {
|
|
91
|
+
app.default_window_icon().cloned()
|
|
92
|
+
} else {
|
|
93
|
+
tauri::image::Image::from_path(tray_icon_path)
|
|
94
|
+
.ok()
|
|
95
|
+
.or_else(|| app.default_window_icon().cloned())
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
if let Some(icon) = resolved_icon {
|
|
99
|
+
tray_builder = tray_builder.icon(icon);
|
|
100
|
+
} else {
|
|
101
|
+
eprintln!("[BghitApp] No tray icon available; tray will build without an icon.");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let tray = tray_builder.build(app)?;
|
|
105
|
+
|
|
106
|
+
tray.set_icon_as_template(false)?;
|
|
107
|
+
Ok(())
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
pub fn set_global_shortcut(
|
|
111
|
+
app: &AppHandle,
|
|
112
|
+
shortcut: String,
|
|
113
|
+
_init_fullscreen: bool,
|
|
114
|
+
) -> tauri::Result<()> {
|
|
115
|
+
if shortcut.is_empty() {
|
|
116
|
+
return Ok(());
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let app_handle = app.clone();
|
|
120
|
+
let shortcut_hotkey = match Shortcut::from_str(&shortcut) {
|
|
121
|
+
Ok(s) => s,
|
|
122
|
+
Err(error) => {
|
|
123
|
+
eprintln!("[BghitApp] Invalid activation shortcut '{shortcut}': {error}");
|
|
124
|
+
return Ok(());
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
let last_triggered = Arc::new(Mutex::new(Instant::now()));
|
|
128
|
+
|
|
129
|
+
if let Err(error) = app_handle.plugin(
|
|
130
|
+
tauri_plugin_global_shortcut::Builder::new()
|
|
131
|
+
.with_handler({
|
|
132
|
+
let last_triggered = Arc::clone(&last_triggered);
|
|
133
|
+
move |app, event, _shortcut| {
|
|
134
|
+
let Ok(mut last_triggered) = last_triggered.lock() else {
|
|
135
|
+
return;
|
|
136
|
+
};
|
|
137
|
+
if Instant::now().duration_since(*last_triggered) < Duration::from_millis(300) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
*last_triggered = Instant::now();
|
|
141
|
+
|
|
142
|
+
if shortcut_hotkey.eq(event) {
|
|
143
|
+
if let Some(window) = app.get_webview_window("bghitapp") {
|
|
144
|
+
let is_visible = window.is_visible().unwrap_or(false);
|
|
145
|
+
if is_visible {
|
|
146
|
+
let _ = window.hide();
|
|
147
|
+
} else {
|
|
148
|
+
let _ = window.show();
|
|
149
|
+
let _ = window.set_focus();
|
|
150
|
+
#[cfg(target_os = "linux")]
|
|
151
|
+
if _init_fullscreen && !window.is_fullscreen().unwrap_or(false) {
|
|
152
|
+
let _ = window.set_fullscreen(true);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
})
|
|
159
|
+
.build(),
|
|
160
|
+
) {
|
|
161
|
+
eprintln!(
|
|
162
|
+
"[BghitApp] Failed to register global shortcut plugin '{shortcut}': {error}; continuing without it."
|
|
163
|
+
);
|
|
164
|
+
return Ok(());
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if let Err(error) = app.global_shortcut().register(shortcut_hotkey) {
|
|
168
|
+
eprintln!("[BghitApp] Failed to bind global shortcut '{shortcut}': {error}");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
Ok(())
|
|
172
|
+
}
|