X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c4825ef73a5f190b8f39c59df098c3f39fa4464b..6cab4fcac7fe26d9ae5a1d29066e0893d689bb38:/src/osx/window_osx.cpp diff --git a/src/osx/window_osx.cpp b/src/osx/window_osx.cpp index 3ad07ae4d2..b9817fbfc1 100644 --- a/src/osx/window_osx.cpp +++ b/src/osx/window_osx.cpp @@ -141,8 +141,6 @@ wxWindowMac::~wxWindowMac() { SendDestroyEvent(); - m_isBeingDeleted = true; - MacInvalidateBorders() ; #ifndef __WXUNIVERSAL__ @@ -153,7 +151,7 @@ wxWindowMac::~wxWindowMac() if ( frame ) { if ( frame->GetLastFocus() == this ) - frame->SetLastFocus((wxWindow*)NULL); + frame->SetLastFocus(NULL); break; } } @@ -305,11 +303,43 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) return; m_peer->SetControlSize( variant ); +#if wxOSX_USE_CARBON + ControlSize size ; + + // we will get that from the settings later + // and make this NORMAL later, but first + // we have a few calculations that we must fix + + switch ( variant ) + { + case wxWINDOW_VARIANT_NORMAL : + size = kControlSizeNormal; + break ; + + case wxWINDOW_VARIANT_SMALL : + size = kControlSizeSmall; + break ; + + case wxWINDOW_VARIANT_MINI : + // not always defined in the headers + size = 3 ; + break ; + + case wxWINDOW_VARIANT_LARGE : + size = kControlSizeLarge; + break ; + + default: + wxFAIL_MSG(_T("unexpected window variant")); + break ; + } + m_peer->SetData(kControlEntireControl, kControlSizeTag, &size ) ; +#endif + #if wxOSX_USE_COCOA_OR_CARBON wxFont font ; -#if wxOSX_USE_CARBON - ControlSize size ; +#if wxOSX_USE_ATSU_TEXT ThemeFontID themeFont = kThemeSystemFont ; // we will get that from the settings later @@ -319,23 +349,19 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) switch ( variant ) { case wxWINDOW_VARIANT_NORMAL : - size = kControlSizeNormal; themeFont = kThemeSystemFont ; break ; case wxWINDOW_VARIANT_SMALL : - size = kControlSizeSmall; themeFont = kThemeSmallSystemFont ; break ; case wxWINDOW_VARIANT_MINI : // not always defined in the headers - size = 3 ; themeFont = 109 ; break ; case wxWINDOW_VARIANT_LARGE : - size = kControlSizeLarge; themeFont = kThemeSystemFont ; break ; @@ -344,7 +370,6 @@ void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) break ; } - m_peer->SetData(kControlEntireControl, kControlSizeTag, &size ) ; font.MacCreateFromThemeFont( themeFont ) ; #else CTFontUIFontType themeFont = kCTFontSystemFontType ; @@ -432,6 +457,7 @@ void wxWindowMac::SetFocus() void wxWindowMac::DoCaptureMouse() { wxApp::s_captureWindow = (wxWindow*) this ; + m_peer->CaptureMouse() ; } wxWindow * wxWindowBase::GetCapture() @@ -442,14 +468,15 @@ wxWindow * wxWindowBase::GetCapture() void wxWindowMac::DoReleaseMouse() { wxApp::s_captureWindow = NULL ; + + m_peer->ReleaseMouse() ; } #if wxUSE_DRAG_AND_DROP void wxWindowMac::SetDropTarget(wxDropTarget *pDropTarget) { - if ( m_dropTarget != NULL ) - delete m_dropTarget; + delete m_dropTarget; m_dropTarget = pDropTarget; if ( m_dropTarget != NULL ) @@ -648,8 +675,8 @@ wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const m_peer->GetContentArea( left, top, innerwidth, innerheight ); m_peer->GetSize( outerwidth, outerheight ); - sizeTotal.x += left + (outerwidth-innerwidth); - sizeTotal.y += top + (outerheight-innerheight); + sizeTotal.x += outerwidth-innerwidth; + sizeTotal.y += outerheight-innerheight; sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ; sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ; @@ -697,37 +724,8 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor) wxASSERT_MSG( m_cursor.Ok(), wxT("cursor must be valid after call to the base version")); - wxWindowMac *mouseWin = 0 ; -#if wxOSX_USE_CARBON - { - wxNonOwnedWindow *tlw = MacGetTopLevelWindow() ; - WindowRef window = (WindowRef) ( tlw ? tlw->GetWXWindow() : 0 ) ; - - ControlPartCode part ; - ControlRef control ; - Point pt ; - #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - HIPoint hiPoint ; - HIGetMousePosition(kHICoordSpaceWindow, window, &hiPoint); - pt.h = hiPoint.x; - pt.v = hiPoint.y; - #else - GetGlobalMouse( &pt ); - int x = pt.h; - int y = pt.v; - ScreenToClient(&x, &y); - pt.h = x; - pt.v = y; -#endif - control = FindControlUnderMouse( pt , window , &part ) ; - if ( control ) - mouseWin = wxFindWindowFromWXWidget( (WXWidget) control ) ; - - } -#endif - - if ( mouseWin == this && !wxIsBusy() ) - m_cursor.MacInstall() ; + if ( GetPeer() != NULL ) + GetPeer()->SetCursor( m_cursor ); return true ; } @@ -749,30 +747,8 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y) { ClientToScreen( &x , &y ) ; } -#ifdef __WXOSX_CARBON__ - long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() , y, x, 0) ; - if ( HiWord(menuResult) != 0 ) - { - MenuCommand macid; - GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &macid ); - int id = wxMacCommandToId( macid ); - wxMenuItem* item = NULL ; - wxMenu* realmenu ; - item = menu->FindItem( id, &realmenu ) ; - if ( item ) - { - if (item->IsCheckable()) - item->Check( !item->IsChecked() ) ; - - menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ; - } - } - -#else + menu->GetPeer()->PopUp(this, x, y); menu->SetInvokingWindow( NULL ); - return false; -#endif - return true; #else // actually this shouldn't be called, because universal is having its own implementation @@ -988,6 +964,13 @@ void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags) // TODO: REMOVE MacRepositionScrollBars() ; // we might have a real position shift + if (sizeFlags & wxSIZE_FORCE_EVENT) + { + wxSizeEvent event( wxSize(width,height), GetId() ); + event.SetEventObject( this ); + HandleWindowEvent( event ); + } + return; } @@ -2232,9 +2215,7 @@ void wxWindowMac::OnPaint( wxPaintEvent & WXUNUSED(event) ) #endif } -void wxWindowMac::MacHandleControlClick(WXWidget WXUNUSED(control), - wxInt16 WXUNUSED(controlpart), - bool WXUNUSED(mouseStillDown)) +void wxWindowMac::TriggerScrollEvent( wxEventType WXUNUSED(scrollEvent) ) { } @@ -2248,7 +2229,7 @@ Rect wxMacGetBoundsForControl( wxWindowMac* window , const wxPoint& pos , const return bounds ; } -bool wxWindowMac::HandleClicked( double timestampsec ) +bool wxWindowMac::OSXHandleClicked( double timestampsec ) { return false; } @@ -2256,7 +2237,7 @@ bool wxWindowMac::HandleClicked( double timestampsec ) wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF event ) { #if wxOSX_USE_COCOA_OR_CARBON - if ( HandleClicked( GetEventTime((EventRef)event) ) ) + if ( OSXHandleClicked( GetEventTime((EventRef)event) ) ) return noErr; return eventNotHandledErr ; @@ -2322,6 +2303,47 @@ bool wxWindowMac::IsShownOnScreen() const return wxWindowBase::IsShownOnScreen(); } +bool wxWindowMac::OSXHandleKeyEvent( wxKeyEvent& event ) +{ + bool handled = HandleWindowEvent( event ) ; + if ( handled && event.GetSkipped() ) + handled = false ; + +#if wxUSE_ACCEL + if ( !handled && event.GetEventType() == wxEVT_KEY_DOWN) + { + wxWindow *ancestor = this; + while (ancestor) + { + int command = ancestor->GetAcceleratorTable()->GetCommand( event ); + if (command != -1) + { + wxEvtHandler * const handler = ancestor->GetEventHandler(); + + wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); + handled = handler->ProcessEvent( command_event ); + + if ( !handled ) + { + // accelerators can also be used with buttons, try them too + command_event.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED); + handled = handler->ProcessEvent( command_event ); + } + + break; + } + + if (ancestor->IsTopLevel()) + break; + + ancestor = ancestor->GetParent(); + } + } +#endif // wxUSE_ACCEL + + return handled ; +} + // // wxWidgetImpl //