]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/app.mm
Fix history in wxWebViewIE when using a custom file scheme.
[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.
-// Licence:     wxWidgets licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
@@ -15,7 +15,6 @@
 #include "wx/app.h"
 
 #ifndef WX_PRECOMP
-    #include "wx/dc.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/dc.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 )
     {
-        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
@@ -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);
 }
 
@@ -131,7 +163,7 @@ void wxApp::CleanUp()
 {
     wxAutoNSAutoreleasePool pool;
 
-    wxDC::CocoaShutdownTextSystem();
+    wxCocoaDCImpl::CocoaShutdownTextSystem();
     wxMenuBarManager::DestroyInstance();
 
     [[NSNotificationCenter defaultCenter] removeObserver:sg_cocoaAppObserver];
@@ -152,12 +184,10 @@ wxApp::wxApp()
 {
     m_topWindow = NULL;
 
-#ifdef __WXDEBUG__
-    m_isInAssert = false;
-#endif // __WXDEBUG__
-
     argc = 0;
+#if !wxUSE_UNICODE
     argv = NULL;
+#endif
     m_cocoaApp = NULL;
     m_cocoaAppDelegate = NULL;
 }
@@ -224,7 +254,7 @@ bool wxApp::OnInitGui()
     if(!sm_isEmbedded)
         wxMenuBarManager::CreateInstance();
 
-    wxDC::CocoaInitializeTextSystem();
+    wxCocoaDCImpl::CocoaInitializeTextSystem();
     return true;
 }
 
@@ -260,75 +290,6 @@ void wxApp::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
@@ -358,7 +319,7 @@ void wxApp::WakeUpIdle()
         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
@@ -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
-    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.
@@ -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