X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7d9d1fd7088fb2d9f27da3d4c232029807c4eeb7..4ac219f63d40983d417cabc09b2ed29c0f87c376:/src/mac/toplevel.cpp?ds=sidebyside diff --git a/src/mac/toplevel.cpp b/src/mac/toplevel.cpp index b952c7cea2..a9acd84e2c 100644 --- a/src/mac/toplevel.cpp +++ b/src/mac/toplevel.cpp @@ -40,6 +40,7 @@ #include "wx/mac/uma.h" #include "wx/mac/aga.h" #include "wx/tooltip.h" +#include "wx/dnd.h" #define wxMAC_DEBUG_REDRAW 0 #ifndef wxMAC_DEBUG_REDRAW @@ -51,7 +52,15 @@ // ---------------------------------------------------------------------------- // list of all frames and modeless dialogs -wxWindowList wxModelessWindows; +wxWindowList wxModelessWindows; + +// double click testing +static Point gs_lastWhere; +static long gs_lastWhen = 0; + +// cursor stuff +extern int wxBusyCursorCount; + // ============================================================================ // wxTopLevelWindowMac implementation @@ -64,7 +73,7 @@ wxWindowList wxModelessWindows; // Find an item given the Macintosh Window Reference wxList *wxWinMacWindowList = NULL; -wxTopLevelWindowMac *wxFindWinFromMacWindow(WindowRef inWindowRef) +wxTopLevelWindowMac *wxFindWinFromMacWindow(WXWindow inWindowRef) { wxNode *node = wxWinMacWindowList->Find((long)inWindowRef); if (!node) @@ -72,7 +81,7 @@ wxTopLevelWindowMac *wxFindWinFromMacWindow(WindowRef inWindowRef) return (wxTopLevelWindowMac *)node->Data(); } -void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxTopLevelWindowMac *win) +void wxAssociateWinWithMacWindow(WXWindow inWindowRef, wxTopLevelWindowMac *win) { // adding NULL WindowRef is (first) surely a result of an error and // (secondly) breaks menu command processing @@ -92,7 +101,7 @@ void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win) // wxTopLevelWindowMac creation // ---------------------------------------------------------------------------- -WindowRef wxTopLevelWindowMac::s_macWindowInUpdate = NULL; +WXHWND wxTopLevelWindowMac::s_macWindowInUpdate = NULL; void wxTopLevelWindowMac::Init() { @@ -100,6 +109,7 @@ void wxTopLevelWindowMac::Init() m_maximizeOnShow = FALSE; m_macNoEraseUpdateRgn = NewRgn() ; m_macNeedsErasing = false ; + m_macWindow = NULL ; } bool wxTopLevelWindowMac::Create(wxWindow *parent, @@ -129,9 +139,12 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent, wxTopLevelWindowMac::~wxTopLevelWindowMac() { - wxToolTip::NotifyWindowDelete(m_macWindow) ; - UMADisposeWindow( m_macWindow ) ; - + if ( m_macWindow ) + { + wxToolTip::NotifyWindowDelete(m_macWindow) ; + UMADisposeWindow( (WindowRef) m_macWindow ) ; + } + wxRemoveMacWindowAssociation( this ) ; wxTopLevelWindows.DeleteObject(this); @@ -149,7 +162,7 @@ wxTopLevelWindowMac::~wxTopLevelWindowMac() wxTheApp->ExitMainLoop() ; } } - DisposeRgn( m_macNoEraseUpdateRgn ) ; + DisposeRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; } @@ -174,7 +187,7 @@ void wxTopLevelWindowMac::Iconize(bool iconize) bool wxTopLevelWindowMac::IsIconized() const { - // mac dialogs cannot be iconized + // mac dialogs cannot be iconized return FALSE; } @@ -228,7 +241,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, WindowClass wclass = 0; WindowAttributes attr = kWindowNoAttributes ; - if ( HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT) ) + if ( HasFlag( wxFRAME_TOOL_WINDOW) /*|| HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT)*/ ) { wclass = kFloatingWindowClass ; if ( HasFlag(wxTINY_CAPTION_VERT) ) @@ -240,7 +253,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, { if ( HasFlag( wxDIALOG_MODAL ) ) { - wclass = kMovableModalWindowClass ; + wclass = kDocumentWindowClass ; // kMovableModalWindowClass ; } else { @@ -249,7 +262,7 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, } else { - wclass = kModalWindowClass ; + wclass = kDocumentWindowClass ; } if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ) @@ -266,27 +279,27 @@ void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title, attr |= kWindowCloseBoxAttribute ; } - ::CreateNewWindow( wclass , attr , &theBoundsRect , &m_macWindow ) ; + ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ; wxAssociateWinWithMacWindow( m_macWindow , this ) ; wxString label ; if( wxApp::s_macDefaultEncodingIsPC ) label = wxMacMakeMacStringFromPC( title ) ; else label = title ; - UMASetWTitleC( m_macWindow , label ) ; - ::CreateRootControl( m_macWindow , &m_macRootControl ) ; + UMASetWTitleC( (WindowRef)m_macWindow , label ) ; + ::CreateRootControl( (WindowRef)m_macWindow , (ControlHandle*)&m_macRootControl ) ; m_macFocus = NULL ; } -void wxTopLevelWindowMac::MacGetPortParams(Point* localOrigin, Rect* clipRect, WindowRef *window , wxWindowMac** rootwin) +void wxTopLevelWindowMac::MacGetPortParams(WXPOINTPTR localOrigin, WXRECTPTR clipRect, WXHWND *window , wxWindowMac** rootwin) { - localOrigin->h = 0; - localOrigin->v = 0; - clipRect->left = 0; - clipRect->top = 0; - clipRect->right = m_width; - clipRect->bottom = m_height; + ((Point*)localOrigin)->h = 0; + ((Point*)localOrigin)->v = 0; + ((Rect*)clipRect)->left = 0; + ((Rect*)clipRect)->top = 0; + ((Rect*)clipRect)->right = m_width; + ((Rect*)clipRect)->bottom = m_height; *window = m_macWindow ; *rootwin = this ; } @@ -296,7 +309,7 @@ void wxTopLevelWindowMac::Clear() wxWindow::Clear() ; } -ControlHandle wxTopLevelWindowMac::MacGetContainerForEmbedding() +WXWidget wxTopLevelWindowMac::MacGetContainerForEmbedding() { return m_macRootControl ; } @@ -304,19 +317,17 @@ ControlHandle wxTopLevelWindowMac::MacGetContainerForEmbedding() void wxTopLevelWindowMac::MacUpdate( long timestamp) { - #if TARGET_CARBON - AGAPortHelper help( GetWindowPort(m_macWindow) ) ; - #else - AGAPortHelper help( (m_macWindow) ) ; - #endif - BeginUpdate( m_macWindow ) ; + + wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ; + + BeginUpdate( (WindowRef)m_macWindow ) ; RgnHandle updateRgn = NewRgn(); RgnHandle diffRgn = NewRgn() ; if ( updateRgn && diffRgn ) { - GetPortVisibleRegion( GetWindowPort( m_macWindow ), updateRgn ); - DiffRgn( updateRgn , m_macNoEraseUpdateRgn , diffRgn ) ; + GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn ); + DiffRgn( updateRgn , (RgnHandle) m_macNoEraseUpdateRgn , diffRgn ) ; if ( !EmptyRgn( updateRgn ) ) { MacRedraw( updateRgn , timestamp , m_macNeedsErasing || !EmptyRgn( diffRgn ) ) ; @@ -326,8 +337,8 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) DisposeRgn( updateRgn ); if ( diffRgn ) DisposeRgn( diffRgn ); - EndUpdate( m_macWindow ) ; - SetEmptyRgn( m_macNoEraseUpdateRgn ) ; + EndUpdate( (WindowRef)m_macWindow ) ; + SetEmptyRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ; m_macNeedsErasing = false ; } @@ -335,21 +346,18 @@ void wxTopLevelWindowMac::MacUpdate( long timestamp) // Raise the window to the top of the Z order void wxTopLevelWindowMac::Raise() { - ::BringToFront( m_macWindow ) ; + ::BringToFront( (WindowRef)m_macWindow ) ; } // Lower the window to the bottom of the Z order void wxTopLevelWindowMac::Lower() { - ::SendBehind( m_macWindow , NULL ) ; + ::SendBehind( (WindowRef)m_macWindow , NULL ) ; } -Point lastWhere ; -long lastWhen = 0 ; -extern int wxBusyCursorCount ; - -void wxTopLevelWindowMac::MacFireMouseEvent( EventRecord *ev ) +void wxTopLevelWindowMac::MacFireMouseEvent( WXEVENTREF evr ) { + EventRecord *ev = (EventRecord*) evr ; wxMouseEvent event(wxEVT_LEFT_DOWN); bool isDown = !(ev->modifiers & btnState) ; // 1 is for up bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse @@ -387,28 +395,31 @@ void wxTopLevelWindowMac::MacFireMouseEvent( EventRecord *ev ) GrafPtr port ; ::GetPort( &port ) ; - ::SetPort( UMAGetWindowPort( m_macWindow ) ) ; + ::SetPort( UMAGetWindowPort( (WindowRef)m_macWindow ) ) ; ::GlobalToLocal( &localwhere ) ; ::SetPort( port ) ; if ( ev->what == mouseDown ) { - if ( ev->when - lastWhen <= GetDblTime() ) + if ( ev->when - gs_lastWhen <= GetDblTime() ) { - if ( abs( localwhere.h - lastWhere.h ) < 3 || abs( localwhere.v - lastWhere.v ) < 3 ) + if ( abs( localwhere.h - gs_lastWhere.h ) < 3 && abs( localwhere.v - gs_lastWhere.v ) < 3 ) { + // This is not right if the second mouse down + // event occured in a differen window. We + // correct this in MacDispatchMouseEvent. if ( controlDown ) event.SetEventType(wxEVT_RIGHT_DCLICK ) ; else event.SetEventType(wxEVT_LEFT_DCLICK ) ; } - lastWhen = 0 ; + gs_lastWhen = 0 ; } else { - lastWhen = ev->when ; + gs_lastWhen = ev->when ; } - lastWhere = localwhere ; + gs_lastWhere = localwhere ; } event.m_x = localwhere.h; @@ -416,13 +427,6 @@ void wxTopLevelWindowMac::MacFireMouseEvent( EventRecord *ev ) event.m_x += m_x; event.m_y += m_y; -/* - wxPoint origin = GetClientAreaOrigin() ; - - event.m_x += origin.x ; - event.m_y += origin.y ; -*/ - event.m_timeStamp = ev->when; event.SetEventObject(this); if ( wxTheApp->s_captureWindow ) @@ -432,7 +436,9 @@ void wxTopLevelWindowMac::MacFireMouseEvent( EventRecord *ev ) wxTheApp->s_captureWindow->ScreenToClient( &x , &y ) ; event.m_x = x ; event.m_y = y ; + event.SetEventObject( wxTheApp->s_captureWindow ) ; wxTheApp->s_captureWindow->GetEventHandler()->ProcessEvent( event ) ; + if ( ev->what == mouseUp ) { wxTheApp->s_captureWindow = NULL ; @@ -448,12 +454,12 @@ void wxTopLevelWindowMac::MacFireMouseEvent( EventRecord *ev ) } } -void wxTopLevelWindowMac::MacMouseDown( EventRecord *ev , short part) +void wxTopLevelWindowMac::MacMouseDown( WXEVENTREF ev , short part) { MacFireMouseEvent( ev ) ; } -void wxTopLevelWindowMac::MacMouseUp( EventRecord *ev , short part) +void wxTopLevelWindowMac::MacMouseUp( WXEVENTREF ev , short part) { switch (part) { @@ -465,7 +471,7 @@ void wxTopLevelWindowMac::MacMouseUp( EventRecord *ev , short part) } } -void wxTopLevelWindowMac::MacMouseMoved( EventRecord *ev , short part) +void wxTopLevelWindowMac::MacMouseMoved( WXEVENTREF ev , short part) { switch (part) { @@ -476,20 +482,20 @@ void wxTopLevelWindowMac::MacMouseMoved( EventRecord *ev , short part) break ; } } -void wxTopLevelWindowMac::MacActivate( EventRecord *ev , bool inIsActivating ) +void wxTopLevelWindowMac::MacActivate( WXEVENTREF ev , bool inIsActivating ) { wxActivateEvent event(wxEVT_ACTIVATE, inIsActivating , m_windowId); - event.m_timeStamp = ev->when ; + event.m_timeStamp = ((EventRecord*)ev)->when ; event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); - UMAHighlightAndActivateWindow( m_macWindow , inIsActivating ) ; + UMAHighlightAndActivateWindow( (WindowRef)m_macWindow , inIsActivating ) ; MacSuperEnabled( inIsActivating ) ; } -void wxTopLevelWindowMac::MacKeyDown( EventRecord *ev ) +void wxTopLevelWindowMac::MacKeyDown( WXEVENTREF ev ) { } @@ -504,7 +510,7 @@ void wxTopLevelWindowMac::SetTitle(const wxString& title) else label = m_label ; - UMASetWTitleC( m_macWindow , label ) ; + UMASetWTitleC( (WindowRef)m_macWindow , label ) ; } bool wxTopLevelWindowMac::Show(bool show) @@ -514,8 +520,8 @@ bool wxTopLevelWindowMac::Show(bool show) if (show) { - ::ShowWindow( m_macWindow ) ; - ::SelectWindow( m_macWindow ) ; + ::ShowWindow( (WindowRef)m_macWindow ) ; + ::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 wxSize size(m_width, m_height); @@ -525,7 +531,7 @@ bool wxTopLevelWindowMac::Show(bool show) } else { - ::HideWindow( m_macWindow ) ; + ::HideWindow( (WindowRef)m_macWindow ) ; } if ( !show ) @@ -580,10 +586,10 @@ void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height) m_height = actualHeight ; if ( doMove ) - ::MoveWindow(m_macWindow, m_x, m_y , false); // don't make frontmost + ::MoveWindow((WindowRef)m_macWindow, m_x, m_y , false); // don't make frontmost if ( doResize ) - ::SizeWindow(m_macWindow, m_width, m_height , true); + ::SizeWindow((WindowRef)m_macWindow, m_width, m_height , true); // the OS takes care of invalidating and erasing the new area // we have erased the old one @@ -631,11 +637,11 @@ void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height) * will get the eraseBackground event first */ -void wxTopLevelWindowMac::MacInvalidate( const Rect * rect, bool eraseBackground ) +void wxTopLevelWindowMac::MacInvalidate( const WXRECTPTR rect, bool eraseBackground ) { GrafPtr formerPort ; GetPort( &formerPort ) ; - SetPortWindowPort( m_macWindow ) ; + SetPortWindowPort( (WindowRef)m_macWindow ) ; m_macNeedsErasing |= eraseBackground ; @@ -650,11 +656,11 @@ void wxTopLevelWindowMac::MacInvalidate( const Rect * rect, bool eraseBackground RgnHandle diffRgn = NewRgn() ; if ( updateRgn && diffRgn ) { - GetWindowUpdateRgn( m_macWindow , updateRgn ); + GetWindowUpdateRgn( (WindowRef)m_macWindow , updateRgn ); Point pt = {0,0} ; LocalToGlobal( &pt ) ; OffsetRgn( updateRgn , -pt.h , -pt.v ) ; - DiffRgn( updateRgn , m_macNoEraseUpdateRgn , diffRgn ) ; + DiffRgn( updateRgn , (RgnHandle) m_macNoEraseUpdateRgn , diffRgn ) ; if ( !EmptyRgn( diffRgn ) ) { m_macNeedsErasing = true ; @@ -668,15 +674,16 @@ void wxTopLevelWindowMac::MacInvalidate( const Rect * rect, bool eraseBackground if ( !m_macNeedsErasing ) { RgnHandle rectRgn = NewRgn() ; - SetRectRgn( rectRgn , rect->left , rect->top , rect->right , rect->bottom ) ; - UnionRgn( m_macNoEraseUpdateRgn , rectRgn , m_macNoEraseUpdateRgn ) ; + SetRectRgn( rectRgn , ((Rect*)rect)->left , ((Rect*)rect)->top , ((Rect*)rect)->right , ((Rect*)rect)->bottom ) ; + UnionRgn( (RgnHandle) m_macNoEraseUpdateRgn , rectRgn , (RgnHandle) m_macNoEraseUpdateRgn ) ; DisposeRgn( rectRgn ) ; } } - InvalWindowRect( m_macWindow , rect ) ; + InvalWindowRect( (WindowRef)m_macWindow , (Rect*)rect ) ; // turn this on to debug the refreshing cycle #if wxMAC_DEBUG_REDRAW PaintRect( rect ) ; #endif SetPort( formerPort ) ; } +