]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
make sure we always restore the passed in cg in a paint event
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index 8d279e9599678a1f460b261158a37846c6a3457e..6903a408f8ba15892add8d28f8acc67b250d96f3 100644 (file)
@@ -130,7 +130,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
     UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
 
 #if wxUSE_UNICODE
-    UInt32 dataSize = 0 ;
+    ByteCount dataSize = 0 ;
     if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr )
     {
         UniChar buf[2] ;
@@ -248,9 +248,9 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
 
 wxWindow* g_MacLastWindow = NULL ;
 
-static EventMouseButton lastButton = 0 ;
+EventMouseButton g_lastButton = 0 ;
 
-static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
+void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
 {
     UInt32 modifiers = cEvent.GetParameter<UInt32>(kEventParamKeyModifiers, typeUInt32) ;
     Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
@@ -274,19 +274,19 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
         button = kEventMouseButtonSecondary ;
 
     // otherwise we report double clicks by connecting a left click with a ctrl-left click
-    if ( clickCount > 1 && button != lastButton )
+    if ( clickCount > 1 && button != g_lastButton )
         clickCount = 1 ;
 
     // we must make sure that our synthetic 'right' button corresponds in
     // mouse down, moved and mouse up, and does not deliver a right down and left up
 
     if ( cEvent.GetKind() == kEventMouseDown )
-        lastButton = button ;
+        g_lastButton = button ;
 
     if ( button == 0 )
-        lastButton = 0 ;
-    else if ( lastButton )
-        button = lastButton ;
+        g_lastButton = 0 ;
+    else if ( g_lastButton )
+        button = g_lastButton ;
 
     // determine the correct down state, wx does not want a 'down' for a mouseUp event,
     // while mac delivers this button
@@ -359,7 +359,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
             wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ;
 
             // EventMouseWheelAxis axis = cEvent.GetParameter<EventMouseWheelAxis>(kEventParamMouseWheelAxis, typeMouseWheelAxis) ;
-            SInt32 delta = cEvent.GetParameter<SInt32>(kEventParamMouseWheelDelta, typeLongInteger) ;
+            SInt32 delta = cEvent.GetParameter<SInt32>(kEventParamMouseWheelDelta, typeSInt32) ;
 
             wxevent.m_wheelRotation = delta;
             wxevent.m_wheelDelta = 1;
@@ -467,7 +467,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
 
     if ( window )
     {
-        QDGlobalToLocalPoint( UMAGetWindowPort(window ) ,  &windowMouseLocation ) ;
+        wxMacGlobalToLocal( window,  &windowMouseLocation ) ;
 
         if ( wxApp::s_captureWindow
 #if !NEW_CAPTURE_HANDLING
@@ -980,10 +980,18 @@ void wxTopLevelWindowMac::Maximize(bool maximize)
     Point idealSize = { 0 , 0 } ;
     if ( maximize )
     {
+#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+        HIRect bounds ;
+        HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
+            &bounds);
+        idealSize.h = bounds.size.width;
+        idealSize.v = bounds.size.height;
+#else
         Rect rect ;
         GetAvailableWindowPositioningBounds(GetMainDevice(),&rect) ;
         idealSize.h = rect.right - rect.left ;
         idealSize.v = rect.bottom - rect.top ;
+#endif
     }
     ZoomWindowIdeal( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , &idealSize ) ;
 }
@@ -1157,8 +1165,12 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     {
         WindowDefSpec customWindowDefSpec;
         customWindowDefSpec.defType = kWindowDefProcPtr;
-        customWindowDefSpec.u.defProc = NewWindowDefUPP(wxShapedMacWindowDef);
-
+        customWindowDefSpec.u.defProc = 
+#ifdef __LP64__
+            (WindowDefUPP) wxShapedMacWindowDef;
+#else
+            NewWindowDefUPP(wxShapedMacWindowDef);
+#endif
         err = ::CreateCustomWindow( &customWindowDefSpec, wclass,
                               attr, &theBoundsRect,
                               (WindowRef*) &m_macWindow);
@@ -1173,6 +1185,11 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
 
     wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
 
+    // setup a separate group for each window, so that overlays can be handled easily
+    verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &group ));
+    verify_noerr( SetWindowGroupParent( group, GetWindowGroup( (WindowRef) m_macWindow )));
+    verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , group ));
+  
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
     SetWindowBounds(  (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
@@ -1599,7 +1616,7 @@ bool wxTopLevelWindowMac::SetShape(const wxRegion& region)
         DisposeRgn(oldRgn);
 
     // Save the region so we can use it later
-    SetWRefCon((WindowRef)MacGetWindowRef(), (SInt32)shapeRegion);
+    SetWRefCon((WindowRef)MacGetWindowRef(), (URefCon)shapeRegion);
 
     // inform the window manager that the window has changed shape
     ReshapeCustomWindow((WindowRef)MacGetWindowRef());
@@ -1615,13 +1632,12 @@ bool wxTopLevelWindowMac::SetShape(const wxRegion& region)
 static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect)
 {
     GetWindowPortBounds(window, inRect);
-    Point pt = { inRect->left, inRect->top };
-
-    QDLocalToGlobalPoint( GetWindowPort(window), &pt ) ;
+    Point pt = { inRect->top ,inRect->left };
+    wxMacLocalToGlobal( window, &pt ) ;
+    inRect->bottom += pt.v - inRect->top;
+    inRect->right += pt.h - inRect->left;
     inRect->top = pt.v;
     inRect->left = pt.h;
-    inRect->bottom += pt.v;
-    inRect->right += pt.h;
 }
 
 static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param)