]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/window.cpp
benefit from 10.5+ call HIShapeUnionWithRect
[wxWidgets.git] / src / osx / carbon / window.cpp
index 09f448a83c2c6da6234a934fca0c5f624e157b63..94c95ef5cf40b204c58166b9259d71da3d633f7e 100644 (file)
@@ -65,7 +65,7 @@
 #include "wx/osx/uma.h"
 #else
 #include "wx/osx/private.h"
-// bring in themeing
+// bring in theming
 #include <Carbon/Carbon.h>
 #endif
 
@@ -188,7 +188,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     OSStatus err = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) ;
                     if ( err != noErr )
                     {
-                        wxFAIL_MSG("Unable to retrieve CGContextRef");
+                        // for non-composite drawing, since we don't support it ourselves, send it through the
+                        // the default handler
+                        // CallNextEventHandler( handler,event ) ;
+                        // result = noErr ;
+                        if ( allocatedRgn )
+                            CFRelease( allocatedRgn ) ;
+                        break;
                     }
 
                     thisWindow->MacSetCGContextRef( cgContext ) ;
@@ -579,7 +585,7 @@ wxMacWindowServiceEventHandler(EventHandlerCallRef WXUNUSED(handler),
     return result ;
 }
 
-pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+WXDLLEXPORT pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
     OSStatus result = eventNotHandledErr ;
     wxWindowMac* focus = (wxWindowMac*) data ;
@@ -604,14 +610,9 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
         uniChars = new wchar_t[ numChars ] ;
         GetEventParameter( event, kEventParamTextInputSendText, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ;
         charBuf[ numChars - 1 ] = 0;
-#if SIZEOF_WCHAR_T == 2
-        uniChars = (wchar_t*) charBuf ;
-/*        memcpy( uniChars , charBuf , numChars * 2 ) ;*/   // is there any point in copying charBuf over itself? (in fact, memcpy isn't even guaranteed to work correctly if the source and destination ranges overlap...)
-#else
         // the resulting string will never have more chars than the utf16 version, so this is safe
         wxMBConvUTF16 converter ;
         numChars = converter.MB2WC( uniChars , (const char*)charBuf , numChars ) ;
-#endif
     }
 
     switch ( GetEventKind( event ) )
@@ -652,8 +653,7 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
     I don't have time to look into that right now.
         -- CL
 */
-                    if ( wxTheApp->MacSendCharEvent(
-                                                    focus , message , 0 , when , 0 , 0 , uniChars[pos] ) )
+                    if ( wxTheApp->MacSendCharEvent( focus , message , 0 , when , uniChars[pos] ) )
                     {
                         result = noErr ;
                     }
@@ -665,7 +665,6 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
         case kEventTextInputUnicodeForKeyEvent :
             {
                 UInt32 keyCode, modifiers ;
-                Point point ;
                 EventRef rawEvent ;
                 unsigned char charCode ;
 
@@ -673,7 +672,6 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
                 GetEventParameter( rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode );
                 GetEventParameter( rawEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );
                 GetEventParameter( rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );
-                GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );
 
                 UInt32 message = (keyCode << 8) + charCode;
 
@@ -685,8 +683,7 @@ pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , Even
                     WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
                     wxTheApp->MacSetCurrentEvent( event , handler ) ;
 
-                    if ( wxTheApp->MacSendCharEvent(
-                        focus , message , modifiers , when , point.h , point.v , uniChars[pos] ) )
+                    if ( wxTheApp->MacSendCharEvent( focus , message , modifiers , when , uniChars[pos] ) )
                     {
                         result = noErr ;
                     }
@@ -835,7 +832,7 @@ wxWidgetImplType* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer,
 {
     OSStatus err = noErr;
     Rect bounds = wxMacGetBoundsForControl( wxpeer , pos , size ) ;
-    wxMacControl* c = new wxMacControl(wxpeer) ;
+    wxMacControl* c = new wxMacControl(wxpeer, false, true) ;
     UInt32 features = 0
         | kControlSupportsEmbedding
         | kControlSupportsLiveFeedback
@@ -867,8 +864,8 @@ wxMacControl::wxMacControl()
     Init();
 }
 
-wxMacControl::wxMacControl(wxWindowMac* peer , bool isRootControl ) :
-    wxWidgetImpl( peer, isRootControl )
+wxMacControl::wxMacControl(wxWindowMac* peer , bool isRootControl, bool isUserPane ) :
+    wxWidgetImpl( peer, isRootControl, isUserPane )
 {
     Init();
 }
@@ -964,7 +961,17 @@ void wxMacControl::GetContentArea(int &left , int &top , int &width , int &heigh
 
 void wxMacControl::Move(int x, int y, int width, int height)
 {
+    UInt32 attr = 0 ;
+    GetWindowAttributes( GetControlOwner(m_controlRef) , &attr ) ;
+
     HIRect hir = CGRectMake(x,y,width,height);
+    if ( !(attr & kWindowCompositingAttribute) )
+    {
+        HIRect parent;
+        HIViewGetFrame( HIViewGetSuperview(m_controlRef), &parent );
+        hir.origin.x += parent.origin.x;
+        hir.origin.y += parent.origin.y;
+    }
     HIViewSetFrame ( m_controlRef , &hir );
 }
 
@@ -974,6 +981,18 @@ void wxMacControl::GetPosition( int &x, int &y ) const
     GetControlBounds( m_controlRef , &r );
     x = r.left;
     y = r.top;
+
+    UInt32 attr = 0 ;
+    GetWindowAttributes( GetControlOwner(m_controlRef) , &attr ) ;
+
+    if ( !(attr & kWindowCompositingAttribute) )
+    {
+        HIRect parent;
+        HIViewGetFrame( HIViewGetSuperview(m_controlRef), &parent );
+        x -= (int)parent.origin.x;
+        y -= (int)parent.origin.y;
+    }
+
 }
 
 void wxMacControl::GetSize( int &width, int &height ) const
@@ -1318,6 +1337,22 @@ void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
 //    HITextViewSetBackgroundColor( m_textView , color );
 }
 
+bool wxMacControl::SetBackgroundStyle(wxBackgroundStyle style)
+{
+    if ( style != wxBG_STYLE_PAINT )
+    {
+        OSStatus err = HIViewChangeFeatures(m_controlRef , 0 , kHIViewIsOpaque);
+        verify_noerr( err );
+    }
+    else
+    {
+        OSStatus err = HIViewChangeFeatures(m_controlRef , kHIViewIsOpaque , 0);
+        verify_noerr( err );
+    }
+
+    return true ;
+}
+
 void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
 {
     ::SetControl32BitMinimum( m_controlRef , minimum );
@@ -1369,7 +1404,15 @@ void wxMacControl::Enable( bool enable )
 
 void wxMacControl::SetDrawingEnabled( bool enable )
 {
-    HIViewSetDrawingEnabled( m_controlRef , enable );
+    if ( enable )
+    {
+        HIViewSetDrawingEnabled( m_controlRef , true );
+        HIViewSetNeedsDisplay( m_controlRef, true);
+    }
+    else
+    {
+        HIViewSetDrawingEnabled( m_controlRef , false );
+    }
 }
 
 void wxMacControl::GetRectInWindowCoords( Rect *r )
@@ -1515,6 +1558,8 @@ wxWidgetImplType* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now )
     }
 
     // the root control level handler
-    contentview->InstallEventHandler() ;
+    if ( !now->IsNativeWindowWrapper() )
+        contentview->InstallEventHandler() ;
+
     return contentview;
 }