]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/app.cpp
support for hints, fixing textfield implementation on iOS
[wxWidgets.git] / src / osx / carbon / app.cpp
index d7dc2db405f3118cd2c725fe4a56ebef3de94f57..7e03354c972efe3817f18259801ff0ebb7202226 100644 (file)
@@ -249,18 +249,13 @@ short wxApp::MacHandleAEOApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU
 
 short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
 {
 
 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->ProcessEvent(exitEvent))
-            win->Close(true) ;
+        wxCloseEvent event;
+        wxTheApp->OnEndSession(event);
     }
     }
-    else
-    {
-        ExitMainLoop() ;
-    }
-
     return noErr ;
 }
 
     return noErr ;
 }
 
@@ -508,12 +503,12 @@ wxMenu* wxFindMenuFromMacCommand( const HICommand &command , wxMenuItem* &item )
         }
         else
         {
         }
         else
         {
-            URefCon refCon = NULL ;
+            URefCon refCon = 0 ;
 
             GetMenuItemRefCon( command.menu.menuRef , command.menu.menuItemIndex , &refCon ) ;
             itemMenu = wxFindMenuFromMacMenu( command.menu.menuRef ) ;
             if ( itemMenu != NULL && refCon != 0)
 
             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
@@ -732,7 +727,7 @@ pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef eve
 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler )
 #endif
 
 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler )
 #endif
 
-#if defined( __WXDEBUG__ ) && wxOSX_USE_COCOA_OR_CARBON
+#if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
 
 pascal static void
 wxMacAssertOutputHandler(OSType WXUNUSED(componentSignature),
 
 pascal static void
 wxMacAssertOutputHandler(OSType WXUNUSED(componentSignature),
@@ -778,18 +773,13 @@ wxMacAssertOutputHandler(OSType WXUNUSED(componentSignature),
 #endif
 }
 
 #endif
 }
 
-#endif //__WXDEBUG__
-
-extern "C" void macPostedEventCallback(void *WXUNUSED(unused))
-{
-    wxTheApp->ProcessPendingEvents();
-}
+#endif // wxDEBUG_LEVEL
 
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     // Mac-specific
 
 
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     // Mac-specific
 
-#if defined( __WXDEBUG__ ) && wxOSX_USE_COCOA_OR_CARBON
+#if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
     InstallDebugAssertOutputHandler( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler ) );
 #endif
 
     InstallDebugAssertOutputHandler( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler ) );
 #endif
 
@@ -799,7 +789,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     // application (otherwise applications would need to handle it)
     if ( argc > 1 )
     {
     // 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
         if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
         {
             // remove this argument
@@ -828,24 +818,16 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
         wxSetWorkingDirectory( cwd ) ;
     }
 
         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 true;
 }
 
+#if wxOSX_USE_COCOA_OR_CARBON
 bool wxApp::CallOnInit()
 {
     wxMacAutoreleasePool autoreleasepool;
     return OnInit();
 }
 bool wxApp::CallOnInit()
 {
     wxMacAutoreleasePool autoreleasepool;
     return OnInit();
 }
+#endif
 
 bool wxApp::OnInitGui()
 {
 
 bool wxApp::OnInitGui()
 {
@@ -864,6 +846,12 @@ bool wxApp::ProcessIdle()
     return wxAppBase::ProcessIdle();
 }
 
     return wxAppBase::ProcessIdle();
 }
 
+int wxApp::OnRun()
+{
+    wxMacAutoreleasePool pool;
+    return wxAppBase::OnRun();
+}
+
 #if wxOSX_USE_CARBON
 bool wxApp::DoInitGui()
 {
 #if wxOSX_USE_CARBON
 bool wxApp::DoInitGui()
 {
@@ -937,16 +925,11 @@ void wxApp::DoCleanUp()
 
 void wxApp::CleanUp()
 {
 
 void wxApp::CleanUp()
 {
+    wxMacAutoreleasePool autoreleasepool;
 #if wxUSE_TOOLTIPS
     wxToolTip::RemoveToolTips() ;
 #endif
 
 #if wxUSE_TOOLTIPS
     wxToolTip::RemoveToolTips() ;
 #endif
 
-    if (m_macEventPosted)
-       {
-               CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes);
-               m_macEventPosted = NULL;
-       }
-
     DoCleanUp();
 
     wxAppBase::CleanUp();
     DoCleanUp();
 
     wxAppBase::CleanUp();
@@ -1054,7 +1037,13 @@ wxApp::wxApp()
 
     m_macCurrentEvent = NULL ;
     m_macCurrentEventHandlerCallRef = NULL ;
 
     m_macCurrentEvent = NULL ;
     m_macCurrentEventHandlerCallRef = NULL ;
-    m_macEventPosted = NULL ;
+    m_macPool = new wxMacAutoreleasePool();
+}
+
+wxApp::~wxApp()
+{
+    if (m_macPool)
+        delete m_macPool;
 }
 
 CFMutableArrayRef GetAutoReleaseArray()
 }
 
 CFMutableArrayRef GetAutoReleaseArray()
@@ -1070,6 +1059,13 @@ void wxApp::MacAddToAutorelease( void* cfrefobj )
     CFArrayAppendValue( GetAutoReleaseArray(), cfrefobj );
 }
 
     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::OnIdle(wxIdleEvent& WXUNUSED(event))
 {
     // If they are pending events, we must process them: pending events are
@@ -1086,12 +1082,10 @@ void wxApp::OnIdle(wxIdleEvent& WXUNUSED(event))
 
 void wxApp::WakeUpIdle()
 {
 
 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))
 }
 
 void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
@@ -1104,10 +1098,17 @@ void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event))
 // user can veto the close, and therefore the end session.
 void wxApp::OnQueryEndSession(wxCloseEvent& 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);
     }
 }
 
     }
 }
 
@@ -1117,59 +1118,6 @@ void wxCYield()
     wxYield() ;
 }
 
     wxYield() ;
 }
 
-// Yield to other processes
-
-bool wxApp::Yield(bool onlyIfNeeded)
-{
-#if wxUSE_THREADS
-    // Yielding from a non-gui thread needs to bail out, otherwise we end up
-    // possibly sending events in the thread too.
-    if ( !wxThread::IsMain() )
-    {
-        return true;
-    }
-#endif // wxUSE_THREADS
-
-    if (m_isInsideYield)
-    {
-        if ( !onlyIfNeeded )
-        {
-            wxFAIL_MSG( wxT("wxYield called recursively" ) );
-        }
-
-        return false;
-    }
-
-    m_isInsideYield = true;
-
-#if wxUSE_LOG
-    // disable log flushing from here because a call to wxYield() shouldn't
-    // normally result in message boxes popping up &c
-    wxLog::Suspend();
-#endif // wxUSE_LOG
-
-    wxEventLoop * const
-        loop = static_cast<wxEventLoop *>(wxEventLoop::GetActive());
-    if ( loop )
-    {
-        // process all pending events:
-        while ( loop->Pending() )
-            loop->Dispatch();
-    }
-
-    // it's necessary to call ProcessIdle() to update the frames sizes which
-    // might have been changed (it also will update other things set from
-    // OnUpdateUI() which is a nice (and desired) side effect)
-    while ( ProcessIdle() ) {}
-
-#if wxUSE_LOG
-    wxLog::Resume();
-#endif // wxUSE_LOG
-    m_isInsideYield = false;
-
-    return true;
-}
-
 // virtual
 void wxApp::MacHandleUnhandledEvent( WXEVENTREF WXUNUSED(evr) )
 {
 // virtual
 void wxApp::MacHandleUnhandledEvent( WXEVENTREF WXUNUSED(evr) )
 {
@@ -1345,6 +1293,12 @@ int wxMacKeyCodeToModifier(wxKeyCode key)
 }
 #endif
 
 }
 #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;
 wxMouseState wxGetMouseState()
 {
     wxMouseState ms;
@@ -1353,7 +1307,6 @@ wxMouseState wxGetMouseState()
     ms.SetX(pt.x);
     ms.SetY(pt.y);
 
     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 );
     UInt32 buttons = GetCurrentButtonState();
     ms.SetLeftDown( (buttons & 0x01) != 0 );
     ms.SetMiddleDown( (buttons & 0x04) != 0 );
@@ -1364,12 +1317,12 @@ wxMouseState wxGetMouseState()
     ms.SetShiftDown(modifiers & shiftKey);
     ms.SetAltDown(modifiers & optionKey);
     ms.SetMetaDown(modifiers & cmdKey);
     ms.SetShiftDown(modifiers & shiftKey);
     ms.SetAltDown(modifiers & optionKey);
     ms.SetMetaDown(modifiers & cmdKey);
-#else
-    // TODO
-#endif
+
     return ms;
 }
 
     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 )
 // 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 )
@@ -1388,7 +1341,6 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier
     if ( !focus )
         return false ;
 
     if ( !focus )
         return false ;
 
-    bool handled;
     wxKeyEvent event( wxEVT_KEY_UP ) ;
     MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ;
 
     wxKeyEvent event( wxEVT_KEY_UP ) ;
     MacCreateKeyEvent( event, focus , keymessage , modifiers , when , wherex , wherey , uniChar ) ;
 
@@ -1497,7 +1449,7 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess
         // 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__
         // 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);
 #else
         UInt32 state = 0;
         UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey | shiftKey | optionKey))) | keycode, &state);
@@ -1570,6 +1522,15 @@ void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymess
     event.m_y = wherey;
     event.SetTimestamp(when);
     event.SetEventObject(focus);
     event.m_y = wherey;
     event.SetTimestamp(when);
     event.SetEventObject(focus);
+#else
+    wxUnusedVar(event);
+    wxUnusedVar(focus);
+    wxUnusedVar(keymessage);
+    wxUnusedVar(modifiers);
+    wxUnusedVar(when);
+    wxUnusedVar(wherex);
+    wxUnusedVar(wherey);
+    wxUnusedVar(uniChar);
 #endif
 }
 
 #endif
 }