X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0f9b48d1e1535f8b92a73031be8cceff39123d27..55410bb4f67febe1ca20654f078ea4fb9a6223ae:/src/osx/cocoa/nonownedwnd.mm diff --git a/src/osx/cocoa/nonownedwnd.mm b/src/osx/cocoa/nonownedwnd.mm index eba768adb8..73e3fa9cbc 100644 --- a/src/osx/cocoa/nonownedwnd.mm +++ b/src/osx/cocoa/nonownedwnd.mm @@ -10,23 +10,19 @@ ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" - -#if wxOSX_USE_COCOA -#include -#else -#include +#ifndef WX_PRECOMP + #include "wx/nonownedwnd.h" + #include "wx/frame.h" #endif -#ifdef __WXMAC__ #include "wx/osx/private.h" -#endif NSRect wxToNSRect( NSView* parent, const wxRect& r ) { NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int y = r.y; int x = r.x ; - if ( parent != NULL && ![ parent isFlipped ] ) + if ( parent == NULL || ![ parent isFlipped ] ) y = frame.size.height - ( r.y + r.height ); return NSMakeRect(x, y, r.width , r.height); } @@ -36,7 +32,7 @@ wxRect wxFromNSRect( NSView* parent, const NSRect& rect ) NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int y = rect.origin.y; int x = rect.origin.x; - if ( parent != NULL && ![ parent isFlipped ] ) + if ( parent == NULL || ![ parent isFlipped ] ) y = frame.size.height - (rect.origin.y + rect.size.height); return wxRect( x, y, rect.size.width, rect.size.height ); } @@ -46,7 +42,7 @@ NSPoint wxToNSPoint( NSView* parent, const wxPoint& p ) NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int x = p.x ; int y = p.y; - if ( parent != NULL && ![ parent isFlipped ] ) + if ( parent == NULL || ![ parent isFlipped ] ) y = frame.size.height - ( p.y ); return NSMakePoint(x, y); } @@ -56,7 +52,7 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame]; int x = p.x; int y = p.y; - if ( parent != NULL && ![ parent isFlipped ] ) + if ( parent == NULL || ![ parent isFlipped ] ) y = frame.size.height - ( p.y ); return wxPoint( x, y); } @@ -65,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 { @@ -73,7 +71,7 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) - (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation; - (wxNonOwnedWindowCocoaImpl*) implementation; - +- (void)noResponderFor: (SEL) selector; @end @implementation wxNSWindow @@ -88,18 +86,51 @@ 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; +} + +- (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 @@ -141,10 +172,26 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p ) return NO; } -- (NSSize)windowWillResize:(NSWindow *)window +- (NSSize)windowWillResize:(NSWindow *)win toSize:(NSSize)proposedFrameSize { - // todo + NSRect frame = [win frame]; + wxRect wxframe = wxFromNSRect( NULL, frame ); + wxframe.SetWidth( proposedFrameSize.width ); + wxframe.SetHeight( proposedFrameSize.height ); + wxNSWindow* window = (wxNSWindow*) win; + wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation]; + if ( windowimpl ) + { + wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer(); + if ( wxpeer ) + { + wxpeer->HandleResizing( 0, &wxframe ); + NSSize newSize = NSMakeSize(wxframe.GetWidth(), wxframe.GetHeight()); + return newSize; + } + } + return proposedFrameSize; } @@ -215,6 +262,8 @@ wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl() wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl() { + [m_macWindow setImplementation:nil]; + [m_macWindow setDelegate:nil]; [m_macWindow release]; } @@ -239,15 +288,11 @@ long style, long extraStyle, const wxString& name ) else m_macWindow = [wxNSWindow alloc]; - CGWindowLevel level = kCGNormalWindowLevelKey; + CGWindowLevel level = kCGNormalWindowLevel; if ( style & wxFRAME_TOOL_WINDOW ) { - if ( ( style & wxSTAY_ON_TOP ) ) - level = kCGUtilityWindowLevel; - else - level = kCGFloatingWindowLevel ; - + windowstyle |= NSTitledWindowMask | NSUtilityWindowMask; } else if ( ( style & wxPOPUP_WINDOW ) ) { @@ -311,12 +356,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) ); @@ -414,7 +458,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 @@ -522,24 +567,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 ) @@ -552,4 +596,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 +}