#include "wx/textctrl.h"
#include "wx/menu.h"
#include "wx/docview.h"
-
-#if wxUSE_WX_RESOURCES
-# include "wx/resource.h"
-#endif
+#include "wx/filename.h"
#include <string.h>
#endif
#endif
-#include "apprsrc.h"
+// #include "apprsrc.h"
#include "wx/mac/uma.h"
#include "wx/mac/macnotfy.h"
#ifdef __DARWIN__
# include <CoreServices/CoreServices.h>
-# if defined(WXMAKINGDLL)
+# if defined(WXMAKINGDLL_CORE)
# include <mach-o/dyld.h>
# endif
#else
#endif
extern wxList wxPendingDelete;
-extern wxList *wxWinMacWindowList;
-extern wxList *wxWinMacControlList;
+
+#if wxUSE_THREADS
+extern size_t g_numberOfThreads;
+#endif // wxUSE_THREADS
// statics for implementation
static bool s_inYield = FALSE;
-static bool s_inOnIdle = FALSE;
-#if TARGET_CARBON
static bool s_inReceiveEvent = FALSE ;
static EventTime sleepTime = kEventDurationNoWait ;
-#else
-static long sleepTime = 0 ;
-#endif
-
-wxApp *wxTheApp = NULL;
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
long wxApp::s_lastModifiers = 0 ;
-bool wxApp::s_macDefaultEncodingIsPC = true ;
bool wxApp::s_macSupportPCMenuShortcuts = true ;
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
-long wxApp::s_macPreferencesMenuItemId = 0 ;
+long wxApp::s_macPreferencesMenuItemId = wxID_PREFERENCES ;
long wxApp::s_macExitMenuItemId = wxID_EXIT ;
-wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
+wxString wxApp::s_macHelpMenuTitleName = wxT("&Help") ;
+// Normally we're not a plugin
+bool wxApp::sm_isEmbedded = false;
//----------------------------------------------------------------------
// Core Apple Event Support
//----------------------------------------------------------------------
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
{
return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;
}
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
+{
+ return wxTheApp->MacHandleAERApp( (AppleEvent*) event , reply) ;
+}
+
// AEODoc Calls MacOpenFile on each of the files passed
short wxApp::MacHandleAEODoc(const WXEVENTREF event, WXEVENTREF WXUNUSED(reply))
err = AEGetParamDesc((AppleEvent *)event, keyDirectObject, typeAEList,&docList);
if (err != noErr)
return err;
-
+
err = AECountItems(&docList, &itemsInList);
if (err != noErr)
return err;
-
+
ProcessSerialNumber PSN ;
PSN.highLongOfPSN = 0 ;
PSN.lowLongOfPSN = kCurrentProcess ;
SetFrontProcess( &PSN ) ;
-
+
for (i = 1; i <= itemsInList; i++) {
AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
(Ptr) & theSpec, sizeof(theSpec), &actualSize);
err = AEGetParamDesc((AppleEvent *)event, keyDirectObject, typeAEList,&docList);
if (err != noErr)
return err;
-
+
err = AECountItems(&docList, &itemsInList);
if (err != noErr)
return err;
-
+
ProcessSerialNumber PSN ;
PSN.highLongOfPSN = 0 ;
PSN.lowLongOfPSN = kCurrentProcess ;
SetFrontProcess( &PSN ) ;
-
+
for (i = 1; i <= itemsInList; i++) {
AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
(Ptr) & theSpec, sizeof(theSpec), &actualSize);
return noErr ;
}
-// AEQuit attempts to quite the application
+// AEQuit attempts to quit the application
short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
{
- /* wxWindow* win = GetTopWindow() ;
+ wxWindow* win = GetTopWindow() ;
if ( win )
{
- win->Close(TRUE ) ;
+ wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId);
+ if (!win->ProcessEvent(exitEvent))
+ win->Close(TRUE ) ;
}
else
- */
{
ExitMainLoop() ;
}
return noErr ;
}
+// AEROApp calls MacReopenApp
+
+short wxApp::MacHandleAERApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
+{
+ MacReopenApp() ;
+ return noErr ;
+}
+
+
//----------------------------------------------------------------------
// Support Routines linking the Mac...File Calls to the Document Manager
//----------------------------------------------------------------------
{
}
+void wxApp::MacReopenApp()
+{
+ // eventually check for open docs, if none, call MacNewFile
+}
+
//----------------------------------------------------------------------
// Carbon Event Handler
//----------------------------------------------------------------------
-#if TARGET_CARBON
-
- static const EventTypeSpec eventList[] =
- {
- { kEventClassCommand, kEventProcessCommand } ,
- { kEventClassCommand, kEventCommandUpdateStatus } ,
-
- { kEventClassApplication , kEventAppActivated } ,
- { kEventClassApplication , kEventAppDeactivated } ,
- // handling the quit event is not recommended by apple
- // rather using the quit apple event - which we do
-
- { kEventClassAppleEvent , kEventAppleEvent } ,
-
- { kEventClassMouse , kEventMouseDown } ,
- { 'WXMC' , 'WXMC' }
- } ;
-
-static pascal OSStatus MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static const EventTypeSpec eventList[] =
{
- OSStatus result = eventNotHandledErr ;
- UInt32 kind = GetEventKind( event ) ;
-
- return result ;
-}
+ { kEventClassCommand, kEventProcessCommand } ,
+ { kEventClassCommand, kEventCommandUpdateStatus } ,
+
+ { kEventClassMenu, kEventMenuOpening },
+ { kEventClassMenu, kEventMenuClosed },
+ { kEventClassMenu, kEventMenuTargetItem },
-// due to the rather low-level event API of wxWindows, we cannot use RunApplicationEventLoop
-// but have to use ReceiveNextEvent dealing with events manually, therefore we also have
-// deal with clicks in the menu bar explicitely
+ { kEventClassApplication , kEventAppActivated } ,
+ { kEventClassApplication , kEventAppDeactivated } ,
+ // handling the quit event is not recommended by apple
+ // rather using the quit apple event - which we do
-static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+ { kEventClassAppleEvent , kEventAppleEvent } ,
+
+ { kEventClassMouse , kEventMouseDown } ,
+ { kEventClassMouse , kEventMouseMoved } ,
+ { kEventClassMouse , kEventMouseUp } ,
+ { kEventClassMouse , kEventMouseDragged } ,
+ { 'WXMC' , 'WXMC' }
+} ;
+
+static pascal OSStatus
+wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
- OSStatus result = eventNotHandledErr ;
+ wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
- switch( GetEventKind(event) )
+ if ( mbar )
{
- case kEventMouseDown :
- {
- Point point ;
- WindowRef window ;
-
- GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL,
- sizeof( Point ), NULL, &point );
- short windowPart = ::FindWindow(point, &window);
-
- if ( windowPart == inMenuBar )
- {
- MenuSelect( point ) ;
- result = noErr ;
- }
- }
- break ;
- }
+ wxFrame* win = mbar->GetFrame();
+ 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
+
+ wxEventType type=0;
+ MenuCommand cmd=0;
+ switch (GetEventKind(event))
+ {
+ case kEventMenuOpening:
+ type = wxEVT_MENU_OPEN;
+ break;
+ case kEventMenuClosed:
+ type = wxEVT_MENU_CLOSE;
+ break;
+ case kEventMenuTargetItem:
+ type = wxEVT_MENU_HIGHLIGHT;
+ GetEventParameter(event, kEventParamMenuCommand,
+ typeMenuCommand, NULL,
+ sizeof(cmd), NULL, &cmd);
+ if (cmd == 0) return eventNotHandledErr;
+ break;
+ default:
+ wxFAIL_MSG(wxT("Unexpected menu event kind"));
+ break;
+ }
- return result ;
+ wxMenuEvent wxevent(type, cmd);
+ wxevent.SetEventObject(win);
+
+ (void)win->GetEventHandler()->ProcessEvent(wxevent);
+ }
+ }
+
+ return eventNotHandledErr;
}
-static pascal OSStatus CommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus wxMacAppCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
- HICommand command ;
-
- GetEventParameter( event, kEventParamDirectObject, typeHICommand, NULL,
- sizeof( HICommand ), NULL, &command );
+ HICommand command ;
+
+ GetEventParameter( event, kEventParamDirectObject, typeHICommand, NULL,
+ sizeof( HICommand ), NULL, &command );
+
+ MenuCommand id = command.commandID ;
+ if ( id == kHICommandPreferences )
+ id = wxApp::s_macPreferencesMenuItemId ;
- 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 ;
+
+ 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 )
+static pascal OSStatus wxMacAppApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
- switch ( GetEventKind( event ) )
- {
- case kEventAppActivated :
- {
- wxTheApp->MacResume( true ) ;
- result = noErr ;
- }
- break ;
- case kEventAppDeactivated :
- {
- wxTheApp->MacSuspend( true ) ;
- result = noErr ;
- }
- break ;
- default :
- break ;
- }
+ switch ( GetEventKind( event ) )
+ {
+ case kEventAppActivated :
+ {
+ if ( wxTheApp )
+ wxTheApp->SetActive( true , NULL ) ;
+ result = noErr ;
+ }
+ break ;
+ case kEventAppDeactivated :
+ {
+ if ( wxTheApp )
+ wxTheApp->SetActive( false , NULL ) ;
+ result = noErr ;
+ }
+ break ;
+ default :
+ break ;
+ }
return result ;
}
-pascal OSStatus wxAppEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+pascal OSStatus wxMacAppEventHandler( 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 ;
+ case kEventClassCommand :
+ result = wxMacAppCommandEventHandler( handler , event , data ) ;
+ break ;
+ case kEventClassApplication :
+ result = wxMacAppApplicationEventHandler( handler , event , data ) ;
+ break ;
+ case kEventClassMenu :
+ result = wxMacAppMenuEventHandler( handler , event , data ) ;
+ break ;
+ case kEventClassMouse :
+ result = wxMacTopLevelMouseEventHandler( handler , event , NULL ) ;
+ break ;
+ case kEventClassAppleEvent :
+ {
+ EventRecord rec ;
+ wxMacConvertEventToRecord( event , &rec ) ;
+ result = AEProcessAppleEvent( &rec ) ;
+ }
+ break ;
+ default :
+ break ;
}
return result ;
}
-DEFINE_ONE_SHOT_HANDLER_GETTER( wxAppEventHandler )
-
-#endif
+DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler )
-#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__)
// we know it's there ;-)
WXIMPORT char std::__throws_bad_alloc ;
#endif
-bool wxApp::Initialize()
-{
- int error = 0 ;
+pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options,
+ const char *assertionString, const char *exceptionLabelString,
+ const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg)
+{
+ // flow into assert handling
+ wxString fileNameStr ;
+ wxString assertionStr ;
+ wxString exceptionStr ;
+ wxString errorStr ;
+#if wxUSE_UNICODE
+ fileNameStr = wxString(fileName, wxConvLocal);
+ assertionStr = wxString(assertionString, wxConvLocal);
+ exceptionStr = wxString((exceptionLabelString!=0) ? exceptionLabelString : "", wxConvLocal) ;
+ errorStr = wxString((errorString!=0) ? errorString : "", wxConvLocal) ;
+#else
+ fileNameStr = fileName;
+ assertionStr = assertionString;
+ exceptionStr = (exceptionLabelString!=0) ? exceptionLabelString : "" ;
+ errorStr = (errorString!=0) ? errorString : "" ;
+#endif
+
+#if 1
+ // flow into log
+ wxLogDebug( wxT("AssertMacros: %s %s %s file: %s, line: %ld (value %p)\n"),
+ assertionStr.c_str() ,
+ exceptionStr.c_str() ,
+ errorStr.c_str(),
+ fileNameStr.c_str(), lineNumber ,
+ value ) ;
+#else
+
+ wxOnAssert(fileNameStr, lineNumber , assertionStr ,
+ wxString::Format( wxT("%s %s value (%p)") ,exceptionStr, errorStr , value ) ) ;
+#endif
+}
+bool wxApp::Initialize(int& argc, wxChar **argv)
+{
// Mac-specific
- UMAInitToolbox( 4 ) ;
+#if __WXDEBUG__
+ InstallDebugAssertOutputHandler ( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler ) );
+#endif
+ UMAInitToolbox( 4, sm_isEmbedded ) ;
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);
#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 , 20000 , 40 ) ;
+ 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
+ // FIXME CS for some changes outside wxMac does not compile anymore
#if 0
std::__throws_bad_alloc = 0 ;
#endif
s_macCursorRgn = ::NewRgn() ;
- wxClassInfo::InitializeClasses();
-
-#if wxUSE_RESOURCES
-// wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
-#endif
-
-#if wxUSE_THREADS
- wxPendingEventsLocker = new wxCriticalSection;
-#endif
-
- wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
- wxTheColourDatabase->Initialize();
-
-#ifdef __WXDEBUG__
-#if wxUSE_LOG
- // flush the logged messages if any and install a 'safer' log target: the
- // default one (wxLogGui) can't be used after the resources are freed just
- // below and the user suppliedo ne might be even more unsafe (using any
- // wxWindows GUI function is unsafe starting from now)
- wxLog::DontCreateOnDemand();
-
- // this will flush the old messages if any
- delete wxLog::SetActiveTarget(new wxLogStderr);
-#endif // wxUSE_LOG
-#endif
-
- wxWinMacWindowList = new wxList(wxKEY_INTEGER);
- wxWinMacControlList = new wxList(wxKEY_INTEGER);
+ // 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 *));
+ }
+ }
- wxInitializeStockLists();
- wxInitializeStockObjects();
+ if ( !wxAppBase::Initialize(argc, argv) )
+ return false;
-#if wxUSE_WX_RESOURCES
- wxInitializeResourceSystem();
+#if wxUSE_INTL
+ wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
#endif
- wxBitmap::InitStandardHandlers();
-
- wxModule::RegisterModules();
- if (!wxModule::InitializeModules()) {
- return FALSE;
- }
- wxMacCreateNotifierTable() ;
+ wxMacCreateNotifierTable() ;
- UMAShowArrowCursor() ;
+ UMAShowArrowCursor() ;
- return TRUE;
+ return true;
}
bool wxApp::OnInitGui()
{
- if( !wxAppBase::OnInitGui() )
- return false ;
-
-#if TARGET_CARBON
- InstallStandardEventHandler( GetApplicationEventTarget() ) ;
-
- InstallApplicationEventHandler(
- GetwxAppEventHandlerUPP(),
- GetEventTypeCount(eventList), eventList, wxTheApp, &((EventHandlerRef)wxTheApp->m_macEventHandler));
-#endif
-
-#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 , 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 , kAEQuitApplication ,
- NewAEEventHandlerProc(AEHandleQuit) ,
- 0 , FALSE ) ;
-#endif
+ if( !wxAppBase::OnInitGui() )
+ return false ;
+
+ InstallStandardEventHandler( GetApplicationEventTarget() ) ;
+
+ if (!sm_isEmbedded)
+ {
+ InstallApplicationEventHandler(
+ GetwxMacAppEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, wxTheApp, (EventHandlerRef *)&(wxTheApp->m_macEventHandler));
+ }
+
+ if (!sm_isEmbedded)
+ {
+ 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 ) ;
+ }
- return TRUE ;
+ return TRUE ;
}
void wxApp::CleanUp()
{
wxToolTip::RemoveToolTips() ;
-#if wxUSE_LOG
- // flush the logged messages if any and install a 'safer' log target: the
- // default one (wxLogGui) can't be used after the resources are freed just
- // below and the user suppliedo ne might be even more unsafe (using any
- // wxWindows GUI function is unsafe starting from now)
- wxLog::DontCreateOnDemand();
-
- // this will flush the old messages if any
- delete wxLog::SetActiveTarget(new wxLogStderr);
-#endif // wxUSE_LOG
// One last chance for pending objects to be cleaned up
wxTheApp->DeletePendingObjects();
- wxModule::CleanUpModules();
-
-#if wxUSE_WX_RESOURCES
- wxCleanUpResourceSystem();
-#endif
-
- wxDeleteStockObjects() ;
-
- // Destroy all GDI lists, etc.
- wxDeleteStockLists();
-
- delete wxTheColourDatabase;
- wxTheColourDatabase = NULL;
-
- wxBitmap::CleanUpHandlers();
-
wxMacDestroyNotifierTable() ;
- if (wxWinMacWindowList) {
- delete wxWinMacWindowList ;
- }
- if (wxWinMacControlList) {
- delete wxWinMacControlList ;
- }
- delete wxPendingEvents;
-
-#if wxUSE_THREADS
- delete wxPendingEventsLocker;
- // If we don't do the following, we get an apparent memory leak.
- ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
-#endif
-
- wxClassInfo::CleanUpClasses();
#ifndef __DARWIN__
# if __option(profile)
- ProfilerDump( "\papp.prof" ) ;
+ ProfilerDump( (StringPtr)"\papp.prof" ) ;
ProfilerTerm() ;
# endif
#endif
- delete wxTheApp;
- wxTheApp = NULL;
-
-#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
- // At this point we want to check if there are any memory
- // blocks that aren't part of the wxDebugContext itself,
- // as a special case. Then when dumping we need to ignore
- // wxDebugContext, too.
- if (wxDebugContext::CountObjectsLeft(TRUE) > 0)
- {
- wxLogDebug(wxT("There were memory leaks."));
- wxDebugContext::Dump();
- wxDebugContext::PrintStatistics();
- }
- // wxDebugContext::SetStream(NULL, NULL);
-#endif
-
-#if wxUSE_LOG
- // do it as the very last thing because everything else can log messages
- delete wxLog::SetActiveTarget(NULL);
-#endif // wxUSE_LOG
-
-#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();
#if 0
TerminateAE() ;
#endif
+
+ wxAppBase::CleanUp();
}
//----------------------------------------------------------------------
-// wxEntry
+// 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) && defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__)
CFBundleRef gSharedLibraryBundle = NULL;
-#endif /* WXMAKINGDLL && __DARWIN__ */
+#endif /* WXMAKINGDLL_CORE && __DARWIN__ */
wxStAppResource::wxStAppResource()
{
{
gSharedLibraryResource = kResFileNotOpened;
-#ifdef WXMAKINGDLL
+#ifdef WXMAKINGDLL_CORE
if ( initBlock != NULL ) {
const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
FSSpec *fileSpec = NULL;
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;
theModule = NSModuleForSymbol(theSymbol);
theLibPath = NSLibraryNameForModule(theModule);
+ // if we call wxLogDebug from here then, as wxTheApp hasn't been
+ // created yet when we're called from wxApp::Initialize(), wxLog
+ // is going to create a default stderr-based log target instead of
+ // the expected normal GUI one -- don't do it, if we really want
+ // to see this message just use fprintf() here
+#if 0
wxLogDebug( wxT("wxMac library installation name is '%s'"),
theLibPath );
+#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) {
+#if wxUSE_UNICODE
+ theResPath = wxString(theLibPath, wxConvLocal);
+#else
+ theResPath = wxString(theLibPath);
+#endif
+ // 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
&gSharedLibraryResource);
}
if (theErr != noErr) {
- wxLogDebug( wxT("unable to open wxMac resource file '%s'"),
- theResPath );
+#ifdef __WXDEBUG__
+ wxLogDebug( wxT("unable to open wxMac resource file '%s'\n"),
+ 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__
}
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
// the __wxinitialize and __wxterminate must be used
extern "C" {
- void __sinit(void); /* (generated by linker) */
+ void __sinit(void); /* (generated by linker) */
pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
pascal void __terminate(void);
}
__terminate() ;
}
-#endif /* WXMAKINGDLL && !__DARWIN__ */
-
-int WXDLLEXPORT wxEntryStart( int WXUNUSED(argc), char *WXUNUSED(argv)[] )
-{
- return wxApp::Initialize();
-}
-
-int WXDLLEXPORT wxEntryInitGui()
-{
- return wxTheApp->OnInitGui();
-}
-
-void WXDLLEXPORT wxEntryCleanup()
-{
- wxApp::CleanUp();
-}
-
-int wxEntry( int argc, char *argv[] , bool enterLoop )
-{
-#ifdef __MWERKS__
-#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
- // This seems to be necessary since there are 'rogue'
- // objects present at this point (perhaps global objects?)
- // Setting a checkpoint will ignore them as far as the
- // memory checking facility is concerned.
- // Of course you may argue that memory allocated in globals should be
- // checked, but this is a reasonable compromise.
- wxDebugContext::SetCheckpoint();
-#endif
-#endif
- if (!wxEntryStart(argc, argv)) {
- return 0;
- }
- // create the application object or ensure that one already exists
- if (!wxTheApp)
- {
- // The app may have declared a global application object, but we recommend
- // the IMPLEMENT_APP macro is used instead, which sets an initializer
- // function for delayed, dynamic app object construction.
- wxCHECK_MSG( wxApp::GetInitializerFunction(), 0,
- wxT("No initializer - use IMPLEMENT_APP macro.") );
-
- wxTheApp = (wxApp*) (*wxApp::GetInitializerFunction()) ();
- }
-
- wxCHECK_MSG( wxTheApp, 0, wxT("You have to define an instance of wxApp!") );
-
-#ifdef __DARWIN__
- // 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) {
- if (strncmp(argv[1], "-psn_", 5) == 0) {
- // assume the argument is always the only one and remove it
- --argc;
- }
- }
-#else
- argc = 0 ; // currently we don't support files as parameters
-#endif
- // we could try to get the open apple events here to adjust argc and argv better
-
- wxTheApp->argc = argc;
- wxTheApp->argv = argv;
-
- // GUI-specific initialization, such as creating an app context.
- wxEntryInitGui();
-
- // Here frames insert themselves automatically
- // into wxTopLevelWindows by getting created
- // in OnInit().
-
- int retValue = 0;
-
- if ( wxTheApp->OnInit() )
- {
- if ( enterLoop )
- {
- retValue = wxTheApp->OnRun();
- }
- else
- // We want to initialize, but not run or exit immediately.
- return 1;
- }
- //else: app initialization failed, so we skipped OnRun()
-
- wxWindow *topWindow = wxTheApp->GetTopWindow();
- if ( topWindow )
- {
- // Forcibly delete the window.
- if ( topWindow->IsKindOf(CLASSINFO(wxFrame)) ||
- topWindow->IsKindOf(CLASSINFO(wxDialog)) )
- {
- topWindow->Close(TRUE);
- wxTheApp->DeletePendingObjects();
- }
- else
- {
- delete topWindow;
- wxTheApp->SetTopWindow(NULL);
- }
- }
-
- wxTheApp->OnExit();
-
- wxEntryCleanup();
-
- return retValue;
-}
-
-#if TARGET_CARBON
+#endif /* WXMAKINGDLL_CORE && !__DARWIN__ */
bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec)
{
return converted ;
}
-/*
-pascal OSStatus wxMacApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+wxApp::wxApp()
{
- OSStatus result = eventNotHandledErr ;
+ m_printMode = wxPRINT_WINDOWS;
+
+ m_macCurrentEvent = NULL ;
+ m_macCurrentEventHandlerCallRef = NULL ;
+}
+
+int wxApp::MainLoop()
+{
+ m_keepGoing = TRUE;
- EventRecord rec ;
- switch ( GetEventClass( event ) )
+ while (m_keepGoing)
{
- case kEventClassKeyboard :
- if ( wxMacConvertEventToRecord( event , &rec ) )
- {
- wxTheApp->MacHandleModifierEvents( &rec ) ;
- wxTheApp->MacHandleOneEvent( &rec ) ;
- result = noErr ;
- }
- break ;
- case kEventClassTextInput :
- if ( wxMacConvertEventToRecord( event , &rec ) )
- {
- wxTheApp->MacHandleModifierEvents( &rec ) ;
- wxTheApp->MacHandleOneEvent( &rec ) ;
- result = noErr ;
- }
- break ;
- default :
- break ;
+ MacDoOneEvent() ;
}
- return result ;
-}
-*/
-#endif
-
-// Static member initialization
-wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL;
-
-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;
-}
-
-bool wxApp::Initialized()
-{
- if (GetTopWindow())
- return TRUE;
- else
- return FALSE;
-}
-
-int wxApp::MainLoop()
-{
- m_keepGoing = TRUE;
-
- while (m_keepGoing)
- {
- MacDoOneEvent() ;
- }
-
- return 0;
-}
-
-// Returns TRUE if more time is needed.
-bool wxApp::ProcessIdle()
-{
- wxIdleEvent event;
- event.SetEventObject(this);
- ProcessEvent(event);
-
- return event.MoreRequested();
+ return 0;
}
void wxApp::ExitMainLoop()
{
- m_keepGoing = FALSE;
+ m_keepGoing = FALSE;
}
// Is a message/event pending?
bool wxApp::Pending()
{
-#if TARGET_CARBON
- return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ;
-#else
- EventRecord event ;
-
- return EventAvail( everyEvent , &event ) ;
-#endif
+ // without the receive event (with pull param = false ) nothing is ever reported
+ EventRef theEvent;
+ ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &theEvent);
+ return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ;
}
// Dispatch a message.
-void wxApp::Dispatch()
+bool wxApp::Dispatch()
{
MacDoOneEvent() ;
+
+ return true;
}
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();
}
-void wxWakeUpIdle()
+void wxApp::WakeUpIdle()
{
wxMacWakeUp() ;
}
-// Send idle event to all top-level windows
-bool wxApp::SendIdleEvents()
-{
- bool needMore = FALSE;
- wxNode* node = wxTopLevelWindows.First();
- while (node)
- {
- wxWindow* win = (wxWindow*) node->Data();
- if (SendIdleEvents(win))
- needMore = TRUE;
-
- node = node->Next();
- }
- 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;
-
- wxNode* node = win->GetChildren().First();
- while (node)
- {
- wxWindow* win = (wxWindow*) node->Data();
- if (SendIdleEvents(win))
- needMore = TRUE;
-
- node = node->Next();
- }
- return needMore ;
-}
-
-void wxApp::DeletePendingObjects()
-{
- wxNode *node = wxPendingDelete.First();
- while (node)
- {
- wxObject *obj = (wxObject *)node->Data();
-
- delete obj;
-
- if (wxPendingDelete.Member(obj))
- delete node;
-
- // Deleting one object may have deleted other pending
- // objects, so start from beginning of list again.
- node = wxPendingDelete.First();
- }
-}
-
-void wxExit()
+void wxApp::Exit()
{
- wxLogError(_("Fatal error: exiting"));
-
wxApp::CleanUp();
::ExitToShell() ;
}
#if wxUSE_THREADS
YieldToAnyThread() ;
#endif
- // by definition yield should handle all non-processed events
-#if TARGET_CARBON
- EventRef theEvent;
-
- OSStatus status = noErr ;
- do
- {
- s_inReceiveEvent = true ;
- status = ReceiveNextEvent(0, NULL,kEventDurationNoWait,true,&theEvent) ;
- s_inReceiveEvent = false ;
-
- if ( status == eventLoopTimedOutErr )
- {
- // make sure next time the event loop will trigger idle events
- sleepTime = kEventDurationNoWait ;
- }
- else if ( status == eventLoopQuitErr )
- {
- // according to QA1061 this may also occur when a WakeUp Process
- // is executed
- }
- else
- {
- MacHandleOneEvent( theEvent ) ;
- ReleaseEvent(theEvent);
- }
- } while( status == noErr ) ;
-#else
- EventRecord event ;
+ // by definition yield should handle all non-processed events
- // having a larger value here leads to large performance slowdowns
- // so we cannot give background apps more processor time here
- // we do so however having a large sleep value in the main event loop
- sleepTime = 0 ;
+ EventRef theEvent;
- while ( !IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, (RgnHandle) wxApp::s_macCursorRgn))
+ OSStatus status = noErr ;
+ do
{
- MacHandleModifierEvents( &event ) ;
- MacHandleOneEvent( &event );
- if ( event.what != kHighLevelEvent )
- SetRectRgn( (RgnHandle) wxApp::s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
- }
- MacHandleModifierEvents( &event ) ;
-#endif
+ s_inReceiveEvent = true ;
+ status = ReceiveNextEvent(0, NULL,kEventDurationNoWait,true,&theEvent) ;
+ s_inReceiveEvent = false ;
+
+ if ( status == eventLoopTimedOutErr )
+ {
+ // make sure next time the event loop will trigger idle events
+ sleepTime = kEventDurationNoWait ;
+ }
+ else if ( status == eventLoopQuitErr )
+ {
+ // according to QA1061 this may also occur when a WakeUp Process
+ // is executed
+ }
+ else
+ {
+ MacHandleOneEvent( theEvent ) ;
+ ReleaseEvent(theEvent);
+ }
+ } while( status == noErr ) ;
wxMacProcessNotifierAndPendingEvents() ;
s_inYield = FALSE;
return TRUE;
}
-// platform specifics
-
-void wxApp::MacSuspend( bool convertClipboard )
-{
-#if !TARGET_CARBON
- // we have to deactive the top level windows manually
-
- wxNode* node = wxTopLevelWindows.First();
- while (node)
- {
- wxTopLevelWindow* win = (wxTopLevelWindow*) node->Data();
- win->MacActivate( ((EventRecord*) MacGetCurrentEvent())->when , false ) ;
-
- node = node->Next();
- }
-
- ::HideFloatingWindows() ;
-#endif
- s_lastMouseDown = 0 ;
-
- if( convertClipboard )
- {
- MacConvertPrivateToPublicScrap() ;
- }
-}
-
-extern wxList wxModalDialogs;
-
-void wxApp::MacResume( bool convertClipboard )
-{
- s_lastMouseDown = 0 ;
- if( convertClipboard )
- {
- MacConvertPublicToPrivateScrap() ;
- }
-
-#if !TARGET_CARBON
- ::ShowFloatingWindows() ;
- // raise modal dialogs in case a non modal window was selected to activate the app
-
- wxNode* node = wxModalDialogs.First();
- while (node)
- {
- wxDialog* dialog = (wxDialog *) node->Data();
- dialog->Raise();
-
- node = node->Next();
- }
-#endif
-}
-
-void wxApp::MacConvertPrivateToPublicScrap()
-{
-}
-
-void wxApp::MacConvertPublicToPrivateScrap()
-{
-}
-
void wxApp::MacDoOneEvent()
{
-#if TARGET_CARBON
- EventRef theEvent;
-
- s_inReceiveEvent = true ;
- OSStatus status = ReceiveNextEvent(0, NULL,sleepTime,true,&theEvent) ;
- s_inReceiveEvent = false ;
- if ( status == eventLoopTimedOutErr )
- {
- if ( wxTheApp->ProcessIdle() )
- sleepTime = kEventDurationNoWait ;
- else
- sleepTime = kEventDurationForever ;
- }
- else if ( status == eventLoopQuitErr )
- {
- // according to QA1061 this may also occur when a WakeUp Process
- // is executed
- }
- else
- {
- MacHandleOneEvent( theEvent ) ;
- ReleaseEvent(theEvent);
- }
-#else
- EventRecord event ;
-
- EventMask eventMask = everyEvent ;
+ EventRef theEvent;
- if (WaitNextEvent(eventMask, &event, sleepTime, (RgnHandle) s_macCursorRgn))
+ s_inReceiveEvent = true ;
+ OSStatus status = ReceiveNextEvent(0, NULL,sleepTime,true,&theEvent) ;
+ s_inReceiveEvent = false ;
+ if ( status == eventLoopTimedOutErr )
{
- MacHandleModifierEvents( &event ) ;
- MacHandleOneEvent( &event );
- }
- else
- {
- MacHandleModifierEvents( &event ) ;
- // idlers
- WindowPtr window = ::FrontWindow() ;
- if ( window )
- ::IdleControls( window ) ;
-
if ( wxTheApp->ProcessIdle() )
- sleepTime = 0 ;
+ sleepTime = kEventDurationNoWait ;
else
- sleepTime = GetCaretTime() / 2 ;
- }
- if ( event.what != kHighLevelEvent )
- SetRectRgn( (RgnHandle) s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
-#endif
- // repeaters
-
- DeletePendingObjects() ;
- wxMacProcessNotifierAndPendingEvents() ;
-}
-
-void wxApp::MacHandleOneEvent( WXEVENTREF evr )
-{
-#if TARGET_CARBON
- EventTargetRef theTarget;
- theTarget = GetEventDispatcherTarget();
- m_macCurrentEvent = evr ;
- SendEventToEventTarget ((EventRef) evr , theTarget);
-#else
- EventRecord* ev = (EventRecord*) evr ;
- m_macCurrentEvent = ev ;
-
- wxApp::sm_lastMessageTime = ev->when ;
-
- switch (ev->what)
- {
- case mouseDown:
- MacHandleMouseDownEvent( ev ) ;
- if ( ev->modifiers & controlKey )
- s_lastMouseDown = 2;
- else
- s_lastMouseDown = 1;
- break;
- case mouseUp:
- if ( s_lastMouseDown == 2 )
+ {
+#if wxUSE_THREADS
+ if (g_numberOfThreads)
{
- ev->modifiers |= controlKey ;
+ YieldToAnyThread() ;
+ sleepTime = kEventDurationNoWait;
}
else
+#endif // wxUSE_THREADS
{
- ev->modifiers &= ~controlKey ;
+ sleepTime = kEventDurationSecond;
}
- MacHandleMouseUpEvent( ev ) ;
- s_lastMouseDown = 0;
- break;
- case activateEvt:
- MacHandleActivateEvent( ev ) ;
- break;
- case updateEvt:
- MacHandleUpdateEvent( ev ) ;
- break;
- case keyDown:
- case autoKey:
- MacHandleKeyDownEvent( ev ) ;
- break;
- case keyUp:
- MacHandleKeyUpEvent( ev ) ;
- break;
- case diskEvt:
- MacHandleDiskEvent( ev ) ;
- break;
- case osEvt:
- MacHandleOSEvent( ev ) ;
- break;
- case kHighLevelEvent:
- MacHandleHighLevelEvent( ev ) ;
- break;
- default:
- break;
+ }
}
-#endif
- wxMacProcessNotifierAndPendingEvents() ;
-}
-
-#if !TARGET_CARBON
-bool s_macIsInModalLoop = false ;
-
-void wxApp::MacHandleModifierEvents( WXEVENTREF evr )
-{
- EventRecord* ev = (EventRecord*) evr ;
- if ( ev->modifiers != s_lastModifiers && wxWindow::FindFocus() != NULL )
+ else if ( status == eventLoopQuitErr )
{
- wxKeyEvent event(wxEVT_KEY_DOWN);
-
- event.m_shiftDown = ev->modifiers & shiftKey;
- event.m_controlDown = ev->modifiers & controlKey;
- event.m_altDown = ev->modifiers & optionKey;
- event.m_metaDown = ev->modifiers & cmdKey;
-
- event.m_x = ev->where.h;
- event.m_y = ev->where.v;
- event.m_timeStamp = ev->when;
- wxWindow* focus = wxWindow::FindFocus() ;
- event.SetEventObject(focus);
-
- if ( (ev->modifiers ^ s_lastModifiers ) & controlKey )
- {
- event.m_keyCode = WXK_CONTROL ;
- event.SetEventType( ( ev->modifiers & controlKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
- focus->GetEventHandler()->ProcessEvent( event ) ;
- }
- if ( (ev->modifiers ^ s_lastModifiers ) & shiftKey )
- {
- event.m_keyCode = WXK_SHIFT ;
- event.SetEventType( ( ev->modifiers & shiftKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
- focus->GetEventHandler()->ProcessEvent( event ) ;
- }
- if ( (ev->modifiers ^ s_lastModifiers ) & optionKey )
- {
- event.m_keyCode = WXK_ALT ;
- event.SetEventType( ( ev->modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
- focus->GetEventHandler()->ProcessEvent( event ) ;
- }
- s_lastModifiers = ev->modifiers ;
+ // according to QA1061 this may also occur when a WakeUp Process
+ // is executed
}
-}
+ else
+ {
+ MacHandleOneEvent( theEvent ) ;
+ ReleaseEvent(theEvent);
+ sleepTime = kEventDurationNoWait ;
+ }
+ // repeaters
-void wxApp::MacHandleHighLevelEvent( WXEVENTREF evr )
-{
- // we must avoid reentrancy problems when processing high level events eg printing
- bool former = s_inYield ;
- s_inYield = TRUE ;
- EventRecord* ev = (EventRecord*) evr ;
- ::AEProcessAppleEvent( ev ) ;
- s_inYield = former ;
+ DeletePendingObjects() ;
+ wxMacProcessNotifierAndPendingEvents() ;
}
-void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr )
+/*virtual*/ void wxApp::MacHandleUnhandledEvent( WXEVENTREF evr )
{
- EventRecord* ev = (EventRecord*) evr ;
- wxToolTip::RemoveToolTips() ;
-
- WindowRef window;
- WindowRef frontWindow = ::FrontNonFloatingWindow() ;
- WindowAttributes frontWindowAttributes = NULL ;
- if ( frontWindow )
- ::GetWindowAttributes( frontWindow , &frontWindowAttributes ) ;
-
- short windowPart = ::FindWindow(ev->where, &window);
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
- if ( wxPendingDelete.Member(win) )
- return ;
-
- BitMap screenBits;
- GetQDGlobalsScreenBits( &screenBits );
-
- switch (windowPart)
- {
- case inMenuBar :
- if ( s_macIsInModalLoop )
- {
- SysBeep ( 30 ) ;
- }
- else
- {
- UInt32 menuresult = MenuSelect(ev->where) ;
- MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) );
- s_lastMouseDown = 0;
- }
- break ;
- case inSysWindow :
- SystemClick( ev , window ) ;
- s_lastMouseDown = 0;
- break ;
- case inDrag :
- if ( window != frontWindow && s_macIsInModalLoop && !(ev->modifiers & cmdKey ) )
- {
- SysBeep ( 30 ) ;
- }
- else
- {
- DragWindow(window, ev->where, &screenBits.bounds);
- if (win)
- {
- GrafPtr port ;
- GetPort( &port ) ;
- Point pt = { 0, 0 } ;
- SetPortWindowPort(window) ;
- LocalToGlobal( &pt ) ;
- SetPort( port ) ;
- win->SetSize( pt.h , pt.v , -1 ,
- -1 , wxSIZE_USE_EXISTING);
- }
- s_lastMouseDown = 0;
- }
- break ;
- case inGoAway:
- if (TrackGoAway(window, ev->where))
- {
- if ( win )
- win->Close() ;
- }
- s_lastMouseDown = 0;
- break;
- case inGrow:
- {
- Rect newContentRect ;
- Rect constraintRect ;
- constraintRect.top = win->GetMinHeight() ;
- if ( constraintRect.top == -1 )
- constraintRect.top = 0 ;
- constraintRect.left = win->GetMinWidth() ;
- if ( constraintRect.left == -1 )
- constraintRect.left = 0 ;
- constraintRect.right = win->GetMaxWidth() ;
- if ( constraintRect.right == -1 )
- constraintRect.right = 32000 ;
- constraintRect.bottom = win->GetMaxHeight() ;
- if ( constraintRect.bottom == -1 )
- constraintRect.bottom = 32000 ;
-
- Boolean growResult = ResizeWindow( window , ev->where ,
- &constraintRect , &newContentRect ) ;
- if ( growResult )
- {
- win->SetSize( newContentRect.left , newContentRect.top ,
- newContentRect.right - newContentRect.left ,
- newContentRect.bottom - newContentRect.top, wxSIZE_USE_EXISTING);
- }
- s_lastMouseDown = 0;
- }
- break;
- case inZoomIn:
- case inZoomOut:
- if (TrackBox(window, ev->where, windowPart))
- {
- // TODO setup size event
- ZoomWindow( window , windowPart , false ) ;
- if (win)
- {
- Rect tempRect ;
- GrafPtr port ;
- GetPort( &port ) ;
- Point pt = { 0, 0 } ;
- SetPortWindowPort(window) ;
- LocalToGlobal( &pt ) ;
- SetPort( port ) ;
-
- GetWindowPortBounds(window, &tempRect ) ;
- win->SetSize( pt.h , pt.v , tempRect.right-tempRect.left ,
- tempRect.bottom-tempRect.top, wxSIZE_USE_EXISTING);
- }
- }
- s_lastMouseDown = 0;
- break;
- case inCollapseBox :
- // TODO setup size event
- s_lastMouseDown = 0;
- break ;
-
- case inContent :
- {
- GrafPtr port ;
- GetPort( &port ) ;
- SetPortWindowPort(window) ;
- SetPort( port ) ;
- }
- if ( window != frontWindow && wxTheApp->s_captureWindow == NULL )
- {
- if ( s_macIsInModalLoop )
- {
- SysBeep ( 30 ) ;
- }
- else if ( UMAIsWindowFloating( window ) )
- {
- if ( win )
- win->MacMouseDown( ev , windowPart ) ;
- }
- else
- {
- if ( win )
- win->MacMouseDown( ev , windowPart ) ;
- ::SelectWindow( window ) ;
- }
- }
- else
- {
- if ( win )
- win->MacMouseDown( ev , windowPart ) ;
- }
- break ;
- default:
- break;
- }
+ // Override to process unhandled events as you please
}
-void wxApp::MacHandleMouseUpEvent( WXEVENTREF evr )
+void wxApp::MacHandleOneEvent( WXEVENTREF evr )
{
- EventRecord* ev = (EventRecord*) evr ;
- WindowRef window;
-
- short windowPart = inNoWindow ;
- if ( wxTheApp->s_captureWindow )
- {
- window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
- windowPart = inContent ;
- }
- else
- {
- windowPart = ::FindWindow(ev->where, &window) ;
- }
-
- switch (windowPart)
+ EventTargetRef theTarget;
+ theTarget = GetEventDispatcherTarget();
+ m_macCurrentEvent = evr ;
+ OSStatus status = SendEventToEventTarget ((EventRef) evr , theTarget);
+ if(status == eventNotHandledErr)
{
- case inMenuBar :
- break ;
- case inSysWindow :
- break ;
- default:
- {
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
- if ( win )
- win->MacMouseUp( ev , windowPart ) ;
- }
- break;
+ MacHandleUnhandledEvent(evr);
}
+ wxMacProcessNotifierAndPendingEvents() ;
+#if wxUSE_THREADS
+ wxMutexGuiLeaveOrEnter();
+#endif // wxUSE_THREADS
}
-#endif
-
long wxMacTranslateKey(unsigned char key, unsigned char code) ;
long wxMacTranslateKey(unsigned char key, unsigned char code)
{
return retval;
}
-#if !TARGET_CARBON
-void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
+int wxMacKeyCodeToModifier(wxKeyCode key)
{
- EventRecord* ev = (EventRecord*) evr ;
- wxToolTip::RemoveToolTips() ;
-
- UInt32 menuresult = UMAMenuEvent(ev) ;
- if ( HiWord( menuresult ) )
- {
- if ( !s_macIsInModalLoop )
- MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ;
- }
- else
+ switch (key)
{
- wxWindow* focus = wxWindow::FindFocus() ;
-
- if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
- {
- // has not been handled -> perform default
- wxControl* control = wxDynamicCast( focus , wxControl ) ;
- if ( control && control->GetMacControl() != NULL )
- {
- short keycode ;
- short keychar ;
- keychar = short(ev->message & charCodeMask);
- keycode = short(ev->message & keyCodeMask) >> 8 ;
- ::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ;
- }
- }
+ case WXK_START:
+ case WXK_MENU:
+ return cmdKey;
+
+ case WXK_SHIFT:
+ return shiftKey;
+
+ case WXK_CAPITAL:
+ return alphaLock;
+
+ case WXK_ALT:
+ return optionKey;
+
+ case WXK_CONTROL:
+ return controlKey;
+
+ default:
+ return 0;
}
}
-void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr )
+bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below
{
- EventRecord* ev = (EventRecord*) evr ;
- wxToolTip::RemoveToolTips() ;
-
- UInt32 menuresult = UMAMenuEvent(ev) ;
- if ( HiWord( menuresult ) )
- {
- }
- else
- {
- MacSendKeyUpEvent( wxWindow::FindFocus() , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) ;
- }
+//#ifdef __DARWIN__
+// wxHIDKeyboard keyboard;
+// return keyboard.IsActive(key);
+//#else
+// TODO: Have it use HID Manager on OSX...
+//if OS X > 10.2 (i.e. 10.2.x)
+//a known apple bug prevents the system from determining led
+//states with GetKeys... can only determine caps lock led
+ return !!(GetCurrentKeyModifiers() & wxMacKeyCodeToModifier(key));
+//else
+// KeyMapByteArray keymap;
+// GetKeys((BigEndianLong*)keymap);
+// return !!(BitTst(keymap, (sizeof(KeyMapByteArray)*8) - iKey));
+//#endif
}
-#endif
bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
{
if ( !focus )
return false ;
-
+
short keycode ;
short keychar ;
keychar = short(keymessage & charCodeMask);
keycode = short(keymessage & keyCodeMask) >> 8 ;
-
+
if ( modifiers & ( controlKey|shiftKey|optionKey ) )
{
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
keycode = short(keyInfo & keyCodeMask) >> 8 ;
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
- long realkeyval = keyval ;
- if ( keyval == keychar )
- {
- // we are not on a special character combo -> pass the real os event-value to EVT_CHAR, but not to EVT_KEY (make upper first)
- realkeyval = short(keymessage & charCodeMask) ;
- keyval = wxToupper( keyval ) ;
- }
-
+ long realkeyval = keyval ;
+ if ( keyval == keychar )
+ {
+ // we are not on a special character combo -> pass the real os event-value to EVT_CHAR, but not to EVT_KEY (make upper first)
+ realkeyval = short(keymessage & charCodeMask) ;
+ keyval = wxToupper( keyval ) ;
+ }
+
wxKeyEvent event(wxEVT_KEY_DOWN);
bool handled = false ;
event.m_shiftDown = modifiers & shiftKey;
if ( handled && event.GetSkipped() )
handled = false ;
}
- if ( !handled &&
- (keyval == WXK_TAB) &&
-// CS: copied the change below from wxGTK
-// VZ: testing for wxTE_PROCESS_TAB shouldn't be done here the control may
-// have this style, yet choose not to process this particular TAB in which
-// case TAB must still work as a navigational character
-#if 0
- (!focus->HasFlag(wxTE_PROCESS_TAB)) &&
-#endif
- (focus->GetParent()) &&
- (focus->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
+ if ( !handled && (keyval == WXK_TAB) )
{
- wxNavigationKeyEvent new_event;
- new_event.SetEventObject( focus );
- new_event.SetDirection( !event.ShiftDown() );
- /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
- new_event.SetWindowChange( event.ControlDown() );
- new_event.SetCurrentFocus( focus );
- handled = focus->GetEventHandler()->ProcessEvent( new_event );
- if ( handled && new_event.GetSkipped() )
- handled = false ;
+ wxWindow* iter = focus->GetParent() ;
+ while( iter && !handled )
+ {
+ if ( iter->HasFlag( wxTAB_TRAVERSAL ) )
+ {
+ wxNavigationKeyEvent new_event;
+ new_event.SetEventObject( focus );
+ new_event.SetDirection( !event.ShiftDown() );
+ /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
+ new_event.SetWindowChange( event.ControlDown() );
+ new_event.SetCurrentFocus( focus );
+ handled = focus->GetParent()->GetEventHandler()->ProcessEvent( new_event );
+ if ( handled && new_event.GetSkipped() )
+ handled = false ;
+ }
+ iter = iter->GetParent() ;
+ }
}
// backdoor handler for default return and command escape
if ( !handled && (!focus->IsKindOf(CLASSINFO(wxControl) ) || !focus->MacCanFocus() ) )
}
long keyval = wxMacTranslateKey(keychar, keycode) ;
- if ( keyval == keychar )
- {
- keyval = wxToupper( keyval ) ;
- }
+ if ( keyval == keychar )
+ {
+ keyval = wxToupper( keyval ) ;
+ }
bool handled = false ;
wxKeyEvent event(wxEVT_KEY_UP);
return handled ;
}
-
-#if !TARGET_CARBON
-void wxApp::MacHandleActivateEvent( WXEVENTREF evr )
-{
- EventRecord* ev = (EventRecord*) evr ;
- WindowRef window = (WindowRef) ev->message ;
- if ( window )
- {
- bool activate = (ev->modifiers & activeFlag ) ;
- WindowClass wclass ;
- ::GetWindowClass ( window , &wclass ) ;
- if ( wclass == kFloatingWindowClass )
- {
- // if it is a floater we activate/deactivate the front non-floating window instead
- window = ::FrontNonFloatingWindow() ;
- }
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
- if ( win )
- win->MacActivate( ev->when , activate ) ;
- }
-}
-
-void wxApp::MacHandleUpdateEvent( WXEVENTREF evr )
-{
- EventRecord* ev = (EventRecord*) evr ;
- WindowRef window = (WindowRef) ev->message ;
- wxTopLevelWindowMac * win = wxFindWinFromMacWindow( window ) ;
- if ( win )
- {
- if ( !wxPendingDelete.Member(win) )
- win->MacUpdate( ev->when ) ;
- }
- else
- {
- // since there is no way of telling this foreign window to update itself
- // we have to invalidate the update region otherwise we keep getting the same
- // event over and over again
- BeginUpdate( window ) ;
- EndUpdate( window ) ;
- }
-}
-
-void wxApp::MacHandleDiskEvent( WXEVENTREF evr )
-{
- EventRecord* ev = (EventRecord*) evr ;
- if ( HiWord( ev->message ) != noErr )
- {
- OSErr err ;
- Point point ;
- SetPt( &point , 100 , 100 ) ;
-
- err = DIBadMount( point , ev->message ) ;
- wxASSERT( err == noErr ) ;
- }
-}
-
-void wxApp::MacHandleOSEvent( WXEVENTREF evr )
-{
- EventRecord* ev = (EventRecord*) evr ;
- switch( ( ev->message & osEvtMessageMask ) >> 24 )
- {
- case suspendResumeMessage :
- {
- bool isResuming = ev->message & resumeFlag ;
- bool convertClipboard = ev->message & convertClipboardFlag ;
-
- bool doesActivate = UMAGetProcessModeDoesActivateOnFGSwitch() ;
- if ( isResuming )
- {
- WindowRef oldFrontWindow = NULL ;
- WindowRef newFrontWindow = NULL ;
-
- // in case we don't take care of activating ourselves, we have to synchronize
- // our idea of the active window with the process manager's - which it already activated
-
- if ( !doesActivate )
- oldFrontWindow = ::FrontNonFloatingWindow() ;
-
- MacResume( convertClipboard ) ;
-
- newFrontWindow = ::FrontNonFloatingWindow() ;
-
- if ( oldFrontWindow )
- {
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( oldFrontWindow ) ;
- if ( win )
- win->MacActivate( ev->when , false ) ;
- }
- if ( newFrontWindow )
- {
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( newFrontWindow ) ;
- if ( win )
- win->MacActivate( ev->when , true ) ;
- }
- }
- else
- {
- MacSuspend( convertClipboard ) ;
- }
- }
- break ;
- case mouseMovedMessage :
- {
- WindowRef window;
-
- wxWindow* currentMouseWindow = NULL ;
-
- if (s_captureWindow )
- {
- currentMouseWindow = s_captureWindow ;
- }
- else
- {
- wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) ,
- ¤tMouseWindow ) ;
- }
-
- if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
- {
- wxMouseEvent event ;
-
- bool isDown = !(ev->modifiers & btnState) ; // 1 is for up
- bool controlDown = ev->modifiers & controlKey ; // for simulating right mouse
-
- event.m_leftDown = isDown && !controlDown;
- event.m_middleDown = FALSE;
- event.m_rightDown = isDown && controlDown;
- event.m_shiftDown = ev->modifiers & shiftKey;
- event.m_controlDown = ev->modifiers & controlKey;
- event.m_altDown = ev->modifiers & optionKey;
- event.m_metaDown = ev->modifiers & cmdKey;
- event.m_x = ev->where.h;
- event.m_y = ev->where.v;
- event.m_timeStamp = ev->when;
- event.SetEventObject(this);
-
- if ( wxWindow::s_lastMouseWindow )
- {
- wxMouseEvent eventleave(event);
- eventleave.SetEventType( wxEVT_LEAVE_WINDOW );
- wxWindow::s_lastMouseWindow->ScreenToClient( &eventleave.m_x, &eventleave.m_y );
- eventleave.SetEventObject( wxWindow::s_lastMouseWindow ) ;
-
- wxWindow::s_lastMouseWindow->GetEventHandler()->ProcessEvent(eventleave);
- }
- if ( currentMouseWindow )
- {
- wxMouseEvent evententer(event);
- evententer.SetEventType( wxEVT_ENTER_WINDOW );
- currentMouseWindow->ScreenToClient( &evententer.m_x, &evententer.m_y );
- evententer.SetEventObject( currentMouseWindow ) ;
- currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
- }
- wxWindow::s_lastMouseWindow = currentMouseWindow ;
- }
-
- short windowPart = inNoWindow ;
-
- if ( s_captureWindow )
- {
- window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
- windowPart = inContent ;
- }
- else
- {
- windowPart = ::FindWindow(ev->where, &window);
- }
-
- switch (windowPart)
- {
- case inContent :
- {
- wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
- if ( win )
- win->MacMouseMoved( ev , windowPart ) ;
- else
- {
- if ( wxIsBusy() )
- {
- }
- else
- UMAShowArrowCursor();
- }
- }
- break;
- default :
- {
- if ( wxIsBusy() )
- {
- }
- else
- UMAShowArrowCursor();
- }
- break ;
- }
- }
- break ;
-
- }
-}
-#endif
-
-void wxApp::MacHandleMenuCommand( wxUint32 id )
-{
- wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ;
- wxMenu* menu = NULL ;
- wxMenuItem* item = NULL ;
- if ( mbar )
- {
- item = mbar->FindItem( id , &menu ) ;
- }
- wxCHECK_RET( item != NULL && menu != NULL && mbar != NULL, wxT("error in menu item callback") );
-
- if (item->IsCheckable())
- {
- item->Check( !item->IsChecked() ) ;
- }
-
- menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ;
-}
-
-#if !TARGET_CARBON
-void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum )
-{
- if (macMenuId == 0)
- return; // no menu item selected
-
- if (macMenuId == kwxMacAppleMenuId && macMenuItemNum > 1)
- {
- #if ! TARGET_CARBON
- Str255 deskAccessoryName ;
- GrafPtr savedPort ;
-
- GetMenuItemText(GetMenuHandle(kwxMacAppleMenuId), macMenuItemNum, deskAccessoryName);
- GetPort(&savedPort);
- OpenDeskAcc(deskAccessoryName);
- SetPort(savedPort);
- #endif
- }
- else
- {
- MenuCommand id ;
- GetMenuItemCommandID( GetMenuHandle(macMenuId) , macMenuItemNum , &id ) ;
- MacHandleMenuCommand( id ) ;
- }
- HiliteMenu(0);
-}
-#endif
\ No newline at end of file