X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90ff87d7b01e32cbfa856b41e11b646316c2e88a..814af667d9f1e31d9f54759b4e406209b1a3250f:/src/mac/carbon/toplevel.cpp diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 882781e732..597b6caa9a 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -337,7 +337,8 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent ) break ; } break ; - case kEventMouseWheelMoved : + case kEventMouseWheelMoved : + { wxevent.SetEventType(wxEVT_MOUSEWHEEL ) ; // EventMouseWheelAxis axis = cEvent.GetParameter(kEventParamMouseWheelAxis, typeMouseWheelAxis) ; @@ -347,6 +348,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent ) wxevent.m_wheelDelta = 1; wxevent.m_linesPerAction = 1; break ; + } default : wxevent.SetEventType(wxEVT_MOTION ) ; break ; @@ -422,7 +424,8 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev short windowPart = ::FindWindow(screenMouseLocation, &window); wxWindow* currentMouseWindow = NULL ; - + ControlRef control = NULL ; + if ( window ) { QDGlobalToLocalPoint( UMAGetWindowPort(window ) , &windowMouseLocation ) ; @@ -434,14 +437,15 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev else if ( (IsWindowActive(window) && windowPart == inContent) ) { ControlPartCode part ; - ControlRef control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ; + control = wxMacFindControlUnderMouse( windowMouseLocation , window , &part ) ; + // if there is no control below the mouse position, send the event to the toplevel window itself if ( control == 0 ) currentMouseWindow = (wxWindow*) data ; else currentMouseWindow = wxFindControlFromMacControl( control ) ; } } - + wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent( wxevent , cEvent ) ; @@ -547,6 +551,29 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev // update cursor ? } } // else if ( currentMouseWindow ) + else + { + // don't mess with controls we don't know about + // for some reason returning eventNotHandledErr does not lead to the correct behaviour + // so we try sending them the correct control directly + wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ; + if ( cEvent.GetKind() == kEventMouseDown && toplevelWindow && control ) + { + EventModifiers modifiers = cEvent.GetParameter(kEventParamKeyModifiers, typeUInt32) ; + Point clickLocation = windowMouseLocation ; +#if TARGET_API_MAC_OSX + 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 + HandleControlClick( control , clickLocation , + modifiers , (ControlActionUPP ) -1 ) ; + result = noErr ; + } + } return result ; } @@ -729,6 +756,12 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) wxTopLevelWindowMac *wxTopLevelWindowMac::s_macDeactivateWindow = NULL; +typedef struct +{ + wxPoint m_position ; + wxSize m_size ; +} FullScreenData ; + void wxTopLevelWindowMac::Init() { m_iconized = @@ -740,6 +773,7 @@ void wxTopLevelWindowMac::Init() m_macUsesCompositing = FALSE; #endif m_macEventHandler = NULL ; + m_macFullScreenData = NULL ; } class wxMacDeferredWindowDeleter : public wxObject @@ -773,6 +807,7 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent, SetName(name); m_windowId = id == -1 ? NewControlId() : id; + wxWindow::SetTitle( title ) ; MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ; @@ -804,6 +839,10 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() if ( wxModelessWindows.Find(this) ) wxModelessWindows.DeleteObject(this); + + FullScreenData *data = (FullScreenData *) m_macFullScreenData ; + delete data ; + m_macFullScreenData = NULL ; } @@ -1000,17 +1039,17 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, // 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 explicitely HIViewFindByID( HIViewGetRoot( (WindowRef) m_macWindow ) , kHIViewWindowContentID , - *m_peer ) ; + m_peer->GetControlRefAddr() ) ; if ( !m_peer->Ok() ) { // compatibility mode fallback - GetRootControl( (WindowRef) m_macWindow , *m_peer ) ; + GetRootControl( (WindowRef) m_macWindow , m_peer->GetControlRefAddr() ) ; } #else - ::CreateRootControl( (WindowRef)m_macWindow , *m_peer ) ; + ::CreateRootControl( (WindowRef)m_macWindow , m_peer->GetControlRefAddr() ) ; #endif // the root control level handleer - MacInstallEventHandler() ; + MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ; // the frame window event handler InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; @@ -1114,6 +1153,72 @@ bool wxTopLevelWindowMac::Show(bool show) return TRUE ; } +bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style) +{ + if ( show ) + { + FullScreenData *data = (FullScreenData *)m_macFullScreenData ; + delete data ; + data = new FullScreenData() ; + + m_macFullScreenData = data ; + data->m_position = GetPosition() ; + data->m_size = GetSize() ; + + if ( style & wxFULLSCREEN_NOMENUBAR ) + { + HideMenuBar() ; + } + int left , top , right , bottom ; + wxRect client = wxGetClientDisplayRect() ; + + int x, y, w, h ; + + x = client.x ; + y = client.y ; + w = client.width ; + h = client.height ; + + MacGetContentAreaInset( left , top , right , bottom ) ; + + if ( style & wxFULLSCREEN_NOCAPTION ) + { + y -= top ; + h += top ; + } + if ( style & wxFULLSCREEN_NOBORDER ) + { + x -= left ; + w += left + right ; + h += bottom ; + } + if ( style & wxFULLSCREEN_NOTOOLBAR ) + { + // TODO + } + if ( style & wxFULLSCREEN_NOSTATUSBAR ) + { + // TODO + } + SetSize( x , y , w, h ) ; + } + else + { + ShowMenuBar() ; + FullScreenData *data = (FullScreenData *) m_macFullScreenData ; + SetPosition( data->m_position ) ; + SetSize( data->m_size ) ; + delete data ; + m_macFullScreenData = NULL ; + } + return FALSE; +} + +bool wxTopLevelWindowMac::IsFullScreen() const +{ + return m_macFullScreenData != NULL ; +} + // 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 ) @@ -1260,7 +1365,7 @@ static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param) kWindowCanDrawInCurrentPort| //kWindowCanMeasureTitle| kWindowWantsDisposeAtProcessDeath| - kWindowSupportsSetGrowImageRegion| + kWindowSupportsGetGrowImageRegion| kWindowDefSupportsColorGrafPort; return 1; }