From 8be97d65a6675eeaf0529dbb55f66d0eb5c5214f Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Thu, 11 Feb 1999 16:56:43 +0000 Subject: [PATCH] CW Win32 and Mac adaptions git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1680 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/defs.h | 2 + include/wx/filefn.h | 4 +- include/wx/mac/app.h | 21 ++ include/wx/mac/filedlg.h | 3 - include/wx/mac/setup.h | 28 +-- include/wx/mac/window.h | 29 ++- include/wx/string.h | 4 +- src/mac/app.cpp | 435 +++++++++++++------------------------ src/mac/apprsrc.r | 12 + src/mac/carbon/app.cpp | 435 +++++++++++++------------------------ src/mac/carbon/apprsrc.r | 12 + src/mac/carbon/filedlg.cpp | 4 +- src/mac/filedlg.cpp | 4 +- 13 files changed, 388 insertions(+), 605 deletions(-) diff --git a/include/wx/defs.h b/include/wx/defs.h index ce89fa76a8..76a0bd8981 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -49,6 +49,8 @@ #endif // Sun CC #endif #endif // Sun +#elif defined(applec) || defined(THINK_C) || ( defined( __MWERKS__ ) && !defined(__INTEL__) ) + // MacOS #else // Windows #ifndef __WINDOWS__ #define __WINDOWS__ diff --git a/include/wx/filefn.h b/include/wx/filefn.h index b1523f117c..777973aabd 100644 --- a/include/wx/filefn.h +++ b/include/wx/filefn.h @@ -29,12 +29,14 @@ typedef long off_t; #endif -#if defined(__VISUALC__) || defined(__MWERKS__) +#if defined(__VISUALC__) || ( defined(__MWERKS__) && defined( __INTEL__) ) typedef _off_t off_t; #elif defined(__BORLANDC__) && defined(__WIN16__) typedef long off_t; #elif defined(__SC__) typedef long off_t; +#elif defined(__MWERKS__) && !defined(__INTEL__) + typedef long off_t; #endif const off_t wxInvalidOffset = (off_t)-1; diff --git a/include/wx/mac/app.h b/include/wx/mac/app.h index 67bceb9169..02ed040e88 100644 --- a/include/wx/mac/app.h +++ b/include/wx/mac/app.h @@ -141,6 +141,27 @@ public: protected: bool m_keepGoing ; +// mac specifics + +public : + + void MacDoOneEvent() ; + + void MacHandleOneEvent( EventRecord *ev ) ; + void MacHandleNullEvent( EventRecord *ev ) ; + void MacHandleHighLevelEvent( EventRecord *ev ) ; + void MacHandleMouseDownEvent( EventRecord *ev ) ; + void MacHandleMouseUpEvent( EventRecord *ev ) ; + void MacHandleKeyDownEvent( EventRecord *ev ) ; + void MacHandleKeyUpEvent( EventRecord *ev ) ; + void MacHandleAutoKeyEvent( EventRecord *ev ) ; + void MacHandleActivateEvent( EventRecord *ev ) ; + void MacHandleUpdateEvent( EventRecord *ev ) ; + void MacHandleDiskEvent( EventRecord *ev ) ; + void MacHandleOSEvent( EventRecord *ev ) ; + + + DECLARE_EVENT_TABLE() }; diff --git a/include/wx/mac/filedlg.h b/include/wx/mac/filedlg.h index 2e4c6476e6..911f7ffe85 100644 --- a/include/wx/mac/filedlg.h +++ b/include/wx/mac/filedlg.h @@ -67,7 +67,6 @@ public: #define wxHIDE_READONLY 0x0008 #define wxFILE_MUST_EXIST 0x0010 -/* // File selector - backward compatibility WXDLLEXPORT wxString wxFileSelector(const char *message = wxFileSelectorPromptStr, const char *default_path = NULL, const char *default_filename = NULL, const char *default_extension = NULL, @@ -86,7 +85,5 @@ WXDLLEXPORT wxString wxLoadFileSelector(const char *what, const char *extension, // Generic file save dialog WXDLLEXPORT wxString wxSaveFileSelector(const char *what, const char *extension, const char *default_name = NULL, wxWindow *parent = NULL); -*/ - #endif // _WX_FILEDLG_H_ diff --git a/include/wx/mac/setup.h b/include/wx/mac/setup.h index 3eb97f3e83..77f7dfa27b 100644 --- a/include/wx/mac/setup.h +++ b/include/wx/mac/setup.h @@ -32,42 +32,42 @@ #define wxUSE_AUTOTRANS 0 // Define wxTString -#define wxUSE_POSTSCRIPT 1 +#define wxUSE_POSTSCRIPT 0 // 0 for no PostScript device context #define wxUSE_AFM_FOR_POSTSCRIPT 0 // 1 to use font metric files in GetTextExtent -#define wxUSE_METAFILE 1 +#define wxUSE_METAFILE 0 // 0 for no Metafile and metafile device context #define wxUSE_FORM 0 // 0 for no wxForm -#define wxUSE_IPC 1 +#define wxUSE_IPC 0 // 0 for no interprocess comms -#define wxUSE_HELP 1 +#define wxUSE_HELP 0 // 0 for no help facility -#define wxUSE_RESOURCES 1 +#define wxUSE_RESOURCES 0 // 0 for no wxGetResource/wxWriteResource -#define wxUSE_CLIPBOARD 1 +#define wxUSE_CLIPBOARD 0 // 0 for no clipboard functions -#define wxUSE_SPLINES 1 +#define wxUSE_SPLINES 0 // 0 for no splines -#define wxUSE_XFIG_SPLINE_CODE 1 +#define wxUSE_XFIG_SPLINE_CODE 0 // 1 for XFIG spline code, 0 for AIAI spline code. // AIAI spline code is slower, but freer of copyright issues. // 0 for no splines -#define wxUSE_TOOLBAR 1 +#define wxUSE_TOOLBAR 0 // Use toolbars -#define wxUSE_DRAG_AND_DROP 1 +#define wxUSE_DRAG_AND_DROP 0 // 0 for no drag and drop -#define wxUSE_WX_RESOURCES 1 +#define wxUSE_WX_RESOURCES 0 // Use .wxr resource mechanism (requires PrologIO library) #define wxUSE_DOC_VIEW_ARCHITECTURE 1 // Set to 0 to disable document/view architecture -#define wxUSE_PRINTING_ARCHITECTURE 1 +#define wxUSE_PRINTING_ARCHITECTURE 0 // Set to 0 to disable print/preview architecture code -#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 1 +#define wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW 0 // Set to 0 to disable PostScript print/preview architecture code // under Windows (just use Windows printing). #define wxUSE_DYNAMIC_CLASSES 1 @@ -111,7 +111,7 @@ // but you can't mix them. Set to 1 for , // 0 for -#define wxUSE_WXCONFIG 1 +#define wxUSE_WXCONFIG 0 // if enabled, compiles built-in OS independent wxConfig // class and it's file (any platform) and registry (Win) // based implementations diff --git a/include/wx/mac/window.h b/include/wx/mac/window.h index 75809c01b1..0d37a8b071 100644 --- a/include/wx/mac/window.h +++ b/include/wx/mac/window.h @@ -189,26 +189,49 @@ public: // Get overall window size virtual void GetSize(int *width, int *height) const; + wxSize GetSize() const { int w, h; GetSize(& w, & h); return wxSize(w, h); } // Get window position, relative to parent (or screen if no parent) virtual void GetPosition(int *x, int *y) const; + wxPoint GetPosition() const + { int x, y; GetPosition(&x, &y); return wxPoint(x, y); } + + // Get size and position + wxRect GetRect() const + { int x, y, w, h; GetPosition(& x, & y); GetSize(& w, & h); return wxRect(x, y, w, h); } // Get client (application-useable) size virtual void GetClientSize(int *width, int *height) const; + wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } // Set overall size and position virtual void SetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); - inline virtual void SetSize(int width, int height) { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); } - inline virtual void Move(int x, int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); } + void SetSize(const wxRect& rect, int sizeFlags = wxSIZE_AUTO) + { SetSize(rect.x, rect.y, rect.width, rect.height, sizeFlags); } + + // set size only + void SetSize(int width, int height) + { SetSize(-1, -1, width, height, wxSIZE_USE_EXISTING); } + void SetSize(const wxSize& size) + { SetSize(-1, -1, size.x, size.y, wxSIZE_USE_EXISTING); } + + // set position only + virtual void Move(int x, int y) { SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING); } + void Move(const wxPoint& pt) { SetSize(pt.x, pt.y, -1, -1, wxSIZE_USE_EXISTING); } // Set client size - virtual void SetClientSize(int width, int size); + virtual void SetClientSize(int width, int height); + void SetClientSize(const wxSize& sz) { SetClientSize(sz.x, sz.y); } // Convert client to screen coordinates virtual void ClientToScreen(int *x, int *y) const; + wxPoint ClientToScreen(const wxPoint& pt) const + { int x = pt.x; int y = pt.y; ClientToScreen(& x, & y); return wxPoint(x, y); } // Convert screen to client coordinates virtual void ScreenToClient(int *x, int *y) const; + wxPoint ScreenToClient(const wxPoint& pt) const + { int x = pt.x; int y = pt.y; ScreenToClient(& x, & y); return wxPoint(x, y); } // Set the focus to this window virtual void SetFocus(); diff --git a/include/wx/string.h b/include/wx/string.h index d2b6a60a85..518b8f5f79 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -79,7 +79,7 @@ inline size_t WXDLLEXPORT Strlen(const char *psz) // portable strcasecmp/_stricmp inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2) { -#if defined(__VISUALC__) || defined(__MWERKS__) +#if defined(__VISUALC__) || ( defined(__MWERKS__) && defined(__INTEL__) ) return _stricmp(psz1, psz2); #elif defined(__SC__) return _stricmp(psz1, psz2); @@ -91,7 +91,7 @@ inline int WXDLLEXPORT Stricmp(const char *psz1, const char *psz2) return stricmp(psz1, psz2); #elif defined(__UNIX__) || defined(__GNUWIN32__) return strcasecmp(psz1, psz2); -#elif defined(__MWERKS__) && !defined(_MSC_VER) +#elif defined(__MWERKS__) && !defined(__INTEL__) register char c1, c2; do { c1 = tolower(*psz1++); diff --git a/src/mac/app.cpp b/src/mac/app.cpp index be346f0a57..b0f8b07a30 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -35,6 +35,10 @@ #include +// mac + +#include "apprsrc.h" + extern char *wxBuffer; extern wxList wxPendingDelete; @@ -47,41 +51,116 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) END_EVENT_TABLE() #endif -// platform layer - -typedef void * PLEventHandle ; +long wxApp::sm_lastMessageTime = 0; -int PLTestMinimalRequirements() ; -void PLErrorMessage( int errorCode ) ; -int PLStartupPhase1() ; -int PLStartupPhase2() ; -void PLCleanup() ; +const short kMacMinHeap = (29 * 1024) ; +// platform specific static variables -bool PLDoOneEvent() ; -bool PLHandleOneEvent( PLEventHandle event ) ; // true if really event -bool PLCallbackIdle() ; -bool PLCallbackRepeat() ; +bool gMacHasAppearance = false ; +long gMacAppearanceVersion = 0 ; +RgnHandle gMacCursorRgn = NULL ; -long wxApp::sm_lastMessageTime = 0; bool wxApp::Initialize() { int error = 0 ; - error = PLStartupPhase1() ; - if ( !error ) - { - error = PLTestMinimalRequirements() ; - if ( !error ) - error = PLStartupPhase2() ; - } + // Mac-specific + long total,contig; + + // init all managers + + ::InitGraf(&qd.thePort); + ::InitFonts(); + ::InitWindows(); + ::InitMenus(); + ::TEInit(); + ::InitDialogs(0L); + ::InitCursor(); + CursHandle aCursHandle = ::GetCursor(watchCursor); // Watch should be in system + if (aCursHandle) + ::SetCursor(*aCursHandle); + ::FlushEvents(everyEvent, 0); + + // setup memory of application + ::MaxApplZone(); + for (long i = 1; i <= 4; i++) + ::MoreMasters(); + PurgeSpace(&total, &contig); + ::SetCursor( &qd.arrow ) ; + +#if 0 + InitAEHandlers(); + InitializeAECore() ; + GUSISetup(GUSIwithInternetSockets); +#endif + + // test the minimal configuration necessary + + long theSystem ; + long theMachine; + long theAppearance ; + + if (Gestalt(gestaltMachineType, &theMachine) != noErr) + { + error = kMacSTRWrongMachine; + } + else if (theMachine < gestaltMacPlus) + { + error = kMacSTRWrongMachine; + } + else if (Gestalt(gestaltSystemVersion, &theSystem) != noErr ) + { + error = kMacSTROldSystem ; + } + else if ( theSystem < 0x0700 ) + { + error = kMacSTROldSystem ; + } + else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap) + { + error = kMacSTRSmallSize; + } + else + { + if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr ) + { + gMacHasAppearance = true ; + RegisterAppearanceClient(); + if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr ) + { + gMacAppearanceVersion = theAppearance ; + } + else + { + gMacAppearanceVersion = 0x0100 ; + } + } + else + error = kMacSTRNoPre8Yet ; + } + + // if we encountered any problems so far, give the error code and exit immediately + if ( error ) - { - PLErrorMessage( error ) ; - return FALSE ; + { + short itemHit; + Str255 message; + + SetCursor(&qd.arrow); + GetIndString(message, 128, error); + ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p"); + itemHit = Alert(129, nil); + return FALSE ; } + // now avoid exceptions thrown for new (bad_alloc) + + std::__throws_bad_alloc = FALSE ; + + gMacCursorRgn = ::NewRgn() ; + #ifdef __WXMSW__ wxBuffer = new char[1500]; #else @@ -173,7 +252,12 @@ void wxApp::CleanUp() // do it as the very last thing because everything else can log messages delete wxLog::SetActiveTarget(NULL); - PLCleanup() ; + ::PrClose() ; + if (gMacCursorRgn) + ::DisposeRgn(gMacCursorRgn); + #if 0 + TerminateAE() ; + #endif } int wxEntry( int argc, char *argv[] ) @@ -264,7 +348,7 @@ int wxApp::MainLoop() while (m_keepGoing) { - PLDoOneEvent() ; + MacDoOneEvent() ; } return 0; @@ -403,354 +487,127 @@ wxWindow* wxApp::GetTopWindow() const void wxExit() { wxApp::CleanUp(); -/* - * TODO: Exit in some platform-specific way. Not recommended that the app calls this: - * only for emergencies. - */ + ::ExitToShell() ; } // Yield to other processes bool wxYield() { - /* - * TODO - */ - return TRUE; -} - -// ------------------------------------------------------------------- -// Portability Layer PL -// ------------------------------------------------------------------- -// this is the c-api part, the only part of this file that needs to be -// adapted for supporting a new platform -// there are two flavours of PL... functions, Callbacks and normal functions -// Callbacks are called by other PLxxx functions and allow to trigger idle -// processing etc. the callbacks don't have to be adapted for every platform -// but only in case of changes to the underlying wx framework - -// callbacks - -bool PLCallbackIdle() -{ - return wxTheApp->ProcessIdle() ; -} - -bool PLCallbackRepeat() -{ - // wxMacProcessSocketEvents() ; - return false ; -} - -// platform specific static variables - -bool gMacHasAppearance = false ; -long gMacAppearanceVersion = 0 ; -RgnHandle gMacCursorRgn = NULL ; - -#define kMinHeap (29 * 1024) -#define kMinSpace (20 * 1024) -#define eWrongMachine 1 -#define eSmallSize 2 -#define eNoMemory 3 -#define eOldSystem 4 -#define eGenericAbout 5 - -// platform specific prototypes - -void DoMacNullEvent( EventRecord *ev ) ; -void DoMacHighLevelEvent( EventRecord *ev ) ; -void DoMacMouseDownEvent( EventRecord *ev ) ; -void DoMacMouseUpEvent( EventRecord *ev ) ; -void DoMacKeyDownEvent( EventRecord *ev ) ; -void DoMacKeyUpEvent( EventRecord *ev ) ; -void DoMacAutoKeyEvent( EventRecord *ev ) ; -void DoMacActivateEvent( EventRecord *ev ) ; -void DoMacUpdateEvent( EventRecord *ev ) ; -void DoMacDiskEvent( EventRecord *ev ) ; -void DoMacOSEvent( EventRecord *ev ) ; - -// platform specific functions - -// ------------------------------------------------------------------- -// PLStartupPhase1 -// ------------------------------------------------------------------- -// Initializes the system so that at least the requirements can be tested -// and that error messages will shop up at all ;-) -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLStartupPhase1() -{ - ::InitGraf(&qd.thePort); - ::InitFonts(); - ::InitWindows(); - ::InitMenus(); - ::TEInit(); - ::InitDialogs(0L); - ::InitCursor(); - CursHandle aCursHandle = ::GetCursor(watchCursor); // Watch should be in system - if (aCursHandle) - ::SetCursor(*aCursHandle); // Change cursor to watch - ::FlushEvents(everyEvent, 0); - - gMacCursorRgn = ::NewRgn() ; - - return 0 ; -} - -// ------------------------------------------------------------------- -// PLStartupPhase2 -// ------------------------------------------------------------------- -// booting the system further until all subsystems are running -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLStartupPhase2() -{ - long total,contig; - - ::MaxApplZone(); - for (long i = 1; i <= 4; i++) - ::MoreMasters(); - PurgeSpace(&total, &contig); - ::SetCursor( &qd.arrow ) ; - #if 0 - InitAEHandlers(); - InitializeAECore() ; - GUSISetup(GUSIwithInternetSockets); + ::YieldToOtherThreads() ; + ::SystemTime() ; #endif - - return 0 ; -} - -// ------------------------------------------------------------------- -// PLErrorMessage -// ------------------------------------------------------------------- -// notifies the user of a implementation specific error -// is useful for messages before the wx System is up and running -// -// parameters : int error = error code (implementation specific) -// return value : none - -void PLErrorMessage( int error ) -{ - short itemHit; - Str255 message; - - SetCursor(&qd.arrow); - GetIndString(message, 128, error); - ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p"); - itemHit = Alert(129, nil); -} - -// ------------------------------------------------------------------- -// PLCleanup -// ------------------------------------------------------------------- -// notifies the user of a implementation specific error -// is useful for messages before the wx System is up and running -// -// parameters : int error = error code (implementation specific) -// return value : none - -void PLCleanup() -{ - ::PrClose() ; - if (gMacCursorRgn) - ::DisposeRgn(gMacCursorRgn); -#if 0 - TerminateAE() ; -#endif -} - -// ------------------------------------------------------------------- -// PLTestMinimalRequirements -// ------------------------------------------------------------------- -// test whether we are on the correct runnable system and read out any -// useful informations from the system -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLTestMinimalRequirements() -{ - long theSystem ; - long theMachine; - long theAppearance ; - - if (Gestalt(gestaltMachineType, &theMachine) != noErr) - { - return(eWrongMachine); - } - - if (theMachine < gestaltMacPlus) - { - return(eWrongMachine); - } - - if (Gestalt(gestaltSystemVersion, &theSystem) != noErr ) - { - return( eOldSystem ) ; - } - - if ( theSystem < 0x0700 ) - { - return( eOldSystem ) ; - } - - if ((long)GetApplLimit() - (long)ApplicationZone() < kMinHeap) - { - return(eSmallSize); - } - - if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr ) - { - gMacHasAppearance = true ; - RegisterAppearanceClient(); - if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr ) - { - gMacAppearanceVersion = theAppearance ; - } - else - { - gMacAppearanceVersion = 0x0100 ; - } - } - - return 0 ; + return TRUE; } -// ------------------------------------------------------------------- -// PLDoOneEvent -// ------------------------------------------------------------------- -// -// parameters : none -// return value : returns true if a real event occured (no null or timeout event) +// platform specifics -bool PLDoOneEvent() +void wxApp::MacDoOneEvent() { EventRecord event ; long sleepTime = 60; - bool gotEvent = false ; - - if (WaitNextEvent(everyEvent, &event,sleepTime, gMacCursorRgn)) { - gotEvent = PLHandleOneEvent( &event ); + MacHandleOneEvent( &event ); } else { - PLCallbackIdle(); + // idlers + wxTheApp->ProcessIdle() ; } - - PLCallbackRepeat() ; - - return gotEvent ; + + // repeaters +#if 0 + wxMacProcessSocketEvents() ; +#endif } -// ------------------------------------------------------------------- -// PLHandleOneEvent -// ------------------------------------------------------------------- -// -// parameters : event = event handle of the platform specific event to be handled -// return value : returns true if a real event occured (no null or timeout event) - -bool PLHandleOneEvent( PLEventHandle event ) +void wxApp::MacHandleOneEvent( EventRecord *ev ) { - bool realEvent = true ; - - EventRecord* ev = (EventRecord*) event ; - switch (ev->what) { case nullEvent: - DoMacNullEvent( ev ) ; - realEvent = false ; + MacHandleNullEvent( ev ) ; break ; case kHighLevelEvent: - DoMacHighLevelEvent( ev ) ; + MacHandleHighLevelEvent( ev ) ; break; case mouseDown: - DoMacMouseDownEvent( ev ) ; + MacHandleMouseDownEvent( ev ) ; wxTheApp->ExitMainLoop() ; break; case mouseUp: - DoMacMouseUpEvent( ev ) ; + MacHandleMouseUpEvent( ev ) ; break; case keyDown: - DoMacKeyDownEvent( ev ) ; + MacHandleKeyDownEvent( ev ) ; break; case autoKey: - DoMacAutoKeyEvent( ev ) ; + MacHandleAutoKeyEvent( ev ) ; break; case keyUp: - DoMacKeyUpEvent( ev ) ; + MacHandleKeyUpEvent( ev ) ; break; case activateEvt: - DoMacActivateEvent( ev ) ; + MacHandleActivateEvent( ev ) ; break; case updateEvt: - DoMacUpdateEvent( ev ) ; + MacHandleUpdateEvent( ev ) ; break; case diskEvt: - DoMacDiskEvent( ev ) ; + MacHandleDiskEvent( ev ) ; break; case osEvt: - DoMacOSEvent( ev ) ; + MacHandleOSEvent( ev ) ; break; default: break; } - return realEvent ; } -// platform specific functions (non PLxxx functions) - -void DoMacNullEvent( EventRecord *ev ) +void wxApp::MacHandleNullEvent( EventRecord *ev ) { } -void DoMacHighLevelEvent( EventRecord *ev ) +void wxApp::MacHandleHighLevelEvent( EventRecord *ev ) { } -void DoMacMouseDownEvent( EventRecord *ev ) +void wxApp::MacHandleMouseDownEvent( EventRecord *ev ) { } -void DoMacMouseUpEvent( EventRecord *ev ) +void wxApp::MacHandleMouseUpEvent( EventRecord *ev ) { } -void DoMacKeyDownEvent( EventRecord *ev ) +void wxApp::MacHandleKeyDownEvent( EventRecord *ev ) { } -void DoMacKeyUpEvent( EventRecord *ev ) +void wxApp::MacHandleKeyUpEvent( EventRecord *ev ) { } -void DoMacAutoKeyEvent( EventRecord *ev ) +void wxApp::MacHandleAutoKeyEvent( EventRecord *ev ) { } -void DoMacActivateEvent( EventRecord *ev ) +void wxApp::MacHandleActivateEvent( EventRecord *ev ) { } -void DoMacUpdateEvent( EventRecord *ev ) +void wxApp::MacHandleUpdateEvent( EventRecord *ev ) { } -void DoMacDiskEvent( EventRecord *ev ) +void wxApp::MacHandleDiskEvent( EventRecord *ev ) { } -void DoMacOSEvent( EventRecord *ev ) +void wxApp::MacHandleOSEvent( EventRecord *ev ) { } diff --git a/src/mac/apprsrc.r b/src/mac/apprsrc.r index c336ed3626..6a9530632a 100644 --- a/src/mac/apprsrc.r +++ b/src/mac/apprsrc.r @@ -1,4 +1,16 @@ #include +#include "apprsrc.h" + +resource 'STR#' ( 128 , "Simple Alert Messages" ) +{ + { + "This application needs at least a MacPlus" , + "This application needs more memory" , + "This application is out of memory" , + "This application needs at least System 7" , + "This application needs Appearance extension (built in with System 8) - this restriction will be relieved in the final release" + } +} ; data 'alis' (128, "Libs alias") { $"0000 0000 00CE 0002 0001 0A58 5858 5858" diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index be346f0a57..b0f8b07a30 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -35,6 +35,10 @@ #include +// mac + +#include "apprsrc.h" + extern char *wxBuffer; extern wxList wxPendingDelete; @@ -47,41 +51,116 @@ BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) END_EVENT_TABLE() #endif -// platform layer - -typedef void * PLEventHandle ; +long wxApp::sm_lastMessageTime = 0; -int PLTestMinimalRequirements() ; -void PLErrorMessage( int errorCode ) ; -int PLStartupPhase1() ; -int PLStartupPhase2() ; -void PLCleanup() ; +const short kMacMinHeap = (29 * 1024) ; +// platform specific static variables -bool PLDoOneEvent() ; -bool PLHandleOneEvent( PLEventHandle event ) ; // true if really event -bool PLCallbackIdle() ; -bool PLCallbackRepeat() ; +bool gMacHasAppearance = false ; +long gMacAppearanceVersion = 0 ; +RgnHandle gMacCursorRgn = NULL ; -long wxApp::sm_lastMessageTime = 0; bool wxApp::Initialize() { int error = 0 ; - error = PLStartupPhase1() ; - if ( !error ) - { - error = PLTestMinimalRequirements() ; - if ( !error ) - error = PLStartupPhase2() ; - } + // Mac-specific + long total,contig; + + // init all managers + + ::InitGraf(&qd.thePort); + ::InitFonts(); + ::InitWindows(); + ::InitMenus(); + ::TEInit(); + ::InitDialogs(0L); + ::InitCursor(); + CursHandle aCursHandle = ::GetCursor(watchCursor); // Watch should be in system + if (aCursHandle) + ::SetCursor(*aCursHandle); + ::FlushEvents(everyEvent, 0); + + // setup memory of application + ::MaxApplZone(); + for (long i = 1; i <= 4; i++) + ::MoreMasters(); + PurgeSpace(&total, &contig); + ::SetCursor( &qd.arrow ) ; + +#if 0 + InitAEHandlers(); + InitializeAECore() ; + GUSISetup(GUSIwithInternetSockets); +#endif + + // test the minimal configuration necessary + + long theSystem ; + long theMachine; + long theAppearance ; + + if (Gestalt(gestaltMachineType, &theMachine) != noErr) + { + error = kMacSTRWrongMachine; + } + else if (theMachine < gestaltMacPlus) + { + error = kMacSTRWrongMachine; + } + else if (Gestalt(gestaltSystemVersion, &theSystem) != noErr ) + { + error = kMacSTROldSystem ; + } + else if ( theSystem < 0x0700 ) + { + error = kMacSTROldSystem ; + } + else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap) + { + error = kMacSTRSmallSize; + } + else + { + if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr ) + { + gMacHasAppearance = true ; + RegisterAppearanceClient(); + if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr ) + { + gMacAppearanceVersion = theAppearance ; + } + else + { + gMacAppearanceVersion = 0x0100 ; + } + } + else + error = kMacSTRNoPre8Yet ; + } + + // if we encountered any problems so far, give the error code and exit immediately + if ( error ) - { - PLErrorMessage( error ) ; - return FALSE ; + { + short itemHit; + Str255 message; + + SetCursor(&qd.arrow); + GetIndString(message, 128, error); + ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p"); + itemHit = Alert(129, nil); + return FALSE ; } + // now avoid exceptions thrown for new (bad_alloc) + + std::__throws_bad_alloc = FALSE ; + + gMacCursorRgn = ::NewRgn() ; + #ifdef __WXMSW__ wxBuffer = new char[1500]; #else @@ -173,7 +252,12 @@ void wxApp::CleanUp() // do it as the very last thing because everything else can log messages delete wxLog::SetActiveTarget(NULL); - PLCleanup() ; + ::PrClose() ; + if (gMacCursorRgn) + ::DisposeRgn(gMacCursorRgn); + #if 0 + TerminateAE() ; + #endif } int wxEntry( int argc, char *argv[] ) @@ -264,7 +348,7 @@ int wxApp::MainLoop() while (m_keepGoing) { - PLDoOneEvent() ; + MacDoOneEvent() ; } return 0; @@ -403,354 +487,127 @@ wxWindow* wxApp::GetTopWindow() const void wxExit() { wxApp::CleanUp(); -/* - * TODO: Exit in some platform-specific way. Not recommended that the app calls this: - * only for emergencies. - */ + ::ExitToShell() ; } // Yield to other processes bool wxYield() { - /* - * TODO - */ - return TRUE; -} - -// ------------------------------------------------------------------- -// Portability Layer PL -// ------------------------------------------------------------------- -// this is the c-api part, the only part of this file that needs to be -// adapted for supporting a new platform -// there are two flavours of PL... functions, Callbacks and normal functions -// Callbacks are called by other PLxxx functions and allow to trigger idle -// processing etc. the callbacks don't have to be adapted for every platform -// but only in case of changes to the underlying wx framework - -// callbacks - -bool PLCallbackIdle() -{ - return wxTheApp->ProcessIdle() ; -} - -bool PLCallbackRepeat() -{ - // wxMacProcessSocketEvents() ; - return false ; -} - -// platform specific static variables - -bool gMacHasAppearance = false ; -long gMacAppearanceVersion = 0 ; -RgnHandle gMacCursorRgn = NULL ; - -#define kMinHeap (29 * 1024) -#define kMinSpace (20 * 1024) -#define eWrongMachine 1 -#define eSmallSize 2 -#define eNoMemory 3 -#define eOldSystem 4 -#define eGenericAbout 5 - -// platform specific prototypes - -void DoMacNullEvent( EventRecord *ev ) ; -void DoMacHighLevelEvent( EventRecord *ev ) ; -void DoMacMouseDownEvent( EventRecord *ev ) ; -void DoMacMouseUpEvent( EventRecord *ev ) ; -void DoMacKeyDownEvent( EventRecord *ev ) ; -void DoMacKeyUpEvent( EventRecord *ev ) ; -void DoMacAutoKeyEvent( EventRecord *ev ) ; -void DoMacActivateEvent( EventRecord *ev ) ; -void DoMacUpdateEvent( EventRecord *ev ) ; -void DoMacDiskEvent( EventRecord *ev ) ; -void DoMacOSEvent( EventRecord *ev ) ; - -// platform specific functions - -// ------------------------------------------------------------------- -// PLStartupPhase1 -// ------------------------------------------------------------------- -// Initializes the system so that at least the requirements can be tested -// and that error messages will shop up at all ;-) -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLStartupPhase1() -{ - ::InitGraf(&qd.thePort); - ::InitFonts(); - ::InitWindows(); - ::InitMenus(); - ::TEInit(); - ::InitDialogs(0L); - ::InitCursor(); - CursHandle aCursHandle = ::GetCursor(watchCursor); // Watch should be in system - if (aCursHandle) - ::SetCursor(*aCursHandle); // Change cursor to watch - ::FlushEvents(everyEvent, 0); - - gMacCursorRgn = ::NewRgn() ; - - return 0 ; -} - -// ------------------------------------------------------------------- -// PLStartupPhase2 -// ------------------------------------------------------------------- -// booting the system further until all subsystems are running -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLStartupPhase2() -{ - long total,contig; - - ::MaxApplZone(); - for (long i = 1; i <= 4; i++) - ::MoreMasters(); - PurgeSpace(&total, &contig); - ::SetCursor( &qd.arrow ) ; - #if 0 - InitAEHandlers(); - InitializeAECore() ; - GUSISetup(GUSIwithInternetSockets); + ::YieldToOtherThreads() ; + ::SystemTime() ; #endif - - return 0 ; -} - -// ------------------------------------------------------------------- -// PLErrorMessage -// ------------------------------------------------------------------- -// notifies the user of a implementation specific error -// is useful for messages before the wx System is up and running -// -// parameters : int error = error code (implementation specific) -// return value : none - -void PLErrorMessage( int error ) -{ - short itemHit; - Str255 message; - - SetCursor(&qd.arrow); - GetIndString(message, 128, error); - ParamText(message, (ConstStr255Param)"\p", (ConstStr255Param)"\p", (ConstStr255Param)"\p"); - itemHit = Alert(129, nil); -} - -// ------------------------------------------------------------------- -// PLCleanup -// ------------------------------------------------------------------- -// notifies the user of a implementation specific error -// is useful for messages before the wx System is up and running -// -// parameters : int error = error code (implementation specific) -// return value : none - -void PLCleanup() -{ - ::PrClose() ; - if (gMacCursorRgn) - ::DisposeRgn(gMacCursorRgn); -#if 0 - TerminateAE() ; -#endif -} - -// ------------------------------------------------------------------- -// PLTestMinimalRequirements -// ------------------------------------------------------------------- -// test whether we are on the correct runnable system and read out any -// useful informations from the system -// -// parameters : none -// return value : non zero for a implementation specific error code - -int PLTestMinimalRequirements() -{ - long theSystem ; - long theMachine; - long theAppearance ; - - if (Gestalt(gestaltMachineType, &theMachine) != noErr) - { - return(eWrongMachine); - } - - if (theMachine < gestaltMacPlus) - { - return(eWrongMachine); - } - - if (Gestalt(gestaltSystemVersion, &theSystem) != noErr ) - { - return( eOldSystem ) ; - } - - if ( theSystem < 0x0700 ) - { - return( eOldSystem ) ; - } - - if ((long)GetApplLimit() - (long)ApplicationZone() < kMinHeap) - { - return(eSmallSize); - } - - if ( Gestalt( gestaltAppearanceAttr, &theAppearance ) == noErr ) - { - gMacHasAppearance = true ; - RegisterAppearanceClient(); - if ( Gestalt( gestaltAppearanceVersion, &theAppearance ) == noErr ) - { - gMacAppearanceVersion = theAppearance ; - } - else - { - gMacAppearanceVersion = 0x0100 ; - } - } - - return 0 ; + return TRUE; } -// ------------------------------------------------------------------- -// PLDoOneEvent -// ------------------------------------------------------------------- -// -// parameters : none -// return value : returns true if a real event occured (no null or timeout event) +// platform specifics -bool PLDoOneEvent() +void wxApp::MacDoOneEvent() { EventRecord event ; long sleepTime = 60; - bool gotEvent = false ; - - if (WaitNextEvent(everyEvent, &event,sleepTime, gMacCursorRgn)) { - gotEvent = PLHandleOneEvent( &event ); + MacHandleOneEvent( &event ); } else { - PLCallbackIdle(); + // idlers + wxTheApp->ProcessIdle() ; } - - PLCallbackRepeat() ; - - return gotEvent ; + + // repeaters +#if 0 + wxMacProcessSocketEvents() ; +#endif } -// ------------------------------------------------------------------- -// PLHandleOneEvent -// ------------------------------------------------------------------- -// -// parameters : event = event handle of the platform specific event to be handled -// return value : returns true if a real event occured (no null or timeout event) - -bool PLHandleOneEvent( PLEventHandle event ) +void wxApp::MacHandleOneEvent( EventRecord *ev ) { - bool realEvent = true ; - - EventRecord* ev = (EventRecord*) event ; - switch (ev->what) { case nullEvent: - DoMacNullEvent( ev ) ; - realEvent = false ; + MacHandleNullEvent( ev ) ; break ; case kHighLevelEvent: - DoMacHighLevelEvent( ev ) ; + MacHandleHighLevelEvent( ev ) ; break; case mouseDown: - DoMacMouseDownEvent( ev ) ; + MacHandleMouseDownEvent( ev ) ; wxTheApp->ExitMainLoop() ; break; case mouseUp: - DoMacMouseUpEvent( ev ) ; + MacHandleMouseUpEvent( ev ) ; break; case keyDown: - DoMacKeyDownEvent( ev ) ; + MacHandleKeyDownEvent( ev ) ; break; case autoKey: - DoMacAutoKeyEvent( ev ) ; + MacHandleAutoKeyEvent( ev ) ; break; case keyUp: - DoMacKeyUpEvent( ev ) ; + MacHandleKeyUpEvent( ev ) ; break; case activateEvt: - DoMacActivateEvent( ev ) ; + MacHandleActivateEvent( ev ) ; break; case updateEvt: - DoMacUpdateEvent( ev ) ; + MacHandleUpdateEvent( ev ) ; break; case diskEvt: - DoMacDiskEvent( ev ) ; + MacHandleDiskEvent( ev ) ; break; case osEvt: - DoMacOSEvent( ev ) ; + MacHandleOSEvent( ev ) ; break; default: break; } - return realEvent ; } -// platform specific functions (non PLxxx functions) - -void DoMacNullEvent( EventRecord *ev ) +void wxApp::MacHandleNullEvent( EventRecord *ev ) { } -void DoMacHighLevelEvent( EventRecord *ev ) +void wxApp::MacHandleHighLevelEvent( EventRecord *ev ) { } -void DoMacMouseDownEvent( EventRecord *ev ) +void wxApp::MacHandleMouseDownEvent( EventRecord *ev ) { } -void DoMacMouseUpEvent( EventRecord *ev ) +void wxApp::MacHandleMouseUpEvent( EventRecord *ev ) { } -void DoMacKeyDownEvent( EventRecord *ev ) +void wxApp::MacHandleKeyDownEvent( EventRecord *ev ) { } -void DoMacKeyUpEvent( EventRecord *ev ) +void wxApp::MacHandleKeyUpEvent( EventRecord *ev ) { } -void DoMacAutoKeyEvent( EventRecord *ev ) +void wxApp::MacHandleAutoKeyEvent( EventRecord *ev ) { } -void DoMacActivateEvent( EventRecord *ev ) +void wxApp::MacHandleActivateEvent( EventRecord *ev ) { } -void DoMacUpdateEvent( EventRecord *ev ) +void wxApp::MacHandleUpdateEvent( EventRecord *ev ) { } -void DoMacDiskEvent( EventRecord *ev ) +void wxApp::MacHandleDiskEvent( EventRecord *ev ) { } -void DoMacOSEvent( EventRecord *ev ) +void wxApp::MacHandleOSEvent( EventRecord *ev ) { } diff --git a/src/mac/carbon/apprsrc.r b/src/mac/carbon/apprsrc.r index c336ed3626..6a9530632a 100644 --- a/src/mac/carbon/apprsrc.r +++ b/src/mac/carbon/apprsrc.r @@ -1,4 +1,16 @@ #include +#include "apprsrc.h" + +resource 'STR#' ( 128 , "Simple Alert Messages" ) +{ + { + "This application needs at least a MacPlus" , + "This application needs more memory" , + "This application is out of memory" , + "This application needs at least System 7" , + "This application needs Appearance extension (built in with System 8) - this restriction will be relieved in the final release" + } +} ; data 'alis' (128, "Libs alias") { $"0000 0000 00CE 0002 0001 0A58 5858 5858" diff --git a/src/mac/carbon/filedlg.cpp b/src/mac/carbon/filedlg.cpp index ba8ad73df7..b6f5b1912d 100644 --- a/src/mac/carbon/filedlg.cpp +++ b/src/mac/carbon/filedlg.cpp @@ -57,7 +57,7 @@ WXDLLEXPORT wxString wxFileSelector(const char *title, return wxBuffer; } else - return NULL; + return wxGetEmptyString(); } WXDLLEXPORT wxString wxFileSelectorEx(const char *title, @@ -81,7 +81,7 @@ WXDLLEXPORT wxString wxFileSelectorEx(const char *title, return wxBuffer; } else - return NULL; + return wxGetEmptyString(); } wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, diff --git a/src/mac/filedlg.cpp b/src/mac/filedlg.cpp index ba8ad73df7..b6f5b1912d 100644 --- a/src/mac/filedlg.cpp +++ b/src/mac/filedlg.cpp @@ -57,7 +57,7 @@ WXDLLEXPORT wxString wxFileSelector(const char *title, return wxBuffer; } else - return NULL; + return wxGetEmptyString(); } WXDLLEXPORT wxString wxFileSelectorEx(const char *title, @@ -81,7 +81,7 @@ WXDLLEXPORT wxString wxFileSelectorEx(const char *title, return wxBuffer; } else - return NULL; + return wxGetEmptyString(); } wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message, -- 2.47.2