X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5706de1cf469f1ca53be7c402365d47e12a616cf..8e54aaedb5329a49ffd9c5d50071f9c8cdd5c59e:/src/mac/toplevel.cpp diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index 34db5c2604..70d0f1e348 100644 --- a/src/mac/toplevel.cpp +++ b/src/mac/toplevel.cpp @@ -42,6 +42,9 @@ #include "wx/app.h" #include "wx/tooltip.h" #include "wx/dnd.h" +#if wxUSE_SYSTEM_OPTIONS + #include "wx/sysopt.h" +#endif #include "ToolUtils.h" @@ -97,6 +100,7 @@ static const EventTypeSpec eventList[] = { kEventClassMouse , kEventMouseDown } , { kEventClassMouse , kEventMouseUp } , + { kEventClassMouse , kEventMouseWheelMoved } , { kEventClassMouse , kEventMouseMoved } , { kEventClassMouse , kEventMouseDragged } , @@ -111,7 +115,6 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even UInt32 keyCode ; UInt32 modifiers ; Point point ; - UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; EventRef rawEvent ; @@ -123,16 +126,32 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even GetEventParameter( rawEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof( Point ), NULL, &point ); - UInt32 message = (keyCode << 8) + charCode; - switch ( GetEventKind( event ) ) { case kEventTextInputUnicodeForKeyEvent : + // this is only called when no default handler has jumped in, eg a wxControl on a floater window does not + // get its own kEventTextInputUnicodeForKeyEvent, so we route back the + wxControl* control = wxDynamicCast( focus , wxControl ) ; + if ( control ) + { + ControlHandle macControl = (ControlHandle) control->GetMacControl() ; + if ( macControl ) + { + ::HandleControlKey( macControl , keyCode , charCode , modifiers ) ; + result = noErr ; + } + } + /* + // this may lead to double events sent to a window in case all handlers have skipped the key down event + UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; + UInt32 message = (keyCode << 8) + charCode; + if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent( focus , message , modifiers , when , point.h , point.v ) ) { result = noErr ; } + */ break ; } @@ -161,10 +180,16 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event { case kEventRawKeyRepeat : case kEventRawKeyDown : - if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent( - focus , message , modifiers , when , point.h , point.v ) ) { - result = noErr ; + WXEVENTREF formerEvent = wxTheApp->MacGetCurrentEvent() ; + WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ; + wxTheApp->MacSetCurrentEvent( event , handler ) ; + if ( (focus != NULL) && wxTheApp->MacSendKeyDownEvent( + focus , message , modifiers , when , point.h , point.v ) ) + { + result = noErr ; + } + wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ; } break ; case kEventRawKeyUp : @@ -207,6 +232,12 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event event.SetEventType( ( modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } + if ( focus && (modifiers ^ wxTheApp->s_lastModifiers ) & cmdKey ) + { + event.m_keyCode = WXK_COMMAND ; + event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; + focus->GetEventHandler()->ProcessEvent( event ) ; + } wxTheApp->s_lastModifiers = modifiers ; } break ; @@ -215,7 +246,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event return result ; } -static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { OSStatus result = eventNotHandledErr ; @@ -237,10 +268,18 @@ static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef if ( button == 0 || GetEventKind( event ) == kEventMouseUp ) modifiers += btnState ; + // temporary hack to support true two button mouse + if ( button == kEventMouseButtonSecondary ) + { + modifiers |= controlKey ; + } WindowRef window ; short windowPart = ::FindWindow(point, &window); - if ( IsWindowActive(window) && windowPart == inContent ) + // either we really are active or we are capturing mouse events + + if ( (IsWindowActive(window) && windowPart == inContent) || + (wxTheApp->s_captureWindow && wxTheApp->s_captureWindow->MacGetTopLevelWindow() == toplevelWindow) ) { switch ( GetEventKind( event ) ) { @@ -253,13 +292,46 @@ static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef result = noErr ; break ; case kEventMouseMoved : - toplevelWindow->MacFireMouseEvent( nullEvent , point.h , point.v , modifiers , EventTimeToTicks( GetEventTime( event ) ) ) ; + wxTheApp->MacHandleMouseMovedEvent( point.h , point.v , modifiers , EventTimeToTicks( GetEventTime( event ) ) ) ; result = noErr ; break ; case kEventMouseDragged : toplevelWindow->MacFireMouseEvent( nullEvent , point.h , point.v , modifiers , EventTimeToTicks( GetEventTime( event ) ) ) ; result = noErr ; break ; + case kEventMouseWheelMoved : + { + //bClearTooltip = false; + EventMouseWheelAxis axis = kEventMouseWheelAxisY; + SInt32 delta = 0; + Point mouseLoc = {0, 0}; + if (::GetEventParameter(event, kEventParamMouseWheelAxis, typeMouseWheelAxis, + NULL, sizeof(EventMouseWheelAxis), NULL, &axis) == noErr && + ::GetEventParameter(event, kEventParamMouseWheelDelta, typeLongInteger, + NULL, sizeof(SInt32), NULL, &delta) == noErr && + ::GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, + NULL, sizeof(Point), NULL, &mouseLoc) == noErr) + { + wxMouseEvent wheelEvent(wxEVT_MOUSEWHEEL); + + wheelEvent.m_x = mouseLoc.h; + wheelEvent.m_y = mouseLoc.v; + + wheelEvent.m_wheelRotation = delta; + wheelEvent.m_wheelDelta = 1; + wheelEvent.m_linesPerAction = 1; + + wxWindow* currentMouseWindow = NULL; + wxWindow::MacGetWindowFromPoint(wxPoint(mouseLoc.h, mouseLoc.v), ¤tMouseWindow); + + if (currentMouseWindow) + { + currentMouseWindow->GetEventHandler()->ProcessEvent(wheelEvent); + result = noErr; + } + } + } + break ; default : break ; } @@ -317,6 +389,40 @@ static pascal OSStatus WindowEventHandler( EventHandlerCallRef handler , EventRe result = noErr; } break ; + case kEventWindowBoundsChanging : + err = GetEventParameter( event, kEventParamAttributes, typeUInt32, + NULL, sizeof( UInt32 ), NULL, &attributes ); + if ( err == noErr ) + { + Rect newContentRect ; + + GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL, + sizeof( newContentRect ), NULL, &newContentRect ); + + wxSize formerSize = toplevelWindow->GetSize() ; + + if ( (attributes & kWindowBoundsChangeSizeChanged ) || + ( attributes & kWindowBoundsChangeOriginChanged ) ) + toplevelWindow->SetSize( newContentRect.left , newContentRect.top , + newContentRect.right - newContentRect.left , + newContentRect.bottom - newContentRect.top, wxSIZE_USE_EXISTING); + + int x , y , w , h ; + toplevelWindow->GetPosition( &x , &y ) ; + toplevelWindow->GetSize( &w , &h ) ; + Rect adjustedRect = { y , x , y + h , x + w } ; + + if ( !EqualRect( &newContentRect , &adjustedRect ) ) + { + SetEventParameter( event , kEventParamCurrentBounds , typeQDRectangle, sizeof( adjustedRect ) , &adjustedRect ) ; + } + + if ( toplevelWindow->GetSize() != formerSize ) + toplevelWindow->Update() ; + + result = noErr ; + } + break ; default : break ; } @@ -349,64 +455,6 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler ) -// Patch 531199 defined a window event handler, as follows. -// TODO: merge the moving/sizing event handling with the event -// handler above. -#if 0 -static pascal OSStatus -WindowHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData ) -{ - Rect bounds; - SInt16 height, width; - UInt32 attributes; - OSStatus result = eventNotHandledErr; - - GetEventParameter( inEvent, kEventParamAttributes, typeUInt32, NULL, sizeof( UInt32 ), NULL, &attributes ); - - if ((attributes & (kWindowBoundsChangeSizeChanged | kWindowBoundsChangeOriginChanged)) != 0) - { - // Extract the current bounds. This is the paramter you get to modify to - // alter the window position or size during a window resizing. - GetEventParameter( inEvent, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof( bounds ), NULL, &bounds ); - - wxRect rect; - rect.SetLeft(bounds.left); - rect.SetTop(bounds.top); - rect.SetRight(bounds.right); - rect.SetBottom(bounds.bottom); - - bool rc; - wxWindowMac *pWindow = (wxWindowMac*)userData; - if ((attributes & kWindowBoundsChangeSizeChanged) != 0) { - wxSizeEvent event(rect, pWindow->GetId()); - event.SetEventObject(pWindow); - rc = pWindow->GetEventHandler()->ProcessEvent(event); - rect = event.GetRect(); - } - else { - wxMoveEvent event(rect, pWindow->GetId()); - event.SetEventObject(pWindow); - rc = pWindow->GetEventHandler()->ProcessEvent(event); - rect = event.GetRect(); - } - - if (rc) { - bounds.left = rect.GetLeft(); - bounds.top = rect.GetTop(); - bounds.right = rect.GetRight(); - bounds.bottom = rect.GetBottom(); - } - - // Set the current bounds parameter to our adjusted bounds. Return - // noErr to indicate we handled this event. - SetEventParameter( inEvent, kEventParamCurrentBounds, typeQDRectangle, sizeof( bounds ), &bounds ); - result = noErr; - } - return result; -} -#endif - // WindowHandler - #endif // --------------------------------------------------------------------------- @@ -418,6 +466,8 @@ WindowHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData ) wxList *wxWinMacWindowList = NULL; wxTopLevelWindowMac *wxFindWinFromMacWindow(WXWindow inWindowRef) { + if ( wxWinMacWindowList == NULL ) + return NULL ; wxNode *node = wxWinMacWindowList->Find((long)inWindowRef); if (!node) return NULL; @@ -445,6 +495,8 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) // ---------------------------------------------------------------------------- WXHWND wxTopLevelWindowMac::s_macWindowInUpdate = NULL; +wxTopLevelWindowMac *wxTopLevelWindowMac::s_macDeactivateWindow = NULL; +bool wxTopLevelWindowMac::s_macWindowCompositing = FALSE; void wxTopLevelWindowMac::Init() { @@ -453,6 +505,7 @@ void wxTopLevelWindowMac::Init() m_macNoEraseUpdateRgn = NewRgn() ; m_macNeedsErasing = false ; m_macWindow = NULL ; + m_macUsesCompositing = FALSE ; #if TARGET_CARBON m_macEventHandler = NULL ; #endif @@ -529,23 +582,37 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() void wxTopLevelWindowMac::Maximize(bool maximize) { - // not available on mac + wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ; + wxMacWindowClipper clip (this); + ZoomWindow( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , false ) ; + + Rect tempRect ; + GrafPtr port ; + GetPort( &port ) ; + Point pt = { 0, 0 } ; + SetPortWindowPort((WindowRef)m_macWindow) ; + LocalToGlobal( &pt ) ; + SetPort( port ) ; + + GetWindowPortBounds((WindowRef)m_macWindow, &tempRect ) ; + SetSize( pt.h , pt.v , tempRect.right-tempRect.left , + tempRect.bottom-tempRect.top, wxSIZE_USE_EXISTING); } bool wxTopLevelWindowMac::IsMaximized() const { - return false ; + return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ; } void wxTopLevelWindowMac::Iconize(bool iconize) { - // not available on mac + if ( IsWindowCollapsable((WindowRef)m_macWindow) ) + CollapseWindow((WindowRef)m_macWindow , iconize ) ; } bool wxTopLevelWindowMac::IsIconized() const { - // mac dialogs cannot be iconized - return FALSE; + return IsWindowCollapsed((WindowRef)m_macWindow ) ; } void wxTopLevelWindowMac::Restore() @@ -569,6 +636,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, long style, const wxString& name ) { + OSStatus err = noErr ; SetName(name); m_windowStyle = style; m_isShown = FALSE; @@ -628,7 +696,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, else { if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) || - HasFlag( wxSYSTEM_MENU ) ) + HasFlag( wxCLOSE_BOX ) || HasFlag( wxSYSTEM_MENU ) ) { wclass = kDocumentWindowClass ; } @@ -642,20 +710,25 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, } } - if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ) + if ( HasFlag( wxMINIMIZE_BOX ) ) { - attr |= kWindowFullZoomAttribute ; attr |= kWindowCollapseBoxAttribute ; } + if ( HasFlag( wxMAXIMIZE_BOX ) ) + { + attr |= kWindowFullZoomAttribute ; + } if ( HasFlag( wxRESIZE_BORDER ) ) { attr |= kWindowResizableAttribute ; } - if ( HasFlag( wxSYSTEM_MENU ) ) + if ( HasFlag( wxCLOSE_BOX) ) { attr |= kWindowCloseBoxAttribute ; } + attr |= kWindowLiveResizeAttribute; //turn on live resizing + #if TARGET_CARBON #if 0 // having problems right now with that if (HasFlag(wxSTAY_ON_TOP)) @@ -663,6 +736,19 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, #endif #endif + //this setup lets us have compositing and non-compositing + //windows in the same application. + + if ( wxTopLevelWindowMac::s_macWindowCompositing ) + { + attr |= kWindowCompositingAttribute; + m_macUsesCompositing = TRUE; + } + else + { + m_macUsesCompositing = FALSE; + } + #if TARGET_CARBON if ( HasFlag(wxFRAME_SHAPED) ) { @@ -670,34 +756,31 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, customWindowDefSpec.defType = kWindowDefProcPtr; customWindowDefSpec.u.defProc = NewWindowDefUPP(wxShapedMacWindowDef); - ::CreateCustomWindow( &customWindowDefSpec, wclass, + err = ::CreateCustomWindow( &customWindowDefSpec, wclass, attr, &theBoundsRect, (WindowRef*) &m_macWindow); } else #endif { - ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ; + err = ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ; } + wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") ); wxAssociateWinWithMacWindow( m_macWindow , this ) ; UMASetWTitle( (WindowRef)m_macWindow , title ) ; - ::CreateRootControl( (WindowRef)m_macWindow , (ControlHandle*)&m_macRootControl ) ; + if ( wxTopLevelWindowMac::s_macWindowCompositing ) + { + ::GetRootControl( (WindowRef)m_macWindow, (ControlHandle*)&m_macRootControl ) ; + } + else + { + ::CreateRootControl( (WindowRef)m_macWindow , (ControlHandle*)&m_macRootControl ) ; + } #if TARGET_CARBON InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; InstallWindowEventHandler(MAC_WXHWND(m_macWindow), GetwxMacWindowEventHandlerUPP(), - GetEventTypeCount(eventList), eventList, this, &((EventHandlerRef)m_macEventHandler)); - - // Patch 531199 also defined a window event handler, as follows: -#if 0 - // install a window event handler to send wxEVT_MOVING and wxEVT_SIZING events - EventTypeSpec events[] = { { kEventClassWindow, kEventWindowBoundsChanging } }; - EventHandlerUPP handlerProc = NewEventHandlerUPP( WindowHandler ); - EventHandlerRef eventHandlerRef; - InstallWindowEventHandler( m_macWindowData->m_macWindow, handlerProc, GetEventTypeCount(events), - events, (void*)this, &eventHandlerRef); -#endif - + GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler); #endif m_macFocus = NULL ; @@ -710,6 +793,16 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, SetShape(rgn); } #endif + + wxWindowCreateEvent event(this); + GetEventHandler()->ProcessEvent(event); +} + +bool wxTopLevelWindowMac::MacEnableCompositing( bool useCompositing ) +{ + bool oldval = s_macWindowCompositing; + s_macWindowCompositing = useCompositing; + return oldval; } void wxTopLevelWindowMac::MacGetPortParams(WXPOINTPTR localOrigin, WXRECTPTR clipRect, WXHWND *window , wxWindowMac** rootwin) @@ -724,9 +817,9 @@ void wxTopLevelWindowMac::MacGetPortParams(WXPOINTPTR localOrigin, WXRECTPTR cli *rootwin = this ; } -void wxTopLevelWindowMac::Clear() +void wxTopLevelWindowMac::ClearBackground() { - wxWindow::Clear() ; + wxWindow::ClearBackground() ; } WXWidget wxTopLevelWindowMac::MacGetContainerForEmbedding() @@ -777,7 +870,7 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) DisposeRgn( diffRgn ); if ( visRgn ) DisposeRgn( visRgn ) ; - + EndUpdate( (WindowRef)m_macWindow ) ; SetEmptyRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; m_macNeedsErasing = false ; @@ -844,7 +937,7 @@ void wxTopLevelWindowMac::MacFireMouseEvent( if ( kind == mouseDown ) { - if ( timestamp - gs_lastWhen <= GetDblTime() ) + if ( timestamp - gs_lastWhen <= (long) GetDblTime() ) { if ( abs( localwhere.h - gs_lastWhere.h ) < 3 && abs( localwhere.v - gs_lastWhere.v ) < 3 ) { @@ -933,8 +1026,22 @@ void wxTopLevelWindowMac::MacMouseMoved( WXEVENTREF ev , short part) #endif +void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) +{ + if(s_macDeactivateWindow) + { + wxLogDebug(wxT("Doing delayed deactivation of %p"),s_macDeactivateWindow); + s_macDeactivateWindow->MacActivate(timestamp, false); + } +} + void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { + // wxLogDebug(wxT("TopLevel=%p::MacActivate"),this); + + if(s_macDeactivateWindow==this) + s_macDeactivateWindow=NULL; + MacDelayedDeactivation(timestamp); wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId); event.m_timeStamp = timestamp ; event.SetEventObject(this); @@ -979,18 +1086,36 @@ bool wxTopLevelWindowMac::Show(bool show) if (show) { - ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowShowTransitionAction,nil); - ::SelectWindow( (WindowRef)m_macWindow ) ; - // no need to generate events here, they will get them triggered by macos - // actually they should be , but apparently they are not - wxSize size(m_width, m_height); - wxSizeEvent event(size, m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + #if wxUSE_SYSTEM_OPTIONS //code contributed by Ryan Wilcox December 18, 2003 + if ( (wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) ) && ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1) ) + { + ::ShowWindow( (WindowRef)m_macWindow ); + } + else + #endif + { + ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowShowTransitionAction,nil); + } + ::SelectWindow( (WindowRef)m_macWindow ) ; + // no need to generate events here, they will get them triggered by macos + // actually they should be , but apparently they are not + wxSize size(m_width, m_height); + wxSizeEvent event(size, m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); } else { - ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil); + #if wxUSE_SYSTEM_OPTIONS + if ( (wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) ) && ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1) ) + { + ::HideWindow((WindowRef) m_macWindow ); + } + else + #endif + { + ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil); + } } if ( !show ) @@ -1006,6 +1131,9 @@ bool wxTopLevelWindowMac::Show(bool show) void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height) { + wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ; + wxMacWindowClipper clip (this); + int former_x = m_x ; int former_y = m_y ; int former_w = m_width ; @@ -1041,27 +1169,32 @@ void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height) { m_x = actualX ; m_y = actualY ; - m_width = actualWidth ; - m_height = actualHeight ; if ( doMove ) ::MoveWindow((WindowRef)m_macWindow, m_x, m_y , false); // don't make frontmost + m_width = actualWidth ; + m_height = actualHeight ; + if ( doResize ) ::SizeWindow((WindowRef)m_macWindow, m_width, m_height , true); // the OS takes care of invalidating and erasing the new area so we only have to // take care of refreshing for full repaints - if ( doResize && !HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) ) + if ( doResize && HasFlag(wxFULL_REPAINT_ON_RESIZE) ) Refresh() ; if ( IsKindOf( CLASSINFO( wxFrame ) ) ) { wxFrame* frame = (wxFrame*) this ; +#if wxUSE_STATUSBAR frame->PositionStatusBar(); +#endif +#if wxUSE_TOOLBAR frame->PositionToolBar(); +#endif } if ( doMove ) wxWindowMac::MacTopLevelWindowChangedPosition() ; // like this only children will be notified