]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/app.cpp
added comment about array, switched intepretation of IsRunning to MSW meaning
[wxWidgets.git] / src / mac / carbon / app.cpp
index 36165f1246977a79afcbe8280133a8b93adeb95f..613c323b92f3c4d9bf2533d9915348f8f2f6a61a 100644 (file)
@@ -37,6 +37,7 @@
 #include "wx/textctrl.h"
 #include "wx/menu.h"
 #include "wx/docview.h"
+#include "wx/filename.h"
 
 #include <string.h>
 
@@ -69,7 +70,9 @@
 extern wxList wxPendingDelete;
 extern wxList *wxWinMacWindowList;
 extern wxList *wxWinMacControlList;
+#if wxUSE_THREADS
 extern size_t g_numberOfThreads;
+#endif // wxUSE_THREADS
 
 // statics for implementation
 
@@ -121,6 +124,7 @@ pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long re
 pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
 pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
 pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
 
 pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
 {
@@ -142,6 +146,11 @@ pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long WX
     return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;
 }
 
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
+{
+    return wxTheApp->MacHandleAERApp( (AppleEvent*) event , reply) ;
+}
+
 // AEODoc Calls MacOpenFile on each of the files passed
 
 short wxApp::MacHandleAEODoc(const WXEVENTREF event, WXEVENTREF WXUNUSED(reply))
@@ -222,18 +231,29 @@ 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 ) ;
+        wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId);
+        if (!win->ProcessEvent(exitEvent))
+            win->Close(TRUE ) ;
     }
-       else
+    else
     {
         ExitMainLoop() ;
     }
     return noErr ;
 }
 
+// AEROApp calls MacReopenApp
+
+short wxApp::MacHandleAERApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
+{
+    MacReopenApp() ;
+    return noErr ;
+}
+
+
 //----------------------------------------------------------------------
 // Support Routines linking the Mac...File Calls to the Document Manager
 //----------------------------------------------------------------------
@@ -277,6 +297,11 @@ void wxApp::MacNewFile()
 {
 }
 
+void wxApp::MacReopenApp()
+{
+    // eventually check for open docs, if none, call MacNewFile
+}
+
 //----------------------------------------------------------------------
 // Carbon Event Handler
 //----------------------------------------------------------------------
@@ -290,6 +315,7 @@ void wxApp::MacNewFile()
 
         { kEventClassMenu, kEventMenuOpening },
         { kEventClassMenu, kEventMenuClosed },
+        { kEventClassMenu, kEventMenuTargetItem },
 
         { kEventClassApplication , kEventAppActivated } ,
         { kEventClassApplication , kEventAppDeactivated } ,
@@ -308,29 +334,54 @@ void wxApp::MacNewFile()
 static pascal OSStatus
 MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
-    // FIXME: this doesn't work for multiple windows
-    wxWindow *win = wxTheApp->GetTopWindow();
-    if ( win )
+    wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
+    
+    if ( mbar )
     {
-        // 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
+        wxFrame* win = mbar->GetFrame();
+        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
+
+            wxEventType type=0;        
+            MenuCommand cmd=0;
+            switch (GetEventKind(event))
+            {
+                case kEventMenuOpening:
+                    type = wxEVT_MENU_OPEN;
+                    break;
+                case kEventMenuClosed:
+                    type = wxEVT_MENU_CLOSE;
+                    break;
+                case kEventMenuTargetItem:
+                    type = wxEVT_MENU_HIGHLIGHT;
+                    GetEventParameter(event, kEventParamMenuCommand,
+                                      typeMenuCommand, NULL,
+                                      sizeof(cmd), NULL, &cmd);
+                    if (cmd == 0) return eventNotHandledErr;
+                    break;
+                default:
+                    wxFAIL_MSG(wxT("Unexpected menu event kind"));
+                    break;
+            }
 
-        wxMenuEvent wxevent(GetEventKind(event) == kEventMenuOpening
-                        ? wxEVT_MENU_OPEN
-                        : wxEVT_MENU_CLOSE);
-        wxevent.SetEventObject(win);
+            wxMenuEvent wxevent(type, cmd);
+            wxevent.SetEventObject(win);
 
-        (void)win->GetEventHandler()->ProcessEvent(wxevent);
+            (void)win->GetEventHandler()->ProcessEvent(wxevent);
+        }
     }
 
     return eventNotHandledErr;
@@ -623,6 +674,11 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     if ( !wxAppBase::Initialize(argc, argv) )
         return false;
 
+#if wxUSE_INTL
+    wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
+#endif
+
+
     wxWinMacWindowList = new wxList(wxKEY_INTEGER);
     wxWinMacControlList = new wxList(wxKEY_INTEGER);
 
@@ -661,6 +717,9 @@ bool wxApp::OnInitGui()
         AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
                                NewAEEventHandlerUPP(AEHandlePDoc) ,
                                0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
+                               NewAEEventHandlerUPP(AEHandleRApp) ,
+                               0 , FALSE ) ;
         AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
                                NewAEEventHandlerUPP(AEHandleQuit) ,
                                0 , FALSE ) ;
@@ -674,6 +733,9 @@ bool wxApp::OnInitGui()
         AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
                                NewAEEventHandlerProc(AEHandlePDoc) ,
                                0 , FALSE ) ;
+        AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
+                               NewAEEventHandlerProc(AEHandleRApp) ,
+                               0 , FALSE ) ;
         AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
                                NewAEEventHandlerProc(AEHandleQuit) ,
                                0 , FALSE ) ;
@@ -1044,7 +1106,10 @@ void wxApp::ExitMainLoop()
 bool wxApp::Pending()
 {
 #if TARGET_CARBON
-    return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ;
+    // without the receive event (with pull param = false ) nothing is ever reported
+    EventRef theEvent;
+    ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &theEvent);
+    return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ; 
 #else
     EventRecord event ;
 
@@ -1255,11 +1320,13 @@ void wxApp::MacDoOneEvent()
             sleepTime = kEventDurationNoWait ;
         else
         {
+#if wxUSE_THREADS
             if (g_numberOfThreads)
             {
                 sleepTime = kEventDurationNoWait;
             }
             else
+#endif // wxUSE_THREADS
             {
                 sleepTime = kEventDurationSecond;
             }
@@ -1298,11 +1365,13 @@ void wxApp::MacDoOneEvent()
             sleepTime = kEventDurationNoWait;
         else
         {
+#if wxUSE_THREADS
             if (g_numberOfThreads)
             {
                 sleepTime = kEventDurationNoWait;
             }
             else
+#endif // wxUSE_THREADS
             {
                 sleepTime = kEventDurationSecond;
             }
@@ -1762,6 +1831,7 @@ int wxKeyCodeToMacModifier(wxKeyCode key)
     switch (key)
     {
     case WXK_START:
+    case WXK_MENU:
         return cmdKey;
 
     case WXK_SHIFT:
@@ -1770,7 +1840,7 @@ int wxKeyCodeToMacModifier(wxKeyCode key)
     case WXK_CAPITAL:
         return alphaLock;
 
-    case WXK_OPTION:
+    case WXK_ALT:
         return optionKey;
 
     case WXK_CONTROL:
@@ -1783,6 +1853,11 @@ int wxKeyCodeToMacModifier(wxKeyCode key)
 
 bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below
 {
+//#ifdef __DARWIN__
+//     wxHIDKeyboard keyboard;
+//     return keyboard.IsActive(key);
+//#else
+// TODO:  Have it use HID Manager on OSX...
 //if OS X > 10.2 (i.e. 10.2.x)
 //a known apple bug prevents the system from determining led
 //states with GetKeys... can only determine caps lock led
@@ -1791,6 +1866,7 @@ bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below
 //  KeyMapByteArray keymap; 
 //  GetKeys((BigEndianLong*)keymap);
 //  return !!(BitTst(keymap, (sizeof(KeyMapByteArray)*8) - iKey));
+//#endif
 }
 
 #if !TARGET_CARBON