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:
Gilles Depeyrot
2002-05-05 16:09:21 +00:00
parent f0e8cc57f4
commit fbbdb7cd4c
3 changed files with 404 additions and 357 deletions

View File

@@ -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

View File

@@ -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'

View File

@@ -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'