X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/94929e7b60de96bd3b064984ae8995d665329411..b13d363b87017dbac11e74d11447288f17b62998:/src/osx/cocoa/nonownedwnd.mm?ds=sidebyside diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index 20a01d1834..bdee26db1a 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -61,6 +61,8 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) // wx native implementation classes // +typedef void (*wxOSX_NoResponderHandlerPtr)(NSView* self, SEL _cmd, SEL selector); + @interface wxNSWindow : NSWindow { @@ -69,7 +71,7 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) - (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation; - (wxNonOwnedWindowCocoaImpl*) implementation; - +- (void)noResponderFor: (SEL) selector; @end @implementation wxNSWindow @@ -84,18 +86,56 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) return impl; } +// NB: if we don't do this, all key downs that get handled lead to a NSBeep +- (void)noResponderFor: (SEL) selector +{ + if (selector != @selector(keyDown:)) + { + wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; + superimpl(self, @selector(noResponderFor:), selector); + } +} @end -@interface wxNSPanel : wxNSWindow +@interface wxNSPanel : NSPanel { + wxNonOwnedWindowCocoaImpl* impl; } +- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation; +- (wxNonOwnedWindowCocoaImpl*) implementation; +- (void)noResponderFor: (SEL) selector; @end @implementation wxNSPanel +- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation +{ + impl = theImplementation; +} + +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +- (wxNonOwnedWindowCocoaImpl*) implementation +{ + return impl; +} + +// NB: if we don't do this, all key downs that get handled lead to a NSBeep +- (void)noResponderFor: (SEL) selector +{ + if (selector != @selector(keyDown:)) + { + wxOSX_NoResponderHandlerPtr superimpl = (wxOSX_NoResponderHandlerPtr) [[self superclass] instanceMethodForSelector:@selector(noResponderFor:)]; + superimpl(self, @selector(noResponderFor:), selector); + } +} + @end @@ -109,8 +149,8 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) - (void)windowDidResize:(NSNotification *)notification; - (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize; -- (void)windowDidResignMain:(NSNotification *)notification; -- (void)windowDidBecomeMain:(NSNotification *)notification; +- (void)windowDidResignKey:(NSNotification *)notification; +- (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; - (BOOL)windowShouldClose:(id)window; @@ -184,7 +224,7 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) } } -- (void)windowDidBecomeMain:(NSNotification *)notification +- (void)windowDidBecomeKey:(NSNotification *)notification { wxNSWindow* window = (wxNSWindow*) [notification object]; wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; @@ -196,7 +236,7 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) } } -- (void)windowDidResignMain:(NSNotification *)notification +- (void)windowDidResignKey:(NSNotification *)notification { wxNSWindow* window = (wxNSWindow*) [notification object]; wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; @@ -204,7 +244,15 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) { wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); if ( wxpeer ) + { wxpeer->HandleActivated(0, false); + // Needed for popup window since the firstResponder + // (focus in wx) doesn't change when this + // TLW becomes inactive. + wxFocusEvent event( wxEVT_KILL_FOCUS, wxpeer->GetId()); + event.SetEventObject(wxpeer); + wxpeer->HandleWindowEvent(event); + } } } @@ -227,6 +275,8 @@ wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() { + [m_macWindow setImplementation:nil]; + [m_macWindow setDelegate:nil]; [m_macWindow release]; } @@ -246,8 +296,11 @@ long style, long extraStyle, const wxString& name ) int windowstyle = NSBorderlessWindowMask; - if ( style & wxFRAME_TOOL_WINDOW ) + if ( style & wxFRAME_TOOL_WINDOW || ( style & wxPOPUP_WINDOW ) || + GetWXPeer()->GetExtraStyle() & wxTOPLEVEL_EX_DIALOG ) + { m_macWindow = [wxNSPanel alloc]; + } else m_macWindow = [wxNSWindow alloc]; @@ -255,11 +308,12 @@ long style, long extraStyle, const wxString& name ) if ( style & wxFRAME_TOOL_WINDOW ) { - if ( ( style & wxSTAY_ON_TOP ) ) - level = kCGUtilityWindowLevel; - else - level = kCGFloatingWindowLevel ; - + windowstyle |= NSUtilityWindowMask; + if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) || + ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) ) + { + windowstyle |= NSTitledWindowMask ; + } } else if ( ( style & wxPOPUP_WINDOW ) ) { @@ -323,12 +377,11 @@ long style, long extraStyle, const wxString& name ) if ( extraStyle & wxFRAME_EX_METAL) windowstyle |= NSTexturedBackgroundWindowMask; + if ( ( style & wxFRAME_FLOAT_ON_PARENT ) || ( style & wxFRAME_TOOL_WINDOW ) ) + level = kCGFloatingWindowLevel; + if ( ( style & wxSTAY_ON_TOP ) ) level = kCGUtilityWindowLevel; -/* - if ( ( style & wxFRAME_FLOAT_ON_PARENT ) ) - group = GetWindowGroupOfClass(kFloatingWindowClass); - */ NSRect r = wxToNSRect( NULL, wxRect( pos, size) ); @@ -344,7 +397,10 @@ long style, long extraStyle, const wxString& name ) [m_macWindow setDelegate:controller]; - // [m_macWindow makeKeyAndOrderFront:nil]; + [m_macWindow setAcceptsMouseMovedEvents: YES]; + + if ( ( style & wxPOPUP_WINDOW ) ) + [m_macWindow makeKeyAndOrderFront:nil]; } @@ -426,7 +482,8 @@ bool wxNonOwnedWindowCocoaImpl::CanSetTransparent() void wxNonOwnedWindowCocoaImpl::MoveWindow(int x, int y, int width, int height) { NSRect r = wxToNSRect( NULL, wxRect(x,y,width, height) ); - [m_macWindow setFrame:r display:YES]; + // do not trigger refreshes upon invisible and possible partly created objects + [m_macWindow setFrame:r display:GetWXPeer()->IsShownOnScreen()]; } void wxNonOwnedWindowCocoaImpl::GetPosition( int &x, int &y ) const @@ -443,11 +500,13 @@ void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const height = rect.size.height; } -void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &right, int &width, int &height ) const +void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, int &height ) const { NSRect outer = NSMakeRect(100,100,100,100); NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ]; NSRect rect = [[m_macWindow contentView] frame]; + left = rect.origin.x; + top = rect.origin.y; width = rect.size.width; height = rect.size.height; } @@ -534,24 +593,23 @@ void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags)) void wxNonOwnedWindowCocoaImpl::ScreenToWindow( int *x, int *y ) { wxPoint p((x ? *x : 0), (y ? *y : 0) ); - /* NSPoint nspt = wxToNSPoint( NULL, p ); - - nspt = [[m_macWindow contentView] convertPoint:p toV:nil]; - p = wxFromNSPoint( - */ + nspt = [m_macWindow convertScreenToBase:nspt]; + nspt = [[m_macWindow contentView] convertPoint:nspt fromView:nil]; + p = wxFromNSPoint([m_macWindow contentView], nspt); if ( x ) - *x = p.x; + *x = p.x; if ( y ) *y = p.y; } void wxNonOwnedWindowCocoaImpl::WindowToScreen( int *x, int *y ) { - wxPoint p( (x ? *x : 0), (y ? *y : 0) ); - /* - p = [m_macWindow convertPoint:p toWindow:nil]; - */ + wxPoint p((x ? *x : 0), (y ? *y : 0) ); + NSPoint nspt = wxToNSPoint( [m_macWindow contentView], p ); + nspt = [[m_macWindow contentView] convertPoint:nspt toView:nil]; + nspt = [m_macWindow convertBaseToScreen:nspt]; + p = wxFromNSPoint( NULL, nspt); if ( x ) *x = p.x; if ( y ) @@ -564,4 +622,4 @@ wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWind wxNonOwnedWindowImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer ); now->Create( parent, pos, size, style , extraStyle, name ); return now; -} \ No newline at end of file +}