From: David Elliott Date: Tue, 26 Aug 2003 19:28:35 +0000 (+0000) Subject: Added a notification observer for NSWindow. Observe the become key and X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/720e01c312b9a7ee493d649656bcc875eaf5acb6 Added a notification observer for NSWindow. Observe the become key and resign key notifications. (window activation in wxWindows parlance) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23241 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cocoa/NSWindow.h b/include/wx/cocoa/NSWindow.h index 04da760edc..29748141c9 100644 --- a/include/wx/cocoa/NSWindow.h +++ b/include/wx/cocoa/NSWindow.h @@ -23,14 +23,14 @@ class wxCocoaNSWindow WX_DECLARE_OBJC_INTERFACE_HASHMAP(NSWindow) public: void AssociateNSWindow(WX_NSWindow cocoaNSWindow); - inline void DisassociateNSWindow(WX_NSWindow cocoaNSWindow) - { - if(cocoaNSWindow) - sm_cocoaHash.erase(cocoaNSWindow); - } + void DisassociateNSWindow(WX_NSWindow cocoaNSWindow); virtual void Cocoa_close(void) = 0; virtual bool Cocoa_windowShouldClose(void) = 0; virtual void Cocoa_wxMenuItemAction(wxMenuItem& item) = 0; + virtual void CocoaNotification_DidBecomeKey(void) { } + virtual void CocoaNotification_DidResignKey(void) { } +protected: + static void *sm_cocoaObserver; }; #endif // _WX_COCOA_NSWINDOW_H_ diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index d230b1a093..15b3eb583e 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -27,18 +27,64 @@ #include "wx/cocoa/NSWindow.h" #import +#import +#import + +// ============================================================================ +// @class wxNSWindowNotificationObserver +// ============================================================================ +@interface wxNSWindowNotificationObserver : NSObject +{ +} + +- (void)notificationDidBecomeKey: (NSNotification *)notification; +- (void)notificationDidResignKey: (NSNotification *)notification; +@end //interface wxNSWindowNotificationObserver + +@implementation wxNSWindowNotificationObserver : NSObject + +- (void)notificationDidBecomeKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists"); + win->CocoaNotification_DidBecomeKey(); +} + +- (void)notificationDidResignKey: (NSNotification *)notification +{ + wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); + wxCHECK_RET(win,"notificationDidResignKey received but no wxWindow exists"); + win->CocoaNotification_DidResignKey(); +} + +@end //implementation wxNSWindowNotificationObserver + +// ============================================================================ +// class wxCocoaNSWindow +// ============================================================================ -// ---------------------------------------------------------------------------- -// globals -// ---------------------------------------------------------------------------- WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) +void *wxCocoaNSWindow::sm_cocoaObserver = [[wxNSWindowNotificationObserver alloc] init]; + void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { if(cocoaNSWindow) { [cocoaNSWindow setReleasedWhenClosed: NO]; sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this)); + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidBecomeKey:) name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow]; + [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidResignKey:) name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow]; + } +} + +void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow) +{ + if(cocoaNSWindow) + { + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow]; + [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow]; + sm_cocoaHash.erase(cocoaNSWindow); } }