X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1ea39a039924df94abcd7f9ce1c4c51abda09080..fe779e404706294a48d88964ecbff29e3664e485:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 1e188494c5..f5598a3c9f 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -176,15 +176,17 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event { case kEventRawKeyRepeat : case kEventRawKeyDown : - 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 ; + 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 ) ; } - wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ; break ; case kEventRawKeyUp : if ( (focus != NULL) && wxTheApp->MacSendKeyUpEvent( @@ -226,6 +228,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 ; @@ -272,7 +280,7 @@ 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 : @@ -346,30 +354,27 @@ static pascal OSStatus WindowEventHandler( EventHandlerCallRef handler , EventRe GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof( newContentRect ), NULL, &newContentRect ); - wxRect contentRect(newContentRect.left , newContentRect.top , - newContentRect.right - newContentRect.left , - newContentRect.bottom - newContentRect.top) ; + wxSize formerSize = toplevelWindow->GetSize() ; - bool handled = false ; - if ((attributes & kWindowBoundsChangeSizeChanged) != 0) - { - wxSizeEvent event(contentRect , toplevelWindow->GetId()); - event.SetEventObject(toplevelWindow); - handled = toplevelWindow->GetEventHandler()->ProcessEvent(event); - contentRect = event.GetRect() ; - } - else if ( attributes & kWindowBoundsChangeOriginChanged != 0) - { - wxMoveEvent event(contentRect , toplevelWindow->GetId()); - event.SetEventObject(toplevelWindow); - handled = toplevelWindow->GetEventHandler()->ProcessEvent(event); - contentRect = event.GetRect() ; - } - if ( handled ) + 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 ) ) { - SetRect( &newContentRect , contentRect.GetLeft() , contentRect.GetTop() , contentRect.GetRight() , contentRect.GetBottom() ) ; - SetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, sizeof( newContentRect ), &newContentRect ); + SetEventParameter( event , kEventParamCurrentBounds , typeQDRectangle, sizeof( adjustedRect ) , &adjustedRect ) ; } + + if ( toplevelWindow->GetSize() != formerSize ) + toplevelWindow->Update() ; + result = noErr ; } break ; @@ -416,6 +421,8 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler ) wxList *wxWinMacWindowList = NULL; wxTopLevelWindowMac *wxFindWinFromMacWindow(WXWindow inWindowRef) { + if ( wxWinMacWindowList == NULL ) + return NULL ; wxNode *node = wxWinMacWindowList->Find((long)inWindowRef); if (!node) return NULL; @@ -528,23 +535,35 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() void wxTopLevelWindowMac::Maximize(bool maximize) { - // not available on mac + 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() @@ -937,7 +956,8 @@ void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { - wxLogDebug(wxT("TopLevel=%p::MacActivate"),this); + // wxLogDebug(wxT("TopLevel=%p::MacActivate"),this); + if(s_macDeactivateWindow==this) s_macDeactivateWindow=NULL; MacDelayedDeactivation(timestamp);