#pragma implementation "app.h"
#endif
+#include "wx/window.h"
#include "wx/frame.h"
#include "wx/app.h"
#include "wx/utils.h"
#include "wx/pen.h"
#include "wx/brush.h"
#include "wx/cursor.h"
+#include "wx/intl.h"
#include "wx/icon.h"
#include "wx/palette.h"
#include "wx/dc.h"
#include "wx/module.h"
#include "wx/memory.h"
#include "wx/tooltip.h"
+#include "wx/textctrl.h"
+#include "wx/menu.h"
#if wxUSE_WX_RESOURCES
#include "wx/resource.h"
#endif
// mac
-#if __option(profile)
+#ifndef __DARWIN__
+ #if __option(profile)
#include <profiler.h>
+ #endif
#endif
#include "apprsrc.h"
-#include <wx/mac/uma.h>
-#include <wx/mac/macnotfy.h>
+#include "wx/mac/uma.h"
+#include "wx/mac/macnotfy.h"
#if wxUSE_SOCKETS
-#include <OpenTransport.h>
-#include <OpenTptInternet.h>
+ #ifdef __DARWIN__
+ #include <CoreServices/CoreServices.h>
+ #else
+ #include <OpenTransport.h>
+ #include <OpenTptInternet.h>
+ #endif
#endif
extern char *wxBuffer;
int wxApp::s_lastMouseDown = 0 ;
long wxApp::sm_lastMessageTime = 0;
-#ifdef __WXMAC__
-
bool wxApp::s_macDefaultEncodingIsPC = true ;
bool wxApp::s_macSupportPCMenuShortcuts = true ;
long wxApp::s_macAboutMenuItemId = wxID_ABOUT ;
wxString wxApp::s_macHelpMenuTitleName = "&Help" ;
+#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
+pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon )
+#else
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon )
+#endif
{
wxApp* app = (wxApp*) refcon ;
- return wxTheApp->MacHandleAEODoc( event , reply) ;
+ return wxTheApp->MacHandleAEODoc( (AppleEvent*) event , reply) ;
}
+#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
+pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon )
+#else
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , unsigned long refcon )
+#endif
{
wxApp* app = (wxApp*) refcon ;
- return wxTheApp->MacHandleAEOApp( event , reply ) ;
+ return wxTheApp->MacHandleAEOApp( (AppleEvent*) event , reply ) ;
}
+#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
+pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon )
+#else
pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , unsigned long refcon )
+#endif
{
wxApp* app = (wxApp*) refcon ;
- return wxTheApp->MacHandleAEPDoc( event , reply ) ;
+ return wxTheApp->MacHandleAEPDoc( (AppleEvent*) event , reply ) ;
}
+#if defined(UNIVERSAL_INTERFACES_VERSION) && (UNIVERSAL_INTERFACES_VERSION >= 0x0340)
+pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon )
+#else
pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , unsigned long refcon )
+#endif
{
wxApp* app = (wxApp*) refcon ;
- return wxTheApp->MacHandleAEQuit( event , reply) ;
+ return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;
}
-OSErr wxApp::MacHandleAEODoc(AppleEvent *event , AppleEvent *reply)
+OSErr wxApp::MacHandleAEODoc(const AppleEvent *event , AppleEvent *reply)
{
+ SysBeep(40) ;
ProcessSerialNumber PSN ;
PSN.highLongOfPSN = 0 ;
PSN.lowLongOfPSN = kCurrentProcess ;
return noErr ;
}
-OSErr wxApp::MacHandleAEPDoc(AppleEvent *event , AppleEvent *reply)
+OSErr wxApp::MacHandleAEPDoc(const AppleEvent *event , AppleEvent *reply)
{
return noErr ;
}
-OSErr wxApp::MacHandleAEOApp(AppleEvent *event , AppleEvent *reply)
+OSErr wxApp::MacHandleAEOApp(const AppleEvent *event , AppleEvent *reply)
{
return noErr ;
}
-OSErr wxApp::MacHandleAEQuit(AppleEvent *event , AppleEvent *reply)
+OSErr wxApp::MacHandleAEQuit(const AppleEvent *event , AppleEvent *reply)
{
wxWindow* win = GetTopWindow() ;
if ( win )
return result ;
}
-#endif
+wxString wxMacMakeStringFromMacString( const char* from , bool mac2pcEncoding )
+{
+ if (mac2pcEncoding)
+ {
+ return wxMacMakePCStringFromMac( from ) ;
+ }
+ else
+ {
+ return wxString( from ) ;
+ }
+}
+
+wxString wxMacMakeStringFromPascal( StringPtr from , bool mac2pcEncoding )
+{
+ // this is safe since a pascal string can never be larger than 256 bytes
+ char s[256] ;
+ CopyPascalStringToC( from , s ) ;
+ if (mac2pcEncoding)
+ {
+ return wxMacMakePCStringFromMac( s ) ;
+ }
+ else
+ {
+ return wxString( s ) ;
+ }
+}
+
+void wxMacStringToPascal( const char * from , StringPtr to , bool pc2macEncoding )
+{
+ if (pc2macEncoding)
+ {
+ CopyCStringToPascal( wxMacMakeMacStringFromPC( from ) , to ) ;
+ }
+ else
+ {
+ CopyCStringToPascal( from , to ) ;
+ }
+}
bool wxApp::Initialize()
{
// Mac-specific
UMAInitToolbox( 4 ) ;
+ SetEventMask( everyEvent ) ;
UMAShowWatchCursor() ;
- 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(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
+ #if !TARGET_CARBON
long theSystem ;
- long theMachine;
+ long theMachine;
if (Gestalt(gestaltMachineType, &theMachine) != noErr)
{
{
error = kMacSTROldSystem ;
}
- #if !TARGET_CARBON
else if ((long)GetApplLimit() - (long)ApplicationZone() < kMacMinHeap)
{
error = kMacSTRSmallSize;
}
}
*/
+#endif
// if we encountered any problems so far, give the error code and exit immediately
return FALSE ;
}
-#if __option(profile)
+#ifndef __DARWIN__
+ #if __option(profile)
ProfilerInit( collectDetailed, bestTimeBase , 20000 , 40 ) ;
+ #endif
#endif
// now avoid exceptions thrown for new (bad_alloc)
+#ifndef __DARWIN__
std::__throws_bad_alloc = FALSE ;
+#endif
s_macCursorRgn = ::NewRgn() ;
wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING);
wxTheColourDatabase->Initialize();
+#ifdef __WXDEBUG__
+#if wxUSE_LOG
+ // flush the logged messages if any and install a 'safer' log target: the
+ // default one (wxLogGui) can't be used after the resources are freed just
+ // below and the user suppliedo ne might be even more unsafe (using any
+ // wxWindows GUI function is unsafe starting from now)
+ wxLog::DontCreateOnDemand();
+
+ // this will flush the old messages if any
+ delete wxLog::SetActiveTarget(new wxLogStderr);
+#endif // wxUSE_LOG
+#endif
+
wxInitializeStockLists();
wxInitializeStockObjects();
wxBitmap::InitStandardHandlers();
wxModule::RegisterModules();
- if (!wxModule::InitializeModules())
+ if (!wxModule::InitializeModules()) {
return FALSE;
+ }
wxWinMacWindowList = new wxList(wxKEY_INTEGER);
wxWinMacControlList = new wxList(wxKEY_INTEGER);
wxClassInfo::CleanUpClasses();
-#if __option(profile)
- ProfilerDump( "\papp.prof" ) ;
- ProfilerTerm() ;
+#ifndef __DARWIN__
+ #if __option(profile)
+ ProfilerDump( "\papp.prof" ) ;
+ ProfilerTerm() ;
+ #endif
#endif
delete wxTheApp;
delete wxLog::SetActiveTarget(NULL);
#endif // wxUSE_LOG
+ UMACleanupToolbox() ;
if (s_macCursorRgn)
::DisposeRgn(s_macCursorRgn);
wxDebugContext::SetCheckpoint();
#endif
#endif
- if (!wxApp::Initialize())
+ if (!wxApp::Initialize()) {
return 0;
+ }
// create the application object or ensure that one already exists
if (!wxTheApp)
{
wxApp::CleanUp();
return retValue;
-};
+}
// Static member initialization
wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL;
}
// Yield to other processes
+
+static bool gs_inYield = FALSE;
+
bool wxYield()
{
+#ifdef __WXDEBUG__
+ if (gs_inYield)
+ wxFAIL_MSG( wxT("wxYield called recursively" ) );
+#endif
+
+ gs_inYield = TRUE;
+
#if wxUSE_THREADS
- YieldToAnyThread() ;
+ YieldToAnyThread() ;
#endif
- EventRecord event ;
+ EventRecord event ;
- long sleepTime = 0 ; //::GetCaretTime();
+ long sleepTime = 1 ; //::GetCaretTime();
while ( !wxTheApp->IsExiting() && WaitNextEvent(everyEvent, &event,sleepTime, wxApp::s_macCursorRgn))
{
wxTheApp->MacHandleOneEvent( &event );
+ if ( event.what != kHighLevelEvent )
+ SetRectRgn( wxApp::s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
}
wxMacProcessNotifierAndPendingEvents() ;
- return TRUE;
+
+ gs_inYield = FALSE;
+
+ return TRUE;
+}
+
+// Yield to incoming messages; but fail silently if recursion is detected.
+bool wxYieldIfNeeded()
+{
+ if (gs_inYield)
+ return FALSE;
+
+ return wxYield();
}
// platform specifics
{
EventRecord event ;
- long sleepTime = ::GetCaretTime();
+ long sleepTime = 1 ; // GetCaretTime() / 4 ;
if (WaitNextEvent(everyEvent, &event,sleepTime, s_macCursorRgn))
{
wxTheApp->ProcessIdle() ;
}
if ( event.what != kHighLevelEvent )
- SetRectRgn( s_macCursorRgn , event.where.h - 1 , event.where.v - 1, event.where.h + 1 , event.where.v + 1 ) ;
+ SetRectRgn( s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
// repeaters
+ DeletePendingObjects() ;
wxMacProcessNotifierAndPendingEvents() ;
}
short windowPart = ::FindWindow(ev->where, &window);
wxWindow* win = wxFindWinFromMacWindow( window ) ;
+ if ( wxPendingDelete.Member(win) )
+ return ;
BitMap screenBits;
GetQDGlobalsScreenBits( &screenBits );
s_lastMouseDown = 0;
break;
case inGrow:
+ {
int growResult = GrowWindow(window , ev->where, &screenBits.bounds);
if (growResult != 0)
{
int newHeight = HiWord(growResult);
int oldWidth, oldHeight;
- win->GetSize(&oldWidth, &oldHeight);
- if (newWidth == 0)
- newWidth = oldWidth;
- if (newHeight == 0)
- newHeight = oldHeight;
if (win)
+ {
+ win->GetSize(&oldWidth, &oldHeight);
+ if (newWidth == 0)
+ newWidth = oldWidth;
+ if (newHeight == 0)
+ newHeight = oldHeight;
win->SetSize( -1, -1, newWidth, newHeight, wxSIZE_USE_EXISTING);
+ }
}
s_lastMouseDown = 0;
+ }
break;
case inZoomIn:
case inZoomOut:
SetOrigin( 0 , 0 ) ;
SetPort( port ) ;
}
- if ( window != frontWindow )
+ if ( window != frontWindow && wxTheApp->s_captureWindow == NULL )
{
if ( s_macIsInModalLoop )
{
}
else
{
+ if ( win )
+ win->MacMouseDown( ev , windowPart ) ;
UMASelectWindow( window ) ;
}
}
UInt32 menuresult = UMAMenuEvent(ev) ;
if ( HiWord( menuresult ) )
+ {
+ if ( !s_macIsInModalLoop )
MacHandleMenuSelect( HiWord( menuresult ) , LoWord( menuresult ) ) ;
+ }
else
{
short keycode ;
void wxApp::MacHandleKeyUpEvent( EventRecord *ev )
{
- // nothing to do
+ wxToolTip::RemoveToolTips() ;
+
+ UInt32 menuresult = UMAMenuEvent(ev) ;
+ if ( HiWord( menuresult ) )
+ {
+ }
+ else
+ {
+ short keycode ;
+ short keychar ;
+ keychar = short(ev->message & charCodeMask);
+ keycode = short(ev->message & keyCodeMask) >> 8 ;
+
+ wxWindow* focus = wxWindow::FindFocus() ;
+ if ( focus )
+ {
+ long keyval = wxMacTranslateKey(keychar, keycode) ;
+
+ wxKeyEvent event(wxEVT_KEY_UP);
+ event.m_shiftDown = ev->modifiers & shiftKey;
+ event.m_controlDown = ev->modifiers & controlKey;
+ event.m_altDown = ev->modifiers & optionKey;
+ event.m_metaDown = ev->modifiers & cmdKey;
+ event.m_keyCode = keyval;
+ event.m_x = ev->where.h;
+ event.m_y = ev->where.v;
+ event.m_timeStamp = ev->when;
+ event.SetEventObject(focus);
+ bool handled = focus->GetEventHandler()->ProcessEvent( event ) ;
+ }
+ }
}
void wxApp::MacHandleActivateEvent( EventRecord *ev )
wxWindow * win = wxFindWinFromMacWindow( window ) ;
if ( win )
{
- win->MacUpdate( ev ) ;
+ if ( !wxPendingDelete.Member(win) )
+ win->MacUpdate( ev ) ;
+ }
+ else
+ {
+ // since there is no way of telling this foreign window to update itself
+ // we have to invalidate the update region otherwise we keep getting the same
+ // event over and over again
+ BeginUpdate( window ) ;
+ EndUpdate( window ) ;
}
}
case suspendResumeMessage :
{
bool isResuming = ev->message & resumeFlag ;
+#if !TARGET_CARBON
bool convertClipboard = ev->message & convertClipboardFlag ;
+#else
+ bool convertClipboard = false;
+#endif
bool doesActivate = UMAGetProcessModeDoesActivateOnFGSwitch() ;
if ( isResuming )
{
wxWindow* currentMouseWindow = NULL ;
- MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) , ¤tMouseWindow ) ;
+ wxWindow::MacGetWindowFromPoint( wxPoint( ev->where.h , ev->where.v ) ,
+ ¤tMouseWindow ) ;
if ( currentMouseWindow != wxWindow::s_lastMouseWindow )
{
switch (windowPart)
{
+ // fixes for setting the cursor back from dominic mazzoni
case inMenuBar :
+ UMAShowArrowCursor();
break ;
case inSysWindow :
+ UMAShowArrowCursor();
break ;
default:
{
wxWindow* win = wxFindWinFromMacWindow( window ) ;
if ( win )
win->MacMouseMoved( ev , windowPart ) ;
+ else
+ UMAShowArrowCursor();
+
}
break;
}