]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/window.mm
Move menu messages handling from wxFrame to wxTLW in wxMSW.
[wxWidgets.git] / src / osx / cocoa / window.mm
index 35b33e350f106f81f2d18a41d7268d3c4d9354d1..0f8d583014313b7205cad012fb42b681baf53ef2 100644 (file)
@@ -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;
 }
@@ -2584,11 +2611,15 @@ 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 )