improved opening/closing of shared library resources so that Mach-O shared
library resources are opened in wxApp::Initialize and closed in wxApp::CleanUp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15386 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -42,126 +42,133 @@ bool WXDLLEXPORT wxYield();
|
|||||||
// a new App object to start application
|
// a new App object to start application
|
||||||
class WXDLLEXPORT wxApp: public wxAppBase
|
class WXDLLEXPORT wxApp: public wxAppBase
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxApp)
|
DECLARE_DYNAMIC_CLASS(wxApp)
|
||||||
wxApp();
|
|
||||||
virtual ~wxApp() {}
|
|
||||||
|
|
||||||
virtual int MainLoop();
|
wxApp();
|
||||||
virtual void ExitMainLoop();
|
virtual ~wxApp() {}
|
||||||
virtual bool Initialized();
|
|
||||||
virtual bool Pending() ;
|
|
||||||
virtual void Dispatch() ;
|
|
||||||
virtual bool Yield(bool onlyIfNeeded = FALSE);
|
|
||||||
|
|
||||||
virtual void SetPrintMode(int mode) { m_printMode = mode; }
|
virtual int MainLoop();
|
||||||
virtual int GetPrintMode() const { return m_printMode; }
|
virtual void ExitMainLoop();
|
||||||
|
virtual bool Initialized();
|
||||||
|
virtual bool Pending() ;
|
||||||
|
virtual void Dispatch() ;
|
||||||
|
virtual bool Yield(bool onlyIfNeeded = FALSE);
|
||||||
|
|
||||||
// implementation only
|
virtual void SetPrintMode(int mode) { m_printMode = mode; }
|
||||||
void OnIdle(wxIdleEvent& event);
|
virtual int GetPrintMode() const { return m_printMode; }
|
||||||
void OnEndSession(wxCloseEvent& event);
|
|
||||||
void OnQueryEndSession(wxCloseEvent& event);
|
|
||||||
|
|
||||||
// Send idle event to all top-level windows.
|
// implementation only
|
||||||
// Returns TRUE if more idle time is requested.
|
void OnIdle(wxIdleEvent& event);
|
||||||
bool SendIdleEvents();
|
void OnEndSession(wxCloseEvent& event);
|
||||||
|
void OnQueryEndSession(wxCloseEvent& event);
|
||||||
|
|
||||||
// Send idle event to window and all subwindows
|
// Send idle event to all top-level windows.
|
||||||
// Returns TRUE if more idle time is requested.
|
// Returns TRUE if more idle time is requested.
|
||||||
bool SendIdleEvents(wxWindowMac* win);
|
bool SendIdleEvents();
|
||||||
|
|
||||||
// Windows only, but for compatibility...
|
// Send idle event to window and all subwindows
|
||||||
inline void SetAuto3D(bool flag) { m_auto3D = flag; }
|
// Returns TRUE if more idle time is requested.
|
||||||
inline bool GetAuto3D() const { return m_auto3D; }
|
bool SendIdleEvents(wxWindowMac* win);
|
||||||
|
|
||||||
|
// Windows only, but for compatibility...
|
||||||
|
inline void SetAuto3D(bool flag) { m_auto3D = flag; }
|
||||||
|
inline bool GetAuto3D() const { return m_auto3D; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_showOnInit;
|
bool m_showOnInit;
|
||||||
int m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
|
int m_printMode; // wxPRINT_WINDOWS, wxPRINT_POSTSCRIPT
|
||||||
bool m_auto3D ; // Always use 3D controls, except
|
bool m_auto3D ; // Always use 3D controls, except
|
||||||
// where overriden
|
// where overriden
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Implementation
|
// Implementation
|
||||||
static bool Initialize();
|
static bool Initialize();
|
||||||
static void CleanUp();
|
static void CleanUp();
|
||||||
|
|
||||||
void DeletePendingObjects();
|
void DeletePendingObjects();
|
||||||
bool ProcessIdle();
|
bool ProcessIdle();
|
||||||
bool IsExiting() { return !m_keepGoing ; }
|
bool IsExiting() { return !m_keepGoing ; }
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static long sm_lastMessageTime;
|
static long sm_lastMessageTime;
|
||||||
static wxWindow* s_captureWindow ;
|
static wxWindow* s_captureWindow ;
|
||||||
static int s_lastMouseDown ; // 0 = none , 1 = left , 2 = right
|
static int s_lastMouseDown ; // 0 = none , 1 = left , 2 = right
|
||||||
static WXHRGN s_macCursorRgn ;
|
static WXHRGN s_macCursorRgn ;
|
||||||
WXEVENTREF m_macCurrentEvent ;
|
WXEVENTREF m_macCurrentEvent ;
|
||||||
|
|
||||||
int m_nCmdShow;
|
int m_nCmdShow;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_keepGoing ;
|
bool m_keepGoing ;
|
||||||
|
|
||||||
// mac specifics
|
// mac specifics
|
||||||
|
|
||||||
public :
|
public:
|
||||||
static bool s_macDefaultEncodingIsPC ;
|
static bool s_macDefaultEncodingIsPC ;
|
||||||
static bool s_macSupportPCMenuShortcuts ;
|
static bool s_macSupportPCMenuShortcuts ;
|
||||||
static long s_macAboutMenuItemId ;
|
static long s_macAboutMenuItemId ;
|
||||||
static wxString s_macHelpMenuTitleName ;
|
static wxString s_macHelpMenuTitleName ;
|
||||||
|
|
||||||
static bool s_macHasAppearance ;
|
static bool s_macHasAppearance ;
|
||||||
static long s_macAppearanceVersion ;
|
static long s_macAppearanceVersion ;
|
||||||
static bool s_macHasNavigation ;
|
static bool s_macHasNavigation ;
|
||||||
static bool s_macNavigationVersion ;
|
static bool s_macNavigationVersion ;
|
||||||
static bool s_macHasWindowManager ;
|
static bool s_macHasWindowManager ;
|
||||||
static long s_macWindowManagerVersion ;
|
static long s_macWindowManagerVersion ;
|
||||||
static bool s_macHasMenuManager ;
|
static bool s_macHasMenuManager ;
|
||||||
static long s_macMenuManagerVersion ;
|
static long s_macMenuManagerVersion ;
|
||||||
static bool s_macHasDialogManager ;
|
static bool s_macHasDialogManager ;
|
||||||
static long s_macDialogManagerVersion ;
|
static long s_macDialogManagerVersion ;
|
||||||
|
|
||||||
WXHRGN m_macCursorRgn ;
|
WXHRGN m_macCursorRgn ;
|
||||||
WXHRGN m_macSleepRgn ;
|
WXHRGN m_macSleepRgn ;
|
||||||
WXHRGN m_macHelpRgn ;
|
WXHRGN m_macHelpRgn ;
|
||||||
|
|
||||||
virtual void MacSuspend( bool convertClipboard ) ;
|
virtual void MacSuspend( bool convertClipboard ) ;
|
||||||
virtual void MacResume( bool convertClipboard ) ;
|
virtual void MacResume( bool convertClipboard ) ;
|
||||||
|
|
||||||
virtual void MacConvertPrivateToPublicScrap() ;
|
virtual void MacConvertPrivateToPublicScrap() ;
|
||||||
virtual void MacConvertPublicToPrivateScrap() ;
|
virtual void MacConvertPublicToPrivateScrap() ;
|
||||||
|
|
||||||
// event main methods
|
// event main methods
|
||||||
|
|
||||||
void MacDoOneEvent() ;
|
void MacDoOneEvent() ;
|
||||||
void MacHandleOneEvent( WXEVENTREF ev ) ;
|
void MacHandleOneEvent( WXEVENTREF ev ) ;
|
||||||
WXEVENTREF MacGetCurrentEvent() { return m_macCurrentEvent ; }
|
WXEVENTREF MacGetCurrentEvent() { return m_macCurrentEvent ; }
|
||||||
// primary events
|
|
||||||
|
|
||||||
virtual void MacHandleMouseDownEvent( WXEVENTREF ev ) ;
|
// primary events
|
||||||
virtual void MacHandleMouseUpEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleActivateEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleUpdateEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleKeyDownEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleKeyUpEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleDiskEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleOSEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleHighLevelEvent( WXEVENTREF ev ) ;
|
|
||||||
virtual void MacHandleMenuSelect( int menuid , int menuitem ) ;
|
|
||||||
|
|
||||||
virtual short MacHandleAEODoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
virtual void MacHandleMouseDownEvent( WXEVENTREF ev ) ;
|
||||||
virtual short MacHandleAEPDoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
virtual void MacHandleMouseUpEvent( WXEVENTREF ev ) ;
|
||||||
virtual short MacHandleAEOApp(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
virtual void MacHandleActivateEvent( WXEVENTREF ev ) ;
|
||||||
virtual short MacHandleAEQuit(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
virtual void MacHandleUpdateEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleKeyDownEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleKeyUpEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleDiskEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleOSEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleHighLevelEvent( WXEVENTREF ev ) ;
|
||||||
|
virtual void MacHandleMenuSelect( int menuid , int menuitem ) ;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
virtual short MacHandleAEODoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
||||||
|
virtual short MacHandleAEPDoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
||||||
|
virtual short MacHandleAEOApp(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
||||||
|
virtual short MacHandleAEQuit(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ;
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
class WXDLLEXPORT wxStAppResource
|
class WXDLLEXPORT wxStAppResource
|
||||||
{
|
{
|
||||||
public :
|
public:
|
||||||
wxStAppResource() ;
|
wxStAppResource() ;
|
||||||
~wxStAppResource() ;
|
~wxStAppResource() ;
|
||||||
private :
|
|
||||||
short m_currentRefNum ;
|
// opaque pointer for CFragInitBlock
|
||||||
|
static void OpenSharedLibraryResource(const void *) ;
|
||||||
|
static void CloseSharedLibraryResource() ;
|
||||||
|
|
||||||
|
private:
|
||||||
|
short m_currentRefNum ;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
// TODO: add platform-specific arguments
|
// TODO: add platform-specific arguments
|
||||||
|
278
src/mac/app.cpp
278
src/mac/app.cpp
@@ -91,15 +91,15 @@ const short kMacMinHeap = (29 * 1024) ;
|
|||||||
const short kwxMacMenuBarResource = 1 ;
|
const short kwxMacMenuBarResource = 1 ;
|
||||||
const short kwxMacAppleMenuId = 1 ;
|
const short kwxMacAppleMenuId = 1 ;
|
||||||
|
|
||||||
WXHRGN wxApp::s_macCursorRgn = NULL;
|
WXHRGN wxApp::s_macCursorRgn = NULL;
|
||||||
wxWindow* wxApp::s_captureWindow = NULL ;
|
wxWindow* wxApp::s_captureWindow = NULL ;
|
||||||
int wxApp::s_lastMouseDown = 0 ;
|
int wxApp::s_lastMouseDown = 0 ;
|
||||||
long wxApp::sm_lastMessageTime = 0;
|
long wxApp::sm_lastMessageTime = 0;
|
||||||
|
|
||||||
bool wxApp::s_macDefaultEncodingIsPC = true ;
|
bool wxApp::s_macDefaultEncodingIsPC = true ;
|
||||||
bool wxApp::s_macSupportPCMenuShortcuts = true ;
|
bool wxApp::s_macSupportPCMenuShortcuts = true ;
|
||||||
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
|
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
|
||||||
wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
|
wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
|
||||||
|
|
||||||
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
||||||
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
||||||
@@ -384,39 +384,52 @@ WXIMPORT char std::__throws_bad_alloc ;
|
|||||||
|
|
||||||
bool wxApp::Initialize()
|
bool wxApp::Initialize()
|
||||||
{
|
{
|
||||||
int error = 0 ;
|
int error = 0 ;
|
||||||
|
|
||||||
// Mac-specific
|
// Mac-specific
|
||||||
|
|
||||||
UMAInitToolbox( 4 ) ;
|
UMAInitToolbox( 4 ) ;
|
||||||
SetEventMask( everyEvent ) ;
|
SetEventMask( everyEvent ) ;
|
||||||
UMAShowWatchCursor() ;
|
UMAShowWatchCursor() ;
|
||||||
|
|
||||||
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerUPP(AEHandleODoc) ,
|
// open shared library resources from here since we don't have
|
||||||
(long) wxTheApp , FALSE ) ;
|
// __wxinitialize in Mach-O shared libraries
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerUPP(AEHandleOApp) ,
|
wxStAppResource::OpenSharedLibraryResource(NULL);
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerUPP(AEHandlePDoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerUPP(AEHandleQuit) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
#else
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerProc(AEHandleODoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerProc(AEHandleOApp) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerProc(AEHandlePDoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerProc(AEHandleQuit) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleODoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleOApp) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
|
||||||
|
NewAEEventHandlerUPP(AEHandlePDoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleQuit) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
#else
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
|
||||||
|
NewAEEventHandlerProc(AEHandleODoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
|
||||||
|
NewAEEventHandlerProc(AEHandleOApp) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
|
||||||
|
NewAEEventHandlerProc(AEHandlePDoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
|
||||||
|
NewAEEventHandlerProc(AEHandleQuit) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
// test the minimal configuration necessary
|
// test the minimal configuration necessary
|
||||||
|
|
||||||
#if !TARGET_CARBON
|
# if !TARGET_CARBON
|
||||||
long theSystem ;
|
long theSystem ;
|
||||||
long theMachine;
|
long theMachine;
|
||||||
|
|
||||||
@@ -440,7 +453,7 @@ bool wxApp::Initialize()
|
|||||||
{
|
{
|
||||||
error = kMacSTRSmallSize;
|
error = kMacSTRSmallSize;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
/*
|
/*
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -468,9 +481,9 @@ bool wxApp::Initialize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
#if __option(profile)
|
# if __option(profile)
|
||||||
ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
|
ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
@@ -549,50 +562,51 @@ void wxApp::CleanUp()
|
|||||||
// One last chance for pending objects to be cleaned up
|
// One last chance for pending objects to be cleaned up
|
||||||
wxTheApp->DeletePendingObjects();
|
wxTheApp->DeletePendingObjects();
|
||||||
|
|
||||||
wxModule::CleanUpModules();
|
wxModule::CleanUpModules();
|
||||||
|
|
||||||
#if wxUSE_WX_RESOURCES
|
#if wxUSE_WX_RESOURCES
|
||||||
wxCleanUpResourceSystem();
|
wxCleanUpResourceSystem();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxDeleteStockObjects() ;
|
wxDeleteStockObjects() ;
|
||||||
|
|
||||||
// Destroy all GDI lists, etc.
|
// Destroy all GDI lists, etc.
|
||||||
wxDeleteStockLists();
|
wxDeleteStockLists();
|
||||||
|
|
||||||
delete wxTheColourDatabase;
|
delete wxTheColourDatabase;
|
||||||
wxTheColourDatabase = NULL;
|
wxTheColourDatabase = NULL;
|
||||||
|
|
||||||
wxBitmap::CleanUpHandlers();
|
wxBitmap::CleanUpHandlers();
|
||||||
|
|
||||||
delete[] wxBuffer;
|
delete[] wxBuffer;
|
||||||
wxBuffer = NULL;
|
wxBuffer = NULL;
|
||||||
|
|
||||||
wxMacDestroyNotifierTable() ;
|
|
||||||
if (wxWinMacWindowList)
|
|
||||||
delete wxWinMacWindowList ;
|
|
||||||
|
|
||||||
if (wxWinMacControlList)
|
|
||||||
delete wxWinMacControlList ;
|
|
||||||
|
|
||||||
|
wxMacDestroyNotifierTable() ;
|
||||||
|
if (wxWinMacWindowList) {
|
||||||
|
delete wxWinMacWindowList ;
|
||||||
|
}
|
||||||
|
if (wxWinMacControlList) {
|
||||||
|
delete wxWinMacControlList ;
|
||||||
|
}
|
||||||
delete wxPendingEvents;
|
delete wxPendingEvents;
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
delete wxPendingEventsLocker;
|
delete wxPendingEventsLocker;
|
||||||
// If we don't do the following, we get an apparent memory leak.
|
// If we don't do the following, we get an apparent memory leak.
|
||||||
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxClassInfo::CleanUpClasses();
|
wxClassInfo::CleanUpClasses();
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
#if __option(profile)
|
# if __option(profile)
|
||||||
ProfilerDump( "\papp.prof" ) ;
|
ProfilerDump( "\papp.prof" ) ;
|
||||||
ProfilerTerm() ;
|
ProfilerTerm() ;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delete wxTheApp;
|
delete wxTheApp;
|
||||||
wxTheApp = NULL;
|
wxTheApp = NULL;
|
||||||
|
|
||||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||||
// At this point we want to check if there are any memory
|
// At this point we want to check if there are any memory
|
||||||
@@ -613,9 +627,16 @@ void wxApp::CleanUp()
|
|||||||
delete wxLog::SetActiveTarget(NULL);
|
delete wxLog::SetActiveTarget(NULL);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
|
|
||||||
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
|
// close shared library resources from here since we don't have
|
||||||
|
// __wxterminate in Mach-O shared libraries
|
||||||
|
wxStAppResource::CloseSharedLibraryResource();
|
||||||
|
#endif
|
||||||
|
|
||||||
UMACleanupToolbox() ;
|
UMACleanupToolbox() ;
|
||||||
if (s_macCursorRgn)
|
if (s_macCursorRgn) {
|
||||||
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
TerminateAE() ;
|
TerminateAE() ;
|
||||||
@@ -626,26 +647,64 @@ void wxApp::CleanUp()
|
|||||||
// wxEntry
|
// wxEntry
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
short gCurrentResource = -1 ;
|
// extern variable for shared library resource id
|
||||||
|
// need to be able to find it with NSLookupAndBindSymbol
|
||||||
|
short gSharedLibraryResource = kResFileNotOpened ;
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
CFBundleRef gDylibBundle = NULL;
|
CFBundleRef gSharedLibraryBundle = NULL;
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||||
|
|
||||||
wxStAppResource::wxStAppResource()
|
wxStAppResource::wxStAppResource()
|
||||||
{
|
{
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
m_currentRefNum = CurResFile() ;
|
||||||
// Open the shared library resource file if it is not yet open
|
if ( gSharedLibraryResource != kResFileNotOpened )
|
||||||
if (gCurrentResource == -1) {
|
{
|
||||||
|
UseResFile( gSharedLibraryResource ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxStAppResource::~wxStAppResource()
|
||||||
|
{
|
||||||
|
if ( m_currentRefNum != kResFileNotOpened )
|
||||||
|
{
|
||||||
|
UseResFile( m_currentRefNum ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
|
||||||
|
{
|
||||||
|
gSharedLibraryResource = kResFileNotOpened;
|
||||||
|
|
||||||
|
#ifdef WXMAKINGDLL
|
||||||
|
if ( initBlock != NULL ) {
|
||||||
|
const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
|
||||||
|
FSSpec *fileSpec = NULL;
|
||||||
|
|
||||||
|
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
||||||
|
fileSpec = theInitBlock->fragLocator.u.onDisk.fileSpec;
|
||||||
|
}
|
||||||
|
else if (theInitBlock->fragLocator.where == kResourceCFragLocator) {
|
||||||
|
fileSpec = theInitBlock->fragLocator.u.inSegs.fileSpec;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileSpec != NULL) {
|
||||||
|
gSharedLibraryResource = FSpOpenResFile(fileSpec, fsRdPerm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
// Open the shared library resource file if it is not yet open
|
||||||
NSSymbol theSymbol;
|
NSSymbol theSymbol;
|
||||||
NSModule theModule;
|
NSModule theModule;
|
||||||
const char *theLibPath;
|
const char *theLibPath;
|
||||||
|
|
||||||
gDylibBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
gSharedLibraryBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||||
if (gDylibBundle != NULL) {
|
if (gSharedLibraryBundle != NULL) {
|
||||||
// wxWindows has been bundled into a framework
|
// wxWindows has been bundled into a framework
|
||||||
// load the framework resources
|
// load the framework resources
|
||||||
|
|
||||||
gCurrentResource = CFBundleOpenBundleResourceMap(gDylibBundle);
|
gSharedLibraryResource = CFBundleOpenBundleResourceMap(gSharedLibraryBundle);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// wxWindows is a simple dynamic shared library
|
// wxWindows is a simple dynamic shared library
|
||||||
@@ -657,12 +716,10 @@ wxStAppResource::wxStAppResource()
|
|||||||
OSErr theErr = noErr;
|
OSErr theErr = noErr;
|
||||||
|
|
||||||
// get the library path
|
// get the library path
|
||||||
theSymbol = NSLookupAndBindSymbol("_gCurrentResource");
|
theSymbol = NSLookupAndBindSymbol("_gSharedLibraryResource");
|
||||||
theModule = NSModuleForSymbol(theSymbol);
|
theModule = NSModuleForSymbol(theSymbol);
|
||||||
theLibPath = NSLibraryNameForModule(theModule);
|
theLibPath = NSLibraryNameForModule(theModule);
|
||||||
|
|
||||||
wxLogDebug( theLibPath );
|
|
||||||
|
|
||||||
// allocate copy to replace .dylib.* extension with .rsrc
|
// allocate copy to replace .dylib.* extension with .rsrc
|
||||||
theResPath = strdup(theLibPath);
|
theResPath = strdup(theLibPath);
|
||||||
if (theResPath != NULL) {
|
if (theResPath != NULL) {
|
||||||
@@ -690,54 +747,34 @@ wxStAppResource::wxStAppResource()
|
|||||||
// open the resource file
|
// open the resource file
|
||||||
if (theErr == noErr) {
|
if (theErr == noErr) {
|
||||||
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
||||||
&gCurrentResource);
|
&gSharedLibraryResource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* __DARWIN__ */
|
||||||
/*
|
|
||||||
char *path;
|
|
||||||
int i, len;
|
|
||||||
|
|
||||||
if( i++ > 0 ) {
|
|
||||||
len = i + strlen(rPath);
|
|
||||||
path = (char*) malloc(len+1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// try current directory
|
|
||||||
myerr = FSPathMakeRef((UInt8 *) rPath, &myref, false);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
|
||||||
|
|
||||||
m_currentRefNum = CurResFile() ;
|
|
||||||
if ( gCurrentResource != -1 )
|
|
||||||
{
|
|
||||||
UseResFile( gCurrentResource ) ;
|
|
||||||
}
|
}
|
||||||
|
#endif /* WXMAKINGDLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
wxStAppResource::~wxStAppResource()
|
void wxStAppResource::CloseSharedLibraryResource()
|
||||||
{
|
{
|
||||||
if ( m_currentRefNum != -1 )
|
#ifdef WXMAKINGDLL
|
||||||
{
|
|
||||||
UseResFile( m_currentRefNum ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
|
||||||
// Close the shared library resource file
|
// Close the shared library resource file
|
||||||
if (gCurrentResource != -1) {
|
if (gSharedLibraryResource != kResFileNotOpened) {
|
||||||
if (gDylibBundle != NULL) {
|
#ifdef __DARWIN__
|
||||||
CFBundleCloseBundleResourceMap(gDylibBundle, gCurrentResource);
|
if (gSharedLibraryBundle != NULL) {
|
||||||
gDylibBundle = NULL;
|
CFBundleCloseBundleResourceMap(gSharedLibraryBundle,
|
||||||
|
gSharedLibraryResource);
|
||||||
|
gSharedLibraryBundle = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
CloseResFile(gCurrentResource);
|
#endif /* __DARWIN__ */
|
||||||
|
{
|
||||||
|
CloseResFile(gSharedLibraryResource);
|
||||||
}
|
}
|
||||||
gCurrentResource = -1;
|
gSharedLibraryResource = kResFileNotOpened;
|
||||||
}
|
}
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
#endif /* WXMAKINGDLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
||||||
@@ -746,34 +783,21 @@ wxStAppResource::~wxStAppResource()
|
|||||||
// ref num upon initializing and releasing when terminating, therefore
|
// ref num upon initializing and releasing when terminating, therefore
|
||||||
// the __wxinitialize and __wxterminate must be used
|
// the __wxinitialize and __wxterminate must be used
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
void __sinit(void); /* (generated by linker) */
|
||||||
|
pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
|
||||||
void __sinit(void); /* (generated by linker) */
|
pascal void __terminate(void);
|
||||||
pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
|
|
||||||
pascal void __terminate(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock)
|
pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock)
|
||||||
{
|
{
|
||||||
gCurrentResource = -1;
|
wxStAppResource::OpenSharedLibraryResource( theInitBlock ) ;
|
||||||
|
return __initialize( theInitBlock ) ;
|
||||||
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
|
||||||
gCurrentResource =
|
|
||||||
FSpOpenResFile(theInitBlock->fragLocator.u.onDisk.fileSpec,
|
|
||||||
fsRdPerm);
|
|
||||||
}
|
|
||||||
return __initialize( theInitBlock ) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pascal void __wxterminate(void)
|
pascal void __wxterminate(void)
|
||||||
{
|
{
|
||||||
if (gCurrentResource != -1)
|
wxStAppResource::CloseSharedLibraryResource() ;
|
||||||
CloseResFile(gCurrentResource);
|
|
||||||
__terminate() ;
|
__terminate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -796,10 +820,6 @@ void WXDLLEXPORT wxEntryCleanup()
|
|||||||
|
|
||||||
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
||||||
{
|
{
|
||||||
#if !(defined(WXMAKINGDLL) && defined(__DARWIN__))
|
|
||||||
gCurrentResource = CurResFile() ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __MWERKS__
|
#ifdef __MWERKS__
|
||||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||||
// This seems to be necessary since there are 'rogue'
|
// This seems to be necessary since there are 'rogue'
|
||||||
|
@@ -91,15 +91,15 @@ const short kMacMinHeap = (29 * 1024) ;
|
|||||||
const short kwxMacMenuBarResource = 1 ;
|
const short kwxMacMenuBarResource = 1 ;
|
||||||
const short kwxMacAppleMenuId = 1 ;
|
const short kwxMacAppleMenuId = 1 ;
|
||||||
|
|
||||||
WXHRGN wxApp::s_macCursorRgn = NULL;
|
WXHRGN wxApp::s_macCursorRgn = NULL;
|
||||||
wxWindow* wxApp::s_captureWindow = NULL ;
|
wxWindow* wxApp::s_captureWindow = NULL ;
|
||||||
int wxApp::s_lastMouseDown = 0 ;
|
int wxApp::s_lastMouseDown = 0 ;
|
||||||
long wxApp::sm_lastMessageTime = 0;
|
long wxApp::sm_lastMessageTime = 0;
|
||||||
|
|
||||||
bool wxApp::s_macDefaultEncodingIsPC = true ;
|
bool wxApp::s_macDefaultEncodingIsPC = true ;
|
||||||
bool wxApp::s_macSupportPCMenuShortcuts = true ;
|
bool wxApp::s_macSupportPCMenuShortcuts = true ;
|
||||||
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
|
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
|
||||||
wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
|
wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
|
||||||
|
|
||||||
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
||||||
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
|
||||||
@@ -384,39 +384,52 @@ WXIMPORT char std::__throws_bad_alloc ;
|
|||||||
|
|
||||||
bool wxApp::Initialize()
|
bool wxApp::Initialize()
|
||||||
{
|
{
|
||||||
int error = 0 ;
|
int error = 0 ;
|
||||||
|
|
||||||
// Mac-specific
|
// Mac-specific
|
||||||
|
|
||||||
UMAInitToolbox( 4 ) ;
|
UMAInitToolbox( 4 ) ;
|
||||||
SetEventMask( everyEvent ) ;
|
SetEventMask( everyEvent ) ;
|
||||||
UMAShowWatchCursor() ;
|
UMAShowWatchCursor() ;
|
||||||
|
|
||||||
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerUPP(AEHandleODoc) ,
|
// open shared library resources from here since we don't have
|
||||||
(long) wxTheApp , FALSE ) ;
|
// __wxinitialize in Mach-O shared libraries
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerUPP(AEHandleOApp) ,
|
wxStAppResource::OpenSharedLibraryResource(NULL);
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerUPP(AEHandlePDoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerUPP(AEHandleQuit) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
#else
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , NewAEEventHandlerProc(AEHandleODoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , NewAEEventHandlerProc(AEHandleOApp) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , NewAEEventHandlerProc(AEHandlePDoc) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , NewAEEventHandlerProc(AEHandleQuit) ,
|
|
||||||
(long) wxTheApp , FALSE ) ;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleODoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleOApp) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
|
||||||
|
NewAEEventHandlerUPP(AEHandlePDoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
|
||||||
|
NewAEEventHandlerUPP(AEHandleQuit) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
#else
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments ,
|
||||||
|
NewAEEventHandlerProc(AEHandleODoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEOpenApplication ,
|
||||||
|
NewAEEventHandlerProc(AEHandleOApp) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
|
||||||
|
NewAEEventHandlerProc(AEHandlePDoc) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
|
||||||
|
NewAEEventHandlerProc(AEHandleQuit) ,
|
||||||
|
(long) wxTheApp , FALSE ) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
// test the minimal configuration necessary
|
// test the minimal configuration necessary
|
||||||
|
|
||||||
#if !TARGET_CARBON
|
# if !TARGET_CARBON
|
||||||
long theSystem ;
|
long theSystem ;
|
||||||
long theMachine;
|
long theMachine;
|
||||||
|
|
||||||
@@ -440,7 +453,7 @@ bool wxApp::Initialize()
|
|||||||
{
|
{
|
||||||
error = kMacSTRSmallSize;
|
error = kMacSTRSmallSize;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
/*
|
/*
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -468,9 +481,9 @@ bool wxApp::Initialize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
#if __option(profile)
|
# if __option(profile)
|
||||||
ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
|
ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
@@ -549,50 +562,51 @@ void wxApp::CleanUp()
|
|||||||
// One last chance for pending objects to be cleaned up
|
// One last chance for pending objects to be cleaned up
|
||||||
wxTheApp->DeletePendingObjects();
|
wxTheApp->DeletePendingObjects();
|
||||||
|
|
||||||
wxModule::CleanUpModules();
|
wxModule::CleanUpModules();
|
||||||
|
|
||||||
#if wxUSE_WX_RESOURCES
|
#if wxUSE_WX_RESOURCES
|
||||||
wxCleanUpResourceSystem();
|
wxCleanUpResourceSystem();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxDeleteStockObjects() ;
|
wxDeleteStockObjects() ;
|
||||||
|
|
||||||
// Destroy all GDI lists, etc.
|
// Destroy all GDI lists, etc.
|
||||||
wxDeleteStockLists();
|
wxDeleteStockLists();
|
||||||
|
|
||||||
delete wxTheColourDatabase;
|
delete wxTheColourDatabase;
|
||||||
wxTheColourDatabase = NULL;
|
wxTheColourDatabase = NULL;
|
||||||
|
|
||||||
wxBitmap::CleanUpHandlers();
|
wxBitmap::CleanUpHandlers();
|
||||||
|
|
||||||
delete[] wxBuffer;
|
delete[] wxBuffer;
|
||||||
wxBuffer = NULL;
|
wxBuffer = NULL;
|
||||||
|
|
||||||
wxMacDestroyNotifierTable() ;
|
|
||||||
if (wxWinMacWindowList)
|
|
||||||
delete wxWinMacWindowList ;
|
|
||||||
|
|
||||||
if (wxWinMacControlList)
|
|
||||||
delete wxWinMacControlList ;
|
|
||||||
|
|
||||||
|
wxMacDestroyNotifierTable() ;
|
||||||
|
if (wxWinMacWindowList) {
|
||||||
|
delete wxWinMacWindowList ;
|
||||||
|
}
|
||||||
|
if (wxWinMacControlList) {
|
||||||
|
delete wxWinMacControlList ;
|
||||||
|
}
|
||||||
delete wxPendingEvents;
|
delete wxPendingEvents;
|
||||||
|
|
||||||
#if wxUSE_THREADS
|
#if wxUSE_THREADS
|
||||||
delete wxPendingEventsLocker;
|
delete wxPendingEventsLocker;
|
||||||
// If we don't do the following, we get an apparent memory leak.
|
// If we don't do the following, we get an apparent memory leak.
|
||||||
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
wxClassInfo::CleanUpClasses();
|
wxClassInfo::CleanUpClasses();
|
||||||
|
|
||||||
#ifndef __DARWIN__
|
#ifndef __DARWIN__
|
||||||
#if __option(profile)
|
# if __option(profile)
|
||||||
ProfilerDump( "\papp.prof" ) ;
|
ProfilerDump( "\papp.prof" ) ;
|
||||||
ProfilerTerm() ;
|
ProfilerTerm() ;
|
||||||
#endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delete wxTheApp;
|
delete wxTheApp;
|
||||||
wxTheApp = NULL;
|
wxTheApp = NULL;
|
||||||
|
|
||||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||||
// At this point we want to check if there are any memory
|
// At this point we want to check if there are any memory
|
||||||
@@ -613,9 +627,16 @@ void wxApp::CleanUp()
|
|||||||
delete wxLog::SetActiveTarget(NULL);
|
delete wxLog::SetActiveTarget(NULL);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
|
|
||||||
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
|
// close shared library resources from here since we don't have
|
||||||
|
// __wxterminate in Mach-O shared libraries
|
||||||
|
wxStAppResource::CloseSharedLibraryResource();
|
||||||
|
#endif
|
||||||
|
|
||||||
UMACleanupToolbox() ;
|
UMACleanupToolbox() ;
|
||||||
if (s_macCursorRgn)
|
if (s_macCursorRgn) {
|
||||||
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
TerminateAE() ;
|
TerminateAE() ;
|
||||||
@@ -626,26 +647,64 @@ void wxApp::CleanUp()
|
|||||||
// wxEntry
|
// wxEntry
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
short gCurrentResource = -1 ;
|
// extern variable for shared library resource id
|
||||||
|
// need to be able to find it with NSLookupAndBindSymbol
|
||||||
|
short gSharedLibraryResource = kResFileNotOpened ;
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||||
CFBundleRef gDylibBundle = NULL;
|
CFBundleRef gSharedLibraryBundle = NULL;
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||||
|
|
||||||
wxStAppResource::wxStAppResource()
|
wxStAppResource::wxStAppResource()
|
||||||
{
|
{
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
m_currentRefNum = CurResFile() ;
|
||||||
// Open the shared library resource file if it is not yet open
|
if ( gSharedLibraryResource != kResFileNotOpened )
|
||||||
if (gCurrentResource == -1) {
|
{
|
||||||
|
UseResFile( gSharedLibraryResource ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxStAppResource::~wxStAppResource()
|
||||||
|
{
|
||||||
|
if ( m_currentRefNum != kResFileNotOpened )
|
||||||
|
{
|
||||||
|
UseResFile( m_currentRefNum ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxStAppResource::OpenSharedLibraryResource(const void *initBlock)
|
||||||
|
{
|
||||||
|
gSharedLibraryResource = kResFileNotOpened;
|
||||||
|
|
||||||
|
#ifdef WXMAKINGDLL
|
||||||
|
if ( initBlock != NULL ) {
|
||||||
|
const CFragInitBlock *theInitBlock = (const CFragInitBlock *)initBlock;
|
||||||
|
FSSpec *fileSpec = NULL;
|
||||||
|
|
||||||
|
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
||||||
|
fileSpec = theInitBlock->fragLocator.u.onDisk.fileSpec;
|
||||||
|
}
|
||||||
|
else if (theInitBlock->fragLocator.where == kResourceCFragLocator) {
|
||||||
|
fileSpec = theInitBlock->fragLocator.u.inSegs.fileSpec;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileSpec != NULL) {
|
||||||
|
gSharedLibraryResource = FSpOpenResFile(fileSpec, fsRdPerm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
// Open the shared library resource file if it is not yet open
|
||||||
NSSymbol theSymbol;
|
NSSymbol theSymbol;
|
||||||
NSModule theModule;
|
NSModule theModule;
|
||||||
const char *theLibPath;
|
const char *theLibPath;
|
||||||
|
|
||||||
gDylibBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
gSharedLibraryBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||||
if (gDylibBundle != NULL) {
|
if (gSharedLibraryBundle != NULL) {
|
||||||
// wxWindows has been bundled into a framework
|
// wxWindows has been bundled into a framework
|
||||||
// load the framework resources
|
// load the framework resources
|
||||||
|
|
||||||
gCurrentResource = CFBundleOpenBundleResourceMap(gDylibBundle);
|
gSharedLibraryResource = CFBundleOpenBundleResourceMap(gSharedLibraryBundle);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// wxWindows is a simple dynamic shared library
|
// wxWindows is a simple dynamic shared library
|
||||||
@@ -657,12 +716,10 @@ wxStAppResource::wxStAppResource()
|
|||||||
OSErr theErr = noErr;
|
OSErr theErr = noErr;
|
||||||
|
|
||||||
// get the library path
|
// get the library path
|
||||||
theSymbol = NSLookupAndBindSymbol("_gCurrentResource");
|
theSymbol = NSLookupAndBindSymbol("_gSharedLibraryResource");
|
||||||
theModule = NSModuleForSymbol(theSymbol);
|
theModule = NSModuleForSymbol(theSymbol);
|
||||||
theLibPath = NSLibraryNameForModule(theModule);
|
theLibPath = NSLibraryNameForModule(theModule);
|
||||||
|
|
||||||
wxLogDebug( theLibPath );
|
|
||||||
|
|
||||||
// allocate copy to replace .dylib.* extension with .rsrc
|
// allocate copy to replace .dylib.* extension with .rsrc
|
||||||
theResPath = strdup(theLibPath);
|
theResPath = strdup(theLibPath);
|
||||||
if (theResPath != NULL) {
|
if (theResPath != NULL) {
|
||||||
@@ -690,54 +747,34 @@ wxStAppResource::wxStAppResource()
|
|||||||
// open the resource file
|
// open the resource file
|
||||||
if (theErr == noErr) {
|
if (theErr == noErr) {
|
||||||
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
||||||
&gCurrentResource);
|
&gSharedLibraryResource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* __DARWIN__ */
|
||||||
/*
|
|
||||||
char *path;
|
|
||||||
int i, len;
|
|
||||||
|
|
||||||
if( i++ > 0 ) {
|
|
||||||
len = i + strlen(rPath);
|
|
||||||
path = (char*) malloc(len+1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// try current directory
|
|
||||||
myerr = FSPathMakeRef((UInt8 *) rPath, &myref, false);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
|
||||||
|
|
||||||
m_currentRefNum = CurResFile() ;
|
|
||||||
if ( gCurrentResource != -1 )
|
|
||||||
{
|
|
||||||
UseResFile( gCurrentResource ) ;
|
|
||||||
}
|
}
|
||||||
|
#endif /* WXMAKINGDLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
wxStAppResource::~wxStAppResource()
|
void wxStAppResource::CloseSharedLibraryResource()
|
||||||
{
|
{
|
||||||
if ( m_currentRefNum != -1 )
|
#ifdef WXMAKINGDLL
|
||||||
{
|
|
||||||
UseResFile( m_currentRefNum ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
|
||||||
// Close the shared library resource file
|
// Close the shared library resource file
|
||||||
if (gCurrentResource != -1) {
|
if (gSharedLibraryResource != kResFileNotOpened) {
|
||||||
if (gDylibBundle != NULL) {
|
#ifdef __DARWIN__
|
||||||
CFBundleCloseBundleResourceMap(gDylibBundle, gCurrentResource);
|
if (gSharedLibraryBundle != NULL) {
|
||||||
gDylibBundle = NULL;
|
CFBundleCloseBundleResourceMap(gSharedLibraryBundle,
|
||||||
|
gSharedLibraryResource);
|
||||||
|
gSharedLibraryBundle = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
CloseResFile(gCurrentResource);
|
#endif /* __DARWIN__ */
|
||||||
|
{
|
||||||
|
CloseResFile(gSharedLibraryResource);
|
||||||
}
|
}
|
||||||
gCurrentResource = -1;
|
gSharedLibraryResource = kResFileNotOpened;
|
||||||
}
|
}
|
||||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
#endif /* WXMAKINGDLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
||||||
@@ -746,34 +783,21 @@ wxStAppResource::~wxStAppResource()
|
|||||||
// ref num upon initializing and releasing when terminating, therefore
|
// ref num upon initializing and releasing when terminating, therefore
|
||||||
// the __wxinitialize and __wxterminate must be used
|
// the __wxinitialize and __wxterminate must be used
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
void __sinit(void); /* (generated by linker) */
|
||||||
|
pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
|
||||||
void __sinit(void); /* (generated by linker) */
|
pascal void __terminate(void);
|
||||||
pascal OSErr __initialize(const CFragInitBlock *theInitBlock);
|
|
||||||
pascal void __terminate(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock)
|
pascal OSErr __wxinitialize(const CFragInitBlock *theInitBlock)
|
||||||
{
|
{
|
||||||
gCurrentResource = -1;
|
wxStAppResource::OpenSharedLibraryResource( theInitBlock ) ;
|
||||||
|
return __initialize( theInitBlock ) ;
|
||||||
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
|
||||||
gCurrentResource =
|
|
||||||
FSpOpenResFile(theInitBlock->fragLocator.u.onDisk.fileSpec,
|
|
||||||
fsRdPerm);
|
|
||||||
}
|
|
||||||
return __initialize( theInitBlock ) ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pascal void __wxterminate(void)
|
pascal void __wxterminate(void)
|
||||||
{
|
{
|
||||||
if (gCurrentResource != -1)
|
wxStAppResource::CloseSharedLibraryResource() ;
|
||||||
CloseResFile(gCurrentResource);
|
|
||||||
__terminate() ;
|
__terminate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -796,10 +820,6 @@ void WXDLLEXPORT wxEntryCleanup()
|
|||||||
|
|
||||||
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
||||||
{
|
{
|
||||||
#if !(defined(WXMAKINGDLL) && defined(__DARWIN__))
|
|
||||||
gCurrentResource = CurResFile() ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __MWERKS__
|
#ifdef __MWERKS__
|
||||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||||
// This seems to be necessary since there are 'rogue'
|
// This seems to be necessary since there are 'rogue'
|
||||||
|
Reference in New Issue
Block a user