short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
{
- wxWindow* win = GetTopWindow() ;
- if ( win )
+ wxCloseEvent event;
+ wxTheApp->OnQueryEndSession(event);
+ if ( !event.GetVeto() )
{
- wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId);
- if (!win->GetEventHandler()->ProcessEvent(exitEvent))
- win->Close(true) ;
+ wxCloseEvent event;
+ wxTheApp->OnEndSession(event);
}
- else
- {
- ExitMainLoop() ;
- }
-
return noErr ;
}
GetMenuItemRefCon( command.menu.menuRef , command.menu.menuItemIndex , &refCon ) ;
itemMenu = wxFindMenuFromMacMenu( command.menu.menuRef ) ;
if ( itemMenu != NULL && refCon != 0)
- item = ((wxMenuItemImpl*) refCon)->GetWXPeer() ;
+ item = (wxMenuItem*) refCon;
}
}
#endif
#endif // wxDEBUG_LEVEL
-extern "C" void macPostedEventCallback(void *WXUNUSED(unused))
-{
- wxTheApp->ProcessPendingEvents();
-}
-
bool wxApp::Initialize(int& argc, wxChar **argv)
{
// Mac-specific
// application (otherwise applications would need to handle it)
if ( argc > 1 )
{
- static const wxChar *ARG_PSN = _T("-psn_");
+ static const wxChar *ARG_PSN = wxT("-psn_");
if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
{
// remove this argument
wxSetWorkingDirectory( cwd ) ;
}
- /* connect posted events to common-mode run loop so that wxPostEvent events
- are handled even while we're in the menu or on a scrollbar */
- /*
- CFRunLoopSourceContext event_posted_context = {0};
- event_posted_context.perform = macPostedEventCallback;
- m_macEventPosted = CFRunLoopSourceCreate(NULL,0,&event_posted_context);
- CFRunLoopAddSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes);
- // run loop takes ownership
- CFRelease(m_macEventPosted);
- */
return true;
}
return wxAppBase::ProcessIdle();
}
+int wxApp::OnRun()
+{
+ wxMacAutoreleasePool pool;
+ return wxAppBase::OnRun();
+}
+
#if wxOSX_USE_CARBON
bool wxApp::DoInitGui()
{
void wxApp::CleanUp()
{
+ wxMacAutoreleasePool autoreleasepool;
#if wxUSE_TOOLTIPS
wxToolTip::RemoveToolTips() ;
#endif
- if (m_macEventPosted)
- {
- CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes);
- m_macEventPosted = NULL;
- }
-
DoCleanUp();
wxAppBase::CleanUp();
m_macCurrentEvent = NULL ;
m_macCurrentEventHandlerCallRef = NULL ;
- m_macEventPosted = NULL ;
+ m_macPool = new wxMacAutoreleasePool();
+}
+
+wxApp::~wxApp()
+{
+ if (m_macPool)
+ delete m_macPool;
}
CFMutableArrayRef GetAutoReleaseArray()
CFArrayAppendValue( GetAutoReleaseArray(), cfrefobj );
}
+void wxApp::MacReleaseAutoreleasePool()
+{
+ if (m_macPool)
+ delete m_macPool;
+ m_macPool = new wxMacAutoreleasePool();
+}
+
void wxApp::OnIdle(wxIdleEvent& WXUNUSED(event))
{
// If they are pending events, we must process them: pending events are
void wxApp::WakeUpIdle()
{
- if (m_macEventPosted)
- {
- CFRunLoopSourceSignal(m_macEventPosted);
- }
+ wxEventLoopBase * const loop = wxEventLoopBase::GetActive();
- wxMacWakeUp() ;
+ if ( loop )
+ loop->WakeUp();
}
void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
// user can veto the close, and therefore the end session.
void wxApp::OnQueryEndSession(wxCloseEvent& event)
{
- if (GetTopWindow())
+ if ( !wxDialog::OSXHasModalDialogsOpen() )
{
- if (!GetTopWindow()->Close(!event.CanVeto()))
- event.Veto(true);
+ if (GetTopWindow())
+ {
+ if (!GetTopWindow()->Close(!event.CanVeto()))
+ event.Veto(true);
+ }
+ }
+ else
+ {
+ event.Veto(true);
}
}
}
#endif
+#if wxOSX_USE_COCOA && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
+
+// defined in utils.mm
+
+#elif wxOSX_USE_COCOA_OR_CARBON
+
wxMouseState wxGetMouseState()
{
wxMouseState ms;
ms.SetX(pt.x);
ms.SetY(pt.y);
-#if wxOSX_USE_CARBON
UInt32 buttons = GetCurrentButtonState();
ms.SetLeftDown( (buttons & 0x01) != 0 );
ms.SetMiddleDown( (buttons & 0x04) != 0 );
ms.SetShiftDown(modifiers & shiftKey);
ms.SetAltDown(modifiers & optionKey);
ms.SetMetaDown(modifiers & cmdKey);
-#else
- // TODO
-#endif
+
return ms;
}
+#endif
+
// TODO : once the new key/char handling is tested, move all the code to wxWindow
bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar )
// control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
// and look at the character after
#ifdef __LP64__
- // TODO new implementation using TextInputSources
+ // TODO new implementation using TextInputSources
#else
UInt32 state = 0;
UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey | shiftKey | optionKey))) | keycode, &state);