X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/28a62eec0932de35b36b550ddc98cf6d94866288..95316a3f245a4baf3046e97222660bed986153ed:/src/osx/cocoa/window.mm?ds=sidebyside diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 34e985f69b..0f8d583014 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -783,6 +783,14 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve } [super removeTrackingRect:tag]; } + +#if wxOSX_USE_NATIVE_FLIPPED +- (BOOL)isFlipped +{ + return YES; +} +#endif + @end // wxNSView // @@ -911,6 +919,8 @@ BOOL wxOSX_resignFirstResponder(NSView* self, SEL _cmd) return impl->resignFirstResponder(self, _cmd); } +#if !wxOSX_USE_NATIVE_FLIPPED + BOOL wxOSX_isFlipped(NSView* self, SEL _cmd) { wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); @@ -920,6 +930,8 @@ BOOL wxOSX_isFlipped(NSView* self, SEL _cmd) return impl->isFlipped(self, _cmd) ? YES:NO; } +#endif + typedef void (*wxOSX_DrawRectHandlerPtr)(NSView* self, SEL _cmd, NSRect rect); void wxOSX_drawRect(NSView* self, SEL _cmd, NSRect rect) @@ -1149,8 +1161,8 @@ void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) superimpl(slf, (SEL)_cmd, event); // super of built-ins keeps the mouse up, as wx expects this event, we have to synthesize it - - if ( [ event type] == NSLeftMouseDown ) + // only trigger if at this moment the mouse is already up + if ( [ event type] == NSLeftMouseDown && !wxGetMouseState().LeftIsDown() ) { wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; @@ -1297,11 +1309,14 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) return r; } -bool wxWidgetCocoaImpl::isFlipped(WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd)) +#if !wxOSX_USE_NATIVE_FLIPPED + +bool wxWidgetCocoaImpl::isFlipped(WXWidget slf, void *WXUNUSED(_cmd)) { return m_isFlipped; } +#endif #define OSX_DEBUG_DRAWING 0 @@ -1310,15 +1325,20 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) // preparing the update region wxRegion updateRgn; + + // since adding many rects to a region is a costly process, by default use the bounding rect +#if 0 const NSRect *rects; NSInteger count; - [slf getRectsBeingDrawn:&rects count:&count]; for ( int i = 0 ; i < count ; ++i ) { updateRgn.Union(wxFromNSRect(slf, rects[i])); } - +#else + updateRgn.Union(wxFromNSRect(slf,*(NSRect*)rect)); +#endif + wxWindow* wxpeer = GetWXPeer(); if ( wxpeer->MacGetLeftBorderSize() != 0 || wxpeer->MacGetTopBorderSize() != 0 ) @@ -1373,7 +1393,7 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) CGContextStrokePath(context); #endif - if ( !m_isFlipped ) + if ( ![slf isFlipped] ) { CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height ); CGContextScaleCTM( context, 1, -1 ); @@ -1395,7 +1415,7 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) CGContextSaveGState( context ); } // as we called restore above, we have to flip again if necessary - if ( !m_isFlipped ) + if ( ![slf isFlipped] ) { CGContextTranslateCTM( context, 0, [m_osxView bounds].size.height ); CGContextScaleCTM( context, 1, -1 ); @@ -1438,7 +1458,10 @@ void wxWidgetCocoaImpl::controlAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_c { wxWindow* wxpeer = (wxWindow*) GetWXPeer(); if ( wxpeer ) + { + wxpeer->OSXSimulateFocusEvents(); wxpeer->OSXHandleClicked(0); + } } void wxWidgetCocoaImpl::controlDoubleAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender)) @@ -1520,7 +1543,9 @@ void wxOSXCocoaClassAddWXMethods(Class c) wxOSX_CLASS_ADD_METHOD(c, @selector(becomeFirstResponder), (IMP) wxOSX_becomeFirstResponder, "c@:" ) wxOSX_CLASS_ADD_METHOD(c, @selector(resignFirstResponder), (IMP) wxOSX_resignFirstResponder, "c@:" ) +#if !wxOSX_USE_NATIVE_FLIPPED wxOSX_CLASS_ADD_METHOD(c, @selector(isFlipped), (IMP) wxOSX_isFlipped, "c@:" ) +#endif wxOSX_CLASS_ADD_METHOD(c, @selector(drawRect:), (IMP) wxOSX_drawRect, "v@:{_NSRect={_NSPoint=ff}{_NSSize=ff}}" ) wxOSX_CLASS_ADD_METHOD(c, @selector(controlAction:), (IMP) wxOSX_controlAction, "v@:@" ) @@ -1578,7 +1603,9 @@ wxWidgetCocoaImpl::wxWidgetCocoaImpl() void wxWidgetCocoaImpl::Init() { m_osxView = NULL; +#if !wxOSX_USE_NATIVE_FLIPPED m_isFlipped = true; +#endif m_lastKeyDownEvent = NULL; m_hasEditor = false; } @@ -2125,6 +2152,9 @@ void wxWidgetCocoaImpl::Embed( wxWidgetImpl *parent ) NSView* container = parent->GetWXWidget() ; wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; [container addSubview:m_osxView]; + + if( m_wxPeer->IsFrozen() ) + [[m_osxView window] disableFlushWindow]; } void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &col ) @@ -2372,14 +2402,33 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant ) if ([cell respondsToSelector:@selector(setControlSize:)]) [cell setControlSize:size]; } + + // we need to propagate this to inner views as well + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + { + NSView* targetView = [(NSScrollView*) m_osxView documentView]; + + if ( [targetView respondsToSelector:@selector(setControlSize:)] ) + [targetView setControlSize:size]; + else if ([targetView respondsToSelector:@selector(cell)]) + { + id cell = [(id)targetView cell]; + if ([cell respondsToSelector:@selector(setControlSize:)]) + [cell setControlSize:size]; + } + } } void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool) { - if ([m_osxView respondsToSelector:@selector(setFont:)]) - [m_osxView setFont: font.OSXGetNSFont()]; - if ([m_osxView respondsToSelector:@selector(setTextColor:)]) - [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) + NSView* targetView = m_osxView; + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + targetView = [(NSScrollView*) m_osxView documentView]; + + if ([targetView respondsToSelector:@selector(setFont:)]) + [targetView setFont: font.OSXGetNSFont()]; + if ([targetView respondsToSelector:@selector(setTextColor:)]) + [targetView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) green:(CGFloat) (col.Green() / 255.0) blue:(CGFloat) (col.Blue() / 255.0) alpha:(CGFloat) (col.Alpha() / 255.0)]]; @@ -2518,7 +2567,7 @@ void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* oth event.SetWindow(otherWindow->GetWXPeer()); thisWindow->HandleWindowEvent(event) ; } - else // !receivedFocuss + else // !receivedFocus { #if wxUSE_CARET if ( thisWindow->GetCaret() ) @@ -2562,11 +2611,27 @@ void wxWidgetCocoaImpl::ReleaseMouse() // [[m_osxView window] enableCursorRects]; } +#if !wxOSX_USE_NATIVE_FLIPPED + void wxWidgetCocoaImpl::SetFlipped(bool flipped) { m_isFlipped = flipped; } +#endif + +void wxWidgetCocoaImpl::SetDrawingEnabled(bool enabled) +{ + if ( enabled ) + { + [[m_osxView window] enableFlushWindow]; + [m_osxView setNeedsDisplay:YES]; + } + else + { + [[m_osxView window] disableFlushWindow]; + } +} // // Factory methods //