]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/app.cpp
Missing ;
[wxWidgets.git] / src / mac / app.cpp
index 864e76018520a7cf92325d5bad8bae562e983f3f..537bb03e73f4588ef06b3b749c8857019d5ca30d 100644 (file)
@@ -13,6 +13,8 @@
 #pragma implementation "app.h"
 #endif
 
+#include "wx/defs.h"
+
 #include "wx/window.h"
 #include "wx/frame.h"
 #include "wx/button.h"
@@ -35,7 +37,7 @@
 #include "wx/textctrl.h"
 #include "wx/menu.h"
 #if wxUSE_WX_RESOURCES
-#include "wx/resource.h"
+#  include "wx/resource.h"
 #endif
 
 #include <string.h>
 #include "wx/mac/uma.h"
 #include "wx/mac/macnotfy.h"
 
-#if wxUSE_SOCKETS
-    #ifdef __DARWIN__
-        #include <CoreServices/CoreServices.h>
-    #else
-        #include <OpenTransport.h>
-        #include <OpenTptInternet.h>
-    #endif
+#ifdef __DARWIN__
+#  include <CoreServices/CoreServices.h>
+#  if defined(WXMAKINGDLL)
+#    include <mach-o/dyld.h>
+#  endif
+#else
+#  include <Sound.h>
+#  include <Threads.h>
+#  include <ToolUtils.h>
+#  include <DiskInit.h>
+#  include <Devices.h>
 #endif
 
 extern char *wxBuffer;
@@ -85,15 +91,15 @@ const short    kMacMinHeap = (29 * 1024) ;
 const short kwxMacMenuBarResource = 1 ;
 const short kwxMacAppleMenuId = 1 ;
 
-RgnHandle            wxApp::s_macCursorRgn = NULL;
-wxWindow*            wxApp::s_captureWindow = NULL ;
-int                    wxApp::s_lastMouseDown = 0 ;
-long                     wxApp::sm_lastMessageTime = 0;
+WXHRGN    wxApp::s_macCursorRgn = NULL;
+wxWindow* wxApp::s_captureWindow = NULL ;
+int       wxApp::s_lastMouseDown = 0 ;
+long      wxApp::sm_lastMessageTime = 0;
 
-bool    wxApp::s_macDefaultEncodingIsPC = true ;
-bool wxApp::s_macSupportPCMenuShortcuts = true ;
-long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
-wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
+bool      wxApp::s_macDefaultEncodingIsPC = true ;
+bool      wxApp::s_macSupportPCMenuShortcuts = true ;
+long      wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
+wxString  wxApp::s_macHelpMenuTitleName = "&Help" ;
 
 pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
 pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
@@ -103,29 +109,29 @@ pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long re
 
 pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon )
 {
-    wxApp* app = (wxApp*) refcon ;
+    // GD: UNUSED wxApp* app = (wxApp*) refcon ;
     return wxTheApp->MacHandleAEODoc( (AppleEvent*) event , reply) ;
 }
 
 pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon )
 {
-    wxApp* app = (wxApp*) refcon ;
+    // GD: UNUSED wxApp* app = (wxApp*) refcon ;
     return wxTheApp->MacHandleAEOApp( (AppleEvent*) event , reply ) ;
 }
 
 pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon )
 {
-    wxApp* app = (wxApp*) refcon ;
+    // GD: UNUSED wxApp* app = (wxApp*) refcon ;
     return wxTheApp->MacHandleAEPDoc( (AppleEvent*) event , reply ) ;
 }
 
 pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon )
 {
-    wxApp* app = (wxApp*) refcon ;
+    // GD: UNUSED wxApp* app = (wxApp*) refcon ;
     return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;
 }
 
-OSErr wxApp::MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply)
+short wxApp::MacHandleAEODoc(const WXEVENTREF event , WXEVENTREF reply)
 {
     SysBeep(40) ;
     ProcessSerialNumber PSN ;
@@ -135,17 +141,17 @@ OSErr wxApp::MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply)
     return noErr ;
 }
 
-OSErr wxApp::MacHandleAEPDoc(const AppleEvent *event , AppleEvent *reply)
+short wxApp::MacHandleAEPDoc(const WXEVENTREF event , WXEVENTREF reply)
 {
     return noErr ;
 }
 
-OSErr wxApp::MacHandleAEOApp(const AppleEvent *event , AppleEvent *reply)
+short wxApp::MacHandleAEOApp(const WXEVENTREF event , WXEVENTREF reply)
 {
     return noErr ;
 }
 
-OSErr wxApp::MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply)
+short wxApp::MacHandleAEQuit(const WXEVENTREF event , WXEVENTREF reply)
 {
     wxWindow* win = GetTopWindow() ;
     if ( win )
@@ -159,7 +165,7 @@ OSErr wxApp::MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply)
     return noErr ;
 }
 
-char StringMac[] =     "\x0d\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
+char StringMac[] =  "\x0d\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
                     "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
                     "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xae\xaf"
                     "\xb1\xb4\xb5\xb6\xbb\xbc\xbe\xbf"
@@ -257,7 +263,7 @@ void wxMacConvertFromPCForControls( char * p )
     int len = strlen ( p ) ;
 
     wxMacConvertFromPC( ptr , ptr , len ) ;
-    for ( int i = 0 ; i < strlen ( ptr ) ; i++ )
+    for ( unsigned int i = 0 ; i < strlen ( ptr ) ; i++ )
     {
         if ( ptr[i] == '&' && ptr[i]+1 != ' ' )
         {
@@ -371,41 +377,59 @@ void wxMacStringToPascal( const char * from , StringPtr to , bool pc2macEncoding
     }
 }
 
+#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
+// we know it's there ;-)
+WXIMPORT char std::__throws_bad_alloc ;
+#endif
+
 bool wxApp::Initialize()
 {
-  int error = 0 ;
+    int error = 0 ;
 
-  // Mac-specific
+    // Mac-specific
 
-  UMAInitToolbox( 4 ) ;
-  SetEventMask( everyEvent ) ;
+    UMAInitToolbox( 4 ) ;
+    SetEventMask( everyEvent ) ;
     UMAShowWatchCursor() ;
 
+#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+    // open shared library resources from here since we don't have
+    //   __wxinitialize in Mach-O shared libraries
+    wxStAppResource::OpenSharedLibraryResource(NULL);
+#endif
+    
 #if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
-    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,   NewAEEventHandlerUPP(AEHandleODoc) ,
+    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
+                           NewAEEventHandlerUPP(AEHandleODoc) ,
                            (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerUPP(AEHandleOApp) ,
+    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
+                           NewAEEventHandlerUPP(AEHandleOApp) ,
                            (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,  NewAEEventHandlerUPP(AEHandlePDoc) ,
+    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
+                           NewAEEventHandlerUPP(AEHandlePDoc) ,
                            (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerUPP(AEHandleQuit) ,
+    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
+                           NewAEEventHandlerUPP(AEHandleQuit) ,
                            (long) wxTheApp , FALSE ) ;
 #else
-    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,   NewAEEventHandlerProc(AEHandleODoc) ,
-                   (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerProc(AEHandleOApp) ,
-                   (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,  NewAEEventHandlerProc(AEHandlePDoc) ,
-                   (long) wxTheApp , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerProc(AEHandleQuit) ,
-                   (long) wxTheApp , FALSE ) ;
+    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
+                           NewAEEventHandlerProc(AEHandleODoc) ,
+                           (long) wxTheApp , FALSE ) ;
+    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
+                           NewAEEventHandlerProc(AEHandleOApp) ,
+                           (long) wxTheApp , FALSE ) ;
+    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
+                           NewAEEventHandlerProc(AEHandlePDoc) ,
+                           (long) wxTheApp , FALSE ) ;
+    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
+                           NewAEEventHandlerProc(AEHandleQuit) ,
+                           (long) wxTheApp , FALSE ) ;
 #endif
 
-
 #ifndef __DARWIN__
-  // test the minimal configuration necessary
+    // test the minimal configuration necessary
 
-    #if !TARGET_CARBON
+#  if !TARGET_CARBON
     long theSystem ;
     long theMachine;
 
@@ -429,7 +453,7 @@ bool wxApp::Initialize()
     {
         error = kMacSTRSmallSize;
     }
-    #endif
+#  endif
     /*
     else
     {
@@ -445,6 +469,7 @@ bool wxApp::Initialize()
 
   if ( error )
   {
+        wxStAppResource resload ;
         short itemHit;
         Str255 message;
 
@@ -456,26 +481,21 @@ bool wxApp::Initialize()
   }
 
 #ifndef __DARWIN__
-  #if __option(profile)
+#  if __option(profile)
     ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
-  #endif
+#  endif
 #endif
 
-  // now avoid exceptions thrown for new (bad_alloc)
-
 #ifndef __DARWIN__
-  std::__throws_bad_alloc = FALSE ;
+    // now avoid exceptions thrown for new (bad_alloc)
+    std::__throws_bad_alloc = FALSE ;
 #endif
 
     s_macCursorRgn = ::NewRgn() ;
 
-#ifdef __WXMSW__
-  wxBuffer = new char[1500];
-#else
-  wxBuffer = new char[BUFSIZ + 512];
-#endif
-
-  wxClassInfo::InitializeClasses();
+    wxBuffer = new char[BUFSIZ + 512];
+  
+    wxClassInfo::InitializeClasses();
 
 #if wxUSE_RESOURCES
 //    wxGetResource(wxT("wxWindows"), wxT("OsVersion"), &wxOsVersion);
@@ -484,8 +504,9 @@ bool wxApp::Initialize()
 #if wxUSE_THREADS
     wxPendingEventsLocker = new wxCriticalSection;
 #endif
-  wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
-  wxTheColourDatabase->Initialize();
+    
+    wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
+    wxTheColourDatabase->Initialize();
 
 #ifdef __WXDEBUG__
 #if wxUSE_LOG
@@ -500,6 +521,9 @@ bool wxApp::Initialize()
 #endif // wxUSE_LOG
 #endif
 
+  wxWinMacWindowList = new wxList(wxKEY_INTEGER);
+  wxWinMacControlList = new wxList(wxKEY_INTEGER);
+
   wxInitializeStockLists();
   wxInitializeStockObjects();
 
@@ -514,11 +538,9 @@ bool wxApp::Initialize()
      return FALSE;
   }
 
-  wxWinMacWindowList = new wxList(wxKEY_INTEGER);
-  wxWinMacControlList = new wxList(wxKEY_INTEGER);
-
   wxMacCreateNotifierTable() ;
 
+
   UMAShowArrowCursor() ;
 
   return TRUE;
@@ -526,6 +548,7 @@ bool wxApp::Initialize()
 
 void wxApp::CleanUp()
 {
+    wxToolTip::RemoveToolTips() ;
 #if wxUSE_LOG
     // flush the logged messages if any and install a 'safer' log target: the
     // default one (wxLogGui) can't be used after the resources are freed just
@@ -540,47 +563,51 @@ void wxApp::CleanUp()
     // One last chance for pending objects to be cleaned up
     wxTheApp->DeletePendingObjects();
 
-  wxModule::CleanUpModules();
+    wxModule::CleanUpModules();
 
 #if wxUSE_WX_RESOURCES
-  wxCleanUpResourceSystem();
+    wxCleanUpResourceSystem();
 #endif
 
-  wxDeleteStockObjects() ;
+    wxDeleteStockObjects() ;
 
     // Destroy all GDI lists, etc.
     wxDeleteStockLists();
 
-  delete wxTheColourDatabase;
-  wxTheColourDatabase = NULL;
+    delete wxTheColourDatabase;
+    wxTheColourDatabase = NULL;
 
-  wxBitmap::CleanUpHandlers();
+    wxBitmap::CleanUpHandlers();
 
-  delete[] wxBuffer;
-  wxBuffer = NULL;
-
-  wxMacDestroyNotifierTable() ;
-  if (wxWinMacWindowList)
-    delete wxWinMacWindowList ;
+    delete[] wxBuffer;
+    wxBuffer = NULL;
 
+    wxMacDestroyNotifierTable() ;
+    if (wxWinMacWindowList) {
+        delete wxWinMacWindowList ;
+    }
+    if (wxWinMacControlList) {
+        delete wxWinMacControlList ;
+    }
     delete wxPendingEvents;
+    
 #if wxUSE_THREADS
     delete wxPendingEventsLocker;
     // If we don't do the following, we get an apparent memory leak.
     ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
 #endif
 
-  wxClassInfo::CleanUpClasses();
+    wxClassInfo::CleanUpClasses();
 
 #ifndef __DARWIN__
-  #if __option(profile)
-  ProfilerDump( "\papp.prof" ) ;
-  ProfilerTerm() ;
-  #endif
+#  if __option(profile)
+    ProfilerDump( "\papp.prof" ) ;
+    ProfilerTerm() ;
+#  endif
 #endif
 
-  delete wxTheApp;
-  wxTheApp = NULL;
+    delete wxTheApp;
+    wxTheApp = NULL;
 
 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
     // At this point we want to check if there are any memory
@@ -601,10 +628,17 @@ void wxApp::CleanUp()
     delete wxLog::SetActiveTarget(NULL);
 #endif // wxUSE_LOG
 
+#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+    // close shared library resources from here since we don't have
+    //   __wxterminate in Mach-O shared libraries
+    wxStAppResource::CloseSharedLibraryResource();
+#endif
+    
     UMACleanupToolbox() ;
-    if (s_macCursorRgn)
-        ::DisposeRgn(s_macCursorRgn);
-
+    if (s_macCursorRgn) {
+        ::DisposeRgn((RgnHandle)s_macCursorRgn);
+    }
+    
     #if 0
         TerminateAE() ;
     #endif
@@ -614,23 +648,176 @@ void wxApp::CleanUp()
 // wxEntry
 //----------------------------------------------------------------------
 
-int wxEntryStart( int argc, char *argv[] )
+// extern variable for shared library resource id
+// need to be able to find it with NSLookupAndBindSymbol
+short gSharedLibraryResource = kResFileNotOpened ;
+
+#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+CFBundleRef gSharedLibraryBundle = NULL;
+#endif /* WXMAKINGDLL && __DARWIN__ */
+
+wxStAppResource::wxStAppResource()
 {
-    return wxApp::Initialize();
+    m_currentRefNum = CurResFile() ;
+    if ( gSharedLibraryResource != kResFileNotOpened )
+    {
+        UseResFile( gSharedLibraryResource ) ;
+    }
 }
 
+wxStAppResource::~wxStAppResource()
+{
+    if ( m_currentRefNum != kResFileNotOpened )
+    {
+        UseResFile( m_currentRefNum ) ;
+    }
+}
 
-int wxEntryInitGui()
+void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
 {
-    return wxTheApp->OnInitGui();
+    gSharedLibraryResource = kResFileNotOpened;
+
+#ifdef WXMAKINGDLL
+    if ( initBlock != NULL ) {
+        const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
+        FSSpec *fileSpec = NULL;
+        
+        if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
+            fileSpec = theInitBlock->fragLocator.u.onDisk.fileSpec;
+        }
+        else if (theInitBlock->fragLocator.where == kResourceCFragLocator) {
+            fileSpec = theInitBlock->fragLocator.u.inSegs.fileSpec;
+        }
+        
+        if (fileSpec != NULL) {
+            gSharedLibraryResource =  FSpOpenResFile(fileSpec, fsRdPerm);
+        }
+    }
+    else {
+#ifdef __DARWIN__
+        // Open the shared library resource file if it is not yet open
+        NSSymbol    theSymbol;
+        NSModule    theModule;
+        const char *theLibPath;
+        
+        gSharedLibraryBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
+        if (gSharedLibraryBundle != NULL) {
+            // wxWindows has been bundled into a framework
+            //   load the framework resources
+            
+            gSharedLibraryResource = CFBundleOpenBundleResourceMap(gSharedLibraryBundle);
+        }
+        else {
+            // wxWindows is a simple dynamic shared library
+            //   load the resources from the data fork of a separate resource file
+            char  *theResPath;
+            char  *theName;
+            char  *theExt;
+            FSRef  theResRef;
+            OSErr  theErr = noErr;
+            
+            // get the library path
+            theSymbol = NSLookupAndBindSymbol("_gSharedLibraryResource");
+            theModule = NSModuleForSymbol(theSymbol);
+            theLibPath = NSLibraryNameForModule(theModule);
+
+            // allocate copy to replace .dylib.* extension with .rsrc
+            theResPath = strdup(theLibPath);
+            if (theResPath != NULL) {
+                theName = strrchr(theResPath, '/');
+                if (theName == NULL) {
+                    // no directory elements in path
+                    theName = theResPath;
+                }
+                // find ".dylib" shared library extension
+                theExt = strstr(theName, ".dylib");
+                // overwrite extension with ".rsrc"
+                strcpy(theExt, ".rsrc");
+                
+                wxLogDebug( theResPath );
+
+                theErr = FSPathMakeRef((UInt8 *) theResPath, &theResRef, false);
+                if (theErr != noErr) {
+                    // try in current directory (using name only)
+                    theErr = FSPathMakeRef((UInt8 *) theName, &theResRef, false);
+                }
+                
+                // free duplicated resource file path
+                free(theResPath);
+
+                // open the resource file
+                if (theErr == noErr) {
+                    theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
+                                                 &gSharedLibraryResource);
+                }
+            }
+        }
+#endif /* __DARWIN__ */
+    }
+#endif /* WXMAKINGDLL */
+}
+
+void wxStAppResource::CloseSharedLibraryResource()
+{
+#ifdef WXMAKINGDLL
+    // Close the shared library resource file
+    if (gSharedLibraryResource != kResFileNotOpened) {
+#ifdef __DARWIN__
+        if (gSharedLibraryBundle != NULL) {
+            CFBundleCloseBundleResourceMap(gSharedLibraryBundle,
+                                           gSharedLibraryResource);
+            gSharedLibraryBundle = NULL;
+        }
+        else
+#endif /* __DARWIN__ */
+        {
+            CloseResFile(gSharedLibraryResource);
+        }
+        gSharedLibraryResource = kResFileNotOpened;
+    }    
+#endif /* WXMAKINGDLL */
 }
 
+#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
+
+// for shared libraries we have to manually get the correct resource
+// ref num upon initializing and releasing when terminating, therefore
+// the __wxinitialize and __wxterminate must be used
 
-void wxEntryCleanup()
+extern "C" {
+    void __sinit(void);        /*      (generated by linker)   */
+    pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
+    pascal void __terminate(void);
+}
+
+pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock)
 {
-    wxApp::CleanUp();
+    wxStAppResource::OpenSharedLibraryResource( theInitBlock ) ;
+    return __initialize( theInitBlock ) ;
+}
+
+pascal void __wxterminate(void)
+{
+    wxStAppResource::CloseSharedLibraryResource() ;
+    __terminate() ;
+}
+
+#endif /* WXMAKINGDLL && !__DARWIN__ */
+
+int WXDLLEXPORT wxEntryStart( int argc, char *argv[] )
+{
+    return wxApp::Initialize();
 }
 
+int WXDLLEXPORT wxEntryInitGui()
+{
+    return wxTheApp->OnInitGui();
+}
+
+void WXDLLEXPORT wxEntryCleanup()
+{
+    wxApp::CleanUp();
+}
 
 int wxEntry( int argc, char *argv[] , bool enterLoop )
 {
@@ -662,7 +849,22 @@ int wxEntry( int argc, char *argv[] , bool enterLoop )
 
     wxCHECK_MSG( wxTheApp, 0, wxT("You have to define an instance of wxApp!") );
 
-#ifndef __DARWIN__
+#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) {
+        char theArg[6] = "";
+        strncpy(theArg, argv[1], 5);
+        
+        if (strcmp(theArg, "-psn_") == 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
@@ -673,7 +875,6 @@ int wxEntry( int argc, char *argv[] , bool enterLoop )
     // GUI-specific initialization, such as creating an app context.
     wxEntryInitGui();
 
-
     // Here frames insert themselves automatically
     // into wxTopLevelWindows by getting created
     // in OnInit().
@@ -716,6 +917,136 @@ int wxEntry( int argc, char *argv[] , bool enterLoop )
     return retValue;
 }
 
+#if TARGET_CARBON
+
+bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec)
+{
+    bool converted = ConvertEventRefToEventRecord( event,rec) ;
+    OSStatus err = noErr ;
+    if ( !converted )
+    {
+        switch( GetEventClass( event ) )
+        {
+            case kEventClassKeyboard :
+            {
+                converted = true ;
+                switch( GetEventKind(event) ) 
+                {
+                    case kEventRawKeyDown :
+                        rec->what = keyDown ;
+                        break ;
+                    case kEventRawKeyRepeat :
+                        rec->what = autoKey ;
+                        break ;
+                    case kEventRawKeyUp :
+                        rec->what = keyUp ;
+                        break ;
+                    case kEventRawKeyModifiersChanged :
+                        rec->what = nullEvent ;
+                        break ;
+                    default :
+                        converted = false ;
+                        break ;
+                }
+                if ( converted )
+                {
+                    UInt32 keyCode ;
+                    unsigned char charCode ;
+                    UInt32 modifiers ;
+                    GetMouse( &rec->where) ;
+
+                    err = GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, 4, NULL, &modifiers);
+                    err = GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, 4, NULL, &keyCode);
+                    err = GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode);
+                    rec->modifiers = modifiers ;
+                    rec->message = (keyCode << 8 ) + charCode ;
+                }
+            }
+            break ;
+            case kEventClassTextInput :
+            {
+                switch( GetEventKind( event ) )
+                {
+                    case kEventTextInputUnicodeForKeyEvent :
+                        {
+                            EventRef rawEvent ;
+                            err = GetEventParameter( event , kEventParamTextInputSendKeyboardEvent ,typeEventRef,NULL,sizeof(rawEvent),NULL,&rawEvent ) ;
+                            converted = true ;
+                            {
+                                UInt32 keyCode ;
+                                unsigned char charCode ;
+                                UInt32 modifiers ;
+                                GetMouse( &rec->where) ;
+                                rec->what = keyDown ;
+                                err = GetEventParameter(rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, 4, NULL, &modifiers);
+                                err = GetEventParameter(rawEvent, kEventParamKeyCode, typeUInt32, NULL, 4, NULL, &keyCode);
+                                err = GetEventParameter(rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode);
+                                rec->modifiers = modifiers ;
+                                rec->message = (keyCode << 8 ) + charCode ;
+                            }
+                       }
+                        break ;
+                    default :
+                        break ;
+                }
+            }
+            break ;
+        }
+    }
+    
+    return converted ;
+}
+
+pascal OSStatus wxMacApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+    OSStatus result = eventNotHandledErr ;
+    
+    EventRecord rec ;
+    switch ( GetEventClass( event ) )
+    {
+        case kEventClassKeyboard :
+            if ( wxMacConvertEventToRecord( event , &rec ) )
+            {
+                wxTheApp->MacHandleOneEvent( &rec ) ;
+                result = noErr ;
+            }
+            break ;
+        case kEventClassTextInput :
+            if ( wxMacConvertEventToRecord( event , &rec ) )
+            {
+                wxTheApp->MacHandleOneEvent( &rec ) ;
+                result = noErr ;
+            }
+            break ;
+        default :
+            break ;
+    }
+    return result ;
+}
+
+#endif
+
+bool wxApp::OnInit()
+{
+    if ( ! wxAppBase::OnInit() )
+        return FALSE ;
+    
+#if TARGET_CARBON
+       static const EventTypeSpec eventList[] = 
+       {
+           { kEventClassKeyboard, kEventRawKeyDown } ,
+           { kEventClassKeyboard, kEventRawKeyRepeat } ,
+           { kEventClassKeyboard, kEventRawKeyUp } ,
+           { kEventClassKeyboard, kEventRawKeyModifiersChanged } ,
+           
+           { kEventClassTextInput , kEventTextInputUnicodeForKeyEvent } ,
+       } ;
+       
+       InstallApplicationEventHandler(NewEventHandlerUPP(wxMacApplicationEventHandler)
+           , WXSIZEOF(eventList), eventList, this, NULL);    
+#endif
+    return TRUE ;
+}
 // Static member initialization
 wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL;
 
@@ -724,7 +1055,9 @@ wxApp::wxApp()
   m_topWindow = NULL;
   wxTheApp = this;
 
-  m_wantDebugOutput = TRUE ;
+#if WXWIN_COMPATIBILITY_2_2
+  m_wantDebugOutput = TRUE;
+#endif
 
   argc = 0;
   argv = NULL;
@@ -879,29 +1212,6 @@ void wxApp::DeletePendingObjects()
   }
 }
 
-wxIcon
-wxApp::GetStdIcon(int which) const
-{
-    switch(which)
-    {
-        case wxICON_INFORMATION:
-            return wxIcon("wxICON_INFO");
-
-        case wxICON_QUESTION:
-            return wxIcon("wxICON_QUESTION");
-
-        case wxICON_EXCLAMATION:
-            return wxIcon("wxICON_WARNING");
-
-        default:
-            wxFAIL_MSG(wxT("requested non existent standard icon"));
-            // still fall through
-
-        case wxICON_HAND:
-            return wxIcon("wxICON_ERROR");
-    }
-}
-
 void wxExit()
 {
     wxLogError(_("Fatal error: exiting"));
@@ -958,11 +1268,11 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
     long sleepTime = 1 ; //::GetCaretTime();
 
-    while ( !wxTheApp->IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, wxApp::s_macCursorRgn))
+    while ( !wxTheApp->IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, (RgnHandle) wxApp::s_macCursorRgn))
     {
         wxTheApp->MacHandleOneEvent( &event );
         if ( event.what != kHighLevelEvent )
-            SetRectRgn( wxApp::s_macCursorRgn , event.where.h , event.where.v ,  event.where.h + 1 , event.where.v + 1 ) ;
+            SetRectRgn( (RgnHandle) wxApp::s_macCursorRgn , event.where.h , event.where.v ,  event.where.h + 1 , event.where.v + 1 ) ;
     }
 
     wxMacProcessNotifierAndPendingEvents() ;
@@ -976,19 +1286,24 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
 void wxApp::MacSuspend( bool convertClipboard )
 {
-    // we have to deactive the window manually
+    // we have to deactive the top level windows manually
 
-    wxWindow* window = GetTopWindow() ;
-    if ( window )
-        window->MacActivate( MacGetCurrentEvent() , false ) ;
+    wxNode* node = wxTopLevelWindows.First();
+    while (node)
+    {
+        wxTopLevelWindow* win = (wxTopLevelWindow*) node->Data();
+        win->MacActivate( MacGetCurrentEvent() , false ) ;
 
-        s_lastMouseDown = 0 ;
-        if( convertClipboard )
-        {
-            MacConvertPrivateToPublicScrap() ;
-        }
+        node = node->Next();
+    }
 
-        ::HideFloatingWindows() ;
+     s_lastMouseDown = 0 ;
+     if( convertClipboard )
+     {
+         MacConvertPrivateToPublicScrap() ;
+     }
+
+     ::HideFloatingWindows() ;
 }
 
 void wxApp::MacResume( bool convertClipboard )
@@ -1016,7 +1331,7 @@ void wxApp::MacDoOneEvent()
 
     long sleepTime = 1; // GetCaretTime() / 4 ;
 
-    if (WaitNextEvent(everyEvent, &event, sleepTime, s_macCursorRgn))
+    if (WaitNextEvent(everyEvent, &event, sleepTime, (RgnHandle) s_macCursorRgn))
     {
         MacHandleOneEvent( &event );
     }
@@ -1030,7 +1345,7 @@ void wxApp::MacDoOneEvent()
         wxTheApp->ProcessIdle() ;
     }
     if ( event.what != kHighLevelEvent )
-        SetRectRgn( s_macCursorRgn , event.where.h , event.where.v ,  event.where.h + 1 , event.where.v + 1 ) ;
+        SetRectRgn( (RgnHandle) s_macCursorRgn , event.where.h , event.where.v ,  event.where.h + 1 , event.where.v + 1 ) ;
 
     // repeaters
 
@@ -1038,8 +1353,9 @@ void wxApp::MacDoOneEvent()
     wxMacProcessNotifierAndPendingEvents() ;
 }
 
-void wxApp::MacHandleOneEvent( EventRecord *ev )
+void wxApp::MacHandleOneEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     m_macCurrentEvent = ev ;
 
     wxApp::sm_lastMessageTime = ev->when ;
@@ -1093,15 +1409,17 @@ void wxApp::MacHandleOneEvent( EventRecord *ev )
     wxMacProcessNotifierAndPendingEvents() ;
 }
 
-void wxApp::MacHandleHighLevelEvent( EventRecord *ev )
+void wxApp::MacHandleHighLevelEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     ::AEProcessAppleEvent( ev ) ;
 }
 
 bool s_macIsInModalLoop = false ;
 
-void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
+void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     wxToolTip::RemoveToolTips() ;
 
     WindowRef window;
@@ -1111,7 +1429,7 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
         ::GetWindowAttributes( frontWindow , &frontWindowAttributes ) ;
 
     short windowPart = ::FindWindow(ev->where, &window);
-    wxWindow* win = wxFindWinFromMacWindow( window ) ;
+    wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
     if ( wxPendingDelete.Member(win) )
         return ;
 
@@ -1151,12 +1469,7 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
                     GrafPtr port ;
                     GetPort( &port ) ;
                     Point pt = { 0, 0 } ;
-                    #if TARGET_CARBON
-                    SetPort( GetWindowPort(window) ) ;
-                    #else
-                    SetPort( (window) ) ;
-                    #endif
-                    SetOrigin( 0 , 0 ) ;
+                    SetPortWindowPort(window) ;
                     LocalToGlobal( &pt ) ;
                     SetPort( port ) ;
                         win->SetSize( pt.h , pt.v , -1 ,
@@ -1222,12 +1535,7 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
                 {
                     GrafPtr port ;
                     GetPort( &port ) ;
-                    #if TARGET_CARBON
-                    SetPort( GetWindowPort(window) ) ;
-                    #else
-                    SetPort( (window) ) ;
-                    #endif
-                    SetOrigin( 0 , 0 ) ;
+                    SetPortWindowPort(window) ;
                     SetPort( port ) ;
                 }
                 if ( window != frontWindow && wxTheApp->s_captureWindow == NULL )
@@ -1260,11 +1568,21 @@ void wxApp::MacHandleMouseDownEvent( EventRecord *ev )
     }
 }
 
-void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
+void wxApp::MacHandleMouseUpEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     WindowRef window;
 
-    short windowPart = ::FindWindow(ev->where, &window);
+    short windowPart = inNoWindow ;
+       if ( wxTheApp->s_captureWindow )
+       {
+               window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
+               windowPart = inContent ;
+       } 
+       else
+       {
+               windowPart = ::FindWindow(ev->where, &window) ;
+       }
 
     switch (windowPart)
     {
@@ -1274,7 +1592,7 @@ void wxApp::MacHandleMouseUpEvent( EventRecord *ev )
             break ;
         default:
             {
-                wxWindow* win = wxFindWinFromMacWindow( window ) ;
+                wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
                 if ( win )
                     win->MacMouseUp( ev , windowPart ) ;
             }
@@ -1391,8 +1709,9 @@ long wxMacTranslateKey(unsigned char key, unsigned char code)
     return retval;
 }
 
-void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
+void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     wxToolTip::RemoveToolTips() ;
 
     UInt32 menuresult = UMAMenuEvent(ev) ;
@@ -1407,6 +1726,11 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
         short keychar ;
         keychar = short(ev->message & charCodeMask);
         keycode = short(ev->message & keyCodeMask) >> 8 ;
+        // it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value
+        if ( ev->modifiers & controlKey && keychar >= 0 && keychar < 0x20 )
+        {
+            keychar += 0x40 ;
+        }
         long keyval = wxMacTranslateKey(keychar, keycode) ;
         bool handled = false ;
         wxWindow* focus = wxWindow::FindFocus() ;
@@ -1424,13 +1748,14 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
             event.m_timeStamp = ev->when;
             event.SetEventObject(focus);
             handled = focus->GetEventHandler()->ProcessEvent( event ) ;
+            if ( handled && event.GetSkipped() )
+                handled = false ;
             if ( !handled )
             {
-                #if wxUSE_ACCEL
+#if wxUSE_ACCEL
                 if (!handled)
                 {
                     wxWindow *ancestor = focus;
-                    /*
                     while (ancestor)
                     {
                         int command = ancestor->GetAcceleratorTable()->GetCommand( event );
@@ -1440,13 +1765,12 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
                             handled = ancestor->GetEventHandler()->ProcessEvent( command_event );
                             break;
                         }
-                        if (ancestor->m_isFrame)
+                        if (ancestor->IsTopLevel())
                             break;
                         ancestor = ancestor->GetParent();
                     }
-                    */
                 }
-                #endif // wxUSE_ACCEL
+#endif // wxUSE_ACCEL
             }
             if (!handled)
             {
@@ -1461,10 +1785,18 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
                 event.m_timeStamp = ev->when;
                 event.SetEventObject(focus);
                 handled = focus->GetEventHandler()->ProcessEvent( event ) ;
+                if ( handled && event.GetSkipped() )
+                    handled = false ;
             }
             if ( !handled &&
                  (keyval == WXK_TAB) &&
+// CS: copied the change below from wxGTK
+// VZ: testing for wxTE_PROCESS_TAB shouldn't be done here the control may
+//     have this style, yet choose not to process this particular TAB in which
+//     case TAB must still work as a navigational character
+#if 0
                  (!focus->HasFlag(wxTE_PROCESS_TAB)) &&
+#endif
                  (focus->GetParent()) &&
                  (focus->GetParent()->HasFlag( wxTAB_TRAVERSAL)) )
             {
@@ -1475,6 +1807,8 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
                 new_event.SetWindowChange( event.ControlDown() );
                 new_event.SetCurrentFocus( focus );
                 handled = focus->GetEventHandler()->ProcessEvent( new_event );
+                if ( handled && new_event.GetSkipped() )
+                    handled = false ;
             }
         }
         if ( !handled )
@@ -1508,8 +1842,9 @@ void wxApp::MacHandleKeyDownEvent( EventRecord *ev )
     }
 }
 
-void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
+void wxApp::MacHandleKeyUpEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     wxToolTip::RemoveToolTips() ;
 
     UInt32 menuresult = UMAMenuEvent(ev) ;
@@ -1543,8 +1878,9 @@ void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
     }
 }
 
-void wxApp::MacHandleActivateEvent( EventRecord *ev )
+void wxApp::MacHandleActivateEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     WindowRef window = (WindowRef) ev->message ;
     if ( window )
     {
@@ -1556,20 +1892,21 @@ void wxApp::MacHandleActivateEvent( EventRecord *ev )
             // if it is a floater we activate/deactivate the front non-floating window instead
             window = ::FrontNonFloatingWindow() ;
         }
-        wxWindow* win = wxFindWinFromMacWindow( window ) ;
+        wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
         if ( win )
             win->MacActivate( ev , activate ) ;
     }
 }
 
-void wxApp::MacHandleUpdateEvent( EventRecord *ev )
+void wxApp::MacHandleUpdateEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     WindowRef window = (WindowRef) ev->message ;
-    wxWindow * win = wxFindWinFromMacWindow( window ) ;
+    wxTopLevelWindowMac * win = wxFindWinFromMacWindow( window ) ;
     if ( win )
     {
         if ( !wxPendingDelete.Member(win) )
-            win->MacUpdate( ev ) ;
+            win->MacUpdate( ev->when ) ;
     }
     else
     {
@@ -1581,8 +1918,9 @@ void wxApp::MacHandleUpdateEvent( EventRecord *ev )
     }
 }
 
-void wxApp::MacHandleDiskEvent( EventRecord *ev )
+void wxApp::MacHandleDiskEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     if ( HiWord( ev->message ) != noErr )
   {
  #if !TARGET_CARBON
@@ -1596,8 +1934,9 @@ void wxApp::MacHandleDiskEvent( EventRecord *ev )
     }
 }
 
-void wxApp::MacHandleOSEvent( EventRecord *ev )
+void wxApp::MacHandleOSEvent( WXEVENTREF evr )
 {
+    EventRecord* ev = (EventRecord*) evr ;
     switch( ( ev->message & osEvtMessageMask ) >> 24 )
     {
         case suspendResumeMessage :
@@ -1626,13 +1965,13 @@ void wxApp::MacHandleOSEvent( EventRecord *ev )
 
                     if ( oldFrontWindow )
                     {
-                        wxWindow* win = wxFindWinFromMacWindow( oldFrontWindow ) ;
+                        wxTopLevelWindowMac* win = wxFindWinFromMacWindow( oldFrontWindow ) ;
                         if ( win )
                             win->MacActivate( ev , false ) ;
                     }
                     if ( newFrontWindow )
                     {
-                        wxWindow* win = wxFindWinFromMacWindow( newFrontWindow ) ;
+                        wxTopLevelWindowMac* win = wxFindWinFromMacWindow( newFrontWindow ) ;
                         if ( win )
                             win->MacActivate( ev , true ) ;
                     }
@@ -1664,7 +2003,6 @@ void wxApp::MacHandleOSEvent( EventRecord *ev )
 
                 wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) ,
                                                  &currentMouseWindow ) ;
-
                 if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
                 {
                     wxMouseEvent event ;
@@ -1683,17 +2021,22 @@ void wxApp::MacHandleOSEvent( EventRecord *ev )
                     event.m_y = ev->where.v;
                     event.m_timeStamp = ev->when;
                     event.SetEventObject(this);
-
+                    
                     if ( wxWindow::s_lastMouseWindow )
                     {
-                        wxMouseEvent eventleave(event ) ;
-                        eventleave.SetEventType( wxEVT_LEAVE_WINDOW ) ;
+                        wxMouseEvent eventleave(event);
+                        eventleave.SetEventType( wxEVT_LEAVE_WINDOW );
+                        wxWindow::s_lastMouseWindow->ScreenToClient( &eventleave.m_x, &eventleave.m_y );
+                        eventleave.SetEventObject( wxWindow::s_lastMouseWindow ) ;
+                        
                         wxWindow::s_lastMouseWindow->GetEventHandler()->ProcessEvent(eventleave);
                     }
                     if ( currentMouseWindow )
                     {
-                        wxMouseEvent evententer(event ) ;
-                        evententer.SetEventType( wxEVT_ENTER_WINDOW ) ;
+                        wxMouseEvent evententer(event);
+                        evententer.SetEventType( wxEVT_ENTER_WINDOW );
+                        currentMouseWindow->ScreenToClient( &evententer.m_x, &evententer.m_y );
+                        evententer.SetEventObject( currentMouseWindow ) ;
                         currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
                     }
                     wxWindow::s_lastMouseWindow = currentMouseWindow ;
@@ -1726,7 +2069,7 @@ void wxApp::MacHandleOSEvent( EventRecord *ev )
                             ::GetNextEvent(0, &tmp);
                             ev->modifiers = tmp.modifiers;
                             
-                            wxWindow* win = wxFindWinFromMacWindow( window ) ;
+                            wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
                             if ( win )
                                 win->MacMouseMoved( ev , windowPart ) ;
                             else