]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
MPThread implementation by AJ Lavin
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index a96a6631f0a400e7450f27c76b74c0f5c03871b2..114194804f80241edefd411548de5ea48d31b300 100644 (file)
@@ -35,6 +35,7 @@
     #include "wx/string.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/string.h"
     #include "wx/log.h"
     #include "wx/intl.h"
+    #include "wx/settings.h"
 #endif //WX_PRECOMP
 
 #include "wx/mac/uma.h"
 #endif //WX_PRECOMP
 
 #include "wx/mac/uma.h"
@@ -156,7 +157,12 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
 {
     OSStatus result = eventNotHandledErr ;
 
 {
     OSStatus result = eventNotHandledErr ;
 
+    wxTopLevelWindow* tlw = (wxTopLevelWindow*) data ;
+
     wxWindow* focus = wxWindow::FindFocus() ;
     wxWindow* focus = wxWindow::FindFocus() ;
+    if ( focus == NULL )
+        return result ;
+        
     char charCode ;
     UInt32 keyCode ;
     UInt32 modifiers ;
     char charCode ;
     UInt32 keyCode ;
     UInt32 modifiers ;
@@ -293,7 +299,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     if ( button == kEventMouseButtonSecondary )
     {
         if (cEvent.GetKind() == kEventMouseDown )
     if ( button == kEventMouseButtonSecondary )
     {
         if (cEvent.GetKind() == kEventMouseDown )
-            wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DOWN : wxEVT_RIGHT_DCLICK ) ;
+            wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN ) ;
         else if ( cEvent.GetKind() == kEventMouseUp )
             wxevent.SetEventType(wxEVT_RIGHT_UP ) ;
     }
         else if ( cEvent.GetKind() == kEventMouseUp )
             wxevent.SetEventType(wxEVT_RIGHT_UP ) ;
     }
@@ -406,7 +412,10 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
         {
             ControlPartCode part ;
             ControlRef control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ;
         {
             ControlPartCode part ;
             ControlRef control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ;
-            currentMouseWindow = wxFindControlFromMacControl( control ) ;
+            if ( control == 0 )
+                currentMouseWindow = (wxWindow*) data ;
+            else
+                currentMouseWindow = wxFindControlFromMacControl( control ) ;
         }        
     }
 
         }        
     }
 
@@ -512,12 +521,11 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
         case kEventWindowActivated :
         {
             toplevelWindow->MacActivate( cEvent.GetTicks() , true) ;
         case kEventWindowActivated :
         {
             toplevelWindow->MacActivate( cEvent.GetTicks() , true) ;
-
             wxActivateEvent wxevent(wxEVT_ACTIVATE, true , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
             wxActivateEvent wxevent(wxEVT_ACTIVATE, true , toplevelWindow->GetId());
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
-            result = noErr ;
+            // we still sending an eventNotHandledErr in order to allow for default processing
             break ;
         }
         case kEventWindowDeactivated :
             break ;
         }
         case kEventWindowDeactivated :
@@ -527,7 +535,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
             wxevent.SetTimestamp( cEvent.GetTicks() ) ;
             wxevent.SetEventObject(toplevelWindow);
             toplevelWindow->GetEventHandler()->ProcessEvent(wxevent);
-            result = noErr ;
+            // we still sending an eventNotHandledErr in order to allow for default processing
             break ;
         }
        case kEventWindowShown :
             break ;
         }
        case kEventWindowShown :
@@ -576,27 +584,30 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
         {
             UInt32 attributes = cEvent.GetParameter<UInt32>(kEventParamAttributes,typeUInt32) ;
             Rect newRect = cEvent.GetParameter<Rect>(kEventParamCurrentBounds) ;
         {
             UInt32 attributes = cEvent.GetParameter<UInt32>(kEventParamAttributes,typeUInt32) ;
             Rect newRect = cEvent.GetParameter<Rect>(kEventParamCurrentBounds) ;
-            wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
 
             if ( (attributes & kWindowBoundsChangeSizeChanged) || (attributes & kWindowBoundsChangeOriginChanged) )
             {
 
             if ( (attributes & kWindowBoundsChangeSizeChanged) || (attributes & kWindowBoundsChangeOriginChanged) )
             {
+                // all (Mac) rects are in content area coordinates, all wxRects in structure coordinates
+                int left , top , right , bottom ;
+                toplevelWindow->MacGetContentAreaInset( left , top , right , bottom ) ;
+                wxRect r( newRect.left - left  , newRect.top  - top  , 
+                    newRect.right - newRect.left + left + right  , newRect.bottom - newRect.top + top + bottom ) ;
                 // this is a EVT_SIZING not a EVT_SIZE type !
                 wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
                 wxevent.SetEventObject( toplevelWindow ) ;
                 wxRect adjustR = r ;
                 if ( toplevelWindow->GetEventHandler()->ProcessEvent(wxevent) )
                 // this is a EVT_SIZING not a EVT_SIZE type !
                 wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
                 wxevent.SetEventObject( toplevelWindow ) ;
                 wxRect adjustR = r ;
                 if ( toplevelWindow->GetEventHandler()->ProcessEvent(wxevent) )
-                {
                     adjustR = wxevent.GetRect() ;
                     adjustR = wxevent.GetRect() ;
-                }
+
                 if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
                     adjustR.SetWidth( toplevelWindow->GetMaxWidth() ) ;
                 if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
                     adjustR.SetWidth( toplevelWindow->GetMaxWidth() ) ;
-                if ( toplevelWindow->GetMaxHeight() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxHeight() )
+                if ( toplevelWindow->GetMaxHeight() != -1 && adjustR.GetHeight() > toplevelWindow->GetMaxHeight() )
                     adjustR.SetHeight( toplevelWindow->GetMaxHeight() ) ;
                 if ( toplevelWindow->GetMinWidth() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinWidth() )
                     adjustR.SetWidth( toplevelWindow->GetMinWidth() ) ;
                     adjustR.SetHeight( toplevelWindow->GetMaxHeight() ) ;
                 if ( toplevelWindow->GetMinWidth() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinWidth() )
                     adjustR.SetWidth( toplevelWindow->GetMinWidth() ) ;
-                if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinHeight() )
+                if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetHeight() < toplevelWindow->GetMinHeight() )
                     adjustR.SetHeight( toplevelWindow->GetMinHeight() ) ;
                     adjustR.SetHeight( toplevelWindow->GetMinHeight() ) ;
-                Rect adjustedRect = { adjustR.y , adjustR.x , adjustR.y + adjustR.height , adjustR.x + adjustR.width } ;
+                Rect adjustedRect = { adjustR.y + top  , adjustR.x + left , adjustR.y + adjustR.height - bottom , adjustR.x + adjustR.width - right } ;
                 if ( !EqualRect( &newRect , &adjustedRect ) )
                     cEvent.SetParameter( kEventParamCurrentBounds , &adjustedRect ) ;
             }
                 if ( !EqualRect( &newRect , &adjustedRect ) )
                     cEvent.SetParameter( kEventParamCurrentBounds , &adjustedRect ) ;
             }
@@ -714,6 +725,8 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
     // init our fields
     Init();
 
     // init our fields
     Init();
 
+    style = style & ~wxFRAME_SHAPED ;
+
     m_windowStyle = style;
 
     SetName(name);
     m_windowStyle = style;
 
     SetName(name);
@@ -722,6 +735,8 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
 
     MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
 
 
     MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ;
 
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+
     wxTopLevelWindows.Append(this);
 
     if ( parent )
     wxTopLevelWindows.Append(this);
 
     if ( parent )
@@ -961,11 +976,13 @@ void  wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
     {
         ::CreateRootControl( (WindowRef)m_macWindow , (ControlRef*)&m_macControl ) ;
     }
     {
         ::CreateRootControl( (WindowRef)m_macWindow , (ControlRef*)&m_macControl ) ;
     }
+    // the root control level handleer
     MacInstallEventHandler() ;
 
     MacInstallEventHandler() ;
 
+    // the frame window event handler
     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
     MacInstallTopLevelWindowEventHandler() ;
     InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ;
     MacInstallTopLevelWindowEventHandler() ;
-    
+
     m_macFocus = NULL ;
 
     if ( HasFlag(wxFRAME_SHAPED) )
     m_macFocus = NULL ;
 
     if ( HasFlag(wxFRAME_SHAPED) )
@@ -1066,6 +1083,19 @@ bool wxTopLevelWindowMac::Show(bool show)
 
 // we are still using coordinates of the content view, todo switch to structure bounds
 
 
 // we are still using coordinates of the content view, todo switch to structure bounds
 
+void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
+{
+    Rect content ;
+    Rect structure ;
+    GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
+    GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
+
+    left = content.left - structure.left ;
+    top = content.top  - structure.top ;
+    right = structure.right - content.right ;
+    bottom = structure.bottom - content.bottom ;
+}
+
 void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
 {
     Rect bounds = { y , x , y + height , x + width } ;
 void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
 {
     Rect bounds = { y , x , y + height , x + width } ;
@@ -1212,8 +1242,9 @@ static void wxShapedMacWindowContentRegion(WindowRef window, RgnHandle rgn)
     wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);
     if (win)
     {
     wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);
     if (win)
     {
-        wxRect r = win->GetRect();
-        SetRectRgn(rgn, r.GetLeft(), r.GetTop(), r.GetRight(), r.GetBottom());
+        Rect r ;
+        wxShapedMacWindowGetPos(window, &r ) ;
+        RectRgn( rgn , &r ) ;
     }
 }
 
     }
 }