X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2a2064f895b53ae9862c3cb1f19fe756d9e42c45..9c894932284cac53d9cd8d8b2f16308bc65f44d6:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 4e0e77f95b..f7cbe4fb7c 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -1020,8 +1020,12 @@ void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd) bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, void *_cmd) { - wxOSX_PerformKeyEventHandlerPtr superimpl = (wxOSX_PerformKeyEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; - return superimpl(slf, (SEL)_cmd, event); + if ( GetFocusedViewInWindow([slf window]) != slf || m_hasEditor || !DoHandleKeyEvent(event) ) + { + wxOSX_PerformKeyEventHandlerPtr superimpl = (wxOSX_PerformKeyEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + return superimpl(slf, (SEL)_cmd, event); + } + return YES; } bool wxWidgetCocoaImpl::acceptsFirstResponder(WXWidget slf, void *_cmd) @@ -1179,6 +1183,12 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) CGContextRestoreGState( context ); CGContextSaveGState( context ); } + // as we called restore above, we have to flip again if necessary + if ( !m_isFlipped ) + { + CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height ); + CGContextScaleCTM( context, 1, -1 ); + } wxpeer->MacPaintChildrenBorders(); wxpeer->MacSetCGContextRef( NULL ); CGContextRestoreGState( context ); @@ -1660,6 +1670,20 @@ void wxWidgetCocoaImpl::GetPosition( int &x, int &y ) const wxRect r = wxFromNSRect( [m_osxView superview], [m_osxView frame] ); x = r.GetLeft(); y = r.GetTop(); + + // under Cocoa we might have a contentView in the wxParent to which we have to + // adjust the coordinates + wxWindowMac* parent = GetWXPeer()->GetParent(); + if (parent && [m_osxView superview] != parent->GetHandle() ) + { + int cx = 0,cy = 0,cw = 0,ch = 0; + if ( parent->GetPeer() ) + { + parent->GetPeer()->GetContentArea(cx, cy, cw, ch); + x += cx; + y += cy; + } + } } void wxWidgetCocoaImpl::GetSize( int &width, int &height ) const @@ -1828,7 +1852,7 @@ void wxWidgetCocoaImpl::SetMaximum( wxInt32 v ) wxInt32 wxWidgetCocoaImpl::GetMinimum() const { - if ( [m_osxView respondsToSelector:@selector(getMinValue:)] ) + if ( [m_osxView respondsToSelector:@selector(minValue)] ) { return (int)[m_osxView minValue]; } @@ -1837,7 +1861,7 @@ wxInt32 wxWidgetCocoaImpl::GetMinimum() const wxInt32 wxWidgetCocoaImpl::GetMaximum() const { - if ( [m_osxView respondsToSelector:@selector(getMaxValue:)] ) + if ( [m_osxView respondsToSelector:@selector(maxValue)] ) { return (int)[m_osxView maxValue]; } @@ -1920,15 +1944,23 @@ void wxWidgetCocoaImpl::GetBestRect( wxRect *r ) const bool wxWidgetCocoaImpl::IsEnabled() const { - if ( [m_osxView respondsToSelector:@selector(isEnabled) ] ) - return [m_osxView isEnabled]; + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + if ( [targetView respondsToSelector:@selector(isEnabled) ] ) + return [targetView isEnabled]; return true; } void wxWidgetCocoaImpl::Enable( bool enable ) { - if ( [m_osxView respondsToSelector:@selector(setEnabled:) ] ) - [m_osxView setEnabled:enable]; + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + if ( [targetView respondsToSelector:@selector(setEnabled:) ] ) + [targetView setEnabled:enable]; } void wxWidgetCocoaImpl::PulseGauge() @@ -2040,16 +2072,19 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars wxKeyEvent wxevent2(wxevent) ; wxevent2.SetEventType(wxEVT_CHAR); - GetWXPeer()->OSXHandleKeyEvent(wxevent2); + result = GetWXPeer()->OSXHandleKeyEvent(wxevent2); } else { - if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) - [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; - else - [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + if ( !wxevent.CmdDown() ) + { + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + else + [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + result = true; + } } - result = true; } } @@ -2108,13 +2143,16 @@ void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* oth void wxWidgetCocoaImpl::SetCursor(const wxCursor& cursor) { - NSPoint location = [NSEvent mouseLocation]; - location = [[m_osxView window] convertScreenToBase:location]; - NSPoint locationInView = [m_osxView convertPoint:location fromView:nil]; - - if( NSMouseInRect(locationInView, [m_osxView bounds], YES) ) + if ( !wxIsBusy() ) { - [(NSCursor*)cursor.GetHCURSOR() set]; + NSPoint location = [NSEvent mouseLocation]; + location = [[m_osxView window] convertScreenToBase:location]; + NSPoint locationInView = [m_osxView convertPoint:location fromView:nil]; + + if( NSMouseInRect(locationInView, [m_osxView bounds], YES) ) + { + [(NSCursor*)cursor.GetHCURSOR() set]; + } } [[m_osxView window] invalidateCursorRectsForView:m_osxView]; }