X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/902725eefee5a402d21d13b2630583ab28ae3931..5e06d749ed2e8fe82bf058e66695cd4a96e450da:/src/mac/carbon/toplevel.cpp?ds=sidebyside diff --git a/src/mac/carbon/toplevel.cpp b/src/mac/carbon/toplevel.cpp index 5a047b14de..538589ac06 100644 --- a/src/mac/carbon/toplevel.cpp +++ b/src/mac/carbon/toplevel.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: mac/toplevel.cpp +// Name: src/mac/carbon/toplevel.cpp // Purpose: implements wxTopLevelWindow for Mac // Author: Stefan Csomor // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "toplevel.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -49,11 +45,20 @@ #include "wx/sysopt.h" #endif +#ifndef __DARWIN__ #include +#endif //For targeting OSX #include "wx/mac/private.h" +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// trace mask for activation tracing messages +static const wxChar *TRACE_ACTIVATE = _T("activation"); + // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- @@ -188,7 +193,7 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event #if SIZEOF_WCHAR_T == 2 uniChar = charBuf[0] ; #else - wxMBConvUTF16BE converter ; + wxMBConvUTF16 converter ; converter.MB2WC( &uniChar , (const char*)charBuf , 1 ) ; #endif if ( dataSize > 4 ) @@ -389,7 +394,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent ) } } -ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, Point location , ControlRef superControl , ControlPartCode *outPart ) +ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point& location , ControlRef superControl , ControlPartCode *outPart ) { if ( superControl ) { @@ -436,7 +441,7 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, Point locat return NULL ; } -ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , Point location , WindowRef window , ControlPartCode *outPart ) +ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart ) { #if TARGET_API_MAC_OSX if ( UMAGetSystemVersion() >= 0x1030 && ( toplevelWindow == 0 || toplevelWindow->MacUsesCompositing() ) ) @@ -447,6 +452,9 @@ ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , Poi return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ; } + +#define NEW_CAPTURE_HANDLING 1 + pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { wxTopLevelWindowMac* toplevelWindow = (wxTopLevelWindowMac*) data ; @@ -464,11 +472,23 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev wxWindow* currentMouseWindow = NULL ; ControlRef control = NULL ; +#if NEW_CAPTURE_HANDLING + if ( wxApp::s_captureWindow ) + { + window = (WindowRef) wxApp::s_captureWindow->MacGetTopLevelWindowRef() ; + windowPart = inContent ; + } +#endif + if ( window ) { QDGlobalToLocalPoint( UMAGetWindowPort(window ) , &windowMouseLocation ) ; - if ( wxApp::s_captureWindow && wxApp::s_captureWindow->MacGetTopLevelWindowRef() == (WXWindow) window && windowPart == inContent ) + if ( wxApp::s_captureWindow +#if !NEW_CAPTURE_HANDLING + && wxApp::s_captureWindow->MacGetTopLevelWindowRef() == (WXWindow) window && windowPart == inContent +#endif + ) { currentMouseWindow = wxApp::s_captureWindow ; } @@ -511,7 +531,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev eventleave.SetEventType( wxEVT_LEAVE_WINDOW ); g_MacLastWindow->ScreenToClient( &eventleave.m_x, &eventleave.m_y ); eventleave.SetEventObject( g_MacLastWindow ) ; - + wxevent.SetId( g_MacLastWindow->GetId() ) ; #if wxUSE_TOOLTIPS wxToolTip::RelayEvent( g_MacLastWindow , eventleave); #endif // wxUSE_TOOLTIPS @@ -523,6 +543,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev evententer.SetEventType( wxEVT_ENTER_WINDOW ); currentMouseWindow->ScreenToClient( &evententer.m_x, &evententer.m_y ); evententer.SetEventObject( currentMouseWindow ) ; + wxevent.SetId( currentMouseWindow->GetId() ) ; #if wxUSE_TOOLTIPS wxToolTip::RelayEvent( currentMouseWindow , evententer); #endif // wxUSE_TOOLTIPS @@ -547,6 +568,7 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev currentMouseWindow->ScreenToClient( &wxevent.m_x , &wxevent.m_y ) ; wxevent.SetEventObject( currentMouseWindow ) ; + wxevent.SetId( currentMouseWindow->GetId() ) ; // make tooltips current @@ -802,34 +824,6 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacTopLevelEventHandler ) // Find an item given the Macintosh Window Reference -#if KEY_wxList_DEPRECATED -wxList wxWinMacWindowList(wxKEY_INTEGER); -wxTopLevelWindowMac *wxFindWinFromMacWindow(WindowRef inWindowRef) -{ - wxNode *node = wxWinMacWindowList.Find((long)inWindowRef); - if (!node) - return NULL; - return (wxTopLevelWindowMac *)node->GetData(); -} - -void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxTopLevelWindowMac *win) ; -void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxTopLevelWindowMac *win) -{ - // adding NULL WindowRef is (first) surely a result of an error and - // (secondly) breaks menu command processing - wxCHECK_RET( inWindowRef != (WindowRef) NULL, wxT("attempt to add a NULL WindowRef to window list") ); - - if ( !wxWinMacWindowList.Find((long)inWindowRef) ) - wxWinMacWindowList.Append((long)inWindowRef, win); -} - -void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) ; -void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) -{ - wxWinMacWindowList.DeleteObject(win); -} -#else - WX_DECLARE_HASH_MAP(WindowRef, wxTopLevelWindowMac*, wxPointerHash, wxPointerEqual, MacWindowMap); static MacWindowMap wxWinMacWindowList; @@ -864,7 +858,6 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) } } } -#endif // deprecated wxList // ---------------------------------------------------------------------------- // wxTopLevelWindowMac creation @@ -928,7 +921,7 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent, SetName(name); m_windowId = id == -1 ? NewControlId() : id; - wxWindow::SetTitle( title ) ; + wxWindow::SetLabel( title ) ; MacCreateRealWindow( title, pos , size , MacRemoveBordersFromStyle(style) , name ) ; @@ -1215,6 +1208,16 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, // the root control level handleer MacInstallEventHandler( (WXWidget) m_peer->GetControlRef() ) ; +#if TARGET_API_MAC_OSX + if ( m_macUsesCompositing && m_macWindow != NULL ) + { + if ( GetExtraStyle() & wxFRAME_EX_METAL ) + MacSetMetalAppearance( true ) ; + } +#endif + + + // the frame window event handler InstallStandardEventHandler( GetWindowEventTarget(MAC_WXHWND(m_macWindow)) ) ; MacInstallTopLevelWindowEventHandler() ; @@ -1256,14 +1259,16 @@ void wxTopLevelWindowMac::MacDelayedDeactivation(long timestamp) { if(s_macDeactivateWindow) { - wxLogDebug(wxT("Doing delayed deactivation of %p"),s_macDeactivateWindow); + wxLogTrace(TRACE_ACTIVATE, + wxT("Doing delayed deactivation of %p"), + s_macDeactivateWindow); s_macDeactivateWindow->MacActivate(timestamp, false); } } void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) { - // wxLogDebug(wxT("TopLevel=%p::MacActivate"),this); + wxLogTrace(TRACE_ACTIVATE, wxT("TopLevel=%p::MacActivate"), this); if(s_macDeactivateWindow==this) s_macDeactivateWindow=NULL; @@ -1273,10 +1278,15 @@ void wxTopLevelWindowMac::MacActivate( long timestamp , bool inIsActivating ) void wxTopLevelWindowMac::SetTitle(const wxString& title) { - wxWindow::SetTitle( title ) ; + wxWindow::SetLabel( title ) ; UMASetWTitle( (WindowRef)m_macWindow , title , m_font.GetEncoding() ) ; } +wxString wxTopLevelWindowMac::GetTitle() const +{ + return wxWindow::GetLabel(); +} + bool wxTopLevelWindowMac::Show(bool show) { if ( !wxTopLevelWindowBase::Show(show) ) @@ -1385,6 +1395,23 @@ bool wxTopLevelWindowMac::IsFullScreen() const return m_macFullScreenData != NULL ; } +void wxTopLevelWindowMac::SetExtraStyle(long exStyle) +{ + if ( GetExtraStyle() == exStyle ) + return ; + + wxTopLevelWindowBase::SetExtraStyle( exStyle ) ; +#if TARGET_API_MAC_OSX + if ( m_macUsesCompositing && m_macWindow != NULL ) + { + bool metal = GetExtraStyle() & wxFRAME_EX_METAL ; + if ( MacGetMetalAppearance() != metal ) + MacSetMetalAppearance( metal ) ; + } +#endif +} + + // 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 ) @@ -1556,7 +1583,10 @@ bool wxTopLevelWindowMac::SetShape(const wxRegion& region) { wxSize sz = GetClientSize(); wxRegion rgn(0, 0, sz.x, sz.y); - return SetShape(rgn); + if ( rgn.IsEmpty() ) + return false ; + else + return SetShape(rgn); } // Make a copy of the region @@ -1707,4 +1737,3 @@ static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 } // --------------------------------------------------------------------------- -