📄 app.cpp
字号:
{
WindowRef window ;
short windowPart = ::FindWindow(point, &window);
if ( windowPart == inMenuBar )
{
MenuSelect( point ) ;
result = noErr ;
}
}
break ;
case kEventMouseDragged :
case kEventMouseUp :
{
if ( wxTheApp->s_captureWindow )
wxMacWindowEventHandler( handler , event , (void*) wxTheApp->s_captureWindow->MacGetTopLevelWindow() ) ;
}
break ;
case kEventMouseMoved :
{
wxTheApp->MacHandleMouseMovedEvent( point.h , point.v , modifiers , EventTimeToTicks( GetEventTime( event ) ) ) ;
result = noErr ;
break ;
}
break ;
}
return result ;
}
static pascal OSStatus CommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
HICommand command ;
GetEventParameter( event, kEventParamDirectObject, typeHICommand, NULL,
sizeof( HICommand ), NULL, &command );
MenuCommand id = command.commandID ;
if ( id == kHICommandPreferences )
id = wxApp::s_macPreferencesMenuItemId ;
wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ;
wxMenu* menu = NULL ;
wxMenuItem* item = NULL ;
if ( mbar )
{
item = mbar->FindItem( id , &menu ) ;
// it is not 100 % sure that an menu of id 0 is really ours, safety check
if ( id == 0 && menu != NULL && menu->GetHMenu() != command.menu.menuRef )
{
item = NULL ;
menu = NULL ;
}
}
if ( item == NULL || menu == NULL || mbar == NULL )
return result ;
switch( GetEventKind( event ) )
{
case kEventProcessCommand :
{
if (item->IsCheckable())
{
item->Check( !item->IsChecked() ) ;
}
menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ;
result = noErr ;
}
break ;
case kEventCommandUpdateStatus:
// eventually trigger an updateui round
result = noErr ;
break ;
default :
break ;
}
return result ;
}
static pascal OSStatus ApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
switch ( GetEventKind( event ) )
{
case kEventAppActivated :
{
if ( wxTheApp )
wxTheApp->MacResume( true ) ;
result = noErr ;
}
break ;
case kEventAppDeactivated :
{
if ( wxTheApp )
wxTheApp->MacSuspend( true ) ;
result = noErr ;
}
break ;
default :
break ;
}
return result ;
}
pascal OSStatus wxAppEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
switch( GetEventClass( event ) )
{
case kEventClassCommand :
result = CommandEventHandler( handler , event , data ) ;
break ;
case kEventClassApplication :
result = ApplicationEventHandler( handler , event , data ) ;
break ;
case kEventClassMenu :
result = MenuEventHandler( handler , event , data ) ;
break ;
case kEventClassMouse :
result = MouseEventHandler( handler , event , data ) ;
break ;
case kEventClassAppleEvent :
{
EventRecord rec ;
wxMacConvertEventToRecord( event , &rec ) ;
result = AEProcessAppleEvent( &rec ) ;
}
break ;
default :
break ;
}
return result ;
}
DEFINE_ONE_SHOT_HANDLER_GETTER( wxAppEventHandler )
#endif
#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__)
// we know it's there ;-)
WXIMPORT char std::__throws_bad_alloc ;
#endif
bool wxApp::Initialize(int& argc, wxChar **argv)
{
int error = 0 ;
// Mac-specific
UMAInitToolbox( 4, sm_isEmbedded ) ;
SetEventMask( everyEvent ) ;
UMAShowWatchCursor() ;
#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);
#endif
#ifndef __DARWIN__
// test the minimal configuration necessary
# if !TARGET_CARBON
long theSystem ;
long theMachine;
if (Gestalt(gestaltMachineType, &theMachine) != noErr)
{
error = kMacSTRWrongMachine;
}
else if (theMachine < gestaltMacPlus)
{
error = kMacSTRWrongMachine;
}
else if (Gestalt(gestaltSystemVersion, &theSystem) != noErr )
{
error = kMacSTROldSystem ;
}
else if ( theSystem < 0x0860 )
{
error = kMacSTROldSystem ;
}
else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap)
{
error = kMacSTRSmallSize;
}
# endif
/*
else
{
if ( !UMAHasAppearance() )
{
error = kMacSTRNoPre8Yet ;
}
}
*/
#endif
// if we encountered any problems so far, give the error code and exit immediately
if ( error )
{
wxStAppResource resload ;
short itemHit;
Str255 message;
GetIndString(message, 128, error);
UMAShowArrowCursor() ;
ParamText("\pFatal Error", message, (ConstStr255Param)"\p", (ConstStr255Param)"\p");
itemHit = Alert(128, nil);
return false ;
}
#ifndef __DARWIN__
# if __option(profile)
ProfilerInit( collectDetailed, bestTimeBase , 40000 , 50 ) ;
# endif
#endif
#ifndef __DARWIN__
// now avoid exceptions thrown for new (bad_alloc)
// FIXME CS for some changes outside wxMac does not compile anymore
#if 0
std::__throws_bad_alloc = 0 ;
#endif
#endif
s_macCursorRgn = ::NewRgn() ;
// Mac OS X passes a process serial number command line argument when
// the application is launched from the Finder. This argument must be
// removed from the command line arguments before being handled by the
// application (otherwise applications would need to handle it)
if ( argc > 1 )
{
static const wxChar *ARG_PSN = _T("-psn_");
if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
{
// remove this argument
--argc;
memmove(argv + 1, argv + 2, argc * sizeof(char *));
}
}
if ( !wxAppBase::Initialize(argc, argv) )
return false;
#if wxUSE_INTL
wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
#endif
wxWinMacWindowList = new wxList(wxKEY_INTEGER);
wxWinMacControlList = new wxList(wxKEY_INTEGER);
wxMacCreateNotifierTable() ;
UMAShowArrowCursor() ;
return true;
}
bool wxApp::OnInitGui()
{
if( !wxAppBase::OnInitGui() )
return false ;
#if TARGET_CARBON
InstallStandardEventHandler( GetApplicationEventTarget() ) ;
if (!sm_isEmbedded)
{
InstallApplicationEventHandler(
GetwxAppEventHandlerUPP(),
GetEventTypeCount(eventList), eventList, wxTheApp, (EventHandlerRef *)&(wxTheApp->m_macEventHandler));
}
#endif
if (!sm_isEmbedded)
{
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
NewAEEventHandlerUPP(AEHandleODoc) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
NewAEEventHandlerUPP(AEHandleOApp) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
NewAEEventHandlerUPP(AEHandlePDoc) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
NewAEEventHandlerUPP(AEHandleRApp) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
NewAEEventHandlerUPP(AEHandleQuit) ,
0 , FALSE ) ;
#else
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
NewAEEventHandlerProc(AEHandleODoc) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
NewAEEventHandlerProc(AEHandleOApp) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
NewAEEventHandlerProc(AEHandlePDoc) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
NewAEEventHandlerProc(AEHandleRApp) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
NewAEEventHandlerProc(AEHandleQuit) ,
0 , FALSE ) ;
#endif
}
return true ;
}
void wxApp::CleanUp()
{
wxToolTip::RemoveToolTips() ;
// One last chance for pending objects to be cleaned up
wxTheApp->DeletePendingObjects();
wxMacDestroyNotifierTable() ;
delete wxWinMacWindowList ;
wxWinMacWindowList = NULL;
delete wxWinMacControlList ;
wxWinMacControlList = NULL;
#ifndef __DARWIN__
# if __option(profile)
ProfilerDump( (StringPtr)"\papp.prof" ) ;
ProfilerTerm() ;
# endif
#endif
#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();
#endif
UMACleanupToolbox() ;
if (s_macCursorRgn) {
::DisposeRgn((RgnHandle)s_macCursorRgn);
}
#if 0
TerminateAE() ;
#endif
wxAppBase::CleanUp();
}
//----------------------------------------------------------------------
// misc initialization stuff
//----------------------------------------------------------------------
// extern variable for shared library resource id
// need to be able to find it with NSLookupAndBindSymbol
short gSharedLibraryResource = kResFileNotOpened ;
#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__)
CFBundleRef gSharedLibraryBundle = NULL;
#endif /* WXMAKINGDLL_CORE && __DARWIN__ */
wxStAppResource::wxStAppResource()
{
m_currentRefNum = CurResFile() ;
if ( gSharedLibraryResource != kResFileNotOpened )
{
UseResFile( gSharedLibraryResource ) ;
}
}
wxStAppResource::~wxStAppResource()
{
if ( m_currentRefNum != kResFileNotOpened )
{
UseResFile( m_currentRefNum ) ;
}
}
void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
{
gSharedLibraryResource = kResFileNotOpened;
#ifdef WXMAKINGDLL_CORE
if ( initBlock != NULL ) {
const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
FSSpec *fileSpec = NULL;
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
fileSpec = theInitBlock->fragLocator.u.onDisk.fileSpec;
}
else if (theInitBlock->fragLocator.where == kResourceCFragLocator) {
fileSpec = theInitBlock->fragLocator.u.inSegs.fileSpec;
}
if (fileSpec != NULL) {
gSharedLibraryResource = FSpOpenResFile(fileSpec, fsRdPerm);
}
}
else {
#ifdef __DARWIN__
// Open the shared library resource file if it is not yet open
NSSymbol theSymbol;
NSModule theModule;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -