// statics for implementation
static bool s_inYield = FALSE;
-static bool s_inOnIdle = FALSE;
#if TARGET_CARBON
static bool s_inReceiveEvent = FALSE ;
{ kEventClassCommand, kEventProcessCommand } ,
{ kEventClassCommand, kEventCommandUpdateStatus } ,
+ { kEventClassMenu, kEventMenuOpening },
+ { kEventClassMenu, kEventMenuClosed },
+
{ kEventClassApplication , kEventAppActivated } ,
{ kEventClassApplication , kEventAppDeactivated } ,
// handling the quit event is not recommended by apple
{ 'WXMC' , 'WXMC' }
} ;
-static pascal OSStatus MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus
+MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
- return eventNotHandledErr ;
+ // FIXME: this doesn't work for multiple windows
+ wxWindow *win = wxTheApp->GetTopWindow();
+ if ( win )
+ {
+ // VZ: we could find the menu from its handle here by examining all
+ // the menus in the menu bar recursively but knowing that neither
+ // wxMSW nor wxGTK do it why bother...
+#if 0
+ MenuRef menuRef;
+
+ GetEventParameter(event,
+ kEventParamDirectObject,
+ typeMenuRef, NULL,
+ sizeof(menuRef), NULL,
+ &menuRef);
+#endif // 0
+
+ wxMenuEvent wxevent(GetEventKind(event) == kEventMenuOpening
+ ? wxEVT_MENU_OPEN
+ : wxEVT_MENU_CLOSE);
+ wxevent.SetEventObject(win);
+
+ (void)win->GetEventHandler()->ProcessEvent(wxevent);
+ }
+
+ return eventNotHandledErr;
}
// due to the rather low-level event API of wxWindows, we cannot use RunApplicationEventLoop
WXIMPORT char std::__throws_bad_alloc ;
#endif
-bool wxApp::Initialize(int argc, wxChar **argv)
+bool wxApp::Initialize(int& argc, wxChar **argv)
{
int error = 0 ;
s_macCursorRgn = ::NewRgn() ;
+ // Mac OS X passes a process serial number command line argument when
+ // the application is launched from the Finder. This argument must be
+ // removed from the command line arguments before being handled by the
+ // application (otherwise applications would need to handle it)
+ if ( argc > 1 )
+ {
+ static const wxChar *ARG_PSN = _T("-psn_");
+ if ( wxStrncmp(argv[1], ARG_PSN, sizeof(ARG_PSN) - 1) == 0 )
+ {
+ // remove this argument
+ memmove(argv, argv + 1, argc--);
+ }
+ }
+
if ( !wxAppBase::Initialize(argc, argv) )
return false;
}
//----------------------------------------------------------------------
-// wxEntry
+// misc initialization stuff
//----------------------------------------------------------------------
// extern variable for shared library resource id
#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;
-#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();
-
- // 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
bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec)
wxApp::wxApp()
{
- m_topWindow = NULL;
- wxTheApp = this;
-
-#if WXWIN_COMPATIBILITY_2_2
- m_wantDebugOutput = TRUE;
-#endif
-
- argc = 0;
- argv = NULL;
-
m_printMode = wxPRINT_WINDOWS;
m_auto3D = TRUE;
+
+ m_macCurrentEvent = NULL ;
+ m_macCurrentEventHandlerCallRef = NULL ;
}
bool wxApp::Initialized()
return 0;
}
-// Returns TRUE if more time is needed.
-bool wxApp::ProcessIdle()
-{
- wxIdleEvent event;
- event.SetEventObject(this);
- ProcessEvent(event);
-
- return event.MoreRequested();
-}
-
void wxApp::ExitMainLoop()
{
m_keepGoing = FALSE;
#else
EventRecord event ;
- return EventAvail( everyEvent , &event ) ;
+ return EventAvail( everyEvent , &event ) ;
#endif
}
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();
}
wxMacWakeUp() ;
}
-// Send idle event to all top-level windows
-bool wxApp::SendIdleEvents()
-{
- bool needMore = FALSE;
- wxWindowListNode* node = wxTopLevelWindows.GetFirst();
- while (node)
- {
- wxWindow* win = node->GetData();
- if (SendIdleEvents(win))
- needMore = TRUE;
-
- node = node->GetNext();
- }
- return needMore;
-}
-
-// Send idle event to window and all subwindows
-bool wxApp::SendIdleEvents(wxWindow* win)
-{
- bool needMore = FALSE;
-
- wxIdleEvent event;
- event.SetEventObject(win);
- win->ProcessEvent(event);
-
- if (event.MoreRequested())
- needMore = TRUE;
-
- wxWindowListNode* node = win->GetChildren().GetFirst();
- while (node)
- {
- wxWindow* win = node->GetData();
- if (SendIdleEvents(win))
- needMore = TRUE;
-
- node = node->GetNext();
- }
- return needMore ;
-}
-
void wxApp::Exit()
{
wxApp::CleanUp();
event.SetEventType( ( ev->modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
focus->GetEventHandler()->ProcessEvent( event ) ;
}
+ if ( ev->modifiers ^ s_lastModifiers ) & cmdKey )
+ {
+ event.m_keyCode = WXK_COMMAND ;
+ event.SetEventType( ( ev->modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
+ focus->GetEventHandler()->ProcessEvent( event ) ;
+ }
s_lastModifiers = ev->modifiers ;
}
}
if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
{
+#if 0
+ // we must handle control keys the other way round, otherwise text content is updated too late
// has not been handled -> perform default
wxControl* control = wxDynamicCast( focus , wxControl ) ;
if ( control && control->GetMacControl() != NULL )
keycode = short(ev->message & keyCodeMask) >> 8 ;
::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ;
}
+#endif
}
}
}