]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
Better wxFile support, warning fixes and minor source cleaning.
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index 4af012f7d652cfbc088feb4883038ac334d014c6..7f7bc298af597ead48b23d8ec0733a8cd97fd44c 100644 (file)
@@ -36,6 +36,7 @@
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/settings.h"
+    #include "wx/strconv.h"
     #include "wx/control.h"
 #endif //WX_PRECOMP
 
@@ -167,17 +168,40 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
         return result ;
         
     char charCode ;
+    wxChar uniChar = 0 ; 
     UInt32 keyCode ;
     UInt32 modifiers ;
     Point point ;
     UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;
 
+#if wxUSE_UNICODE
+    UInt32 dataSize = 0 ;
+    if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize , NULL ) == noErr )
+    {
+        UniChar buf[2] ;
+        
+        UniChar* charBuf = buf ;
+        
+        if ( dataSize > 4 )
+            charBuf = new UniChar[ dataSize / sizeof( UniChar) ] ;
+        GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ;
+#if SIZEOF_WCHAR_T == 2
+        uniChar = charBuf[0] ;
+#else
+        wxMBConvUTF16BE converter ;
+        converter.MB2WC( &uniChar , (const char*)charBuf , 1 ) ;
+#endif        
+        if ( dataSize > 4 )
+            delete[] charBuf ;
+    }
+#endif
+
     GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL,sizeof(char), NULL,&charCode );
     GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL,  sizeof(UInt32), NULL, &keyCode );
        GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
     GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL,
         sizeof( Point ), NULL, &point );
-
+    
     UInt32 message = (keyCode << 8) + charCode;
     switch( GetEventKind( event ) )
     {
@@ -188,7 +212,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
                 WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
                 wxTheApp->MacSetCurrentEvent( event , handler ) ;
                 if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent(
-                    focus , message , modifiers , when , point.h , point.v ) )
+                    focus , message , modifiers , when , point.h , point.v , uniChar ) )
                 {
                     result = noErr ;
                 }
@@ -197,7 +221,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
             break ;
         case kEventRawKeyUp :
             if ( (focus != NULL) && wxTheApp->MacSendKeyUpEvent(
-                focus , message , modifiers , when , point.h , point.v ) )
+                focus , message , modifiers , when , point.h , point.v , uniChar ) )
             {
                 result = noErr ;
             }
@@ -210,7 +234,9 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
                 event.m_controlDown = modifiers & controlKey;
                 event.m_altDown = modifiers & optionKey;
                 event.m_metaDown = modifiers & cmdKey;
-
+#if wxUSE_UNICODE
+                event.m_uniChar = uniChar ;
+#endif
                 event.m_x = point.h;
                 event.m_y = point.v;
                 event.SetTimestamp(when);
@@ -359,7 +385,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     }       
 }
 
-ControlRef wxMacFindSubControl( Point location , ControlRef superControl , ControlPartCode *outPart )
+ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, Point location , ControlRef superControl , ControlPartCode *outPart )
 {
     if ( superControl )
     {
@@ -383,16 +409,19 @@ ControlRef wxMacFindSubControl( Point location , ControlRef superControl , Contr
                 UMAGetControlBoundsInWindowCoords( sibling , &r ) ;
                 if ( MacPtInRect( location , &r ) )
                 {
-                    ControlHandle child = wxMacFindSubControl( location , sibling , outPart ) ;
+                    ControlHandle child = wxMacFindSubControl( toplevelWindow , location , sibling , outPart ) ;
                     if ( child )
                         return child ;
                     else
                     {
                         Point testLocation = location ;
-#if TARGET_API_MAC_OSX
-                        testLocation.h -= r.left ;
-                        testLocation.v -= r.top ;
-#endif
+
+                        if ( toplevelWindow && toplevelWindow->MacUsesCompositing() )
+                        {
+                            testLocation.h -= r.left ;
+                            testLocation.v -= r.top ;
+                        }
+                        
                         *outPart = TestControl( sibling , testLocation ) ;
                         return sibling ;
                     }
@@ -403,19 +432,20 @@ ControlRef wxMacFindSubControl( Point location , ControlRef superControl , Contr
     return NULL ;
 }
 
-ControlRef wxMacFindControlUnderMouse( Point location , WindowRef window , ControlPartCode *outPart )
+ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , Point location , WindowRef window , ControlPartCode *outPart )
 {
 #if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1030 )
+    if ( UMAGetSystemVersion() >= 0x1030 && ( toplevelWindow == 0 || toplevelWindow->MacUsesCompositing() ) )
         return FindControlUnderMouse( location , window , outPart ) ;
 #endif
     ControlRef rootControl = NULL ;
     verify_noerr( GetRootControl( window , &rootControl ) ) ;
-    return wxMacFindSubControl( location , rootControl , outPart ) ;
+    return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
 
 }
 pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
+    wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ;
     
     OSStatus result = eventNotHandledErr ;
 
@@ -441,7 +471,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         else if ( (IsWindowActive(window) && windowPart == inContent) )
         {
             ControlPartCode part ;
-            control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ;
+            control = wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &part ) ;
             // if there is no control below the mouse position, send the event to the toplevel window itself
             if ( control == 0 )
                 currentMouseWindow = (wxWindow*) data ;
@@ -549,7 +579,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
 #ifdef __WXMAC_OSX__
                 && 
                 (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) != 
-                wxMacFindControlUnderMouse( windowMouseLocation , window , &dummyPart ) ) 
+                wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &dummyPart ) ) 
 #endif
                 )
             {
@@ -557,9 +587,10 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
                 {
                     EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
                     Point clickLocation = windowMouseLocation ;
-    #if TARGET_API_MAC_OSX
-                    currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ;
-    #endif
+
+                    if ( toplevelWindow->MacUsesCompositing() )
+                        currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ;
+
                     HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , clickLocation ,
                         modifiers , (ControlActionUPP ) -1 ) ;
                         
@@ -594,19 +625,21 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         // don't mess with controls we don't know about
         // for some reason returning eventNotHandledErr does not lead to the correct behaviour
         // so we try sending them the correct control directly
-        wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ;
         if ( cEvent.GetKind() == kEventMouseDown && toplevelWindow && control )
         {
             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 ;
+            if ( toplevelWindow->MacUsesCompositing() )
+            {
+#ifdef __WXMAC_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
+            }
             HandleControlClick( control , clickLocation ,
                 modifiers , (ControlActionUPP ) -1 ) ;
             result = noErr ;
@@ -720,7 +753,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
                     cEvent.SetParameter<Rect>( kEventParamCurrentBounds , &adjustedRect ) ;
             }
 
-            result = noErr ;
+            result = noErr ; 
             break ;
         }
         default :
@@ -843,10 +876,15 @@ void wxTopLevelWindowMac::Init()
     m_maximizeOnShow = FALSE;
     m_macWindow = NULL ;
 #if TARGET_API_MAC_OSX 
-    m_macUsesCompositing = TRUE;
-#else
-    m_macUsesCompositing = FALSE;
+    if ( UMAGetSystemVersion() >= 0x1030 )
+    { 
+        m_macUsesCompositing = TRUE;
+    }
+    else
 #endif
+    {
+        m_macUsesCompositing = FALSE;
+    }
     m_macEventHandler = NULL ;
     m_macFullScreenData = NULL ;
 }
@@ -900,7 +938,9 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac()
 {
     if ( m_macWindow )
     {
+#if wxUSE_TOOLTIPS
         wxToolTip::NotifyWindowDelete(m_macWindow) ;
+#endif
         wxPendingDelete.Append( new wxMacDeferredWindowDeleter( (WindowRef) m_macWindow ) ) ;
     }
 
@@ -1052,10 +1092,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
     else if ( HasFlag( wxFRAME_DRAWER ) )
     {
         wclass = kDrawerWindowClass;
-        // Should this be left for compositing check below?
-        // CreateNewWindow will fail without it, should wxDrawerWindow turn
-        // on compositing before calling MacCreateRealWindow?
-        attr |= kWindowCompositingAttribute;// | kWindowStandardHandlerAttribute;
+        // we must force compositing on a drawer
+        m_macUsesCompositing = TRUE ;
     }
 #endif  //10.2 and up
     else
@@ -1100,7 +1138,8 @@ void  wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
     }
 
 #if TARGET_API_MAC_OSX 
-    attr |= kWindowCompositingAttribute;
+    if ( m_macUsesCompositing )
+        attr |= kWindowCompositingAttribute;
 #endif
     
     if ( HasFlag(wxFRAME_SHAPED) )
@@ -1129,20 +1168,25 @@ void  wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
 
     wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
     UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ;
-    m_peer = new wxMacControl(this) ;
+    m_peer = new wxMacControl(this , true /*isRootControl*/) ;
 #if TARGET_API_MAC_OSX
-    // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of 
-    // the content view, so we have to retrieve it explicitely
-    HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID , 
-        m_peer->GetControlRefAddr() ) ;
-    if ( !m_peer->Ok() )
+    
+    if ( m_macUsesCompositing )
     {
-        // compatibility mode fallback
-        GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ;
+        // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of 
+        // the content view, so we have to retrieve it explicitely
+        HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID , 
+            m_peer->GetControlRefAddr() ) ;
+        if ( !m_peer->Ok() )
+        {
+            // compatibility mode fallback
+            GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ;
+        }
     }
-#else
-    ::CreateRootControl( (WindowRef)m_macWindow , m_peer->GetControlRefAddr() ) ;
 #endif
+    {
+        ::CreateRootControl( (WindowRef)m_macWindow , m_peer->GetControlRefAddr() ) ;
+    }
     // the root control level handleer
     MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ;
 
@@ -1361,9 +1405,7 @@ void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const
 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set ) 
 {
 #if TARGET_API_MAC_OSX
-    UInt32 attr = 0 ;
-    GetWindowAttributes((WindowRef) m_macWindow , &attr ) ;
-    wxASSERT_MSG( attr & kWindowCompositingAttribute ,
+    wxASSERT_MSG( m_macUsesCompositing ,
         wxT("Cannot set metal appearance on a non-compositing window") ) ;
                 
     MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,