X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66a09d4776b8ae390d5aa51dbd678b694f2c81d6..2b8a696220b7a9aae68c484025e90587de203fc3:/src/mac/carbon/app.cpp diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index dcd512fa87..cd7e8d2423 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -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 @@ -53,16 +55,14 @@ #include "wx/mac/uma.h" #include "wx/mac/macnotfy.h" -#if wxUSE_SOCKETS - #ifdef __DARWIN__ - #include - #else - #include - #include - #include - #include - #include - #endif +#ifdef __DARWIN__ +# include +#else +# include +# include +# include +# include +# include #endif extern char *wxBuffer; @@ -106,25 +106,25 @@ 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) ; } @@ -162,7 +162,7 @@ short wxApp::MacHandleAEQuit(const WXEVENTREF event , WXEVENTREF 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" @@ -260,7 +260,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 != ' ' ) { @@ -373,6 +373,12 @@ void wxMacStringToPascal( const char * from , StringPtr to , bool pc2macEncoding CopyCStringToPascal( from , to ) ; } } +#ifdef WXMAKINGDLL +#ifndef __DARWIN__ +// we know it's there ;-) +WXIMPORT char std::__throws_bad_alloc ; +#endif +#endif bool wxApp::Initialize() { @@ -448,6 +454,7 @@ bool wxApp::Initialize() if ( error ) { + wxStAppResource resload ; short itemHit; Str255 message; @@ -503,6 +510,9 @@ bool wxApp::Initialize() #endif // wxUSE_LOG #endif + wxWinMacWindowList = new wxList(wxKEY_INTEGER); + wxWinMacControlList = new wxList(wxKEY_INTEGER); + wxInitializeStockLists(); wxInitializeStockObjects(); @@ -517,9 +527,6 @@ bool wxApp::Initialize() return FALSE; } - wxWinMacWindowList = new wxList(wxKEY_INTEGER); - wxWinMacControlList = new wxList(wxKEY_INTEGER); - wxMacCreateNotifierTable() ; UMAShowArrowCursor() ; @@ -621,26 +628,81 @@ void wxApp::CleanUp() // wxEntry //---------------------------------------------------------------------- -int wxEntryStart( int argc, char *argv[] ) +short gCurrentResource = -1 ; + +wxStAppResource::wxStAppResource() { - return wxApp::Initialize(); + m_currentRefNum = CurResFile() ; + if ( gCurrentResource != -1 ) + { + UseResFile( gCurrentResource ) ; + } } +wxStAppResource::~wxStAppResource() +{ + if ( m_currentRefNum != -1 ) + { + UseResFile( m_currentRefNum ) ; + } +} + +#ifdef WXMAKINGDLL + +// 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 + +#ifdef __cplusplus +extern "C" { +#endif -int wxEntryInitGui() +void __sinit(void); /* (generated by linker) */ +pascal OSErr __initialize(const CFragInitBlock *theInitBlock); +pascal void __terminate(void); + +#ifdef __cplusplus +} +#endif + +pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock) { - return wxTheApp->OnInitGui(); + gCurrentResource = -1; + + if (theInitBlock->fragLocator.where == kDataForkCFragLocator) { + gCurrentResource = + FSpOpenResFile(theInitBlock->fragLocator.u.onDisk.fileSpec, + fsRdPerm); + } + return __initialize( theInitBlock ) ; } +pascal void __wxterminate(void) +{ + if (gCurrentResource != -1) + CloseResFile(gCurrentResource); + __terminate() ; +} +#endif -void wxEntryCleanup() +int WXDLLEXPORT wxEntryStart( int argc, char *argv[] ) { - wxApp::CleanUp(); + return wxApp::Initialize(); } +int WXDLLEXPORT wxEntryInitGui() +{ + return wxTheApp->OnInitGui(); +} + +void WXDLLEXPORT wxEntryCleanup() +{ + wxApp::CleanUp(); +} int wxEntry( int argc, char *argv[] , bool enterLoop ) { + gCurrentResource = CurResFile() ; #ifdef __MWERKS__ #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT // This seems to be necessary since there are 'rogue' @@ -669,7 +731,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 buf[6] = ""; + strncpy(buf, argv[1], 5); + + if (strcmp(buf, "-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 @@ -680,7 +757,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(). @@ -731,7 +807,9 @@ wxApp::wxApp() m_topWindow = NULL; wxTheApp = this; - m_wantDebugOutput = TRUE ; +#if WXWIN_COMPATIBILITY_2_2 + m_wantDebugOutput = TRUE; +#endif argc = 0; argv = NULL; @@ -886,29 +964,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")); @@ -1270,7 +1325,16 @@ 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) { @@ -1433,11 +1497,11 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) handled = focus->GetEventHandler()->ProcessEvent( event ) ; if ( !handled ) { - #if wxUSE_ACCEL +#if wxUSE_ACCEL if (!handled) { - wxWindow *ancestor = focus; /* + wxWindow *ancestor = focus; while (ancestor) { int command = ancestor->GetAcceleratorTable()->GetCommand( event ); @@ -1453,7 +1517,7 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) } */ } - #endif // wxUSE_ACCEL +#endif // wxUSE_ACCEL } if (!handled) { @@ -1676,7 +1740,6 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr ) wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , ¤tMouseWindow ) ; - if ( currentMouseWindow != wxWindow::s_lastMouseWindow ) { wxMouseEvent event ; @@ -1695,17 +1758,22 @@ void wxApp::MacHandleOSEvent( WXEVENTREF evr ) 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 ;