extern wxList wxPendingDelete;
extern wxList *wxWinMacWindowList;
extern wxList *wxWinMacControlList;
+extern size_t g_numberOfThreads;
// statics for implementation
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 = wxT("&Help") ;
+// Normally we're not a plugin
+bool wxApp::sm_isEmbedded = false;
//----------------------------------------------------------------------
// Core Apple Event Support
//----------------------------------------------------------------------
short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
{
- /* wxWindow* win = GetTopWindow() ;
+ wxWindow* win = GetTopWindow() ;
if ( win )
{
win->Close(TRUE ) ;
}
- else
- */
+ else
{
ExitMainLoop() ;
}
{ kEventClassMouse , kEventMouseDown } ,
{ kEventClassMouse , kEventMouseMoved } ,
+ { kEventClassMouse , kEventMouseUp } ,
+ { kEventClassMouse , kEventMouseDragged } ,
{ 'WXMC' , 'WXMC' }
} ;
// but have to use ReceiveNextEvent dealing with events manually, therefore we also have
// deal with clicks in the menu bar explicitely
+pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ;
+
static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
}
}
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 ) ) ) ;
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 ;
break ;
case kEventCommandUpdateStatus:
// eventually trigger an updateui round
- result = noErr ;
+ result = noErr ;
break ;
default :
break ;
// Mac-specific
- UMAInitToolbox( 4 ) ;
+ UMAInitToolbox( 4, sm_isEmbedded ) ;
SetEventMask( everyEvent ) ;
UMAShowWatchCursor() ;
#ifndef __DARWIN__
# if __option(profile)
- ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
+ ProfilerInit( collectDetailed, bestTimeBase , 40000 , 50 ) ;
# endif
#endif
#endif
#endif
- wxMacSetupConverters() ;
s_macCursorRgn = ::NewRgn() ;
if ( argc > 1 )
{
static const wxChar *ARG_PSN = _T("-psn_");
- if ( wxStrncmp(argv[1], ARG_PSN, sizeof(ARG_PSN) - 1) == 0 )
+ if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
{
// remove this argument
- memmove(argv, argv + 1, argc--);
+ --argc;
+ memmove(argv + 1, argv + 2, argc * sizeof(char *));
}
}
#if TARGET_CARBON
InstallStandardEventHandler( GetApplicationEventTarget() ) ;
- InstallApplicationEventHandler(
- GetwxAppEventHandlerUPP(),
- GetEventTypeCount(eventList), eventList, wxTheApp, (EventHandlerRef *)&(wxTheApp->m_macEventHandler));
+ 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 , kAEQuitApplication ,
- NewAEEventHandlerUPP(AEHandleQuit) ,
- 0 , FALSE ) ;
+ 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 ) ;
+ 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
+ }
return TRUE ;
}
// __wxterminate in Mach-O shared libraries
wxStAppResource::CloseSharedLibraryResource();
#endif
- wxMacCleanupConverters() ;
UMACleanupToolbox() ;
if (s_macCursorRgn) {
// allocate copy to replace .dylib.* extension with .rsrc
if (theLibPath != NULL) {
- theResPath = theLibPath;
+#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"
}
if (theErr != noErr) {
#ifdef __WXDEBUG__
- fprintf(stderr,
- wxT("unable to open wxMac resource file '%s'\n"),
- theResPath.mb_str() );
+ wxLogDebug( wxT("unable to open wxMac resource file '%s'\n"),
+ theResPath.mb_str() );
#endif // __WXDEBUG__
}
m_auto3D = TRUE;
m_macCurrentEvent = NULL ;
+#if TARGET_CARBON
m_macCurrentEventHandlerCallRef = NULL ;
-}
-
-bool wxApp::Initialized()
-{
- if (GetTopWindow())
- return TRUE;
- else
- return FALSE;
+#endif
}
int wxApp::MainLoop()
}
// Dispatch a message.
-void wxApp::Dispatch()
+bool wxApp::Dispatch()
{
MacDoOneEvent() ;
+
+ return true;
}
void wxApp::OnIdle(wxIdleEvent& event)
if ( wxTheApp->ProcessIdle() )
sleepTime = kEventDurationNoWait ;
else
- sleepTime = kEventDurationForever ;
+ {
+ if (g_numberOfThreads)
+ {
+ sleepTime = kEventDurationNoWait;
+ }
+ else
+ {
+ sleepTime = kEventDurationSecond;
+ }
+ }
}
else if ( status == eventLoopQuitErr )
{
::IdleControls( window ) ;
if ( wxTheApp->ProcessIdle() )
- sleepTime = 0 ;
+ sleepTime = kEventDurationNoWait;
else
- sleepTime = GetCaretTime() / 2 ;
+ {
+ if (g_numberOfThreads)
+ {
+ sleepTime = kEventDurationNoWait;
+ }
+ else
+ {
+ sleepTime = kEventDurationSecond;
+ }
+ }
}
if ( event.what != kHighLevelEvent )
SetRectRgn( (RgnHandle) s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
wxMacProcessNotifierAndPendingEvents() ;
}
+/*virtual*/ void wxApp::MacHandleUnhandledEvent( WXEVENTREF evr )
+{
+ // Override to process unhandled events as you please
+}
+
void wxApp::MacHandleOneEvent( WXEVENTREF evr )
{
#if TARGET_CARBON
EventTargetRef theTarget;
theTarget = GetEventDispatcherTarget();
m_macCurrentEvent = evr ;
- SendEventToEventTarget ((EventRef) evr , theTarget);
+ OSStatus status = SendEventToEventTarget ((EventRef) evr , theTarget);
+ if(status == eventNotHandledErr)
+ {
+ MacHandleUnhandledEvent(evr);
+ }
#else
EventRecord* ev = (EventRecord*) evr ;
m_macCurrentEvent = ev ;
MacHandleActivateEvent( ev ) ;
break;
case updateEvt:
+ // In embedded mode we first let the UnhandledEvent function
+ // try to handle the update event. If we handle it ourselves
+ // first and then pass it on, the host's windows won't update.
+ MacHandleUnhandledEvent(ev);
MacHandleUpdateEvent( ev ) ;
break;
case keyDown:
event.SetEventType( ( ev->modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
focus->GetEventHandler()->ProcessEvent( event ) ;
}
- if ( ev->modifiers ^ s_lastModifiers ) & cmdKey )
+ if ( ( ev->modifiers ^ s_lastModifiers ) & cmdKey )
{
event.m_keyCode = WXK_COMMAND ;
event.SetEventType( ( ev->modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
{
// Activate window first
::SelectWindow( window ) ;
-
+
// Send event later
if ( win )
win->MacMouseDown( ev , windowPart ) ;
event.m_controlDown = modifiers & controlKey;
event.m_altDown = modifiers & optionKey;
event.m_metaDown = modifiers & cmdKey;
-
+
event.m_x = x;
event.m_y = y;
event.m_timeStamp = timestamp;