X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/73bdd73aa22ef33f346937d05bfb69bc04a0e430..de923e4f508d751267da1b730e7b8c4fc1f4793c:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 66c28891ca..f5598a3c9f 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -126,7 +126,7 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even { 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 + // get its own kEventTextInputUnicodeForKeyEvent, so we route back the wxControl* control = wxDynamicCast( focus , wxControl ) ; if ( control ) { @@ -176,10 +176,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 : @@ -222,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 ; @@ -268,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 : @@ -341,31 +353,28 @@ 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) ; - - 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 ) + + 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 ) ) { - 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 ; @@ -412,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; @@ -524,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() @@ -564,6 +587,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, long style, const wxString& name ) { + OSStatus err = noErr ; SetName(name); m_windowStyle = style; m_isShown = FALSE; @@ -623,7 +647,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 ; } @@ -637,16 +661,19 @@ 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 ; } @@ -665,16 +692,17 @@ 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 ) ; @@ -708,9 +736,9 @@ void wxTopLevelWindowMac::MacGetPortParams(WXPOINTPTR localOrigin, WXRECTPTR cli *rootwin = this ; } -void wxTopLevelWindowMac::Clear() +void wxTopLevelWindowMac::ClearBackground() { - wxWindow::Clear() ; + wxWindow::ClearBackground() ; } WXWidget wxTopLevelWindowMac::MacGetContainerForEmbedding() @@ -761,7 +789,7 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) DisposeRgn( diffRgn ); if ( visRgn ) DisposeRgn( visRgn ) ; - + EndUpdate( (WindowRef)m_macWindow ) ; SetEmptyRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; m_macNeedsErasing = false ; @@ -921,14 +949,15 @@ void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) { if(s_macDeactivateWindow) { - wxLogDebug("Doing delayed deactivation of %p",s_macDeactivateWindow); + wxLogDebug(wxT("Doing delayed deactivation of %p"),s_macDeactivateWindow); s_macDeactivateWindow->MacActivate(timestamp, false); } } void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { - wxLogDebug("TopLevel=%p::MacActivate",this); + // wxLogDebug(wxT("TopLevel=%p::MacActivate"),this); + if(s_macDeactivateWindow==this) s_macDeactivateWindow=NULL; MacDelayedDeactivation(timestamp);