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:
@@ -43,6 +43,7 @@ bool WXDLLEXPORT wxYield();
|
||||
class WXDLLEXPORT wxApp: public wxAppBase
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxApp)
|
||||
|
||||
wxApp();
|
||||
virtual ~wxApp() {}
|
||||
|
||||
@@ -134,6 +135,7 @@ public :
|
||||
void MacDoOneEvent() ;
|
||||
void MacHandleOneEvent( WXEVENTREF ev ) ;
|
||||
WXEVENTREF MacGetCurrentEvent() { return m_macCurrentEvent ; }
|
||||
|
||||
// primary events
|
||||
|
||||
virtual void MacHandleMouseDownEvent( WXEVENTREF ev ) ;
|
||||
@@ -160,6 +162,11 @@ class WXDLLEXPORT wxStAppResource
|
||||
public:
|
||||
wxStAppResource() ;
|
||||
~wxStAppResource() ;
|
||||
|
||||
// opaque pointer for CFragInitBlock
|
||||
static void OpenSharedLibraryResource(const void *) ;
|
||||
static void CloseSharedLibraryResource() ;
|
||||
|
||||
private:
|
||||
short m_currentRefNum ;
|
||||
} ;
|
||||
|
202
src/mac/app.cpp
202
src/mac/app.cpp
@@ -392,26 +392,39 @@ bool wxApp::Initialize()
|
||||
SetEventMask( everyEvent ) ;
|
||||
UMAShowWatchCursor() ;
|
||||
|
||||
#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 ) ;
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
// open shared library resources from here since we don't have
|
||||
// __wxinitialize in Mach-O shared libraries
|
||||
wxStAppResource::OpenSharedLibraryResource(NULL);
|
||||
#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__
|
||||
// test the minimal configuration necessary
|
||||
@@ -569,13 +582,14 @@ void wxApp::CleanUp()
|
||||
wxBuffer = NULL;
|
||||
|
||||
wxMacDestroyNotifierTable() ;
|
||||
if (wxWinMacWindowList)
|
||||
if (wxWinMacWindowList) {
|
||||
delete wxWinMacWindowList ;
|
||||
|
||||
if (wxWinMacControlList)
|
||||
}
|
||||
if (wxWinMacControlList) {
|
||||
delete wxWinMacControlList ;
|
||||
|
||||
}
|
||||
delete wxPendingEvents;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
delete wxPendingEventsLocker;
|
||||
// If we don't do the following, we get an apparent memory leak.
|
||||
@@ -613,9 +627,16 @@ void wxApp::CleanUp()
|
||||
delete wxLog::SetActiveTarget(NULL);
|
||||
#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() ;
|
||||
if (s_macCursorRgn)
|
||||
if (s_macCursorRgn) {
|
||||
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
||||
}
|
||||
|
||||
#if 0
|
||||
TerminateAE() ;
|
||||
@@ -626,26 +647,64 @@ void wxApp::CleanUp()
|
||||
// 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__)
|
||||
CFBundleRef gDylibBundle = NULL;
|
||||
CFBundleRef gSharedLibraryBundle = NULL;
|
||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||
|
||||
wxStAppResource::wxStAppResource()
|
||||
{
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
m_currentRefNum = CurResFile() ;
|
||||
if ( gSharedLibraryResource != kResFileNotOpened )
|
||||
{
|
||||
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
|
||||
if (gCurrentResource == -1) {
|
||||
NSSymbol theSymbol;
|
||||
NSModule theModule;
|
||||
const char *theLibPath;
|
||||
|
||||
gDylibBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||
if (gDylibBundle != NULL) {
|
||||
gSharedLibraryBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||
if (gSharedLibraryBundle != NULL) {
|
||||
// wxWindows has been bundled into a framework
|
||||
// load the framework resources
|
||||
|
||||
gCurrentResource = CFBundleOpenBundleResourceMap(gDylibBundle);
|
||||
gSharedLibraryResource = CFBundleOpenBundleResourceMap(gSharedLibraryBundle);
|
||||
}
|
||||
else {
|
||||
// wxWindows is a simple dynamic shared library
|
||||
@@ -657,12 +716,10 @@ wxStAppResource::wxStAppResource()
|
||||
OSErr theErr = noErr;
|
||||
|
||||
// get the library path
|
||||
theSymbol = NSLookupAndBindSymbol("_gCurrentResource");
|
||||
theSymbol = NSLookupAndBindSymbol("_gSharedLibraryResource");
|
||||
theModule = NSModuleForSymbol(theSymbol);
|
||||
theLibPath = NSLibraryNameForModule(theModule);
|
||||
|
||||
wxLogDebug( theLibPath );
|
||||
|
||||
// allocate copy to replace .dylib.* extension with .rsrc
|
||||
theResPath = strdup(theLibPath);
|
||||
if (theResPath != NULL) {
|
||||
@@ -690,54 +747,34 @@ wxStAppResource::wxStAppResource()
|
||||
// open the resource file
|
||||
if (theErr == noErr) {
|
||||
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
||||
&gCurrentResource);
|
||||
&gSharedLibraryResource);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* __DARWIN__ */
|
||||
}
|
||||
#endif /* WXMAKINGDLL */
|
||||
}
|
||||
|
||||
/*
|
||||
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 )
|
||||
void wxStAppResource::CloseSharedLibraryResource()
|
||||
{
|
||||
UseResFile( gCurrentResource ) ;
|
||||
}
|
||||
}
|
||||
|
||||
wxStAppResource::~wxStAppResource()
|
||||
{
|
||||
if ( m_currentRefNum != -1 )
|
||||
{
|
||||
UseResFile( m_currentRefNum ) ;
|
||||
}
|
||||
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
#ifdef WXMAKINGDLL
|
||||
// Close the shared library resource file
|
||||
if (gCurrentResource != -1) {
|
||||
if (gDylibBundle != NULL) {
|
||||
CFBundleCloseBundleResourceMap(gDylibBundle, gCurrentResource);
|
||||
gDylibBundle = NULL;
|
||||
if (gSharedLibraryResource != kResFileNotOpened) {
|
||||
#ifdef __DARWIN__
|
||||
if (gSharedLibraryBundle != NULL) {
|
||||
CFBundleCloseBundleResourceMap(gSharedLibraryBundle,
|
||||
gSharedLibraryResource);
|
||||
gSharedLibraryBundle = NULL;
|
||||
}
|
||||
else {
|
||||
CloseResFile(gCurrentResource);
|
||||
else
|
||||
#endif /* __DARWIN__ */
|
||||
{
|
||||
CloseResFile(gSharedLibraryResource);
|
||||
}
|
||||
gCurrentResource = -1;
|
||||
gSharedLibraryResource = kResFileNotOpened;
|
||||
}
|
||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||
#endif /* WXMAKINGDLL */
|
||||
}
|
||||
|
||||
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
||||
@@ -746,34 +783,21 @@ wxStAppResource::~wxStAppResource()
|
||||
// ref num upon initializing and releasing when terminating, therefore
|
||||
// the __wxinitialize and __wxterminate must be used
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
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)
|
||||
{
|
||||
gCurrentResource = -1;
|
||||
|
||||
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
||||
gCurrentResource =
|
||||
FSpOpenResFile(theInitBlock->fragLocator.u.onDisk.fileSpec,
|
||||
fsRdPerm);
|
||||
}
|
||||
wxStAppResource::OpenSharedLibraryResource( theInitBlock ) ;
|
||||
return __initialize( theInitBlock ) ;
|
||||
}
|
||||
|
||||
pascal void __wxterminate(void)
|
||||
{
|
||||
if (gCurrentResource != -1)
|
||||
CloseResFile(gCurrentResource);
|
||||
wxStAppResource::CloseSharedLibraryResource() ;
|
||||
__terminate() ;
|
||||
}
|
||||
|
||||
@@ -796,10 +820,6 @@ void WXDLLEXPORT wxEntryCleanup()
|
||||
|
||||
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
||||
{
|
||||
#if !(defined(WXMAKINGDLL) && defined(__DARWIN__))
|
||||
gCurrentResource = CurResFile() ;
|
||||
#endif
|
||||
|
||||
#ifdef __MWERKS__
|
||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||
// This seems to be necessary since there are 'rogue'
|
||||
|
@@ -392,26 +392,39 @@ bool wxApp::Initialize()
|
||||
SetEventMask( everyEvent ) ;
|
||||
UMAShowWatchCursor() ;
|
||||
|
||||
#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 ) ;
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
// open shared library resources from here since we don't have
|
||||
// __wxinitialize in Mach-O shared libraries
|
||||
wxStAppResource::OpenSharedLibraryResource(NULL);
|
||||
#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__
|
||||
// test the minimal configuration necessary
|
||||
@@ -569,13 +582,14 @@ void wxApp::CleanUp()
|
||||
wxBuffer = NULL;
|
||||
|
||||
wxMacDestroyNotifierTable() ;
|
||||
if (wxWinMacWindowList)
|
||||
if (wxWinMacWindowList) {
|
||||
delete wxWinMacWindowList ;
|
||||
|
||||
if (wxWinMacControlList)
|
||||
}
|
||||
if (wxWinMacControlList) {
|
||||
delete wxWinMacControlList ;
|
||||
|
||||
}
|
||||
delete wxPendingEvents;
|
||||
|
||||
#if wxUSE_THREADS
|
||||
delete wxPendingEventsLocker;
|
||||
// If we don't do the following, we get an apparent memory leak.
|
||||
@@ -613,9 +627,16 @@ void wxApp::CleanUp()
|
||||
delete wxLog::SetActiveTarget(NULL);
|
||||
#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() ;
|
||||
if (s_macCursorRgn)
|
||||
if (s_macCursorRgn) {
|
||||
::DisposeRgn((RgnHandle)s_macCursorRgn);
|
||||
}
|
||||
|
||||
#if 0
|
||||
TerminateAE() ;
|
||||
@@ -626,26 +647,64 @@ void wxApp::CleanUp()
|
||||
// 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__)
|
||||
CFBundleRef gDylibBundle = NULL;
|
||||
CFBundleRef gSharedLibraryBundle = NULL;
|
||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||
|
||||
wxStAppResource::wxStAppResource()
|
||||
{
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
m_currentRefNum = CurResFile() ;
|
||||
if ( gSharedLibraryResource != kResFileNotOpened )
|
||||
{
|
||||
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
|
||||
if (gCurrentResource == -1) {
|
||||
NSSymbol theSymbol;
|
||||
NSModule theModule;
|
||||
const char *theLibPath;
|
||||
|
||||
gDylibBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||
if (gDylibBundle != NULL) {
|
||||
gSharedLibraryBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.wxwindows.wxWindows"));
|
||||
if (gSharedLibraryBundle != NULL) {
|
||||
// wxWindows has been bundled into a framework
|
||||
// load the framework resources
|
||||
|
||||
gCurrentResource = CFBundleOpenBundleResourceMap(gDylibBundle);
|
||||
gSharedLibraryResource = CFBundleOpenBundleResourceMap(gSharedLibraryBundle);
|
||||
}
|
||||
else {
|
||||
// wxWindows is a simple dynamic shared library
|
||||
@@ -657,12 +716,10 @@ wxStAppResource::wxStAppResource()
|
||||
OSErr theErr = noErr;
|
||||
|
||||
// get the library path
|
||||
theSymbol = NSLookupAndBindSymbol("_gCurrentResource");
|
||||
theSymbol = NSLookupAndBindSymbol("_gSharedLibraryResource");
|
||||
theModule = NSModuleForSymbol(theSymbol);
|
||||
theLibPath = NSLibraryNameForModule(theModule);
|
||||
|
||||
wxLogDebug( theLibPath );
|
||||
|
||||
// allocate copy to replace .dylib.* extension with .rsrc
|
||||
theResPath = strdup(theLibPath);
|
||||
if (theResPath != NULL) {
|
||||
@@ -690,54 +747,34 @@ wxStAppResource::wxStAppResource()
|
||||
// open the resource file
|
||||
if (theErr == noErr) {
|
||||
theErr = FSOpenResourceFile( &theResRef, 0, NULL, fsRdPerm,
|
||||
&gCurrentResource);
|
||||
&gSharedLibraryResource);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* __DARWIN__ */
|
||||
}
|
||||
#endif /* WXMAKINGDLL */
|
||||
}
|
||||
|
||||
/*
|
||||
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 )
|
||||
void wxStAppResource::CloseSharedLibraryResource()
|
||||
{
|
||||
UseResFile( gCurrentResource ) ;
|
||||
}
|
||||
}
|
||||
|
||||
wxStAppResource::~wxStAppResource()
|
||||
{
|
||||
if ( m_currentRefNum != -1 )
|
||||
{
|
||||
UseResFile( m_currentRefNum ) ;
|
||||
}
|
||||
|
||||
#if defined(WXMAKINGDLL) && defined(__DARWIN__)
|
||||
#ifdef WXMAKINGDLL
|
||||
// Close the shared library resource file
|
||||
if (gCurrentResource != -1) {
|
||||
if (gDylibBundle != NULL) {
|
||||
CFBundleCloseBundleResourceMap(gDylibBundle, gCurrentResource);
|
||||
gDylibBundle = NULL;
|
||||
if (gSharedLibraryResource != kResFileNotOpened) {
|
||||
#ifdef __DARWIN__
|
||||
if (gSharedLibraryBundle != NULL) {
|
||||
CFBundleCloseBundleResourceMap(gSharedLibraryBundle,
|
||||
gSharedLibraryResource);
|
||||
gSharedLibraryBundle = NULL;
|
||||
}
|
||||
else {
|
||||
CloseResFile(gCurrentResource);
|
||||
else
|
||||
#endif /* __DARWIN__ */
|
||||
{
|
||||
CloseResFile(gSharedLibraryResource);
|
||||
}
|
||||
gCurrentResource = -1;
|
||||
gSharedLibraryResource = kResFileNotOpened;
|
||||
}
|
||||
#endif /* WXMAKINGDLL && __DARWIN__ */
|
||||
#endif /* WXMAKINGDLL */
|
||||
}
|
||||
|
||||
#if defined(WXMAKINGDLL) && !defined(__DARWIN__)
|
||||
@@ -746,34 +783,21 @@ wxStAppResource::~wxStAppResource()
|
||||
// ref num upon initializing and releasing when terminating, therefore
|
||||
// the __wxinitialize and __wxterminate must be used
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
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)
|
||||
{
|
||||
gCurrentResource = -1;
|
||||
|
||||
if (theInitBlock->fragLocator.where == kDataForkCFragLocator) {
|
||||
gCurrentResource =
|
||||
FSpOpenResFile(theInitBlock->fragLocator.u.onDisk.fileSpec,
|
||||
fsRdPerm);
|
||||
}
|
||||
wxStAppResource::OpenSharedLibraryResource( theInitBlock ) ;
|
||||
return __initialize( theInitBlock ) ;
|
||||
}
|
||||
|
||||
pascal void __wxterminate(void)
|
||||
{
|
||||
if (gCurrentResource != -1)
|
||||
CloseResFile(gCurrentResource);
|
||||
wxStAppResource::CloseSharedLibraryResource() ;
|
||||
__terminate() ;
|
||||
}
|
||||
|
||||
@@ -796,10 +820,6 @@ void WXDLLEXPORT wxEntryCleanup()
|
||||
|
||||
int wxEntry( int argc, char *argv[] , bool enterLoop )
|
||||
{
|
||||
#if !(defined(WXMAKINGDLL) && defined(__DARWIN__))
|
||||
gCurrentResource = CurResFile() ;
|
||||
#endif
|
||||
|
||||
#ifdef __MWERKS__
|
||||
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
|
||||
// This seems to be necessary since there are 'rogue'
|
||||
|
Reference in New Issue
Block a user