X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05e2b077c6187ff4d894e4af58ccd99536c9c584..ba87f54c0da98e069348612a9f4bef92c6798091:/src/mac/app.cpp?ds=sidebyside diff --git a/src/mac/app.cpp b/src/mac/app.cpp index 9fd758b3a0..aa4e3b578b 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -55,7 +55,7 @@ #ifdef __DARWIN__ # include -# if defined(WXMAKINGDLL) +# if defined(WXMAKINGDLL_CORE) # include # endif #else @@ -73,7 +73,6 @@ extern wxList *wxWinMacControlList; // statics for implementation static bool s_inYield = FALSE; -static bool s_inOnIdle = FALSE; #if TARGET_CARBON static bool s_inReceiveEvent = FALSE ; @@ -288,6 +287,9 @@ void wxApp::MacNewFile() { kEventClassCommand, kEventProcessCommand } , { kEventClassCommand, kEventCommandUpdateStatus } , + { kEventClassMenu, kEventMenuOpening }, + { kEventClassMenu, kEventMenuClosed }, + { kEventClassApplication , kEventAppActivated } , { kEventClassApplication , kEventAppDeactivated } , // handling the quit event is not recommended by apple @@ -299,9 +301,35 @@ void wxApp::MacNewFile() { 'WXMC' , 'WXMC' } } ; -static pascal OSStatus MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +static pascal OSStatus +MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { - return eventNotHandledErr ; + // FIXME: this doesn't work for multiple windows + wxWindow *win = wxTheApp->GetTopWindow(); + if ( win ) + { + // VZ: we could find the menu from its handle here by examining all + // the menus in the menu bar recursively but knowing that neither + // wxMSW nor wxGTK do it why bother... +#if 0 + MenuRef menuRef; + + GetEventParameter(event, + kEventParamDirectObject, + typeMenuRef, NULL, + sizeof(menuRef), NULL, + &menuRef); +#endif // 0 + + wxMenuEvent wxevent(GetEventKind(event) == kEventMenuOpening + ? wxEVT_MENU_OPEN + : wxEVT_MENU_CLOSE); + wxevent.SetEventObject(win); + + (void)win->GetEventHandler()->ProcessEvent(wxevent); + } + + return eventNotHandledErr; } // due to the rather low-level event API of wxWindows, we cannot use RunApplicationEventLoop @@ -442,7 +470,7 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxAppEventHandler ) #endif -#if defined(WXMAKINGDLL) && !defined(__DARWIN__) +#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__) // we know it's there ;-) WXIMPORT char std::__throws_bad_alloc ; #endif @@ -457,7 +485,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) SetEventMask( everyEvent ) ; UMAShowWatchCursor() ; -#if defined(WXMAKINGDLL) && defined(__DARWIN__) +#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__) // open shared library resources from here since we don't have // __wxinitialize in Mach-O shared libraries wxStAppResource::OpenSharedLibraryResource(NULL); @@ -628,7 +656,7 @@ void wxApp::CleanUp() # endif #endif -#if defined(WXMAKINGDLL) && defined(__DARWIN__) +#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__) // close shared library resources from here since we don't have // __wxterminate in Mach-O shared libraries wxStAppResource::CloseSharedLibraryResource(); @@ -655,9 +683,9 @@ void wxApp::CleanUp() // need to be able to find it with NSLookupAndBindSymbol short gSharedLibraryResource = kResFileNotOpened ; -#if defined(WXMAKINGDLL) && defined(__DARWIN__) +#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__) CFBundleRef gSharedLibraryBundle = NULL; -#endif /* WXMAKINGDLL && __DARWIN__ */ +#endif /* WXMAKINGDLL_CORE && __DARWIN__ */ wxStAppResource::wxStAppResource() { @@ -680,7 +708,7 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock) { gSharedLibraryResource = kResFileNotOpened; -#ifdef WXMAKINGDLL +#ifdef WXMAKINGDLL_CORE if ( initBlock != NULL ) { const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock; FSSpec *fileSpec = NULL; @@ -713,9 +741,8 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock) else { // wxWindows is a simple dynamic shared library // load the resources from the data fork of a separate resource file - char *theResPath; - char *theName; - char *theExt; + wxString theResPath; + wxString theName; FSRef theResRef; OSErr theErr = noErr; @@ -735,27 +762,24 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock) #endif // allocate copy to replace .dylib.* extension with .rsrc - theResPath = strdup(theLibPath); - if (theResPath != NULL) { - theName = strrchr(theResPath, '/'); - if (theName == NULL) { - // no directory elements in path - theName = theResPath; - } - // find ".dylib" shared library extension - theExt = strstr(theName, ".dylib"); - // overwrite extension with ".rsrc" - strcpy(theExt, ".rsrc"); + if (theLibPath != NULL) { + theResPath = theLibPath; + // replace '_core' with '' in case of multi-lib build + theResPath.Replace(wxT("_core"), wxEmptyString); + // replace ".dylib" shared library extension with ".rsrc" + theResPath.Replace(wxT(".dylib"), wxT(".rsrc")); + // Find the begining of the filename + theName = theResPath.AfterLast('/'); #if 0 wxLogDebug( wxT("wxMac resources file name is '%s'"), - theResPath ); + theResPath.mb_str() ); #endif - theErr = FSPathMakeRef((UInt8 *) theResPath, &theResRef, false); + theErr = FSPathMakeRef((UInt8 *) theResPath.mb_str(), &theResRef, false); if (theErr != noErr) { // try in current directory (using name only) - theErr = FSPathMakeRef((UInt8 *) theName, &theResRef, false); + theErr = FSPathMakeRef((UInt8 *) theName.mb_str(), &theResRef, false); } // open the resource file @@ -767,22 +791,20 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock) #ifdef __WXDEBUG__ fprintf(stderr, wxT("unable to open wxMac resource file '%s'\n"), - theResPath ); + theResPath.mb_str() ); #endif // __WXDEBUG__ } - // free duplicated resource file path - free(theResPath); } } #endif /* __DARWIN__ */ } -#endif /* WXMAKINGDLL */ +#endif /* WXMAKINGDLL_CORE */ } void wxStAppResource::CloseSharedLibraryResource() { -#ifdef WXMAKINGDLL +#ifdef WXMAKINGDLL_CORE // Close the shared library resource file if (gSharedLibraryResource != kResFileNotOpened) { #ifdef __DARWIN__ @@ -798,10 +820,10 @@ void wxStAppResource::CloseSharedLibraryResource() } gSharedLibraryResource = kResFileNotOpened; } -#endif /* WXMAKINGDLL */ +#endif /* WXMAKINGDLL_CORE */ } -#if defined(WXMAKINGDLL) && !defined(__DARWIN__) +#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__) // for shared libraries we have to manually get the correct resource // ref num upon initializing and releasing when terminating, therefore @@ -825,7 +847,7 @@ pascal void __wxterminate(void) __terminate() ; } -#endif /* WXMAKINGDLL && !__DARWIN__ */ +#endif /* WXMAKINGDLL_CORE && !__DARWIN__ */ #if TARGET_CARBON @@ -941,18 +963,11 @@ pascal OSStatus wxMacApplicationEventHandler( EventHandlerCallRef handler , Even wxApp::wxApp() { - m_topWindow = NULL; - wxTheApp = this; - -#if WXWIN_COMPATIBILITY_2_2 - m_wantDebugOutput = TRUE; -#endif - - argc = 0; - argv = NULL; - m_printMode = wxPRINT_WINDOWS; m_auto3D = TRUE; + + m_macCurrentEvent = NULL ; + m_macCurrentEventHandlerCallRef = NULL ; } bool wxApp::Initialized() @@ -975,16 +990,6 @@ int wxApp::MainLoop() return 0; } -// Returns TRUE if more time is needed. -bool wxApp::ProcessIdle() -{ - wxIdleEvent event; - event.SetEventObject(this); - ProcessEvent(event); - - return event.MoreRequested(); -} - void wxApp::ExitMainLoop() { m_keepGoing = FALSE; @@ -998,7 +1003,7 @@ bool wxApp::Pending() #else EventRecord event ; - return EventAvail( everyEvent , &event ) ; + return EventAvail( everyEvent , &event ) ; #endif } @@ -1010,33 +1015,13 @@ void wxApp::Dispatch() void wxApp::OnIdle(wxIdleEvent& event) { - // Avoid recursion (via ProcessEvent default case) - if ( s_inOnIdle ) - return; - - - s_inOnIdle = TRUE; - - // 'Garbage' collection of windows deleted with Close(). - DeletePendingObjects(); - - // flush the logged messages if any - wxLog *pLog = wxLog::GetActiveTarget(); - if ( pLog != NULL && pLog->HasPendingMessages() ) - pLog->Flush(); - - // Send OnIdle events to all windows - bool needMore = SendIdleEvents(); - - if (needMore) - event.RequestMore(TRUE); + wxAppBase::OnIdle(event); // If they are pending events, we must process them: pending events are // either events to the threads other than main or events posted with // wxPostEvent() functions wxMacProcessNotifierAndPendingEvents(); - s_inOnIdle = FALSE; if(!wxMenuBar::MacGetInstalledMenuBar() && wxMenuBar::MacGetCommonMenuBar()) wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar(); } @@ -1046,46 +1031,6 @@ void wxApp::WakeUpIdle() wxMacWakeUp() ; } -// Send idle event to all top-level windows -bool wxApp::SendIdleEvents() -{ - bool needMore = FALSE; - wxWindowListNode* node = wxTopLevelWindows.GetFirst(); - while (node) - { - wxWindow* win = node->GetData(); - if (SendIdleEvents(win)) - needMore = TRUE; - - node = node->GetNext(); - } - return needMore; -} - -// Send idle event to window and all subwindows -bool wxApp::SendIdleEvents(wxWindow* win) -{ - bool needMore = FALSE; - - wxIdleEvent event; - event.SetEventObject(win); - win->ProcessEvent(event); - - if (event.MoreRequested()) - needMore = TRUE; - - wxWindowListNode* node = win->GetChildren().GetFirst(); - while (node) - { - wxWindow* win = node->GetData(); - if (SendIdleEvents(win)) - needMore = TRUE; - - node = node->GetNext(); - } - return needMore ; -} - void wxApp::Exit() { wxApp::CleanUp(); @@ -1199,7 +1144,7 @@ void wxApp::MacSuspend( bool convertClipboard ) #if TARGET_CARBON #if 0 // having problems right now with that if (!win->HasFlag(wxSTAY_ON_TOP)) -#endif +#endif #endif win->MacActivate( ((EventRecord*) MacGetCurrentEvent())->when , false ) ; @@ -1409,6 +1354,12 @@ void wxApp::MacHandleModifierEvents( WXEVENTREF evr ) event.SetEventType( ( ev->modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; focus->GetEventHandler()->ProcessEvent( event ) ; } + if ( ev->modifiers ^ s_lastModifiers ) & cmdKey ) + { + event.m_keyCode = WXK_COMMAND ; + event.SetEventType( ( ev->modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ; + focus->GetEventHandler()->ProcessEvent( event ) ; + } s_lastModifiers = ev->modifiers ; } } @@ -1743,6 +1694,8 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false ) { +#if 0 + // we must handle control keys the other way round, otherwise text content is updated too late // has not been handled -> perform default wxControl* control = wxDynamicCast( focus , wxControl ) ; if ( control && control->GetMacControl() != NULL ) @@ -1753,6 +1706,7 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) keycode = short(ev->message & keyCodeMask) >> 8 ; ::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ; } +#endif } } }