]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/app.cpp
must be static of course, otherwise items just get appended for every menu-build
[wxWidgets.git] / src / mac / carbon / app.cpp
index 2b2c0b892cb770f06a6bf8b9fd3ab88f35c1b2bb..2a536b339b5ee95e1c06d15784d5cfb408c3e7b7 100644 (file)
@@ -9,11 +9,11 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "app.h"
 #endif
 
 #pragma implementation "app.h"
 #endif
 
-#include "wx/defs.h"
+#include "wx/wxprec.h"
 
 #include "wx/window.h"
 #include "wx/frame.h"
 
 #include "wx/window.h"
 #include "wx/frame.h"
@@ -266,19 +266,26 @@ short wxApp::MacHandleAERApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU
 }
 
 
 }
 
 
+
 //----------------------------------------------------------------------
 // Support Routines linking the Mac...File Calls to the Document Manager
 //----------------------------------------------------------------------
 
 void wxApp::MacOpenFile(const wxString & fileName )
 {
 //----------------------------------------------------------------------
 // Support Routines linking the Mac...File Calls to the Document Manager
 //----------------------------------------------------------------------
 
 void wxApp::MacOpenFile(const wxString & fileName )
 {
+#if wxUSE_DOC_VIEW_ARCHITECTURE
     wxDocManager* dm = wxDocManager::GetDocumentManager() ;
     if ( dm )
         dm->CreateDocument(fileName , wxDOC_SILENT ) ;
     wxDocManager* dm = wxDocManager::GetDocumentManager() ;
     if ( dm )
         dm->CreateDocument(fileName , wxDOC_SILENT ) ;
+#endif
 }
 
 }
 
+
 void wxApp::MacPrintFile(const wxString & fileName )
 {
 void wxApp::MacPrintFile(const wxString & fileName )
 {
+#if wxUSE_DOC_VIEW_ARCHITECTURE
+
+#if wxUSE_PRINTING_ARCHITECTURE
     wxDocManager* dm = wxDocManager::GetDocumentManager() ;
     if ( dm )
     {
     wxDocManager* dm = wxDocManager::GetDocumentManager() ;
     if ( dm )
     {
@@ -303,8 +310,13 @@ void wxApp::MacPrintFile(const wxString & fileName )
             }
         }
     }
             }
         }
     }
+#endif //print
+
+#endif //docview
 }
 
 }
 
+
+
 void wxApp::MacNewFile()
 {
 }
 void wxApp::MacNewFile()
 {
 }
@@ -402,7 +414,7 @@ wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *d
 
         if ( type )
         {
 
         if ( type )
         {
-            wxMenuEvent wxevent(type, cmd);
+            wxMenuEvent wxevent(type, cmd, menu);
             wxevent.SetEventObject(menu);
 
             wxEvtHandler* handler = menu->GetEventHandler();
             wxevent.SetEventObject(menu);
 
             wxEvtHandler* handler = menu->GetEventHandler();
@@ -525,7 +537,7 @@ pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef eve
                 
                 WindowRef window ;
                 Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
                 
                 WindowRef window ;
                 Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
-                short windowPart = ::FindWindow(screenMouseLocation, &window);
+                ::FindWindow(screenMouseLocation, &window);
                 // only send this event in case it had not already been sent to a tlw, as we get
                 // double events otherwise (in case event.skip) was called
                 if ( window == NULL )
                 // only send this event in case it had not already been sent to a tlw, as we get
                 // double events otherwise (in case event.skip) was called
                 if ( window == NULL )
@@ -555,6 +567,8 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler )
 WXIMPORT char std::__throws_bad_alloc ;
 #endif
 
 WXIMPORT char std::__throws_bad_alloc ;
 #endif
 
+#if __WXDEBUG__
+
 pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options, 
     const char *assertionString, const char *exceptionLabelString, 
     const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg)
 pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options, 
     const char *assertionString, const char *exceptionLabelString, 
     const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg)
@@ -591,6 +605,18 @@ pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 op
 #endif
 }
 
 #endif
 }
 
+#endif //__WXDEBUG__
+
+#ifdef __WXMAC_OSX__
+extern "C" {
+   /* m_macEventPosted run loop source callback: */
+   void macPostedEventCallback(void *unused);
+}
+
+void macPostedEventCallback(void *unused) {
+    wxTheApp->ProcessPendingEvents(); }
+#endif
+
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     // Mac-specific
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     // Mac-specific
@@ -658,6 +684,15 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
 
     wxMacCreateNotifierTable() ;
 
 
     wxMacCreateNotifierTable() ;
 
+#ifdef __WXMAC_OSX__
+    /* connect posted events to common-mode run loop so that wxPostEvent events
+       are handled even while we're in the menu or on a scrollbar */
+    CFRunLoopSourceContext event_posted_context = {0};
+    event_posted_context.perform = macPostedEventCallback;
+    m_macEventPosted = CFRunLoopSourceCreate(NULL,0,&event_posted_context);
+    CFRunLoopAddSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes);
+#endif
+
     UMAShowArrowCursor() ;
 
     return true;
     UMAShowArrowCursor() ;
 
     return true;
@@ -701,7 +736,17 @@ bool wxApp::OnInitGui()
 
 void wxApp::CleanUp()
 {
 
 void wxApp::CleanUp()
 {
+#if wxUSE_TOOLTIPS
     wxToolTip::RemoveToolTips() ;
     wxToolTip::RemoveToolTips() ;
+#endif
+
+#ifdef __WXMAC_OSX__
+    if (m_macEventPosted)
+    {
+        CFRelease(m_macEventPosted);
+    }
+    m_macEventPosted = NULL;
+#endif
 
     // One last chance for pending objects to be cleaned up
     wxTheApp->DeletePendingObjects();
 
     // One last chance for pending objects to be cleaned up
     wxTheApp->DeletePendingObjects();
@@ -835,10 +880,13 @@ bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec)
 
 wxApp::wxApp()
 {
 
 wxApp::wxApp()
 {
-  m_printMode = wxPRINT_WINDOWS;
+    m_printMode = wxPRINT_WINDOWS;
 
 
-  m_macCurrentEvent = NULL ;
-  m_macCurrentEventHandlerCallRef = NULL ;
+    m_macCurrentEvent = NULL ;
+    m_macCurrentEventHandlerCallRef = NULL ;
+#ifdef __WXMAC_OSX__
+    m_macEventPosted = NULL ;
+#endif
 }
 
 int wxApp::MainLoop()
 }
 
 int wxApp::MainLoop()
@@ -895,6 +943,12 @@ void wxApp::OnIdle(wxIdleEvent& event)
 
 void wxApp::WakeUpIdle()
 {
 
 void wxApp::WakeUpIdle()
 {
+#ifdef __WXMAC_OSX__
+    if (m_macEventPosted)
+    {
+        CFRunLoopSourceSignal(m_macEventPosted);
+    }
+#endif
     wxMacWakeUp() ;
 }
 
     wxMacWakeUp() ;
 }
 
@@ -1163,13 +1217,12 @@ int wxMacKeyCodeToModifier(wxKeyCode key)
     }
 }
 
     }
 }
 
+#ifndef __DARWIN__
 bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below
 {
 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...
+    wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key !=
+        WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons"));
+
 //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
 //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
@@ -1178,11 +1231,11 @@ 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));
 //  KeyMapByteArray keymap; 
 //  GetKeys((BigEndianLong*)keymap);
 //  return !!(BitTst(keymap, (sizeof(KeyMapByteArray)*8) - iKey));
-//#endif
 }
 }
+#endif
 
 
 
 
-bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
+bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar  )
 {
     if ( !focus )
         return false ;
 {
     if ( !focus )
         return false ;
@@ -1217,10 +1270,13 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi
     event.m_altDown = modifiers & optionKey;
     event.m_metaDown = modifiers & cmdKey;
     event.m_keyCode = keyval ;
     event.m_altDown = modifiers & optionKey;
     event.m_metaDown = modifiers & cmdKey;
     event.m_keyCode = keyval ;
+#if wxUSE_UNICODE
+    event.m_uniChar = uniChar ;
+#endif
 
     event.m_x = wherex;
     event.m_y = wherey;
 
     event.m_x = wherex;
     event.m_y = wherey;
-    event.m_timeStamp = when;
+    event.SetTimestamp(when);
     event.SetEventObject(focus);
     handled = focus->GetEventHandler()->ProcessEvent( event ) ;
     if ( handled && event.GetSkipped() )
     event.SetEventObject(focus);
     handled = focus->GetEventHandler()->ProcessEvent( event ) ;
     if ( handled && event.GetSkipped() )
@@ -1249,6 +1305,23 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi
     }
     if (!handled)
     {
     }
     if (!handled)
     {
+        wxTopLevelWindowMac *tlw = focus->MacGetTopLevelWindow() ;
+
+        if (tlw)
+        {
+            event.Skip( FALSE ) ;
+            event.SetEventType( wxEVT_CHAR_HOOK );
+            // raw value again
+            event.m_keyCode = realkeyval ;
+
+            handled = tlw->GetEventHandler()->ProcessEvent( event );
+            if ( handled && event.GetSkipped() )
+                handled = false ;
+        }
+    }
+    
+    if ( !handled )
+    {        
         event.Skip( FALSE ) ;
         event.SetEventType( wxEVT_CHAR ) ;
         // raw value again
         event.Skip( FALSE ) ;
         event.SetEventType( wxEVT_CHAR ) ;
         // raw value again
@@ -1310,7 +1383,7 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi
     return handled ;
 }
 
     return handled ;
 }
 
-bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey )
+bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar  )
 {
     if ( !focus )
         return false ;
 {
     if ( !focus )
         return false ;
@@ -1342,10 +1415,13 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier
     event.m_altDown = modifiers & optionKey;
     event.m_metaDown = modifiers & cmdKey;
     event.m_keyCode = keyval ;
     event.m_altDown = modifiers & optionKey;
     event.m_metaDown = modifiers & cmdKey;
     event.m_keyCode = keyval ;
+#if wxUSE_UNICODE
+    event.m_uniChar = uniChar ;
+#endif
 
     event.m_x = wherex;
     event.m_y = wherey;
 
     event.m_x = wherex;
     event.m_y = wherey;
-    event.m_timeStamp = when;
+    event.SetTimestamp(when);
     event.SetEventObject(focus);
     handled = focus->GetEventHandler()->ProcessEvent( event ) ;
 
     event.SetEventObject(focus);
     handled = focus->GetEventHandler()->ProcessEvent( event ) ;