X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/45ff80056c6ab939ac05ab5e3f1e9090eb48f5e8..e3b8a866960ec59e5c1dfa927e3e222b73ea8a57:/src/mac/toplevel.cpp diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index 2b1130e4cd..8e4a9551c5 100644 --- a/src/mac/toplevel.cpp +++ b/src/mac/toplevel.cpp @@ -111,7 +111,6 @@ static pascal OSStatus TextInputEventHandler( EventHandlerCallRef handler , Even UInt32 keyCode ; UInt32 modifiers ; Point point ; - UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ; EventRef rawEvent ; @@ -123,16 +122,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 ; } @@ -317,6 +332,43 @@ 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 ); + + 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 ) + { + SetRect( &newContentRect , contentRect.GetLeft() , contentRect.GetTop() , contentRect.GetRight() , contentRect.GetBottom() ) ; + SetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, sizeof( newContentRect ), &newContentRect ); + } + result = noErr ; + } + break ; default : break ; } @@ -387,6 +439,7 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) // ---------------------------------------------------------------------------- WXHWND wxTopLevelWindowMac::s_macWindowInUpdate = NULL; +wxTopLevelWindowMac *wxTopLevelWindowMac::s_macDeactivateWindow = NULL; void wxTopLevelWindowMac::Init() { @@ -511,6 +564,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, long style, const wxString& name ) { + OSStatus err = noErr ; SetName(name); m_windowStyle = style; m_isShown = FALSE; @@ -570,7 +624,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 ; } @@ -584,22 +638,29 @@ 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 ; } +#if TARGET_CARBON +#if 0 // having problems right now with that if (HasFlag(wxSTAY_ON_TOP)) wclass = kUtilityWindowClass; +#endif +#endif #if TARGET_CARBON if ( HasFlag(wxFRAME_SHAPED) ) @@ -608,23 +669,24 @@ 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 TARGET_CARBON InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; InstallWindowEventHandler(MAC_WXHWND(m_macWindow), GetwxMacWindowEventHandlerUPP(), - GetEventTypeCount(eventList), eventList, this, &((EventHandlerRef)m_macEventHandler)); + GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macEventHandler); #endif m_macFocus = NULL ; @@ -666,20 +728,26 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) { wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ; + RgnHandle visRgn = NewRgn() ; + GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), visRgn ); BeginUpdate( (WindowRef)m_macWindow ) ; RgnHandle updateRgn = NewRgn(); RgnHandle diffRgn = NewRgn() ; + if ( updateRgn && diffRgn ) { #if 1 // macos internal control redraws clean up areas we'd like to redraw ourselves // therefore we pick the boundary rect and make sure we can redraw it + // this has to be intersected by the visRgn in order to avoid drawing over its own + // boundaries RgnHandle trueUpdateRgn = NewRgn() ; Rect trueUpdateRgnBoundary ; GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), trueUpdateRgn ); GetRegionBounds( trueUpdateRgn , &trueUpdateRgnBoundary ) ; - RectRgn( (RgnHandle) updateRgn , &trueUpdateRgnBoundary ) ; + RectRgn( updateRgn , &trueUpdateRgnBoundary ) ; + SectRgn( updateRgn , visRgn , updateRgn ) ; if ( trueUpdateRgn ) DisposeRgn( trueUpdateRgn ) ; SetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn ) ; @@ -696,6 +764,9 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) DisposeRgn( updateRgn ); if ( diffRgn ) DisposeRgn( diffRgn ); + if ( visRgn ) + DisposeRgn( visRgn ) ; + EndUpdate( (WindowRef)m_macWindow ) ; SetEmptyRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; m_macNeedsErasing = false ; @@ -762,7 +833,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 ) { @@ -851,8 +922,21 @@ void wxTopLevelWindowMac::MacMouseMoved( WXEVENTREF ev , short part) #endif +void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) +{ + if(s_macDeactivateWindow) + { + wxLogDebug("Doing delayed deactivation of %p",s_macDeactivateWindow); + s_macDeactivateWindow->MacActivate(timestamp, false); + } +} + void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { + wxLogDebug("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); @@ -864,7 +948,7 @@ void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) // Early versions of MacOS X don't refresh backgrounds properly, // so refresh the whole window on activation and deactivation. long osVersion = UMAGetSystemVersion(); - if (osVersion >= 0x1000 && osVersion < 0x1020) + if (osVersion >= 0x1000 && osVersion < 0x1020 ) { Refresh(TRUE); } @@ -897,9 +981,7 @@ bool wxTopLevelWindowMac::Show(bool show) if (show) { - // this is leading to incorrect window layering in some situations - // ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowShowTransitionAction,nil); - ::ShowWindow( (WindowRef)m_macWindow ) ; + ::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 @@ -910,9 +992,7 @@ bool wxTopLevelWindowMac::Show(bool show) } else { - // this is leading to incorrect window layering in some situations - // ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil); - ::HideWindow( (WindowRef)m_macWindow ) ; + ::TransitionWindow((WindowRef)m_macWindow,kWindowZoomTransitionEffect,kWindowHideTransitionAction,nil); } if ( !show ) @@ -1108,14 +1188,13 @@ bool wxTopLevelWindowMac::SetShape(const wxRegion& region) #endif } - - // --------------------------------------------------------------------------- // Support functions for shaped windows, based on Apple's CustomWindow sample at // http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm // --------------------------------------------------------------------------- #if TARGET_CARBON + static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect) { GetWindowPortBounds(window, inRect); @@ -1240,5 +1319,7 @@ static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 return 0; } + #endif // --------------------------------------------------------------------------- +