@@ -190,14 +190,20 @@ impl Drop for KWinScript {
190190
191191async fn send_active_window (
192192 client : & ReportClient ,
193- active_window : & Arc < Mutex < ActiveWindow > > ,
193+ active_window : & Arc < Mutex < Option < ActiveWindow > > > ,
194194) -> anyhow:: Result < ( ) > {
195195 let active_window = active_window. lock ( ) . await ;
196196
197- client
198- . send_active_window ( & active_window. resource_class , & active_window. caption )
199- . await
200- . with_context ( || "Failed to send heartbeat for active window" )
197+ if let Some ( active_window) = active_window. as_ref ( ) {
198+ client
199+ . send_active_window ( & active_window. resource_class , & active_window. caption )
200+ . await
201+ . with_context ( || "Failed to send heartbeat for active window" )
202+ } else {
203+ // This always happens on the first run, since the active window information is known only after KWin script is triggered.
204+ info ! ( "No active window information available yet until window is focused again or changed" ) ;
205+ Ok ( ( ) )
206+ }
201207}
202208
203209struct ActiveWindow {
@@ -207,7 +213,7 @@ struct ActiveWindow {
207213}
208214
209215struct ActiveWindowInterface {
210- active_window : Arc < Mutex < ActiveWindow > > ,
216+ active_window : Arc < Mutex < Option < ActiveWindow > > > ,
211217}
212218
213219#[ interface( name = "com._2e3s.Awatcher" ) ]
@@ -220,14 +226,22 @@ impl ActiveWindowInterface {
220226 ) {
221227 debug ! ( "Active window class: \" {resource_class}\" , name: \" {resource_name}\" , caption: \" {caption}\" " ) ;
222228 let mut active_window = self . active_window . lock ( ) . await ;
223- active_window. caption = caption;
224- active_window. resource_class = resource_class;
225- active_window. resource_name = resource_name;
229+ if let Some ( active_window) = active_window. as_mut ( ) {
230+ active_window. caption = caption;
231+ active_window. resource_class = resource_class;
232+ active_window. resource_name = resource_name;
233+ } else {
234+ * active_window = Some ( ActiveWindow {
235+ caption,
236+ resource_class,
237+ resource_name,
238+ } ) ;
239+ }
226240 }
227241}
228242
229243pub struct WindowWatcher {
230- active_window : Arc < Mutex < ActiveWindow > > ,
244+ active_window : Arc < Mutex < Option < ActiveWindow > > > ,
231245 // Prolong its lifetime
232246 _kwin_script : KWinScript ,
233247}
@@ -248,12 +262,8 @@ impl Watcher for WindowWatcher {
248262
249263 kwin_script. load ( ) . await . unwrap ( ) ;
250264
251- let active_window = Arc :: new ( Mutex :: new ( ActiveWindow {
252- caption : String :: new ( ) ,
253- resource_name : String :: new ( ) ,
254- resource_class : String :: new ( ) ,
255- } ) ) ;
256- let active_window_interface = ActiveWindowInterface {
265+ let active_window = Arc :: new ( Mutex :: new ( None ) ) ;
266+ let active_window_interface: ActiveWindowInterface = ActiveWindowInterface {
257267 active_window : Arc :: clone ( & active_window) ,
258268 } ;
259269
0 commit comments