X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8f2db1f34fcf92ad8a5cdf5334f2000c9f292f4..ec341c7e1fc448c79edfd5f848d5e5adc598dd42:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 471c87c462..0ef67a8a20 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -37,6 +37,7 @@ #include "wx/menuitem.h" #include "wx/spinctrl.h" #include "wx/log.h" +#include "wx/geometry.h" #if wxUSE_CARET #include "wx/caret.h" @@ -168,6 +169,13 @@ wxWindowMac::~wxWindowMac() { s_lastMouseWindow = NULL ; } + + wxFrame* frame = wxDynamicCast( wxGetTopLevelParent( this ) , wxFrame ) ; + if ( frame ) + { + if ( frame->GetLastFocus() == this ) + frame->SetLastFocus( NULL ) ; + } if ( gFocusWindow == this ) { @@ -345,7 +353,17 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) ::InsertMenu( (MenuHandle) menu->GetHMenu() , -1 ) ; long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() ,y,x, 0) ; - menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ; + if ( HiWord(menuResult) != 0 ) + { + MenuCommand id ; + GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &id ) ; + + wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id ); + event.m_timeStamp = TickCount() ; + event.SetEventObject(this->GetEventHandler()); + event.SetInt( id ); + GetEventHandler()->ProcessEvent(event); + } ::DeleteMenu( menu->MacGetMenuId() ) ; menu->SetInvokingWindow(NULL); @@ -373,9 +391,9 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const MacRootWindowToWindow( x , y ) ; if ( x ) - x -= MacGetLeftBorderSize() ; + *x -= MacGetLeftBorderSize() ; if ( y ) - y -= MacGetTopBorderSize() ; + *y -= MacGetTopBorderSize() ; } void wxWindowMac::DoClientToScreen(int *x, int *y) const @@ -383,9 +401,9 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const WindowRef window = (WindowRef) MacGetRootWindow() ; if ( x ) - x += MacGetLeftBorderSize() ; + *x += MacGetLeftBorderSize() ; if ( y ) - y += MacGetTopBorderSize() ; + *y += MacGetTopBorderSize() ; MacWindowToRootWindow( x , y ) ; @@ -587,7 +605,35 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) { // erase former position - Refresh() ; + bool partialRepaint = false ; + + if ( HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) ) + { + wxPoint oldPos( m_x , m_y ) ; + wxPoint newPos( actualX , actualY ) ; + MacWindowToRootWindow( &oldPos.x , &oldPos.y ) ; + MacWindowToRootWindow( &newPos.x , &newPos.y ) ; + if ( oldPos == newPos ) + { + partialRepaint = true ; + RgnHandle oldRgn,newRgn,diffRgn ; + oldRgn = NewRgn() ; + newRgn = NewRgn() ; + diffRgn = NewRgn() ; + SetRectRgn(oldRgn , oldPos.x , oldPos.y , oldPos.x + m_width , oldPos.y + m_height ) ; + SetRectRgn(newRgn , newPos.x , newPos.y , newPos.x + actualWidth , newPos.y + actualHeight ) ; + DiffRgn( newRgn , oldRgn , diffRgn ) ; + InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ; + DiffRgn( oldRgn , newRgn , diffRgn ) ; + InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ; + DisposeRgn(oldRgn) ; + DisposeRgn(newRgn) ; + DisposeRgn(diffRgn) ; + } + } + + if ( !partialRepaint ) + Refresh() ; m_x = actualX ; m_y = actualY ; @@ -599,7 +645,8 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) MacUpdateDimensions() ; // erase new position - Refresh() ; + if ( !partialRepaint ) + Refresh() ; if ( doMove ) wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified @@ -1434,6 +1481,48 @@ bool wxWindowMac::MacGetWindowFromPoint( const wxPoint &screenpoint , wxWindowMa extern int wxBusyCursorCount ; static wxWindow *gs_lastWhich = NULL; +bool wxWindowMac::MacSetupCursor( const wxPoint& pt) +{ + // first trigger a set cursor event + + wxPoint clientorigin = GetClientAreaOrigin() ; + wxSize clientsize = GetClientSize() ; + wxCursor cursor ; + if ( wxRect2DInt( clientorigin.x , clientorigin.y , clientsize.x , clientsize.y ).Contains( wxPoint2DInt( pt ) ) ) + { + wxSetCursorEvent event( pt.x , pt.y ); + + bool processedEvtSetCursor = GetEventHandler()->ProcessEvent(event); + if ( processedEvtSetCursor && event.HasCursor() ) + { + cursor = event.GetCursor() ; + } + else + { + + // the test for processedEvtSetCursor is here to prevent using m_cursor + // if the user code caught EVT_SET_CURSOR() and returned nothing from + // it - this is a way to say that our cursor shouldn't be used for this + // point + if ( !processedEvtSetCursor && m_cursor.Ok() ) + { + cursor = m_cursor ; + } + if ( wxIsBusy() ) + { + } + else + { + if ( !GetParent() ) + cursor = *wxSTANDARD_CURSOR ; + } + } + if ( cursor.Ok() ) + cursor.MacInstall() ; + } + return cursor.Ok() ; +} + bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) { if ((event.m_x < m_x) || (event.m_y < m_y) || @@ -1462,14 +1551,18 @@ bool wxWindowMac::MacDispatchMouseEvent(wxMouseEvent& event) } } - event.m_x = x ; - event.m_y = y ; - event.SetEventObject( this ) ; + wxWindow* cursorTarget = this ; + wxPoint cursorPoint( x , y ) ; - if ( wxBusyCursorCount == 0 ) + while( cursorTarget && !cursorTarget->MacSetupCursor( cursorPoint ) ) { - m_cursor.MacInstall() ; + cursorTarget = cursorTarget->GetParent() ; + if ( cursorTarget ) + cursorPoint += cursorTarget->GetPosition() ; } + event.m_x = x ; + event.m_y = y ; + event.SetEventObject( this ) ; if ( event.GetEventType() == wxEVT_LEFT_DOWN ) {