@@ -46,28 +46,33 @@ - (void)na_swizzled_orderOut:(id)sender;
4646@implementation NSWindow (NativeAPISwizzle)
4747
4848- (void )na_swizzled_makeKeyAndOrderFront : (id )sender {
49- // Ensure registry is in sync and then invoke hook with correct WindowId
49+ // Resolve window id and handle hook if present
50+ if (nativeapi::WindowManager::GetInstance ().HasWillShowHook ()) {
5051 auto windows = nativeapi::WindowManager::GetInstance ().GetAll ();
5152 for (const auto & window : windows) {
5253 if (window->GetNativeObject () == (__bridge void *)self) {
53- nativeapi::WindowManager::GetInstance ().InvokeWillShowHook (window->GetId ());
54- break ;
54+ nativeapi::WindowManager::GetInstance ().HandleWillShow (window->GetId ());
55+ // Hook handles all logic; never call original here
56+ return ;
5557 }
5658 }
57- // First call original implementation so properties like title are up-to-date
58- [self na_swizzled_makeKeyAndOrderFront: sender];
59+ }
60+ // No window found in registry, call original implementation (swapped)
61+ [self na_swizzled_makeKeyAndOrderFront: sender];
5962}
6063
6164- (void )na_swizzled_orderOut : (id )sender {
62- // Invoke hook before hiding, resolving id via registry without using windowNumber
63- auto windows = nativeapi::WindowManager::GetInstance ().GetAll ();
64- for (const auto & window : windows) {
65- if (window->GetNativeObject () == (__bridge void *)self) {
66- nativeapi::WindowManager::GetInstance ().InvokeWillHideHook (window->GetId ());
67- break ;
65+ // Resolve window id and handle hook if present
66+ if (nativeapi::WindowManager::GetInstance ().HasWillHideHook ()) {
67+ auto windows = nativeapi::WindowManager::GetInstance ().GetAll ();
68+ for (const auto & window : windows) {
69+ if (window->GetNativeObject () == (__bridge void *)self) {
70+ nativeapi::WindowManager::GetInstance ().HandleWillHide (window->GetId ());
71+ return ;
72+ }
6873 }
6974 }
70- // Call original implementation (swapped)
75+ // No window found in registry, call original implementation (swapped)
7176 [self na_swizzled_orderOut: sender];
7277}
7378
@@ -277,7 +282,7 @@ - (void)windowWillClose:(NSNotification*)notification {
277282 // Create or get Window wrapper - this will handle ID assignment via associated object
278283 auto window = std::make_shared<Window>((__bridge void *)ns_window);
279284 WindowId window_id = window->GetId ();
280-
285+
281286 // Add to registry if not already present
282287 if (!WindowRegistry::GetInstance ().Get (window_id)) {
283288 WindowRegistry::GetInstance ().Add (window_id, window);
@@ -299,12 +304,12 @@ - (void)windowWillClose:(NSNotification*)notification {
299304 // Create or get Window wrapper - this will handle ID retrieval via associated object
300305 auto window = std::make_shared<Window>((__bridge void *)ns_window);
301306 WindowId window_id = window->GetId ();
302-
307+
303308 // Ensure it's in the registry
304309 if (!WindowRegistry::GetInstance ().Get (window_id)) {
305310 WindowRegistry::GetInstance ().Add (window_id, window);
306311 }
307-
312+
308313 return window;
309314 }
310315 return nullptr ;
@@ -324,18 +329,54 @@ - (void)windowWillClose:(NSNotification*)notification {
324329 }
325330}
326331
327- void WindowManager::InvokeWillShowHook (WindowId id ) {
332+ bool WindowManager::HasWillShowHook () const {
333+ return pimpl_->will_show_hook_ .has_value ();
334+ }
335+
336+ bool WindowManager::HasWillHideHook () const {
337+ return pimpl_->will_hide_hook_ .has_value ();
338+ }
339+
340+ void WindowManager::HandleWillShow (WindowId id ) {
328341 if (pimpl_->will_show_hook_ ) {
329342 (*pimpl_->will_show_hook_ )(id );
330343 }
331344}
332345
333- void WindowManager::InvokeWillHideHook (WindowId id ) {
346+ void WindowManager::HandleWillHide (WindowId id ) {
334347 if (pimpl_->will_hide_hook_ ) {
335348 (*pimpl_->will_hide_hook_ )(id );
336349 }
337350}
338351
352+ bool WindowManager::CallOriginalShow (WindowId id ) {
353+ auto window = Get (id );
354+ if (!window) {
355+ return false ;
356+ }
357+ void * native = window->GetNativeObject ();
358+ if (!native) {
359+ return false ;
360+ }
361+ NSWindow * ns_window = (__bridge NSWindow *)native;
362+ [ns_window na_swizzled_makeKeyAndOrderFront: nil ];
363+ return true ;
364+ }
365+
366+ bool WindowManager::CallOriginalHide (WindowId id ) {
367+ auto window = Get (id );
368+ if (!window) {
369+ return false ;
370+ }
371+ void * native = window->GetNativeObject ();
372+ if (!native) {
373+ return false ;
374+ }
375+ NSWindow * ns_window = (__bridge NSWindow *)native;
376+ [ns_window na_swizzled_orderOut: nil ];
377+ return true ;
378+ }
379+
339380void WindowManager::StartEventListening () {
340381 pimpl_->StartEventListening ();
341382}
@@ -345,7 +386,7 @@ - (void)windowWillClose:(NSNotification*)notification {
345386}
346387
347388void WindowManager::DispatchWindowEvent (const WindowEvent& event) {
348- Emit (event); // Use Dispatch instead of DispatchSync
389+ Emit (event);
349390}
350391
351392} // namespace nativeapi
0 commit comments