]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/app.mm
Virtualize StartEditor and add implementations for the ports that can do it.
[wxWidgets.git] / src / cocoa / app.mm
index c5e4f3dc32d57e1496f0f34de5a6784681fa2684..c353fec89a93821c6f73e661a76428dcc7566b54 100644 (file)
@@ -7,7 +7,7 @@
 // RCS-ID:      $Id$
 // Copyright:   (c) David Elliott
 //              Software 2000 Ltd.
 // RCS-ID:      $Id$
 // Copyright:   (c) David Elliott
 //              Software 2000 Ltd.
-// Licence:     wxWidgets licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
@@ -15,7 +15,6 @@
 #include "wx/app.h"
 
 #ifndef WX_PRECOMP
 #include "wx/app.h"
 
 #ifndef WX_PRECOMP
-    #include "wx/dc.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/module.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/module.h"
@@ -26,6 +25,8 @@
 #include "wx/cocoa/mbarman.h"
 #include "wx/cocoa/NSApplication.h"
 
 #include "wx/cocoa/mbarman.h"
 #include "wx/cocoa/NSApplication.h"
 
+#include "wx/cocoa/dc.h"
+
 #import <AppKit/NSApplication.h>
 #import <Foundation/NSRunLoop.h>
 #import <Foundation/NSThread.h>
 #import <AppKit/NSApplication.h>
 #import <Foundation/NSRunLoop.h>
 #import <Foundation/NSThread.h>
@@ -115,7 +116,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
@@ -124,6 +125,37 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
         }
     }
 
         }
     }
 
+    /*
+        Cocoa supports -Key value options which set the user defaults key "Key"
+        to the value "value"  Some of them are very handy for debugging like
+        -NSShowAllViews YES.  Cocoa picks these up from the real argv so
+        our removal of them from the wx copy of it does not affect Cocoa's
+        ability to see them.
+
+        We basically just assume that any "-NS" option and its following
+        argument needs to be removed from argv.  We hope that user code does
+        not expect to see -NS options and indeed it's probably a safe bet
+        since most user code accepting options is probably using the
+        double-dash GNU-style syntax.
+     */
+    for(int i=1; i < argc; ++i)
+    {
+        static const wxChar *ARG_NS = wxT("-NS");
+        static const int ARG_NS_LEN = wxStrlen(ARG_NS);
+        if( wxStrncmp(argv[i], ARG_NS, ARG_NS_LEN) == 0 )
+        {
+            // Only eat this option if it has an argument
+            if( (i + 1) < argc )
+            {
+                argc -= 2;
+                memmove(argv + i, argv + i + 2, argc * sizeof(wxChar*));
+                // drop back one position so the next run through the loop
+                // reprocesses the argument at our current index.
+                --i;
+            }
+        }
+    }
+
     return wxAppBase::Initialize(argc, argv);
 }
 
     return wxAppBase::Initialize(argc, argv);
 }
 
@@ -131,7 +163,7 @@ void wxApp::CleanUp()
 {
     wxAutoNSAutoreleasePool pool;
 
 {
     wxAutoNSAutoreleasePool pool;
 
-    wxDC::CocoaShutdownTextSystem();
+    wxCocoaDCImpl::CocoaShutdownTextSystem();
     wxMenuBarManager::DestroyInstance();
 
     [[NSNotificationCenter defaultCenter] removeObserver:sg_cocoaAppObserver];
     wxMenuBarManager::DestroyInstance();
 
     [[NSNotificationCenter defaultCenter] removeObserver:sg_cocoaAppObserver];
@@ -152,12 +184,10 @@ wxApp::wxApp()
 {
     m_topWindow = NULL;
 
 {
     m_topWindow = NULL;
 
-#ifdef __WXDEBUG__
-    m_isInAssert = false;
-#endif // __WXDEBUG__
-
     argc = 0;
     argc = 0;
+#if !wxUSE_UNICODE
     argv = NULL;
     argv = NULL;
+#endif
     m_cocoaApp = NULL;
     m_cocoaAppDelegate = NULL;
 }
     m_cocoaApp = NULL;
     m_cocoaAppDelegate = NULL;
 }
@@ -224,7 +254,7 @@ bool wxApp::OnInitGui()
     if(!sm_isEmbedded)
         wxMenuBarManager::CreateInstance();
 
     if(!sm_isEmbedded)
         wxMenuBarManager::CreateInstance();
 
-    wxDC::CocoaInitializeTextSystem();
+    wxCocoaDCImpl::CocoaInitializeTextSystem();
     return true;
 }
 
     return true;
 }
 
@@ -260,75 +290,6 @@ void wxApp::Exit()
     wxAppConsole::Exit();
 }
 
     wxAppConsole::Exit();
 }
 
-// Yield to other processes
-bool wxApp::Yield(bool onlyIfNeeded)
-{
-    // MT-FIXME
-    static bool s_inYield = false;
-
-#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
-
-    if (s_inYield)
-    {
-        if ( !onlyIfNeeded )
-        {
-            wxFAIL_MSG( wxT("wxYield called recursively" ) );
-        }
-
-        return false;
-    }
-
-    s_inYield = true;
-
-    // Run the event loop until it is out of events
-    while(1)
-    {
-        wxAutoNSAutoreleasePool pool;
-        /*  NOTE: It may be better to use something like
-            NSEventTrackingRunLoopMode since we don't necessarily want all
-            timers/sources/observers to run, only those which would
-            run while tracking events.  However, it should be noted that
-            NSEventTrackingRunLoopMode is in the common set of modes
-            so it may not effectively make much of a difference.
-         */
-        NSEvent *event = [GetNSApplication()
-                nextEventMatchingMask:NSAnyEventMask
-                untilDate:[NSDate distantPast]
-                inMode:NSDefaultRunLoopMode
-                dequeue: YES];
-        if(!event)
-            break;
-        [GetNSApplication() sendEvent: event];
-    }
-
-    /*
-        Because we just told NSApplication to avoid blocking it will in turn
-        run the CFRunLoop with a timeout of 0 seconds.  In that case, our
-        run loop observer on kCFRunLoopBeforeWaiting never fires because
-        no waiting occurs.  Therefore, no idle events are sent.
-
-        Believe it or not, this is actually desirable because we do not want
-        to process idle from here.  However, we do want to process pending
-        events because some user code expects to do work in a thread while
-        the main thread waits and then notify the main thread by posting
-        an event.
-     */
-    ProcessPendingEvents();
-
-#if wxUSE_LOG
-    // let the logs be flashed again
-    wxLog::Resume();
-#endif // wxUSE_LOG
-
-    s_inYield = false;
-
-    return true;
-}
-
 void wxApp::WakeUpIdle()
 {
     /*  When called from the main thread the NSAutoreleasePool managed by
 void wxApp::WakeUpIdle()
 {
     /*  When called from the main thread the NSAutoreleasePool managed by
@@ -358,7 +319,7 @@ void wxApp::WakeUpIdle()
         done without exiting the runloop.
 
         Be careful if you decide to change the implementation of this method
         done without exiting the runloop.
 
         Be careful if you decide to change the implementation of this method
-        as wxEventLoop::Exit depends on the current behavior.
+        as wxEventLoop::Exit depends on the current behaviour.
      */
     [m_cocoaApp postEvent:[NSEvent otherEventWithType:NSApplicationDefined
             location:NSZeroPoint modifierFlags:NSAnyEventMask
      */
     [m_cocoaApp postEvent:[NSEvent otherEventWithType:NSApplicationDefined
             location:NSZeroPoint modifierFlags:NSAnyEventMask
@@ -393,7 +354,7 @@ static int sg_cApplicationWillUpdate = 0;
     before the run loop waits and send the idle events from there.
 
     It also has the desirable effect of only sending the wx idle events when
     before the run loop waits and send the idle events from there.
 
     It also has the desirable effect of only sending the wx idle events when
-    the event loop is actualy going to block.  If the event loop is being
+    the event loop is actually going to block.  If the event loop is being
     pumped manualy (e.g. like a PeekMessage) then the kCFRunLoopBeforeWaiting
     observer never fires.  Our Yield() method depends on this because sending
     idle events from within Yield would be bad.
     pumped manualy (e.g. like a PeekMessage) then the kCFRunLoopBeforeWaiting
     observer never fires.  Our Yield() method depends on this because sending
     idle events from within Yield would be bad.
@@ -501,15 +462,6 @@ void wxApp::CF_ObserveMainRunLoopBeforeWaiting(CFRunLoopObserverRef observer, in
     }
 }
 
     }
 }
 
-#ifdef __WXDEBUG__
-void wxApp::OnAssert(const wxChar *file, int line, const wxChar* cond, const wxChar *msg)
-{
-    m_isInAssert = true;
-    wxAppBase::OnAssert(file, line, cond, msg);
-    m_isInAssert = false;
-}
-#endif // __WXDEBUG__
-
 /*  A note about Cocoa's event loops vs. run loops:
 
     It's important to understand that Cocoa has a two-level event loop.  The
 /*  A note about Cocoa's event loops vs. run loops:
 
     It's important to understand that Cocoa has a two-level event loop.  The