11use crate :: error:: OneClickLaunchError ;
22use anyhow:: Result ;
33use api:: { launcher_api, setting_api} ;
4- use constants:: AUTO_START_FLAG ;
4+ use constants:: { AUTO_START_FLAG , WINDOW_MIN_HEIGHT , WINDOW_MIN_WIDTH } ;
55use db:: { launcher, launcher_resource, settings} ;
66use events:: EventDispatcher ;
77use events:: system_listeners:: register_system_listeners;
88use events:: types:: { ApplicationStartupComplete , ApplicationStartupCompletePayload } ;
99use sqlx:: { Executor , Sqlite } ;
1010use sqlx:: { SqlitePool , sqlite:: SqlitePoolOptions } ;
1111use std:: path:: PathBuf ;
12+ use std:: sync:: Mutex ;
13+ use std:: time:: Instant ;
1214use std:: { env, fs} ;
1315use tauri:: Emitter ;
1416use tauri:: tray:: { MouseButton , MouseButtonState , TrayIcon , TrayIconEvent } ;
@@ -121,7 +123,7 @@ pub async fn run() -> Result<()> {
121123 tauri:: Builder :: default ( )
122124 . setup ( move |app| {
123125 // 初始化窗口
124- setup_window ( app. handle ( ) ) ?;
126+ setup_tray ( app. handle ( ) ) ?;
125127
126128 // 注册监听器,之后添加新的监听器时在这个方法内部添加
127129 register_listeners ( app. handle ( ) ) ;
@@ -136,13 +138,11 @@ pub async fn run() -> Result<()> {
136138
137139 Ok ( ( ) )
138140 } )
139- . on_window_event ( |window, event| {
140- if let tauri:: WindowEvent :: CloseRequested { api, .. } = event {
141- api. prevent_close ( ) ;
142- let _ = window. hide ( ) ;
143- }
144- } )
141+ . on_window_event ( handle_window_event)
145142 . manage ( db_manager)
143+ . manage ( ScaleFactorChangedState {
144+ last_reset : Mutex :: new ( None ) ,
145+ } )
146146 // 优先注册单例插件
147147 . plugin ( tauri_plugin_single_instance:: init ( |app, argv, cwd| {
148148 info ! ( "{}, {argv:?}, {cwd}" , app. package_info( ) . name) ;
@@ -190,7 +190,7 @@ fn register_listeners(app: &AppHandle) {
190190}
191191
192192/// 初始化窗口
193- fn setup_window ( app : & AppHandle ) -> Result < ( ) > {
193+ fn setup_tray ( app : & AppHandle ) -> Result < ( ) > {
194194 let tray_icon = TrayIconBuilder :: new ( )
195195 // 设置系统托盘的提示,鼠标悬浮时会显示
196196 . tooltip ( constants:: APPLICATION_NAME )
@@ -247,3 +247,64 @@ fn setup_window(app: &AppHandle) -> Result<()> {
247247
248248 Ok ( ( ) )
249249}
250+
251+ struct ScaleFactorChangedState {
252+ last_reset : Mutex < Option < Instant > > ,
253+ }
254+
255+ fn handle_window_event ( window : & tauri:: Window , event : & tauri:: WindowEvent ) {
256+ match event {
257+ tauri:: WindowEvent :: CloseRequested { api, .. } => {
258+ api. prevent_close ( ) ;
259+ let _ = window. hide ( ) ;
260+ }
261+ tauri:: WindowEvent :: ScaleFactorChanged {
262+ scale_factor,
263+ new_inner_size,
264+ ..
265+ } => {
266+ print ! (
267+ "ScaleFactorChanged scale_factor: {}, new_inner_size: {:?}" ,
268+ scale_factor, new_inner_size
269+ ) ;
270+
271+ let now = Instant :: now ( ) ;
272+ let state = window. state :: < ScaleFactorChangedState > ( ) ;
273+ let mut lock = state. last_reset . try_lock ( ) ;
274+
275+ if let Ok ( ref mut last_reset) = lock {
276+ // 500ms防抖间隔
277+ if last_reset. map_or ( true , |t| now. duration_since ( t) . as_millis ( ) > 500 ) {
278+ if let Ok ( physical_size) = window. inner_size ( ) {
279+ // 如果窗口大小异常,强制调整到正常大小
280+ if physical_size. width != WINDOW_MIN_WIDTH
281+ || physical_size. height != WINDOW_MIN_HEIGHT
282+ {
283+ let _ = window. set_size ( tauri:: Size :: Logical ( tauri:: LogicalSize {
284+ width : WINDOW_MIN_WIDTH as f64 ,
285+ height : WINDOW_MIN_HEIGHT as f64 ,
286+ } ) ) ;
287+ * * last_reset = Some ( now) ;
288+ debug ! ( "DPI发生变化,触发窗口大小重置" ) ;
289+ }
290+ }
291+ } else {
292+ debug ! ( "DPI重置窗口防抖生效" ) ;
293+ }
294+ }
295+ }
296+ tauri:: WindowEvent :: DragDrop ( drag_drop_event) => todo ! ( ) ,
297+ tauri:: WindowEvent :: Resized ( physical_size) => {
298+ // 如果窗口大小过小,强制调整到正常大小
299+ if physical_size. width < WINDOW_MIN_WIDTH || physical_size. height < WINDOW_MIN_HEIGHT {
300+ let _ = window. set_size ( tauri:: Size :: Logical ( tauri:: LogicalSize {
301+ width : WINDOW_MIN_WIDTH as f64 ,
302+ height : WINDOW_MIN_HEIGHT as f64 ,
303+ } ) ) ;
304+ debug ! ( "窗口大小过小,触发窗口大小重置" ) ;
305+ }
306+ }
307+ _ => {
308+ }
309+ }
310+ }
0 commit comments