]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/app.cpp
compilation fix
[wxWidgets.git] / src / mac / app.cpp
index 1af5aa871fc86c6651f16618c7b8d4a55ce34c6d..0c8413941f4efb50b6e490385bd01b6b8b1a898e 100644 (file)
@@ -55,7 +55,7 @@
 
 #ifdef __DARWIN__
 #  include <CoreServices/CoreServices.h>
-#  if defined(WXMAKINGDLL)
+#  if defined(WXMAKINGDLL_CORE)
 #    include <mach-o/dyld.h>
 #  endif
 #else
 extern wxList wxPendingDelete;
 extern wxList *wxWinMacWindowList;
 extern wxList *wxWinMacControlList;
+extern size_t g_numberOfThreads;
 
 // statics for implementation
 
 static bool s_inYield = FALSE;
-static bool s_inOnIdle = FALSE;
 
 #if TARGET_CARBON
 static bool s_inReceiveEvent = FALSE ;
@@ -105,13 +105,14 @@ long      wxApp::sm_lastMessageTime = 0;
 long      wxApp::s_lastModifiers = 0 ;
 
 
-bool      wxApp::s_macDefaultEncodingIsPC = true ;
 bool      wxApp::s_macSupportPCMenuShortcuts = true ;
 long      wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
-long      wxApp::s_macPreferencesMenuItemId = 0 ;
+long      wxApp::s_macPreferencesMenuItemId = wxID_PREFERENCES ;
 long      wxApp::s_macExitMenuItemId = wxID_EXIT ;
 wxString  wxApp::s_macHelpMenuTitleName = wxT("&Help") ;
 
+// Normally we're not a plugin
+bool      wxApp::sm_isEmbedded = false;
 //----------------------------------------------------------------------
 // Core Apple Event Support
 //----------------------------------------------------------------------
@@ -221,13 +222,12 @@ short wxApp::MacHandleAEOApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU
 
 short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
 {
/*   wxWindow* win = GetTopWindow() ;
      wxWindow* win = GetTopWindow() ;
     if ( win )
     {
         win->Close(TRUE ) ;
     }
-    else
- */
+       else
     {
         ExitMainLoop() ;
     }
@@ -288,6 +288,9 @@ void wxApp::MacNewFile()
         { kEventClassCommand, kEventProcessCommand } ,
         { kEventClassCommand, kEventCommandUpdateStatus } ,
 
+        { kEventClassMenu, kEventMenuOpening },
+        { kEventClassMenu, kEventMenuClosed },
+
         { kEventClassApplication , kEventAppActivated } ,
         { kEventClassApplication , kEventAppDeactivated } ,
         // handling the quit event is not recommended by apple
@@ -296,31 +299,77 @@ void wxApp::MacNewFile()
         { kEventClassAppleEvent , kEventAppleEvent } ,
 
         { kEventClassMouse , kEventMouseDown } ,
+        { kEventClassMouse , kEventMouseMoved } ,
+        { kEventClassMouse , kEventMouseUp } ,
+        { kEventClassMouse , kEventMouseDragged } ,
         { 'WXMC' , 'WXMC' }
     } ;
 
-static pascal OSStatus MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus
+MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
-    return eventNotHandledErr ;
+    // FIXME: this doesn't work for multiple windows
+    wxWindow *win = wxTheApp->GetTopWindow();
+    if ( win )
+    {
+        // VZ: we could find the menu from its handle here by examining all
+        //     the menus in the menu bar recursively but knowing that neither
+        //     wxMSW nor wxGTK do it why bother...
+#if 0
+        MenuRef menuRef;
+
+        GetEventParameter(event,
+                          kEventParamDirectObject,
+                          typeMenuRef, NULL,
+                          sizeof(menuRef), NULL,
+                          &menuRef);
+#endif // 0
+
+        wxMenuEvent wxevent(GetEventKind(event) == kEventMenuOpening
+                        ? wxEVT_MENU_OPEN
+                        : wxEVT_MENU_CLOSE);
+        wxevent.SetEventObject(win);
+
+        (void)win->GetEventHandler()->ProcessEvent(wxevent);
+    }
+
+    return eventNotHandledErr;
 }
 
 // due to the rather low-level event API of wxWindows, we cannot use RunApplicationEventLoop
 // but have to use ReceiveNextEvent dealing with events manually, therefore we also have
 // deal with clicks in the menu bar explicitely
 
+pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ;
+
 static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
     OSStatus result = eventNotHandledErr ;
 
+    Point point ;
+    UInt32 modifiers = 0;
+    EventMouseButton button = 0 ;
+    UInt32 click = 0 ;
+
+    GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL,
+        sizeof( Point ), NULL, &point );
+    GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL,
+        sizeof( UInt32 ), NULL, &modifiers );
+    GetEventParameter( event, kEventParamMouseButton, typeMouseButton, NULL,
+        sizeof( EventMouseButton ), NULL, &button );
+    GetEventParameter( event, kEventParamClickCount, typeUInt32, NULL,
+        sizeof( UInt32 ), NULL, &click );
+
+    if ( button == 0 || GetEventKind( event ) == kEventMouseUp )
+        modifiers += btnState ;
+
+
     switch( GetEventKind(event) )
     {
         case kEventMouseDown :
         {
-            Point point ;
             WindowRef window ;
 
-            GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL,
-                sizeof( Point ), NULL, &point );
             short windowPart = ::FindWindow(point, &window);
 
             if ( windowPart == inMenuBar )
@@ -330,6 +379,20 @@ static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef
             }
         }
         break ;
+        case kEventMouseDragged :
+        case kEventMouseUp :
+        {
+            if ( wxTheApp->s_captureWindow )
+                wxMacWindowEventHandler( handler , event , (void*) wxTheApp->s_captureWindow->MacGetTopLevelWindow() ) ;
+        }
+        break ;
+        case kEventMouseMoved :
+        {
+            wxTheApp->MacHandleMouseMovedEvent( point.h , point.v , modifiers , EventTimeToTicks( GetEventTime( event ) ) ) ;
+            result = noErr ;
+            break ;
+        }
+        break ;
     }
 
     return result ;
@@ -353,7 +416,15 @@ static pascal OSStatus CommandEventHandler( EventHandlerCallRef handler , EventR
     wxMenuItem* item = NULL ;
 
     if ( mbar )
+    {
         item = mbar->FindItem( id , &menu ) ;
+        // it is not 100 % sure that an menu of id 0 is really ours, safety check
+        if ( id == 0 && menu != NULL && menu->GetHMenu() != command.menu.menuRef )
+        {
+            item = NULL ;
+            menu = NULL ;
+        }
+    }
 
     if ( item == NULL || menu == NULL || mbar == NULL )
         return result ;
@@ -373,7 +444,7 @@ static pascal OSStatus CommandEventHandler( EventHandlerCallRef handler , EventR
                break ;
         case kEventCommandUpdateStatus:
             // eventually trigger an updateui round
-                result = noErr ;
+            result = noErr ;
             break ;
            default :
                break ;
@@ -442,7 +513,7 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxAppEventHandler )
 
 #endif
 
-#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__)
 // we know it's there ;-)
 WXIMPORT char std::__throws_bad_alloc ;
 #endif
@@ -453,11 +524,11 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 
     // Mac-specific
 
-    UMAInitToolbox( 4 ) ;
+    UMAInitToolbox( 4, sm_isEmbedded ) ;
     SetEventMask( everyEvent ) ;
     UMAShowWatchCursor() ;
 
-#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__)
     // open shared library resources from here since we don't have
     //   __wxinitialize in Mach-O shared libraries
     wxStAppResource::OpenSharedLibraryResource(NULL);
@@ -519,7 +590,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 
 #ifndef __DARWIN__
 #  if __option(profile)
-    ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
+    ProfilerInit( collectDetailed, bestTimeBase , 40000 , 50 ) ;
 #  endif
 #endif
 
@@ -531,7 +602,6 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 #endif
 
 #endif
-    wxMacSetupConverters() ;
 
     s_macCursorRgn = ::NewRgn() ;
 
@@ -542,10 +612,11 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     if ( argc > 1 )
     {
         static const wxChar *ARG_PSN = _T("-psn_");
-        if ( wxStrncmp(argv[1], ARG_PSN, sizeof(ARG_PSN) - 1) == 0 )
+        if ( wxStrncmp(argv[1], ARG_PSN, wxStrlen(ARG_PSN)) == 0 )
         {
             // remove this argument
-            memmove(argv, argv + 1, argc--);
+            --argc;
+            memmove(argv + 1, argv + 2, argc * sizeof(char *));
         }
     }
 
@@ -570,38 +641,44 @@ bool wxApp::OnInitGui()
 #if TARGET_CARBON
     InstallStandardEventHandler( GetApplicationEventTarget() ) ;
 
-    InstallApplicationEventHandler(
-        GetwxAppEventHandlerUPP(),
-        GetEventTypeCount(eventList), eventList, wxTheApp, (EventHandlerRef *)&(wxTheApp->m_macEventHandler));
+    if (!sm_isEmbedded)
+    {
+        InstallApplicationEventHandler(
+            GetwxAppEventHandlerUPP(),
+            GetEventTypeCount(eventList), eventList, wxTheApp, (EventHandlerRef *)&(wxTheApp->m_macEventHandler));
+    }
 #endif
 
+    if (!sm_isEmbedded)
+    {
 #if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
-    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
-                           NewAEEventHandlerUPP(AEHandleODoc) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
-                           NewAEEventHandlerUPP(AEHandleOApp) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
-                           NewAEEventHandlerUPP(AEHandlePDoc) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
-                           NewAEEventHandlerUPP(AEHandleQuit) ,
-                           0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
+                               NewAEEventHandlerUPP(AEHandleODoc) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
+                               NewAEEventHandlerUPP(AEHandleOApp) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
+                               NewAEEventHandlerUPP(AEHandlePDoc) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
+                               NewAEEventHandlerUPP(AEHandleQuit) ,
+                               0 , FALSE ) ;
 #else
-    AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
-                           NewAEEventHandlerProc(AEHandleODoc) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
-                           NewAEEventHandlerProc(AEHandleOApp) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
-                           NewAEEventHandlerProc(AEHandlePDoc) ,
-                           0 , FALSE ) ;
-    AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
-                           NewAEEventHandlerProc(AEHandleQuit) ,
-                           0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
+                               NewAEEventHandlerProc(AEHandleODoc) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
+                               NewAEEventHandlerProc(AEHandleOApp) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
+                               NewAEEventHandlerProc(AEHandlePDoc) ,
+                               0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
+                               NewAEEventHandlerProc(AEHandleQuit) ,
+                               0 , FALSE ) ;
 #endif
+    }
 
     return TRUE ;
 }
@@ -628,12 +705,11 @@ void wxApp::CleanUp()
 #  endif
 #endif
 
-#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__)
     // close shared library resources from here since we don't have
     //   __wxterminate in Mach-O shared libraries
     wxStAppResource::CloseSharedLibraryResource();
 #endif
-    wxMacCleanupConverters() ;
 
     UMACleanupToolbox() ;
     if (s_macCursorRgn) {
@@ -655,9 +731,9 @@ void wxApp::CleanUp()
 // need to be able to find it with NSLookupAndBindSymbol
 short gSharedLibraryResource = kResFileNotOpened ;
 
-#if defined(WXMAKINGDLL) && defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && defined(__DARWIN__)
 CFBundleRef gSharedLibraryBundle = NULL;
-#endif /* WXMAKINGDLL && __DARWIN__ */
+#endif /* WXMAKINGDLL_CORE && __DARWIN__ */
 
 wxStAppResource::wxStAppResource()
 {
@@ -680,7 +756,7 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
 {
     gSharedLibraryResource = kResFileNotOpened;
 
-#ifdef WXMAKINGDLL
+#ifdef WXMAKINGDLL_CORE
     if ( initBlock != NULL ) {
         const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
         FSSpec *fileSpec = NULL;
@@ -713,9 +789,8 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
         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;
+            wxString theResPath;
+            wxString theName;
             FSRef  theResRef;
             OSErr  theErr = noErr;
 
@@ -735,27 +810,28 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
 #endif
 
             // 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");
+            if (theLibPath != NULL) {
+#if wxUSE_UNICODE
+                theResPath = wxString(theLibPath, wxConvLocal);
+#else
+                theResPath = wxString(theLibPath);
+#endif
+                // replace '_core' with '' in case of multi-lib build
+                theResPath.Replace(wxT("_core"), wxEmptyString);
+                // replace ".dylib" shared library extension with ".rsrc"
+                theResPath.Replace(wxT(".dylib"), wxT(".rsrc"));
+                // Find the begining of the filename
+                theName = theResPath.AfterLast('/');
 
 #if 0
                 wxLogDebug( wxT("wxMac resources file name is '%s'"),
-                            theResPath );
+                            theResPath.mb_str() );
 #endif
 
-                theErr = FSPathMakeRef((UInt8 *) theResPath, &theResRef, false);
+                theErr = FSPathMakeRef((UInt8 *) theResPath.mb_str(), &theResRef, false);
                 if (theErr != noErr) {
                     // try in current directory (using name only)
-                    theErr = FSPathMakeRef((UInt8 *) theName, &theResRef, false);
+                    theErr = FSPathMakeRef((UInt8 *) theName.mb_str(), &theResRef, false);
                 }
 
                 // open the resource file
@@ -765,24 +841,21 @@ void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
                 }
                 if (theErr != noErr) {
 #ifdef __WXDEBUG__
-                    fprintf(stderr,
-                            wxT("unable to open wxMac resource file '%s'\n"),
-                            theResPath );
+                    wxLogDebug( wxT("unable to open wxMac resource file '%s'\n"),
+                                theResPath.mb_str() );
 #endif // __WXDEBUG__
                 }
 
-                // free duplicated resource file path
-                free(theResPath);
             }
         }
 #endif /* __DARWIN__ */
     }
-#endif /* WXMAKINGDLL */
+#endif /* WXMAKINGDLL_CORE */
 }
 
 void wxStAppResource::CloseSharedLibraryResource()
 {
-#ifdef WXMAKINGDLL
+#ifdef WXMAKINGDLL_CORE
     // Close the shared library resource file
     if (gSharedLibraryResource != kResFileNotOpened) {
 #ifdef __DARWIN__
@@ -798,10 +871,10 @@ void wxStAppResource::CloseSharedLibraryResource()
         }
         gSharedLibraryResource = kResFileNotOpened;
     }
-#endif /* WXMAKINGDLL */
+#endif /* WXMAKINGDLL_CORE */
 }
 
-#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
+#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__)
 
 // for shared libraries we have to manually get the correct resource
 // ref num upon initializing and releasing when terminating, therefore
@@ -825,7 +898,7 @@ pascal void __wxterminate(void)
     __terminate() ;
 }
 
-#endif /* WXMAKINGDLL && !__DARWIN__ */
+#endif /* WXMAKINGDLL_CORE && !__DARWIN__ */
 
 #if TARGET_CARBON
 
@@ -941,22 +1014,13 @@ pascal OSStatus wxMacApplicationEventHandler( EventHandlerCallRef handler , Even
 
 wxApp::wxApp()
 {
-  m_topWindow = NULL;
-  wxTheApp = this;
-
-  argc = 0;
-  argv = NULL;
-
   m_printMode = wxPRINT_WINDOWS;
   m_auto3D = TRUE;
-}
 
-bool wxApp::Initialized()
-{
-  if (GetTopWindow())
-    return TRUE;
-  else
-    return FALSE;
+  m_macCurrentEvent = NULL ;
+#if TARGET_CARBON
+  m_macCurrentEventHandlerCallRef = NULL ;
+#endif
 }
 
 int wxApp::MainLoop()
@@ -989,40 +1053,22 @@ bool wxApp::Pending()
 }
 
 // Dispatch a message.
-void wxApp::Dispatch()
+bool wxApp::Dispatch()
 {
     MacDoOneEvent() ;
+
+    return true;
 }
 
 void wxApp::OnIdle(wxIdleEvent& event)
 {
-    // Avoid recursion (via ProcessEvent default case)
-    if ( s_inOnIdle )
-        return;
-
-
-  s_inOnIdle = TRUE;
-
-  // 'Garbage' collection of windows deleted with Close().
-  DeletePendingObjects();
-
-  // flush the logged messages if any
-  wxLog *pLog = wxLog::GetActiveTarget();
-  if ( pLog != NULL && pLog->HasPendingMessages() )
-    pLog->Flush();
-
-  // Send OnIdle events to all windows
-  bool needMore = SendIdleEvents();
-
-  if (needMore)
-    event.RequestMore(TRUE);
+    wxAppBase::OnIdle(event);
 
     // If they are pending events, we must process them: pending events are
     // either events to the threads other than main or events posted with
     // wxPostEvent() functions
     wxMacProcessNotifierAndPendingEvents();
 
-  s_inOnIdle = FALSE;
   if(!wxMenuBar::MacGetInstalledMenuBar() && wxMenuBar::MacGetCommonMenuBar())
     wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar();
 }
@@ -1145,7 +1191,7 @@ void wxApp::MacSuspend( bool convertClipboard )
 #if TARGET_CARBON
 #if 0 //  having problems right now with that
         if (!win->HasFlag(wxSTAY_ON_TOP))
-#endif  
+#endif
 #endif
             win->MacActivate( ((EventRecord*) MacGetCurrentEvent())->when , false ) ;
 
@@ -1208,7 +1254,16 @@ void wxApp::MacDoOneEvent()
         if ( wxTheApp->ProcessIdle() )
             sleepTime = kEventDurationNoWait ;
         else
-            sleepTime = kEventDurationForever ;
+        {
+            if (g_numberOfThreads)
+            {
+                sleepTime = kEventDurationNoWait;
+            }
+            else
+            {
+                sleepTime = kEventDurationSecond;
+            }
+        }
     }
     else if ( status == eventLoopQuitErr )
     {
@@ -1240,9 +1295,18 @@ void wxApp::MacDoOneEvent()
             ::IdleControls( window ) ;
 
         if ( wxTheApp->ProcessIdle() )
-            sleepTime = ;
+            sleepTime = kEventDurationNoWait;
         else
-            sleepTime = GetCaretTime() / 2 ;
+        {
+            if (g_numberOfThreads)
+            {
+                sleepTime = kEventDurationNoWait;
+            }
+            else
+            {
+                sleepTime = kEventDurationSecond;
+            }
+        }
     }
     if ( event.what != kHighLevelEvent )
         SetRectRgn( (RgnHandle) s_macCursorRgn , event.where.h , event.where.v ,  event.where.h + 1 , event.where.v + 1 ) ;
@@ -1253,13 +1317,22 @@ void wxApp::MacDoOneEvent()
     wxMacProcessNotifierAndPendingEvents() ;
 }
 
+/*virtual*/ void wxApp::MacHandleUnhandledEvent( WXEVENTREF evr )
+{
+    // Override to process unhandled events as you please    
+}
+
 void wxApp::MacHandleOneEvent( WXEVENTREF evr )
 {
 #if TARGET_CARBON
     EventTargetRef theTarget;
     theTarget = GetEventDispatcherTarget();
     m_macCurrentEvent = evr ;
-    SendEventToEventTarget ((EventRef) evr , theTarget);
+    OSStatus status = SendEventToEventTarget ((EventRef) evr , theTarget);
+    if(status == eventNotHandledErr)
+    {
+        MacHandleUnhandledEvent(evr);
+    }
 #else
     EventRecord* ev = (EventRecord*) evr ;
     m_macCurrentEvent = ev ;
@@ -1291,6 +1364,10 @@ void wxApp::MacHandleOneEvent( WXEVENTREF evr )
             MacHandleActivateEvent( ev ) ;
             break;
         case updateEvt:
+            // In embedded mode we first let the UnhandledEvent function
+            // try to handle the update event. If we handle it ourselves
+            // first and then pass it on, the host's windows won't update.
+            MacHandleUnhandledEvent(ev);
             MacHandleUpdateEvent( ev ) ;
             break;
         case keyDown:
@@ -1355,6 +1432,12 @@ void wxApp::MacHandleModifierEvents( WXEVENTREF evr )
             event.SetEventType( ( ev->modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
             focus->GetEventHandler()->ProcessEvent( event ) ;
         }
+        if ( ( ev->modifiers ^ s_lastModifiers ) & cmdKey )
+        {
+            event.m_keyCode = WXK_COMMAND ;
+            event.SetEventType( ( ev->modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;
+            focus->GetEventHandler()->ProcessEvent( event ) ;
+        }
         s_lastModifiers = ev->modifiers ;
     }
 }
@@ -1512,9 +1595,12 @@ void wxApp::MacHandleMouseDownEvent( WXEVENTREF evr )
                     }
                     else
                     {
+                        // Activate window first
+                        ::SelectWindow( window ) ;
+
+                        // Send event later
                         if ( win )
                             win->MacMouseDown( ev , windowPart ) ;
-                        ::SelectWindow( window ) ;
                     }
                 }
                 else
@@ -1689,6 +1775,8 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
 
         if ( MacSendKeyDownEvent( focus , ev->message , ev->modifiers , ev->when , ev->where.h , ev->where.v ) == false )
         {
+#if 0
+            // we must handle control keys the other way round, otherwise text content is updated too late
             // has not been handled -> perform default
             wxControl* control = wxDynamicCast( focus , wxControl ) ;
             if ( control &&  control->GetMacControl() != NULL )
@@ -1699,6 +1787,7 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
                 keycode = short(ev->message & keyCodeMask) >> 8 ;
                 ::HandleControlKey( (ControlHandle) control->GetMacControl() , keycode , keychar , ev->modifiers ) ;
             }
+#endif
         }
     }
 }
@@ -2091,6 +2180,111 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr )
 
     }
 }
+#else
+
+void wxApp::MacHandleMouseMovedEvent(wxInt32 x , wxInt32 y ,wxUint32 modifiers , long timestamp)
+{
+    WindowRef window;
+
+    wxWindow* currentMouseWindow = NULL ;
+
+    if (s_captureWindow )
+    {
+        currentMouseWindow = s_captureWindow ;
+    }
+    else
+    {
+        wxWindow::MacGetWindowFromPoint( wxPoint( x, y ) , &currentMouseWindow ) ;
+    }
+
+    if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
+    {
+        wxMouseEvent event ;
+
+        bool isDown = !(modifiers & btnState) ; // 1 is for up
+        bool controlDown = modifiers & controlKey ; // for simulating right mouse
+
+        event.m_leftDown = isDown && !controlDown;
+
+        event.m_middleDown = FALSE;
+        event.m_rightDown = isDown && controlDown;
+
+        event.m_shiftDown = modifiers & shiftKey;
+        event.m_controlDown = modifiers & controlKey;
+        event.m_altDown = modifiers & optionKey;
+        event.m_metaDown = modifiers & cmdKey;
+
+        event.m_x = x;
+        event.m_y = y;
+        event.m_timeStamp = timestamp;
+
+        if ( wxWindow::s_lastMouseWindow )
+        {
+            wxMouseEvent eventleave(event);
+            eventleave.SetEventType( wxEVT_LEAVE_WINDOW );
+            wxWindow::s_lastMouseWindow->ScreenToClient( &eventleave.m_x, &eventleave.m_y );
+            eventleave.SetEventObject( wxWindow::s_lastMouseWindow ) ;
+
+#if wxUSE_TOOLTIPS
+            wxToolTip::RelayEvent( wxWindow::s_lastMouseWindow , eventleave);
+#endif // wxUSE_TOOLTIPS
+            wxWindow::s_lastMouseWindow->GetEventHandler()->ProcessEvent(eventleave);
+        }
+        if ( currentMouseWindow )
+        {
+            wxMouseEvent evententer(event);
+            evententer.SetEventType( wxEVT_ENTER_WINDOW );
+            currentMouseWindow->ScreenToClient( &evententer.m_x, &evententer.m_y );
+            evententer.SetEventObject( currentMouseWindow ) ;
+#if wxUSE_TOOLTIPS
+            wxToolTip::RelayEvent( currentMouseWindow , evententer);
+#endif // wxUSE_TOOLTIPS
+            currentMouseWindow->GetEventHandler()->ProcessEvent(evententer);
+        }
+        wxWindow::s_lastMouseWindow = currentMouseWindow ;
+    }
+
+    short windowPart = inNoWindow ;
+
+    if ( s_captureWindow )
+    {
+        window = (WindowRef) s_captureWindow->MacGetRootWindow() ;
+        windowPart = inContent ;
+    }
+    else
+    {
+        Point pt= { y , x } ;
+        windowPart = ::FindWindow(pt , &window);
+    }
+
+    switch (windowPart)
+    {
+        case inContent :
+            {
+                wxTopLevelWindowMac* win = wxFindWinFromMacWindow( window ) ;
+                if ( win )
+                    win->MacFireMouseEvent( nullEvent , x , y , modifiers , timestamp ) ;
+                else
+                {
+                    if ( wxIsBusy() )
+                    {
+                    }
+                    else
+                        UMAShowArrowCursor();
+                 }
+            }
+            break;
+        default :
+            {
+                if ( wxIsBusy() )
+                {
+                }
+                else
+                    UMAShowArrowCursor();
+            }
+            break ;
+    }
+}
 #endif
 
 void wxApp::MacHandleMenuCommand( wxUint32 id )