X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6aab345b9d9037eb85735e446afde2fd87005be5..7368be43c35fbdfc5cecb190a5d299f173866b37:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 4fd7b3e40b..114194804f 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -35,6 +35,7 @@ #include "wx/string.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/settings.h" #endif //WX_PRECOMP #include "wx/mac/uma.h" @@ -156,7 +157,12 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event { OSStatus result = eventNotHandledErr ; + wxTopLevelWindow* tlw = (wxTopLevelWindow*) data ; + wxWindow* focus = wxWindow::FindFocus() ; + if ( focus == NULL ) + return result ; + char charCode ; UInt32 keyCode ; UInt32 modifiers ; @@ -293,7 +299,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent ) 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 ) ; } @@ -406,7 +412,10 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev { 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) ; - 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 : @@ -527,7 +535,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand 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 : @@ -576,27 +584,30 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand { UInt32 attributes = cEvent.GetParameter(kEventParamAttributes,typeUInt32) ; Rect newRect = cEvent.GetParameter(kEventParamCurrentBounds) ; - wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ; 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) ) - { adjustR = wxevent.GetRect() ; - } + 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() ) ; - if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetWidth() < toplevelWindow->GetMinHeight() ) + if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetHeight() < 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 ) ; } @@ -714,6 +725,8 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent, // init our fields Init(); + style = style & ~wxFRAME_SHAPED ; + m_windowStyle = style; SetName(name); @@ -722,6 +735,8 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent, MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); + wxTopLevelWindows.Append(this); if ( parent ) @@ -961,11 +976,13 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, { ::CreateRootControl( (WindowRef)m_macWindow , (ControlRef*)&m_macControl ) ; } + // the root control level handleer MacInstallEventHandler() ; + // the frame window event handler InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; MacInstallTopLevelWindowEventHandler() ; - + m_macFocus = NULL ; if ( HasFlag(wxFRAME_SHAPED) ) @@ -1013,6 +1030,7 @@ void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) if(s_macDeactivateWindow==this) s_macDeactivateWindow=NULL; MacDelayedDeactivation(timestamp); + MacPropagateHiliteChanged() ; } void wxTopLevelWindowMac::SetTitle(const wxString& title) @@ -1065,6 +1083,19 @@ bool wxTopLevelWindowMac::Show(bool show) // 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 } ; @@ -1211,8 +1242,9 @@ static void wxShapedMacWindowContentRegion(WindowRef window, RgnHandle rgn) 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 ) ; } }