X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f0756835d540c23e0103aede52b9857933f59837..3ab296d9eb6d351eb1d2238f3e6ff2f5e6123861:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index c4cd59574e..d0251e111e 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -24,9 +24,10 @@ #pragma hdrstop #endif +#include "wx/toplevel.h" + #ifndef WX_PRECOMP #include "wx/app.h" - #include "wx/toplevel.h" #include "wx/frame.h" #include "wx/string.h" #include "wx/log.h" @@ -38,7 +39,6 @@ #include "wx/mac/uma.h" #include "wx/mac/aga.h" -#include "wx/app.h" #include "wx/tooltip.h" #include "wx/dnd.h" @@ -86,12 +86,14 @@ extern long wxMacTranslateKey(unsigned char key, unsigned char code) ; static const EventTypeSpec eventList[] = { // TODO: remove control related event like key and mouse (except for WindowLeave events) -#if 1 + { kEventClassKeyboard, kEventRawKeyDown } , { kEventClassKeyboard, kEventRawKeyRepeat } , { kEventClassKeyboard, kEventRawKeyUp } , { kEventClassKeyboard, kEventRawKeyModifiersChanged } , -#endif + + { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } , + { kEventClassTextInput, kEventTextInputUpdateActiveInputArea } , { kEventClassWindow , kEventWindowShown } , { kEventClassWindow , kEventWindowActivated } , @@ -120,7 +122,10 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event focus = (wxTopLevelWindowMac*) data ; unsigned char charCode ; - wxChar uniChar = 0 ; + wxChar uniChar[2] ; + uniChar[0] = 0; + uniChar[1] = 0; + UInt32 keyCode ; UInt32 modifiers ; Point point ; @@ -131,21 +136,23 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr ) { UniChar buf[2] ; + int numChars = dataSize / sizeof( UniChar) + 1; UniChar* charBuf = buf ; - if ( dataSize > 4 ) - charBuf = new UniChar[ dataSize / sizeof( UniChar) ] ; + if ( numChars * 2 > 4 ) + charBuf = new UniChar[ numChars ] ; GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ; + charBuf[ numChars - 1 ] = 0; #if SIZEOF_WCHAR_T == 2 uniChar = charBuf[0] ; #else wxMBConvUTF16 converter ; - converter.MB2WC( &uniChar , (const char*)charBuf , 1 ) ; + converter.MB2WC( uniChar , (const char*)charBuf , 2 ) ; #endif - if ( dataSize > 4 ) + if ( numChars * 2 > 4 ) delete[] charBuf ; } #endif @@ -165,7 +172,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ; wxTheApp->MacSetCurrentEvent( event , handler ) ; if ( /* focus && */ wxTheApp->MacSendKeyDownEvent( - focus , message , modifiers , when , point.h , point.v , uniChar ) ) + focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) { result = noErr ; } @@ -175,7 +182,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event case kEventRawKeyUp : if ( /* focus && */ wxTheApp->MacSendKeyUpEvent( - focus , message , modifiers , when , point.h , point.v , uniChar ) ) + focus , message , modifiers , when , point.h , point.v , uniChar[0] ) ) { result = noErr ; } @@ -193,7 +200,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event event.m_y = point.v; #if wxUSE_UNICODE - event.m_uniChar = uniChar ; + event.m_uniChar = uniChar[0] ; #endif event.SetTimestamp(when); @@ -402,7 +409,7 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point { Point testLocation = location ; - if ( toplevelWindow && toplevelWindow->MacUsesCompositing() ) + if ( toplevelWindow ) { testLocation.h -= r.left ; testLocation.v -= r.top ; @@ -423,7 +430,7 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart ) { #if TARGET_API_MAC_OSX - if ( UMAGetSystemVersion() >= 0x1030 && ( toplevelWindow == 0 || toplevelWindow->MacUsesCompositing() ) ) + if ( UMAGetSystemVersion() >= 0x1030 ) return FindControlUnderMouse( location , window , outPart ) ; #endif @@ -446,7 +453,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev Point screenMouseLocation = cEvent.GetParameter(kEventParamMouseLocation) ; Point windowMouseLocation = screenMouseLocation ; - WindowRef window ; + WindowRef window = NULL; short windowPart = ::FindWindow(screenMouseLocation, &window); wxWindow* currentMouseWindow = NULL ; @@ -605,8 +612,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev EventModifiers modifiers = cEvent.GetParameter(kEventParamKeyModifiers, typeUInt32) ; Point clickLocation = windowMouseLocation ; - if ( toplevelWindow->MacUsesCompositing() ) - currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ; + currentMouseWindow->MacRootWindowToWindow( &clickLocation.h , &clickLocation.v ) ; HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , clickLocation , modifiers , (ControlActionUPP ) -1 ) ; @@ -651,15 +657,12 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev EventModifiers modifiers = cEvent.GetParameter(kEventParamKeyModifiers, typeUInt32) ; Point clickLocation = windowMouseLocation ; #if TARGET_API_MAC_OSX - if ( toplevelWindow->MacUsesCompositing() ) - { - HIPoint hiPoint ; - hiPoint.x = clickLocation.h ; - hiPoint.y = clickLocation.v ; - HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control ) ; - clickLocation.h = (int)hiPoint.x ; - clickLocation.v = (int)hiPoint.y ; - } + HIPoint hiPoint ; + hiPoint.x = clickLocation.h ; + hiPoint.y = clickLocation.v ; + HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control ) ; + clickLocation.h = (int)hiPoint.x ; + clickLocation.v = (int)hiPoint.y ; #endif // TARGET_API_MAC_OSX HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ; @@ -795,12 +798,19 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand return result ; } +// mix this in from window.cpp +pascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ; + pascal OSStatus wxMacTopLevelEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { OSStatus result = eventNotHandledErr ; switch ( GetEventClass( event ) ) { + case kEventClassTextInput : + result = wxMacUnicodeTextEventHandler( handler, event , data ) ; + break ; + case kEventClassKeyboard : result = KeyboardEventHandler( handler, event , data ) ; break ; @@ -883,12 +893,6 @@ void wxTopLevelWindowMac::Init() m_maximizeOnShow = false; m_macWindow = NULL ; -#if TARGET_API_MAC_OSX - m_macUsesCompositing = ( UMAGetSystemVersion() >= 0x1030 ); -#else - m_macUsesCompositing = false; -#endif - m_macEventHandler = NULL ; m_macFullScreenData = NULL ; } @@ -976,22 +980,15 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() void wxTopLevelWindowMac::Maximize(bool maximize) { - // TODO: check if this is still necessary -#if 0 - wxMacPortStateHelper help( (GrafPtr)GetWindowPort( (WindowRef)m_macWindow) ) ; - wxMacWindowClipper clip( this ); -#endif - - if ( !IsWindowInStandardState( (WindowRef)m_macWindow, NULL, NULL ) ) + Point idealSize = { 0 , 0 } ; + if ( maximize ) { - Rect rect; - - GetWindowBounds((WindowRef)m_macWindow, kWindowGlobalPortRgn, &rect); - SetWindowIdealUserState((WindowRef)m_macWindow, &rect); - SetWindowUserState((WindowRef)m_macWindow, &rect); + Rect rect ; + GetAvailableWindowPositioningBounds(GetMainDevice(),&rect) ; + idealSize.h = rect.right - rect.left ; + idealSize.v = rect.bottom - rect.top ; } - - ZoomWindow( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , false ) ; + ZoomWindowIdeal( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , &idealSize ) ; } bool wxTopLevelWindowMac::IsMaximized() const @@ -1117,8 +1114,6 @@ void wxTopLevelWindowMac::MacCreateRealWindow( else if ( HasFlag( wxFRAME_DRAWER ) ) { wclass = kDrawerWindowClass; - // we must force compositing on a drawer - m_macUsesCompositing = true ; } #endif //10.2 and up else @@ -1156,9 +1151,9 @@ void wxTopLevelWindowMac::MacCreateRealWindow( if ( HasFlag(wxSTAY_ON_TOP) ) group = GetWindowGroupOfClass(kUtilityWindowClass) ; -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - attr |= kWindowCompositingAttribute; + attr |= kWindowCompositingAttribute; +#if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale) + attr |= kWindowFrameworkScaledAttribute; #endif if ( HasFlag(wxFRAME_SHAPED) ) @@ -1189,28 +1184,22 @@ void wxTopLevelWindowMac::MacCreateRealWindow( UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ; m_peer = new wxMacControl(this , true /*isRootControl*/) ; -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - { - // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of - // the content view, so we have to retrieve it explicitly - HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID , - m_peer->GetControlRefAddr() ) ; - if ( !m_peer->Ok() ) - { - // compatibility mode fallback - GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ; - } - } -#endif + // There is a bug in 10.2.X for ::GetRootControl returning the window view instead of + // the content view, so we have to retrieve it explicitly + HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID , + m_peer->GetControlRefAddr() ) ; + if ( !m_peer->Ok() ) { - ::CreateRootControl( (WindowRef)m_macWindow , m_peer->GetControlRefAddr() ) ; + // compatibility mode fallback + GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ; } // the root control level handler MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ; -#if TARGET_API_MAC_OSX + // Causes the inner part of the window not to be metal + // if the style is used before window creation. +#if 0 // TARGET_API_MAC_OSX if ( m_macUsesCompositing && m_macWindow != NULL ) { if ( GetExtraStyle() & wxFRAME_EX_METAL ) @@ -1405,15 +1394,29 @@ bool wxTopLevelWindowMac::IsFullScreen() const return m_macFullScreenData != NULL ; } -void wxTopLevelWindowMac::SetExtraStyle(long exStyle) + +bool wxTopLevelWindowMac::SetTransparent(wxByte alpha) +{ + OSStatus result = SetWindowAlpha((WindowRef)m_macWindow, float(alpha)/255.0); + return result == noErr; +} + + +bool wxTopLevelWindowMac::CanSetTransparent() +{ + return true; +} + + +void wxTopLevelWindowMac::SetExtraStyle(long exStyle) { if ( GetExtraStyle() == exStyle ) return ; - + wxTopLevelWindowBase::SetExtraStyle( exStyle ) ; #if TARGET_API_MAC_OSX - if ( m_macUsesCompositing && m_macWindow != NULL ) + if ( m_macWindow != NULL ) { bool metal = GetExtraStyle() & wxFRAME_EX_METAL ; if ( MacGetMetalAppearance() != metal ) @@ -1422,8 +1425,8 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle) #endif } +// TODO: switch to structure bounds - // 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 ) { @@ -1485,9 +1488,6 @@ void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const void wxTopLevelWindowMac::MacSetMetalAppearance( bool set ) { #if TARGET_API_MAC_OSX - wxASSERT_MSG( m_macUsesCompositing , - wxT("Cannot set metal appearance on a non-compositing window") ) ; - MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes , set ? kWindowNoAttributes : kWindowMetalAttribute ) ; #endif @@ -1517,57 +1517,33 @@ wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const void wxTopLevelWindowMac::MacPerformUpdates() { -#if TARGET_API_MAC_OSX - if ( m_macUsesCompositing ) - { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 - // for composited windows this also triggers a redraw of all - // invalid views in the window - if ( UMAGetSystemVersion() >= 0x1030 ) - HIWindowFlush((WindowRef) m_macWindow) ; - else -#endif - { - // the only way to trigger the redrawing on earlier systems is to call - // ReceiveNextEvent - - EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ; - UInt32 currentEventClass = 0 ; - UInt32 currentEventKind = 0 ; - if ( currentEvent != NULL ) - { - currentEventClass = ::GetEventClass( currentEvent ) ; - currentEventKind = ::GetEventKind( currentEvent ) ; - } - - if ( currentEventClass != kEventClassMenu ) - { - // when tracking a menu, strange redraw errors occur if we flush now, so leave.. - EventRef theEvent; - OSStatus status = noErr ; - status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ; - } - } - } + // for composited windows this also triggers a redraw of all + // invalid views in the window + if ( UMAGetSystemVersion() >= 0x1030 ) + HIWindowFlush((WindowRef) m_macWindow) ; else #endif { - BeginUpdate( (WindowRef) m_macWindow ) ; + // the only way to trigger the redrawing on earlier systems is to call + // ReceiveNextEvent - RgnHandle updateRgn = NewRgn(); - if ( updateRgn ) + EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ; + UInt32 currentEventClass = 0 ; + UInt32 currentEventKind = 0 ; + if ( currentEvent != NULL ) { - GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn ); - UpdateControls( (WindowRef)m_macWindow , updateRgn ) ; - - // if ( !EmptyRgn( updateRgn ) ) - // MacDoRedraw( updateRgn , 0 , true) ; - - DisposeRgn( updateRgn ); + currentEventClass = ::GetEventClass( currentEvent ) ; + currentEventKind = ::GetEventKind( currentEvent ) ; } - EndUpdate( (WindowRef)m_macWindow ) ; - QDFlushPortBuffer( GetWindowPort( (WindowRef)m_macWindow ) , NULL ) ; + if ( currentEventClass != kEventClassMenu ) + { + // when tracking a menu, strange redraw errors occur if we flush now, so leave.. + EventRef theEvent; + OSStatus status = noErr ; + status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ; + } } } @@ -1773,4 +1749,3 @@ static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 return 0; } -