X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95a8b77a948f58735eeb1cf41ae4263deb6096e9..a71dec776e22b9bdaa73027d67ec5c0c7d0b21df:/src/mac/carbon/app.cpp diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index 2b2c0b892c..2a536b339b 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -9,11 +9,11 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "app.h" #endif -#include "wx/defs.h" +#include "wx/wxprec.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 ) { +#if wxUSE_DOC_VIEW_ARCHITECTURE wxDocManager* dm = wxDocManager::GetDocumentManager() ; if ( dm ) dm->CreateDocument(fileName , wxDOC_SILENT ) ; +#endif } + void wxApp::MacPrintFile(const wxString & fileName ) { +#if wxUSE_DOC_VIEW_ARCHITECTURE + +#if wxUSE_PRINTING_ARCHITECTURE wxDocManager* dm = wxDocManager::GetDocumentManager() ; if ( dm ) { @@ -303,8 +310,13 @@ void wxApp::MacPrintFile(const wxString & fileName ) } } } +#endif //print + +#endif //docview } + + void wxApp::MacNewFile() { } @@ -402,7 +414,7 @@ wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *d if ( type ) { - wxMenuEvent wxevent(type, cmd); + wxMenuEvent wxevent(type, cmd, menu); wxevent.SetEventObject(menu); wxEvtHandler* handler = menu->GetEventHandler(); @@ -525,7 +537,7 @@ pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef eve WindowRef window ; Point screenMouseLocation = cEvent.GetParameter(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 ) @@ -555,6 +567,8 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler ) 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) @@ -591,6 +605,18 @@ pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 op #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 @@ -658,6 +684,15 @@ bool wxApp::Initialize(int& argc, wxChar **argv) 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; @@ -701,7 +736,17 @@ bool wxApp::OnInitGui() void wxApp::CleanUp() { +#if wxUSE_TOOLTIPS 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(); @@ -835,10 +880,13 @@ bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec) 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() @@ -895,6 +943,12 @@ void wxApp::OnIdle(wxIdleEvent& event) void wxApp::WakeUpIdle() { +#ifdef __WXMAC_OSX__ + if (m_macEventPosted) + { + CFRunLoopSourceSignal(m_macEventPosted); + } +#endif 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 { -//#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 @@ -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)); -//#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 ; @@ -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 ; +#if wxUSE_UNICODE + event.m_uniChar = uniChar ; +#endif 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() ) @@ -1249,6 +1305,23 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi } 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 @@ -1310,7 +1383,7 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi 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 ; @@ -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 ; +#if wxUSE_UNICODE + event.m_uniChar = uniChar ; +#endif event.m_x = wherex; event.m_y = wherey; - event.m_timeStamp = when; + event.SetTimestamp(when); event.SetEventObject(focus); handled = focus->GetEventHandler()->ProcessEvent( event ) ;