X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c6aa5cafc5b0cbab9e0347b9e9e076f293c5186a..bd044e27b3c7f9b6d56e75b9e1b789be3545cd5e:/src/osx/carbon/app.cpp diff --git a/src/osx/carbon/app.cpp b/src/osx/carbon/app.cpp index cf770ff350..da75c15489 100644 --- a/src/osx/carbon/app.cpp +++ b/src/osx/carbon/app.cpp @@ -79,7 +79,7 @@ wxString wxApp::s_macHelpMenuTitleName = wxT("&Help") ; bool wxApp::sm_isEmbedded = false; // Normally we're not a plugin -#if wxOSX_CARBON +#if wxOSX_USE_CARBON //---------------------------------------------------------------------- // Core Apple Event Support @@ -253,7 +253,7 @@ short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU if ( win ) { wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId); - if (!win->ProcessEvent(exitEvent)) + if (!win->GetEventHandler()->ProcessEvent(exitEvent)) win->Close(true) ; } else @@ -508,12 +508,12 @@ wxMenu* wxFindMenuFromMacCommand( const HICommand &command , wxMenuItem* &item ) } else { - URefCon refCon = NULL ; + URefCon refCon = 0 ; GetMenuItemRefCon( command.menu.menuRef , command.menu.menuItemIndex , &refCon ) ; itemMenu = wxFindMenuFromMacMenu( command.menu.menuRef ) ; if ( itemMenu != NULL && refCon != 0) - item = ((wxMenuItemImpl*) refCon)->GetWXPeer() ; + item = (wxMenuItem*) refCon; } } #endif @@ -732,7 +732,7 @@ pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef eve DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler ) #endif -#if defined( __WXDEBUG__ ) && wxOSX_USE_COCOA_OR_CARBON +#if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON pascal static void wxMacAssertOutputHandler(OSType WXUNUSED(componentSignature), @@ -778,7 +778,7 @@ wxMacAssertOutputHandler(OSType WXUNUSED(componentSignature), #endif } -#endif //__WXDEBUG__ +#endif // wxDEBUG_LEVEL extern "C" void macPostedEventCallback(void *WXUNUSED(unused)) { @@ -789,7 +789,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) { // Mac-specific -#if defined( __WXDEBUG__ ) && wxOSX_USE_COCOA_OR_CARBON +#if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON InstallDebugAssertOutputHandler( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler ) ); #endif @@ -799,7 +799,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) // application (otherwise applications would need to handle it) if ( argc > 1 ) { - static const wxChar *ARG_PSN = _T("-psn_"); + static const wxChar *ARG_PSN = wxT("-psn_"); if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 ) { // remove this argument @@ -835,17 +835,19 @@ bool wxApp::Initialize(int& argc, wxChar **argv) event_posted_context.perform = macPostedEventCallback; m_macEventPosted = CFRunLoopSourceCreate(NULL,0,&event_posted_context); CFRunLoopAddSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes); - // run loop takes ownership - CFRelease(m_macEventPosted); + // run loop takes ownership + CFRelease(m_macEventPosted); */ return true; } +#if wxOSX_USE_CARBON bool wxApp::CallOnInit() { wxMacAutoreleasePool autoreleasepool; return OnInit(); } +#endif bool wxApp::OnInitGui() { @@ -864,6 +866,12 @@ bool wxApp::ProcessIdle() return wxAppBase::ProcessIdle(); } +int wxApp::OnRun() +{ + wxMacAutoreleasePool pool; + return wxAppBase::OnRun(); +} + #if wxOSX_USE_CARBON bool wxApp::DoInitGui() { @@ -937,15 +945,16 @@ void wxApp::DoCleanUp() void wxApp::CleanUp() { + wxMacAutoreleasePool autoreleasepool; #if wxUSE_TOOLTIPS wxToolTip::RemoveToolTips() ; #endif if (m_macEventPosted) - { - CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes); - m_macEventPosted = NULL; - } + { + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes); + m_macEventPosted = NULL; + } DoCleanUp(); @@ -1055,6 +1064,13 @@ wxApp::wxApp() m_macCurrentEvent = NULL ; m_macCurrentEventHandlerCallRef = NULL ; m_macEventPosted = NULL ; + m_macPool = new wxMacAutoreleasePool(); +} + +wxApp::~wxApp() +{ + if (m_macPool) + delete m_macPool; } CFMutableArrayRef GetAutoReleaseArray() @@ -1070,6 +1086,13 @@ void wxApp::MacAddToAutorelease( void* cfrefobj ) CFArrayAppendValue( GetAutoReleaseArray(), cfrefobj ); } +void wxApp::MacReleaseAutoreleasePool() +{ + if (m_macPool) + delete m_macPool; + m_macPool = new wxMacAutoreleasePool(); +} + void wxApp::OnIdle(wxIdleEvent& WXUNUSED(event)) { // If they are pending events, we must process them: pending events are @@ -1117,59 +1140,6 @@ void wxCYield() wxYield() ; } -// Yield to other processes - -bool wxApp::Yield(bool onlyIfNeeded) -{ -#if wxUSE_THREADS - // Yielding from a non-gui thread needs to bail out, otherwise we end up - // possibly sending events in the thread too. - if ( !wxThread::IsMain() ) - { - return true; - } -#endif // wxUSE_THREADS - - if (m_isInsideYield) - { - if ( !onlyIfNeeded ) - { - wxFAIL_MSG( wxT("wxYield called recursively" ) ); - } - - return false; - } - - m_isInsideYield = true; - -#if wxUSE_LOG - // disable log flushing from here because a call to wxYield() shouldn't - // normally result in message boxes popping up &c - wxLog::Suspend(); -#endif // wxUSE_LOG - - wxEventLoop * const - loop = static_cast(wxEventLoop::GetActive()); - if ( loop ) - { - // process all pending events: - while ( loop->Pending() ) - loop->Dispatch(); - } - - // it's necessary to call ProcessIdle() to update the frames sizes which - // might have been changed (it also will update other things set from - // OnUpdateUI() which is a nice (and desired) side effect) - while ( ProcessIdle() ) {} - -#if wxUSE_LOG - wxLog::Resume(); -#endif // wxUSE_LOG - m_isInsideYield = false; - - return true; -} - // virtual void wxApp::MacHandleUnhandledEvent( WXEVENTREF WXUNUSED(evr) ) { @@ -1345,6 +1315,12 @@ int wxMacKeyCodeToModifier(wxKeyCode key) } #endif +#if wxOSX_USE_COCOA && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + +// defined in utils.mm + +#elif wxOSX_USE_COCOA_OR_CARBON + wxMouseState wxGetMouseState() { wxMouseState ms; @@ -1353,7 +1329,6 @@ wxMouseState wxGetMouseState() ms.SetX(pt.x); ms.SetY(pt.y); -#if wxOSX_USE_CARBON UInt32 buttons = GetCurrentButtonState(); ms.SetLeftDown( (buttons & 0x01) != 0 ); ms.SetMiddleDown( (buttons & 0x04) != 0 ); @@ -1364,12 +1339,12 @@ wxMouseState wxGetMouseState() ms.SetShiftDown(modifiers & shiftKey); ms.SetAltDown(modifiers & optionKey); ms.SetMetaDown(modifiers & cmdKey); -#else - // TODO -#endif + return ms; } +#endif + // TODO : once the new key/char handling is tested, move all the code to wxWindow bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) @@ -1377,47 +1352,10 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi if ( !focus ) return false ; - bool handled; wxKeyEvent event(wxEVT_KEY_DOWN) ; MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ; - handled = focus->HandleWindowEvent( event ) ; - if ( handled && event.GetSkipped() ) - handled = false ; - -#if wxUSE_ACCEL - if ( !handled ) - { - wxWindow *ancestor = focus; - 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 ; + return focus->OSXHandleKeyEvent(event); } bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) @@ -1425,12 +1363,10 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier if ( !focus ) return false ; - bool handled; wxKeyEvent event( wxEVT_KEY_UP ) ; MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ; - handled = focus->HandleWindowEvent( event ) ; - return handled ; + return focus->OSXHandleKeyEvent(event) ; } bool wxApp::MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) @@ -1439,11 +1375,11 @@ bool wxApp::MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers return false ; wxKeyEvent event(wxEVT_CHAR) ; MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ; - long keyval = event.m_keyCode ; bool handled = false ; #if wxOSX_USE_CARBON + long keyval = event.m_keyCode ; wxNonOwnedWindow *tlw = focus->MacGetTopLevelWindow() ; if (tlw) @@ -1535,7 +1471,7 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess // control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier // and look at the character after #ifdef __LP64__ - // TODO new implementation using TextInputSources + // TODO new implementation using TextInputSources #else UInt32 state = 0; UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey | shiftKey | optionKey))) | keycode, &state); @@ -1608,6 +1544,15 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess event.m_y = wherey; event.SetTimestamp(when); event.SetEventObject(focus); +#else + wxUnusedVar(event); + wxUnusedVar(focus); + wxUnusedVar(keymessage); + wxUnusedVar(modifiers); + wxUnusedVar(when); + wxUnusedVar(wherex); + wxUnusedVar(wherey); + wxUnusedVar(uniChar); #endif }