#include "wx/textctrl.h"
#include "wx/menu.h"
#include "wx/docview.h"
+#include "wx/filename.h"
#include <string.h>
extern wxList wxPendingDelete;
extern wxList *wxWinMacWindowList;
extern wxList *wxWinMacControlList;
+#if wxUSE_THREADS
+extern size_t g_numberOfThreads;
+#endif // wxUSE_THREADS
// statics for implementation
pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;
pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
{
return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;
}
+pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) )
+{
+ return wxTheApp->MacHandleAERApp( (AppleEvent*) event , reply) ;
+}
+
// AEODoc Calls MacOpenFile on each of the files passed
short wxApp::MacHandleAEODoc(const WXEVENTREF event, WXEVENTREF WXUNUSED(reply))
short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
{
- wxWindow* win = GetTopWindow() ;
+ wxWindow* win = GetTopWindow() ;
if ( win )
{
- win->Close(TRUE ) ;
+ wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId);
+ if (!win->ProcessEvent(exitEvent))
+ win->Close(TRUE ) ;
}
- else
+ else
{
ExitMainLoop() ;
}
return noErr ;
}
+// AEROApp calls MacReopenApp
+
+short wxApp::MacHandleAERApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply))
+{
+ MacReopenApp() ;
+ return noErr ;
+}
+
+
//----------------------------------------------------------------------
// Support Routines linking the Mac...File Calls to the Document Manager
//----------------------------------------------------------------------
{
}
+void wxApp::MacReopenApp()
+{
+ // eventually check for open docs, if none, call MacNewFile
+}
+
//----------------------------------------------------------------------
// Carbon Event Handler
//----------------------------------------------------------------------
{ kEventClassMenu, kEventMenuOpening },
{ kEventClassMenu, kEventMenuClosed },
+ { kEventClassMenu, kEventMenuTargetItem },
{ kEventClassApplication , kEventAppActivated } ,
{ kEventClassApplication , kEventAppDeactivated } ,
static pascal OSStatus
MenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
- // FIXME: this doesn't work for multiple windows
- wxWindow *win = wxTheApp->GetTopWindow();
+ wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
+ wxFrame* win = mbar->GetFrame();
+
if ( win )
{
// VZ: we could find the menu from its handle here by examining all
&menuRef);
#endif // 0
- wxMenuEvent wxevent(GetEventKind(event) == kEventMenuOpening
- ? wxEVT_MENU_OPEN
- : wxEVT_MENU_CLOSE);
+ wxEventType type=0;
+ MenuCommand cmd=0;
+ switch (GetEventKind(event))
+ {
+ case kEventMenuOpening:
+ type = wxEVT_MENU_OPEN;
+ break;
+ case kEventMenuClosed:
+ type = wxEVT_MENU_CLOSE;
+ break;
+ case kEventMenuTargetItem:
+ type = wxEVT_MENU_HIGHLIGHT;
+ GetEventParameter(event, kEventParamMenuCommand,
+ typeMenuCommand, NULL,
+ sizeof(cmd), NULL, &cmd);
+ if (cmd == 0) return eventNotHandledErr;
+ break;
+ default:
+ wxFAIL_MSG(wxT("Unexpected menu event kind"));
+ break;
+ }
+
+ wxMenuEvent wxevent(type, cmd);
wxevent.SetEventObject(win);
(void)win->GetEventHandler()->ProcessEvent(wxevent);
if ( !wxAppBase::Initialize(argc, argv) )
return false;
+#if wxUSE_INTL
+ wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
+#endif
+
+
wxWinMacWindowList = new wxList(wxKEY_INTEGER);
wxWinMacControlList = new wxList(wxKEY_INTEGER);
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
NewAEEventHandlerUPP(AEHandlePDoc) ,
0 , FALSE ) ;
+ AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
+ NewAEEventHandlerUPP(AEHandleRApp) ,
+ 0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
NewAEEventHandlerUPP(AEHandleQuit) ,
0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments ,
NewAEEventHandlerProc(AEHandlePDoc) ,
0 , FALSE ) ;
+ AEInstallEventHandler( kCoreEventClass , kAEReopenApplication ,
+ NewAEEventHandlerProc(AEHandleRApp) ,
+ 0 , FALSE ) ;
AEInstallEventHandler( kCoreEventClass , kAEQuitApplication ,
NewAEEventHandlerProc(AEHandleQuit) ,
0 , FALSE ) ;
// allocate copy to replace .dylib.* extension with .rsrc
if (theLibPath != NULL) {
- theResPath = theLibPath;
+#if wxUSE_UNICODE
+ theResPath = wxString(theLibPath, wxConvLocal);
+#else
+ theResPath = wxString(theLibPath);
+#endif
// replace '_core' with '' in case of multi-lib build
theResPath.Replace(wxT("_core"), wxEmptyString);
// replace ".dylib" shared library extension with ".rsrc"
}
if (theErr != noErr) {
#ifdef __WXDEBUG__
- fprintf(stderr,
- wxT("unable to open wxMac resource file '%s'\n"),
- theResPath.mb_str() );
+ wxLogDebug( wxT("unable to open wxMac resource file '%s'\n"),
+ theResPath.mb_str() );
#endif // __WXDEBUG__
}
if ( wxTheApp->ProcessIdle() )
sleepTime = kEventDurationNoWait ;
else
- sleepTime = kEventDurationForever ;
+ {
+#if wxUSE_THREADS
+ if (g_numberOfThreads)
+ {
+ sleepTime = kEventDurationNoWait;
+ }
+ else
+#endif // wxUSE_THREADS
+ {
+ sleepTime = kEventDurationSecond;
+ }
+ }
}
else if ( status == eventLoopQuitErr )
{
if ( wxTheApp->ProcessIdle() )
sleepTime = kEventDurationNoWait;
else
- sleepTime = GetCaretTime() / 2 ;
+ {
+#if wxUSE_THREADS
+ if (g_numberOfThreads)
+ {
+ sleepTime = kEventDurationNoWait;
+ }
+ else
+#endif // wxUSE_THREADS
+ {
+ sleepTime = kEventDurationSecond;
+ }
+ }
}
if ( event.what != kHighLevelEvent )
SetRectRgn( (RgnHandle) s_macCursorRgn , event.where.h , event.where.v , event.where.h + 1 , event.where.v + 1 ) ;
return retval;
}
+int wxKeyCodeToMacModifier(wxKeyCode key)
+{
+ switch (key)
+ {
+ case WXK_START:
+ case WXK_MENU:
+ return cmdKey;
+
+ case WXK_SHIFT:
+ return shiftKey;
+
+ case WXK_CAPITAL:
+ return alphaLock;
+
+ case WXK_ALT:
+ return optionKey;
+
+ case WXK_CONTROL:
+ return controlKey;
+
+ default:
+ return 0;
+ }
+}
+
+bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below
+{
+//#ifdef __DARWIN__
+// wxHIDKeyboard keyboard;
+// return keyboard.IsActive(key);
+//#else
+// TODO: Have it use HID Manager on OSX...
+//if OS X > 10.2 (i.e. 10.2.x)
+//a known apple bug prevents the system from determining led
+//states with GetKeys... can only determine caps lock led
+ return !!(GetCurrentKeyModifiers() & wxKeyCodeToMacModifier(key));
+//else
+// KeyMapByteArray keymap;
+// GetKeys((BigEndianLong*)keymap);
+// return !!(BitTst(keymap, (sizeof(KeyMapByteArray)*8) - iKey));
+//#endif
+}
+
#if !TARGET_CARBON
void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr )
{