X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/15b41e900b5bb946cc885b87ed0edd8f745bf22a..e8508ea8a890c90e6e72b2579780ca2ccbf40270:/src/mac/app.cpp diff --git a/src/mac/app.cpp b/src/mac/app.cpp index 02232921ed..bf3a261a93 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // Name: app.cpp // Purpose: wxApp -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: -// Created: ??/??/98 +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR +// Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,10 +38,6 @@ #include "wx/menu.h" #include "wx/docview.h" -#if wxUSE_WX_RESOURCES -# include "wx/resource.h" -#endif - #include // mac @@ -70,12 +66,21 @@ # include #endif -extern char *wxBuffer; extern wxList wxPendingDelete; extern wxList *wxWinMacWindowList; extern wxList *wxWinMacControlList; +// 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; @@ -107,7 +112,7 @@ bool wxApp::s_macSupportPCMenuShortcuts = true ; long wxApp::s_macAboutMenuItemId = wxID_ABOUT ; long wxApp::s_macPreferencesMenuItemId = 0 ; long wxApp::s_macExitMenuItemId = wxID_EXIT ; -wxString wxApp::s_macHelpMenuTitleName = "&Help" ; +wxString wxApp::s_macHelpMenuTitleName = wxT("&Help") ; //---------------------------------------------------------------------- // Core Apple Event Support @@ -153,16 +158,16 @@ 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); @@ -187,16 +192,16 @@ short wxApp::MacHandleAEPDoc(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); @@ -214,16 +219,17 @@ short wxApp::MacHandleAEOApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU return noErr ; } -// AEQuit attempts to quite the application +// AEQuit attempts to quite the application short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply)) { - wxWindow* win = GetTopWindow() ; + /* wxWindow* win = GetTopWindow() ; if ( win ) { win->Close(TRUE ) ; } else + */ { ExitMainLoop() ; } @@ -273,245 +279,80 @@ void wxApp::MacNewFile() { } -char StringMac[] = "\x0d\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f" - "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f" - "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xae\xaf" - "\xb1\xb4\xb5\xb6\xbb\xbc\xbe\xbf" - "\xc0\xc1\xc2\xc4\xc7\xc8\xc9\xcb\xcc\xcd\xce\xcf" - "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xca\xdb" ; - -char StringANSI[] = "\x0a\xC4\xC5\xC7\xC9\xD1\xD6\xDC\xE1\xE0\xE2\xE4\xE3\xE5\xE7\xE9\xE8" - "\xEA\xEB\xED\xEC\xEE\xEF\xF1\xF3\xF2\xF4\xF6\xF5\xFA\xF9\xFB\xFC" - "\x86\xBA\xA2\xA3\xA7\x95\xB6\xDF\xAE\xA9\x99\xB4\xA8\xC6\xD8" - "\xB1\xA5\xB5\xF0\xAA\xBA\xE6\xF8" - "\xBF\xA1\xAC\x83\xAB\xBB\x85\xC0\xC3\xD5\x8C\x9C" - "\x96\x97\x93\x94\x91\x92\xF7\xFF\xA0\x80" ; - -void wxMacConvertFromPC( const char *from , char *to , int len ) -{ - char *c ; - if ( from == to ) - { - for( int i = 0 ; i < len ; ++ i ) - { - c = strchr( StringANSI , *from ) ; - if ( c != NULL ) - { - *to = StringMac[ c - StringANSI] ; - } - ++to ; - ++from ; - } - } - else - { - for( int i = 0 ; i < len ; ++ i ) - { - c = strchr( StringANSI , *from ) ; - if ( c != NULL ) - { - *to = StringMac[ c - StringANSI] ; - } - else - { - *to = *from ; - } - ++to ; - ++from ; - } - } -} - -void wxMacConvertToPC( const char *from , char *to , int len ) -{ - char *c ; - if ( from == to ) - { - for( int i = 0 ; i < len ; ++ i ) - { - c = strchr( StringMac , *from ) ; - if ( c != NULL ) - { - *to = StringANSI[ c - StringMac] ; - } - ++to ; - ++from ; - } - } - else - { - for( int i = 0 ; i < len ; ++ i ) - { - c = strchr( StringMac , *from ) ; - if ( c != NULL ) - { - *to = StringANSI[ c - StringMac] ; - } - else - { - *to = *from ; - } - ++to ; - ++from ; - } - } -} - -void wxMacConvertFromPC( char * p ) -{ - char *ptr = p ; - int len = strlen ( p ) ; - - wxMacConvertFromPC( ptr , ptr , len ) ; -} +//---------------------------------------------------------------------- +// Carbon Event Handler +//---------------------------------------------------------------------- -void wxMacConvertFromPCForControls( char * p ) -{ - char *ptr = p ; - int len = strlen ( p ) ; +#if TARGET_CARBON - wxMacConvertFromPC( ptr , ptr , len ) ; - for ( unsigned int i = 0 ; i < strlen ( ptr ) ; i++ ) + static const EventTypeSpec eventList[] = { - if ( ptr[i] == '&' && ptr[i]+1 != ' ' ) - { - memmove( &ptr[i] , &ptr[i+1] , strlen( &ptr[i+1] ) + 1) ; - } - } -} + { kEventClassCommand, kEventProcessCommand } , + { kEventClassCommand, kEventCommandUpdateStatus } , -void wxMacConvertFromPC( unsigned char *p ) -{ - char *ptr = (char*) p + 1 ; - int len = p[0] ; + { kEventClassApplication , kEventAppActivated } , + { kEventClassApplication , kEventAppDeactivated } , + // handling the quit event is not recommended by apple + // rather using the quit apple event - which we do - wxMacConvertFromPC( ptr , ptr , len ) ; -} + { kEventClassAppleEvent , kEventAppleEvent } , -extern char *wxBuffer ; + { kEventClassMouse , kEventMouseDown } , + { 'WXMC' , 'WXMC' } + } ; -wxString wxMacMakeMacStringFromPC( const char * p ) +static pascal OSStatus MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { - const char *ptr = p ; - int len = strlen ( p ) ; - char *buf = wxBuffer ; - - if ( len >= BUFSIZ + 512 ) - { - buf = new char [len+1] ; - } + OSStatus result = eventNotHandledErr ; + UInt32 kind = GetEventKind( event ) ; - wxMacConvertFromPC( ptr , buf , len ) ; - buf[len] = 0 ; - wxString result( buf ) ; - if ( buf != wxBuffer ) - delete buf ; return result ; } +// 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 -void wxMacConvertToPC( char * p ) -{ - char *ptr = p ; - int len = strlen ( p ) ; - - wxMacConvertToPC( ptr , ptr , len ) ; -} - -void wxMacConvertToPC( unsigned char *p ) -{ - char *ptr = (char*) p + 1 ; - int len = p[0] ; - - wxMacConvertToPC( ptr , ptr , len ) ; -} - -wxString wxMacMakePCStringFromMac( const char * p ) +static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { - const char *ptr = p ; - int len = strlen ( p ) ; - char *buf = wxBuffer ; + OSStatus result = eventNotHandledErr ; - if ( len >= BUFSIZ + 512 ) + switch( GetEventKind(event) ) { - buf = new char [len+1] ; - } - - wxMacConvertToPC( ptr , buf , len ) ; - buf[len] = 0 ; - - wxString result( buf ) ; - if ( buf != wxBuffer ) - delete buf ; - return result ; -} + case kEventMouseDown : + { + Point point ; + WindowRef window ; -wxString wxMacMakeStringFromMacString( const char* from , bool mac2pcEncoding ) -{ - if (mac2pcEncoding) - { - return wxMacMakePCStringFromMac( from ) ; - } - else - { - return wxString( from ) ; - } -} + GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, + sizeof( Point ), NULL, &point ); + short windowPart = ::FindWindow(point, &window); -wxString wxMacMakeStringFromPascal( StringPtr from , bool mac2pcEncoding ) -{ - // this is safe since a pascal string can never be larger than 256 bytes - char s[256] ; - CopyPascalStringToC( from , s ) ; - if (mac2pcEncoding) - { - return wxMacMakePCStringFromMac( s ) ; - } - else - { - return wxString( s ) ; + if ( windowPart == inMenuBar ) + { + MenuSelect( point ) ; + result = noErr ; + } + } + break ; } -} -void wxMacStringToPascal( const char * from , StringPtr to , bool pc2macEncoding ) -{ - if (pc2macEncoding) - { - CopyCStringToPascal( wxMacMakeMacStringFromPC( from ) , to ) ; - } - else - { - CopyCStringToPascal( from , to ) ; - } + return result ; } -//---------------------------------------------------------------------- -// Carbon Event Handler -//---------------------------------------------------------------------- - -#if TARGET_CARBON - - static const EventTypeSpec eventList[] = - { - { kEventClassCommand, kEventProcessCommand } , - { kEventClassCommand, kEventCommandUpdateStatus } , - { kEventClassApplication , kEventAppActivated } , - { kEventClassApplication , kEventAppDeactivated } , - } ; - static pascal OSStatus CommandEventHandler( 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 ; @@ -520,52 +361,54 @@ static pascal OSStatus CommandEventHandler( EventHandlerCallRef handler , EventR item = mbar->FindItem( id , &menu ) ; 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 ) { 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->MacResume( true ) ; + result = noErr ; + } + break ; + case kEventAppDeactivated : + { + if ( wxTheApp ) + wxTheApp->MacSuspend( true ) ; + result = noErr ; + } + break ; + default : + break ; + } return result ; } @@ -574,15 +417,27 @@ pascal OSStatus wxAppEventHandler( EventHandlerCallRef handler , EventRef event OSStatus result = eventNotHandledErr ; switch( GetEventClass( event ) ) { - case kEventClassCommand : - result = CommandEventHandler( handler , event , data ) ; - break ; - case kEventClassApplication : - result = ApplicationEventHandler( handler , event , data ) ; - break ; - - default : - break ; + 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 ; @@ -675,17 +530,16 @@ bool wxApp::Initialize() #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 #endif + wxMacSetupConverters() ; s_macCursorRgn = ::NewRgn() ; - wxBuffer = new char[BUFSIZ + 512]; - wxClassInfo::InitializeClasses(); #if wxUSE_RESOURCES @@ -718,10 +572,6 @@ bool wxApp::Initialize() wxInitializeStockLists(); wxInitializeStockObjects(); -#if wxUSE_WX_RESOURCES - wxInitializeResourceSystem(); -#endif - wxBitmap::InitStandardHandlers(); wxModule::RegisterModules(); @@ -738,15 +588,17 @@ bool wxApp::Initialize() bool wxApp::OnInitGui() { - if( !wxAppBase::OnInitGui() ) - return false ; - -#if TARGET_CARBON - InstallApplicationEventHandler( - GetwxAppEventHandlerUPP(), - GetEventTypeCount(eventList), eventList, wxTheApp, &((EventHandlerRef)wxTheApp->m_macEventHandler)); + 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) , @@ -775,7 +627,7 @@ bool wxApp::OnInitGui() 0 , FALSE ) ; #endif - return TRUE ; + return TRUE ; } void wxApp::CleanUp() @@ -797,10 +649,6 @@ void wxApp::CleanUp() wxModule::CleanUpModules(); -#if wxUSE_WX_RESOURCES - wxCleanUpResourceSystem(); -#endif - wxDeleteStockObjects() ; // Destroy all GDI lists, etc. @@ -811,9 +659,6 @@ void wxApp::CleanUp() wxBitmap::CleanUpHandlers(); - delete[] wxBuffer; - wxBuffer = NULL; - wxMacDestroyNotifierTable() ; if (wxWinMacWindowList) { delete wxWinMacWindowList ; @@ -865,6 +710,7 @@ void wxApp::CleanUp() // __wxterminate in Mach-O shared libraries wxStAppResource::CloseSharedLibraryResource(); #endif + wxMacCleanupConverters() ; UMACleanupToolbox() ; if (s_macCursorRgn) { @@ -1025,7 +871,7 @@ void wxStAppResource::CloseSharedLibraryResource() // 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); } @@ -1107,7 +953,17 @@ int wxEntry( int argc, char *argv[] , bool enterLoop ) // we could try to get the open apple events here to adjust argc and argv better wxTheApp->argc = argc; +#if wxUSE_UNICODE + wxTheApp->argv = new wxChar*[argc+1]; + int mb_argc ; + for ( mb_argc = 0; mb_argc < argc; mb_argc++ ) + { + wxTheApp->argv[mb_argc] = wxStrdup(wxConvLocal.cMB2WX(argv[mb_argc])); + } + wxTheApp->argv[mb_argc] = (wxChar *)NULL; +#else wxTheApp->argv = argv; +#endif // GUI-specific initialization, such as creating an app context. wxEntryInitGui(); @@ -1295,14 +1151,14 @@ bool wxApp::Initialized() int wxApp::MainLoop() { - m_keepGoing = TRUE; + m_keepGoing = TRUE; - while (m_keepGoing) - { - MacDoOneEvent() ; - } + while (m_keepGoing) + { + MacDoOneEvent() ; + } - return 0; + return 0; } // Returns TRUE if more time is needed. @@ -1317,15 +1173,19 @@ bool wxApp::ProcessIdle() 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 ) ; + return EventAvail( everyEvent , &event ) ; +#endif } // Dispatch a message. @@ -1336,8 +1196,6 @@ void wxApp::Dispatch() void wxApp::OnIdle(wxIdleEvent& event) { - static bool s_inOnIdle = FALSE; - // Avoid recursion (via ProcessEvent default case) if ( s_inOnIdle ) return; @@ -1376,14 +1234,14 @@ void wxWakeUpIdle() bool wxApp::SendIdleEvents() { bool needMore = FALSE; - wxNode* node = wxTopLevelWindows.First(); + wxWindowListNode* node = wxTopLevelWindows.GetFirst(); while (node) { - wxWindow* win = (wxWindow*) node->Data(); + wxWindow* win = node->GetData(); if (SendIdleEvents(win)) needMore = TRUE; - node = node->Next(); + node = node->GetNext(); } return needMore; } @@ -1400,24 +1258,24 @@ bool wxApp::SendIdleEvents(wxWindow* win) if (event.MoreRequested()) needMore = TRUE; - wxNode* node = win->GetChildren().First(); + wxWindowListNode* node = win->GetChildren().GetFirst(); while (node) { - wxWindow* win = (wxWindow*) node->Data(); + wxWindow* win = node->GetData(); if (SendIdleEvents(win)) needMore = TRUE; - node = node->Next(); + node = node->GetNext(); } return needMore ; } void wxApp::DeletePendingObjects() { - wxNode *node = wxPendingDelete.First(); + wxNode *node = wxPendingDelete.GetFirst(); while (node) { - wxObject *obj = (wxObject *)node->Data(); + wxObject *obj = (wxObject *)node->GetData(); delete obj; @@ -1426,7 +1284,7 @@ void wxApp::DeletePendingObjects() // Deleting one object may have deleted other pending // objects, so start from beginning of list again. - node = wxPendingDelete.First(); + node = wxPendingDelete.GetFirst(); } } @@ -1480,21 +1338,52 @@ bool wxApp::Yield(bool onlyIfNeeded) #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 ; - long sleepTime = 1 ; //::GetCaretTime(); + // 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 ; - while ( !wxTheApp->IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, (RgnHandle) wxApp::s_macCursorRgn)) + while ( !IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, (RgnHandle) wxApp::s_macCursorRgn)) { - wxTheApp->MacHandleModifierEvents( &event ) ; - wxTheApp->MacHandleOneEvent( &event ); + 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 ) ; } - wxTheApp->MacHandleModifierEvents( &event ) ; + MacHandleModifierEvents( &event ) ; +#endif wxMacProcessNotifierAndPendingEvents() ; - s_inYield = FALSE; return TRUE; @@ -1507,13 +1396,13 @@ void wxApp::MacSuspend( bool convertClipboard ) #if !TARGET_CARBON // we have to deactive the top level windows manually - wxNode* node = wxTopLevelWindows.First(); + wxWindowListNode* node = wxTopLevelWindows.GetFirst(); while (node) { wxTopLevelWindow* win = (wxTopLevelWindow*) node->Data(); win->MacActivate( ((EventRecord*) MacGetCurrentEvent())->when , false ) ; - node = node->Next(); + node = node->GetNext(); } ::HideFloatingWindows() ; @@ -1540,13 +1429,13 @@ void wxApp::MacResume( bool convertClipboard ) ::ShowFloatingWindows() ; // raise modal dialogs in case a non modal window was selected to activate the app - wxNode* node = wxModalDialogs.First(); + wxNode* node = wxModalDialogs.GetFirst(); while (node) { - wxDialog* dialog = (wxDialog *) node->Data(); + wxDialog* dialog = (wxDialog *) node->GetData(); dialog->Raise(); - node = node->Next(); + node = node->GetNext(); } #endif } @@ -1561,11 +1450,36 @@ void wxApp::MacConvertPublicToPrivateScrap() void wxApp::MacDoOneEvent() { - EventRecord event ; +#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); + sleepTime = kEventDurationNoWait ; + } +#else + EventRecord event ; - long sleepTime = 1; // GetCaretTime() / 4 ; + EventMask eventMask = everyEvent ; - if (WaitNextEvent(everyEvent, &event, sleepTime, (RgnHandle) s_macCursorRgn)) + if (WaitNextEvent(eventMask, &event, sleepTime, (RgnHandle) s_macCursorRgn)) { MacHandleModifierEvents( &event ) ; MacHandleOneEvent( &event ); @@ -1578,76 +1492,28 @@ void wxApp::MacDoOneEvent() if ( window ) ::IdleControls( window ) ; - wxTheApp->ProcessIdle() ; + if ( wxTheApp->ProcessIdle() ) + sleepTime = 0 ; + 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::MacHandleModifierEvents( WXEVENTREF evr ) -{ - EventRecord* ev = (EventRecord*) evr ; -#if TARGET_CARBON - if ( ev->what == mouseDown || ev->what == mouseUp || ev->what == activateEvt || - ev->what == keyDown || ev->what == autoKey || ev->what == keyUp || ev->what == kHighLevelEvent || - ev->what == nullEvent - ) - { - // in these cases the modifiers are already correctly setup by carbon - } - else - { - EventRecord nev ; - WaitNextEvent( 0 , &nev , 0 , NULL ) ; - ev->modifiers = nev.modifiers ; - // KeyModifiers unfortunately don't include btnState... -// ev->modifiers = GetCurrentKeyModifiers() ; - } -#endif - if ( ev->modifiers != s_lastModifiers && wxWindow::FindFocus() != NULL ) - { - 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 ; - } -} - 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 ; @@ -1662,7 +1528,6 @@ void wxApp::MacHandleOneEvent( WXEVENTREF evr ) else s_lastMouseDown = 1; break; -#if !TARGET_CARBON case mouseUp: if ( s_lastMouseDown == 2 ) { @@ -1681,7 +1546,6 @@ void wxApp::MacHandleOneEvent( WXEVENTREF evr ) case updateEvt: MacHandleUpdateEvent( ev ) ; break; -#endif case keyDown: case autoKey: MacHandleKeyDownEvent( ev ) ; @@ -1689,23 +1553,65 @@ void wxApp::MacHandleOneEvent( WXEVENTREF evr ) case keyUp: MacHandleKeyUpEvent( ev ) ; break; -#if !TARGET_CARBON case diskEvt: MacHandleDiskEvent( ev ) ; break; case osEvt: MacHandleOSEvent( ev ) ; break; -#endif 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 ) + { + 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 ; + } +} + void wxApp::MacHandleHighLevelEvent( WXEVENTREF evr ) { // we must avoid reentrancy problems when processing high level events eg printing @@ -1716,8 +1622,6 @@ void wxApp::MacHandleHighLevelEvent( WXEVENTREF evr ) s_inYield = former ; } -bool s_macIsInModalLoop = false ; - void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr ) { EventRecord* ev = (EventRecord*) evr ; @@ -1747,13 +1651,10 @@ void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr ) else { UInt32 menuresult = MenuSelect(ev->where) ; -#if !TARGET_CARBON MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ); -#endif s_lastMouseDown = 0; } break ; -#if !TARGET_CARBON case inSysWindow : SystemClick( ev , window ) ; s_lastMouseDown = 0; @@ -1809,8 +1710,8 @@ void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr ) &constraintRect , &newContentRect ) ; if ( growResult ) { - win->SetSize( newContentRect.left , newContentRect.top , - newContentRect.right - newContentRect.left , + win->SetSize( newContentRect.left , newContentRect.top , + newContentRect.right - newContentRect.left , newContentRect.bottom - newContentRect.top, wxSIZE_USE_EXISTING); } s_lastMouseDown = 0; @@ -1875,29 +1776,26 @@ void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr ) win->MacMouseDown( ev , windowPart ) ; } break ; -#endif default: break; } } -#if !TARGET_CARBON - void wxApp::MacHandleMouseUpEvent( 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) ; - } + if ( wxTheApp->s_captureWindow ) + { + window = (WindowRef) s_captureWindow->MacGetRootWindow() ; + windowPart = inContent ; + } + else + { + windowPart = ::FindWindow(ev->where, &window) ; + } switch (windowPart) { @@ -1915,7 +1813,7 @@ void wxApp::MacHandleMouseUpEvent( WXEVENTREF evr ) } } -#endif +#endif long wxMacTranslateKey(unsigned char key, unsigned char code) ; long wxMacTranslateKey(unsigned char key, unsigned char code) @@ -2026,12 +1924,12 @@ long wxMacTranslateKey(unsigned char key, unsigned char code) return retval; } +#if !TARGET_CARBON void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) { EventRecord* ev = (EventRecord*) evr ; wxToolTip::RemoveToolTips() ; -#if !TARGET_CARBON UInt32 menuresult = UMAMenuEvent(ev) ; if ( HiWord( menuresult ) ) { @@ -2039,10 +1937,9 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ; } else -#endif { 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 @@ -2059,16 +1956,33 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) } } +void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr ) +{ + 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 ) ; + } +} + +#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 @@ -2079,14 +1993,14 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi 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; @@ -2189,22 +2103,6 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi return handled ; } - -void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr ) -{ - 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 ) ; - } -} - bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey ) { if ( !focus ) @@ -2225,10 +2123,10 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier } 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); @@ -2246,6 +2144,7 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier return handled ; } + #if !TARGET_CARBON void wxApp::MacHandleActivateEvent( WXEVENTREF evr ) { @@ -2352,15 +2251,15 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr ) wxWindow* currentMouseWindow = NULL ; - if (s_captureWindow ) - { - currentMouseWindow = s_captureWindow ; - } - else - { - wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , - ¤tMouseWindow ) ; - } + if (s_captureWindow ) + { + currentMouseWindow = s_captureWindow ; + } + else + { + wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , + ¤tMouseWindow ) ; + } if ( currentMouseWindow != wxWindow::s_lastMouseWindow ) { @@ -2403,16 +2302,16 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr ) short windowPart = inNoWindow ; - if ( s_captureWindow ) - { - window = (WindowRef) s_captureWindow->MacGetRootWindow() ; - windowPart = inContent ; - } - else - { - windowPart = ::FindWindow(ev->where, &window); - } - + if ( s_captureWindow ) + { + window = (WindowRef) s_captureWindow->MacGetRootWindow() ; + windowPart = inContent ; + } + else + { + windowPart = ::FindWindow(ev->where, &window); + } + switch (windowPart) { case inContent : @@ -2457,13 +2356,13 @@ void wxApp::MacHandleMenuCommand( wxUint32 id ) 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 ) ; + + menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ; } #if !TARGET_CARBON @@ -2488,8 +2387,8 @@ void wxApp::MacHandleMenuSelect( int macMenuId , int macMenuItemNum ) { MenuCommand id ; GetMenuItemCommandID( GetMenuHandle(macMenuId) , macMenuItemNum , &id ) ; - MacHandleMenuCommand( id ) ; + MacHandleMenuCommand( id ) ; } HiliteMenu(0); } -#endif \ No newline at end of file +#endif