]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
mac cleanup, pure cgcolor
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index cc7fde5a170cbb1db8561ad701d7401ca82cadd0..135bf7aa619d2d66e4b0a689996c687e8372c46a 100644 (file)
@@ -79,7 +79,6 @@ static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16
 BEGIN_EVENT_TABLE(wxTopLevelWindowMac, wxTopLevelWindowBase)
 END_EVENT_TABLE()
 
-
 // ---------------------------------------------------------------------------
 // Carbon Events
 // ---------------------------------------------------------------------------
@@ -260,11 +259,15 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     UInt32 modifiers = cEvent.GetParameter<UInt32>(kEventParamKeyModifiers, typeUInt32) ;
     Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
 
-    // this parameter are not given for all events
+    // these parameters are not given for all events
     EventMouseButton button = 0 ;
     UInt32 clickCount = 0 ;
+    UInt32 mouseChord = 0;
+
     cEvent.GetParameter<EventMouseButton>( kEventParamMouseButton, typeMouseButton , &button ) ;
     cEvent.GetParameter<UInt32>( kEventParamClickCount, typeUInt32 , &clickCount ) ;
+    // the chord is the state of the buttons pressed currently
+    cEvent.GetParameter<UInt32>( kEventParamMouseChord, typeUInt32 , &mouseChord ) ;
 
     wxevent.m_x = screenMouseLocation.h;
     wxevent.m_y = screenMouseLocation.v;
@@ -282,6 +285,7 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
         button = kEventMouseButtonSecondary ;
         thisButtonIsFakeRight = true ;
     }
+
     // otherwise we report double clicks by connecting a left click with a ctrl-left click
     if ( clickCount > 1 && button != g_lastButton )
         clickCount = 1 ;
@@ -303,28 +307,19 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     else if ( g_lastButton == kEventMouseButtonSecondary && g_lastButtonWasFakeRight )
         button = g_lastButton ;
 
-    // determine the correct down state, wx does not want a 'down' for a mouseUp event,
-    // while mac delivers this button
-    if ( button != 0 && cEvent.GetKind() != kEventMouseUp )
-    {
-        switch ( button )
-        {
-            case kEventMouseButtonPrimary :
-                wxevent.m_leftDown = true ;
-                break ;
+    // Adjust the chord mask to remove the primary button and add the
+    // secondary button.  It is possible that the secondary button is
+    // already pressed, e.g. on a mouse connected to a laptop, but this
+    // possibility is ignored here:
+    if( thisButtonIsFakeRight && ( mouseChord & 1U ) )
+        mouseChord = ((mouseChord & ~1U) | 2U);
 
-            case kEventMouseButtonSecondary :
+    if(mouseChord & 1U)
+                wxevent.m_leftDown = true ;
+    if(mouseChord & 2U)
                 wxevent.m_rightDown = true ;
-                break ;
-
-            case kEventMouseButtonTertiary :
+    if(mouseChord & 4U)
                 wxevent.m_middleDown = true ;
-                break ;
-
-            default:
-                break ;
-        }
-    }
 
     // translate into wx types
     switch ( cEvent.GetKind() )
@@ -384,8 +379,13 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
         }
         break ;
 
-        default :
+        case kEventMouseEntered :
+        case kEventMouseExited :
+        case kEventMouseDragged :
+        case kEventMouseMoved :
             wxevent.SetEventType( wxEVT_MOTION ) ;
+            break;
+        default :
             break ;
     }
 }
@@ -442,18 +442,6 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point
     return NULL ;
 }
 
-ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart )
-{
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1030 )
-        return FindControlUnderMouse( location , window , outPart ) ;
-#endif
-
-    ControlRef rootControl = NULL ;
-    verify_noerr( GetRootControl( window , &rootControl ) ) ;
-
-    return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
-}
 
 #define NEW_CAPTURE_HANDLING 1
 
@@ -500,7 +488,7 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
         else if ( (IsWindowActive(window) && windowPart == inContent) )
         {
             ControlPartCode part ;
-            control = wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &part ) ;
+            control = FindControlUnderMouse( windowMouseLocation , window , &part ) ;
             // if there is no control below the mouse position, send the event to the toplevel window itself
             if ( control == 0 )
             {
@@ -508,7 +496,8 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
             }
             else
             {
-                currentMouseWindow = wxFindControlFromMacControl( control ) ;
+                currentMouseWindow = (wxWindow*) wxFindControlFromMacControl( control ) ;
+#ifndef __WXUNIVERSAL__
                 if ( currentMouseWindow == NULL && cEvent.GetKind() == kEventMouseMoved )
                 {
 #if wxUSE_TOOLBAR
@@ -516,11 +505,12 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
                     // instead of its children (wxToolBarTools)
                     ControlRef parent ;
                     GetSuperControl(control, &parent );
-                    wxWindow *wxParent = wxFindControlFromMacControl( parent ) ;
+                    wxWindow *wxParent = (wxWindow*) wxFindControlFromMacControl( parent ) ;
                     if ( wxParent && wxParent->IsKindOf( CLASSINFO( wxToolBar ) ) )
                         currentMouseWindow = wxParent ;
 #endif
                 }
+#endif
             }
 
             // disabled windows must not get any input messages
@@ -575,6 +565,7 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
         if ( cEvent.GetKind() == kEventMouseDown )
         {
             ::MenuSelect( screenMouseLocation ) ;
+            ::HiliteMenu(0);
             result = noErr ;
         }
     }
@@ -613,17 +604,10 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
                     currentMouseWindow->SetFocus();
             }
 
-            ControlPartCode dummyPart ;
             // if built-in find control is finding the wrong control (ie static box instead of overlaid
             // button, we cannot let the standard handler do its job, but must handle manually
 
-            if ( ( cEvent.GetKind() == kEventMouseDown )
-#ifdef __WXMAC_OSX__
-                &&
-                (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) !=
-                wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &dummyPart ) )
-#endif
-                )
+            if ( cEvent.GetKind() == kEventMouseDown )
             {
                 if ( currentMouseWindow->MacIsReallyEnabled() )
                 {
@@ -674,14 +658,13 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
         {
             EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
             Point clickLocation = windowMouseLocation ;
-#if TARGET_API_MAC_OSX
+
             HIPoint hiPoint ;
             hiPoint.x = clickLocation.h ;
             hiPoint.y = clickLocation.v ;
             HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control  ) ;
             clickLocation.h = (int)hiPoint.x ;
             clickLocation.v = (int)hiPoint.y ;
-#endif // TARGET_API_MAC_OSX
 
             HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ;
             result = noErr ;
@@ -744,6 +727,7 @@ wxMacTopLevelWindowEventHandler(EventHandlerCallRef WXUNUSED(handler),
             wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
             if ( attributes & kWindowBoundsChangeSizeChanged )
             {
+#ifndef __WXUNIVERSAL__
                 // according to the other ports we handle this within the OS level
                 // resize event, not within a wxSizeEvent
                 wxFrame *frame = wxDynamicCast( toplevelWindow , wxFrame ) ;
@@ -751,7 +735,7 @@ wxMacTopLevelWindowEventHandler(EventHandlerCallRef WXUNUSED(handler),
                 {
                     frame->PositionBars();
                 }
-
+#endif
                 wxSizeEvent event( r.GetSize() , toplevelWindow->GetId() ) ;
                 event.SetEventObject( toplevelWindow ) ;
 
@@ -947,22 +931,15 @@ void wxTopLevelWindowMac::Init()
     m_macFullScreenData = NULL ;
 }
 
-class wxMacDeferredWindowDeleter : public wxObject
+wxMacDeferredWindowDeleter::wxMacDeferredWindowDeleter( WindowRef windowRef )
 {
-public :
-    wxMacDeferredWindowDeleter( WindowRef windowRef )
-    {
-        m_macWindow = windowRef ;
-    }
-
-    virtual ~wxMacDeferredWindowDeleter()
-    {
-        UMADisposeWindow( (WindowRef) m_macWindow ) ;
-    }
+    m_macWindow = windowRef ;
+}
 
-protected :
-    WindowRef m_macWindow ;
-} ;
+wxMacDeferredWindowDeleter::~wxMacDeferredWindowDeleter()
+{
+    UMADisposeWindow( (WindowRef) m_macWindow ) ;
+}
 
 bool wxTopLevelWindowMac::Create(wxWindow *parent,
                                  wxWindowID id,
@@ -982,7 +959,7 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
     m_windowId = id == -1 ? NewControlId() : id;
     wxWindow::SetLabel( title ) ;
 
-    MacCreateRealWindow( title, pos , size , style , name ) ;
+    DoMacCreateRealWindow( parent, title, pos , size , style , name ) ;
 
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
 
@@ -1096,16 +1073,19 @@ void  wxTopLevelWindowMac::MacSetBackgroundBrush( const wxBrush &brush )
     }
 }
 
+void wxTopLevelWindowMacInstallTopLevelWindowEventHandler(WindowRef window, EventHandlerRef* handler, void *ref)
+{
+    InstallWindowEventHandler(window, GetwxMacTopLevelEventHandlerUPP(),
+        GetEventTypeCount(eventList), eventList, ref, handler );
+}
+
 void wxTopLevelWindowMac::MacInstallTopLevelWindowEventHandler()
 {
     if ( m_macEventHandler != NULL )
     {
         verify_noerr( ::RemoveEventHandler( (EventHandlerRef) m_macEventHandler ) ) ;
     }
-
-    InstallWindowEventHandler(
-        MAC_WXHWND(m_macWindow), GetwxMacTopLevelEventHandlerUPP(),
-        GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler );
+    wxTopLevelWindowMacInstallTopLevelWindowEventHandler(MAC_WXHWND(m_macWindow),(EventHandlerRef *)&m_macEventHandler,this);
 }
 
 void  wxTopLevelWindowMac::MacCreateRealWindow(
@@ -1114,6 +1094,17 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     const wxSize& size,
     long style,
     const wxString& name )
+{
+    DoMacCreateRealWindow( NULL, title, pos, size, style, name );
+}
+
+void  wxTopLevelWindowMac::DoMacCreateRealWindow(
+    wxWindow* parent,
+    const wxString& title,
+    const wxPoint& pos,
+    const wxSize& size,
+    long style,
+    const wxString& name )
 {
     OSStatus err = noErr ;
     SetName(name);
@@ -1142,6 +1133,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     WindowClass wclass = 0;
     WindowAttributes attr = kWindowNoAttributes ;
     WindowGroupRef group = NULL ;
+    bool activationScopeSet = false;
+    WindowActivationScope activationScope = kWindowActivationScopeNone;
 
     if ( HasFlag( wxFRAME_TOOL_WINDOW) )
     {
@@ -1151,7 +1144,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
             HasFlag(wxTINY_CAPTION_HORIZ) ||  HasFlag(wxTINY_CAPTION_VERT)
             )
         {
-            wclass = kFloatingWindowClass ;
+            if ( HasFlag( wxSTAY_ON_TOP ) )
+                wclass = kUtilityWindowClass;
+            else
+                wclass = kFloatingWindowClass ;
 
             if ( HasFlag(wxTINY_CAPTION_VERT) )
                 attr |= kWindowSideTitlebarAttribute ;
@@ -1159,6 +1155,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         else
         {
             wclass = kPlainWindowClass ;
+            activationScopeSet = true;
+            activationScope = kWindowActivationScopeNone;
         }
     }
     else if ( HasFlag( wxPOPUP_WINDOW ) )
@@ -1180,12 +1178,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         wclass = kDocumentWindowClass ;
         attr |= kWindowInWindowMenuAttribute ;
     }
-#if defined( __WXMAC__ ) && TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 )
     else if ( HasFlag( wxFRAME_DRAWER ) )
     {
         wclass = kDrawerWindowClass;
     }
-#endif  //10.2 and up
     else
     {
         if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
@@ -1193,6 +1189,10 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         {
             wclass = kDocumentWindowClass ;
         }
+        else if ( HasFlag( wxNO_BORDER ) )
+        {
+            wclass = kSimpleWindowClass ;
+        }
         else
         {
             wclass = kPlainWindowClass ;
@@ -1213,10 +1213,7 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
         if ( HasFlag( wxCLOSE_BOX) )
             attr |= kWindowCloseBoxAttribute ;
     }
-
-    // turn on live resizing (OS X only)
-    if (UMAGetSystemVersion() >= 0x1000)
-        attr |= kWindowLiveResizeAttribute;
+    attr |= kWindowLiveResizeAttribute;
 
     if ( HasFlag(wxSTAY_ON_TOP) )
         group = GetWindowGroupOfClass(kUtilityWindowClass) ;
@@ -1224,6 +1221,13 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     if ( HasFlag( wxFRAME_FLOAT_ON_PARENT ) )
         group = GetWindowGroupOfClass(kFloatingWindowClass) ;
 
+    if ( group == NULL && parent != NULL )
+    {
+        WindowRef parenttlw = (WindowRef) parent->MacGetTopLevelWindowRef();
+        if( parenttlw )
+            group = GetWindowGroupParent( GetWindowGroup( parenttlw ) );
+    }
+
     attr |= kWindowCompositingAttribute;
 #if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
     attr |= kWindowFrameworkScaledAttribute;
@@ -1254,9 +1258,16 @@ 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 ));
+
+    WindowGroupRef overlaygroup = NULL;
+    verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &overlaygroup ));
+    verify_noerr( SetWindowGroupParent( overlaygroup, GetWindowGroup( (WindowRef) m_macWindow )));
+    verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , overlaygroup ));
+
+    if ( activationScopeSet )
+    {
+        verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope ));
+    }
 
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
@@ -1289,12 +1300,15 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
     }
 #endif
 
-#if TARGET_API_MAC_OSX
     if ( m_macWindow != NULL )
     {
         MacSetUnifiedAppearance( true ) ;
     }
-#endif
+
+    HIViewRef growBoxRef = 0 ;
+    err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef  );
+    if ( err == noErr && growBoxRef != 0 )
+        HIGrowBoxViewSetTransparent( growBoxRef, true ) ;
 
     // the frame window event handler
     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
@@ -1371,11 +1385,9 @@ bool wxTopLevelWindowMac::Show(bool show)
     if ( !wxTopLevelWindowBase::Show(show) )
         return false;
 
-    bool plainTransition = false;
+    bool plainTransition = true;
 
 #if wxUSE_SYSTEM_OPTIONS
-    // code contributed by Ryan Wilcox December 18, 2003
-    plainTransition = UMAGetSystemVersion() >= 0x1000 ;
     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
         plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
 #endif
@@ -1504,7 +1516,6 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
 
     wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
 
-#if TARGET_API_MAC_OSX
     if ( m_macWindow != NULL )
     {
         bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
@@ -1517,7 +1528,6 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
             MacSetMetalAppearance( metal ) ;
         }
     }
-#endif
 }
 
 bool wxTopLevelWindowMac::SetBackgroundStyle(wxBackgroundStyle style)
@@ -1598,55 +1608,45 @@ void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const
        *height = bounds.bottom - bounds.top ;
 }
 
+void wxTopLevelWindowMac::DoCentre(int dir)
+{
+    if ( m_macWindow != 0 )
+        wxTopLevelWindowBase::DoCentre(dir);
+}
+
 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
 {
-#if TARGET_API_MAC_OSX
     if ( MacGetUnifiedAppearance() )
         MacSetUnifiedAppearance( false ) ;
 
     MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
         set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
-#endif
 }
 
 bool wxTopLevelWindowMac::MacGetMetalAppearance() const
 {
-#if TARGET_API_MAC_OSX
     return MacGetWindowAttributes() & kWindowMetalAttribute ;
-#else
-    return false;
-#endif
 }
 
 void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set )
 {
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1040 )
-    {
-        if ( MacGetMetalAppearance() )
-            MacSetMetalAppearance( false ) ;
-
-        MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
-            set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
-
-        // For some reason, Tiger uses white as the background color for this appearance,
-        // while most apps using it use the typical striped background. Restore that behavior
-        // for wx.
-        // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
-        // though)
-        SetBackgroundColour( wxSYS_COLOUR_WINDOW ) ;
-    }
-#endif
+    if ( MacGetMetalAppearance() )
+        MacSetMetalAppearance( false ) ;
+
+    MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
+        set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
+
+    // For some reason, Tiger uses white as the background color for this appearance,
+    // while most apps using it use the typical striped background. Restore that behavior
+    // for wx.
+    // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
+    // though)
+    SetBackgroundColour( wxSYS_COLOUR_WINDOW ) ;
 }
 
 bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const
 {
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1040 )
-        return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
-    else
-#endif
-        return false;
+    return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
 }
 
 void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )
@@ -1664,32 +1664,9 @@ wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const
 
 void wxTopLevelWindowMac::MacPerformUpdates()
 {
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
     // for composited windows this also triggers a redraw of all
     // invalid views in the window
-    if ( UMAGetSystemVersion() >= 0x1030 )
-        HIWindowFlush((WindowRef) m_macWindow) ;
-    else
-#endif
-    {
-        // the only way to trigger the redrawing on earlier systems is to call
-        // ReceiveNextEvent
-
-        EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;
-        UInt32 currentEventClass = 0 ;
-        if ( currentEvent != NULL )
-        {
-            currentEventClass = ::GetEventClass( currentEvent ) ;
-            ::GetEventKind( currentEvent ) ;
-        }
-
-        if ( currentEventClass != kEventClassMenu )
-        {
-            // when tracking a menu, strange redraw errors occur if we flush now, so leave..
-            EventRef theEvent;
-            ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;
-        }
-    }
+    HIWindowFlush((WindowRef) m_macWindow) ;
 }
 
 // Attracts the users attention to this window if the application is