1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/app.cpp
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
20 #include "wx/window.h"
23 #include "wx/button.h"
27 #include "wx/palette.h"
29 #include "wx/cursor.h"
30 #include "wx/dialog.h"
31 #include "wx/msgdlg.h"
32 #include "wx/textctrl.h"
33 #include "wx/memory.h"
34 #include "wx/gdicmn.h"
35 #include "wx/module.h"
38 #include "wx/tooltip.h"
39 #include "wx/docview.h"
40 #include "wx/filename.h"
42 #include "wx/thread.h"
43 #include "wx/evtloop.h"
49 #include "wx/osx/uma.h"
51 #include "wx/osx/private.h"
54 #if defined(WXMAKINGDLL_CORE)
55 # include <mach-o/dyld.h>
58 // Keep linker from discarding wxStockGDIMac
59 wxFORCE_LINK_MODULE(gdiobj
)
61 IMPLEMENT_DYNAMIC_CLASS(wxApp
, wxEvtHandler
)
62 BEGIN_EVENT_TABLE(wxApp
, wxEvtHandler
)
63 EVT_IDLE(wxApp::OnIdle
)
64 EVT_END_SESSION(wxApp::OnEndSession
)
65 EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession
)
69 // platform specific static variables
70 static const short kwxMacAppleMenuId
= 1 ;
72 wxWindow
* wxApp::s_captureWindow
= NULL
;
73 long wxApp::s_lastModifiers
= 0 ;
75 long wxApp::s_macAboutMenuItemId
= wxID_ABOUT
;
76 long wxApp::s_macPreferencesMenuItemId
= wxID_PREFERENCES
;
77 long wxApp::s_macExitMenuItemId
= wxID_EXIT
;
78 wxString
wxApp::s_macHelpMenuTitleName
= wxT("&Help") ;
80 bool wxApp::sm_isEmbedded
= false; // Normally we're not a plugin
84 //----------------------------------------------------------------------
85 // Core Apple Event Support
86 //----------------------------------------------------------------------
88 AEEventHandlerUPP sODocHandler
= NULL
;
89 AEEventHandlerUPP sGURLHandler
= NULL
;
90 AEEventHandlerUPP sOAppHandler
= NULL
;
91 AEEventHandlerUPP sPDocHandler
= NULL
;
92 AEEventHandlerUPP sRAppHandler
= NULL
;
93 AEEventHandlerUPP sQuitHandler
= NULL
;
95 pascal OSErr
AEHandleODoc( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
96 pascal OSErr
AEHandleOApp( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
97 pascal OSErr
AEHandlePDoc( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
98 pascal OSErr
AEHandleQuit( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
99 pascal OSErr
AEHandleRApp( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
100 pascal OSErr
AEHandleGURL( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon refcon
) ;
102 pascal OSErr
AEHandleODoc( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
104 return wxTheApp
->MacHandleAEODoc( (AppleEvent
*) event
, reply
) ;
107 pascal OSErr
AEHandleOApp( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
109 return wxTheApp
->MacHandleAEOApp( (AppleEvent
*) event
, reply
) ;
112 pascal OSErr
AEHandlePDoc( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
114 return wxTheApp
->MacHandleAEPDoc( (AppleEvent
*) event
, reply
) ;
117 pascal OSErr
AEHandleQuit( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
119 return wxTheApp
->MacHandleAEQuit( (AppleEvent
*) event
, reply
) ;
122 pascal OSErr
AEHandleRApp( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
124 return wxTheApp
->MacHandleAERApp( (AppleEvent
*) event
, reply
) ;
127 pascal OSErr
AEHandleGURL( const AppleEvent
*event
, AppleEvent
*reply
, SRefCon
WXUNUSED(refcon
) )
129 return wxTheApp
->MacHandleAEGURL((WXEVENTREF
*)event
, reply
) ;
133 // AEODoc Calls MacOpenFiles with all of the files passed
135 short wxApp::MacHandleAEODoc(const WXEVENTREF event
, WXEVENTREF
WXUNUSED(reply
))
139 DescType returnedType
;
145 err
= AEGetParamDesc((AppleEvent
*)event
, keyDirectObject
, typeAEList
,&docList
);
149 err
= AECountItems(&docList
, &itemsInList
);
153 ProcessSerialNumber PSN
;
154 PSN
.highLongOfPSN
= 0 ;
155 PSN
.lowLongOfPSN
= kCurrentProcess
;
156 SetFrontProcess( &PSN
) ;
161 wxArrayString fileNames
;
162 for (i
= 1; i
<= itemsInList
; i
++)
165 &docList
, i
, typeFSRef
, &keywd
, &returnedType
,
166 (Ptr
)&theRef
, sizeof(theRef
), &actualSize
);
167 fName
= wxMacFSRefToPath( &theRef
) ;
169 fileNames
.Add(fName
);
172 MacOpenFiles(fileNames
);
177 // AEODoc Calls MacOpenURL on the url passed
179 short wxApp::MacHandleAEGURL(const WXEVENTREF event
, WXEVENTREF
WXUNUSED(reply
))
181 DescType returnedType
;
184 OSErr err
= AEGetParamPtr((AppleEvent
*)event
, keyDirectObject
, typeChar
,
185 &returnedType
, url
, sizeof(url
)-1,
190 url
[actualSize
] = '\0'; // Terminate the C string
192 ProcessSerialNumber PSN
;
193 PSN
.highLongOfPSN
= 0 ;
194 PSN
.lowLongOfPSN
= kCurrentProcess
;
195 SetFrontProcess( &PSN
) ;
197 MacOpenURL(wxString(url
, wxConvUTF8
));
202 // AEPDoc Calls MacPrintFile on each of the files passed
204 short wxApp::MacHandleAEPDoc(const WXEVENTREF event
, WXEVENTREF
WXUNUSED(reply
))
208 DescType returnedType
;
214 err
= AEGetParamDesc((AppleEvent
*)event
, keyDirectObject
, typeAEList
,&docList
);
218 err
= AECountItems(&docList
, &itemsInList
);
222 ProcessSerialNumber PSN
;
223 PSN
.highLongOfPSN
= 0 ;
224 PSN
.lowLongOfPSN
= kCurrentProcess
;
225 SetFrontProcess( &PSN
) ;
230 for (i
= 1; i
<= itemsInList
; i
++)
233 &docList
, i
, typeFSRef
, &keywd
, &returnedType
,
234 (Ptr
)&theRef
, sizeof(theRef
), &actualSize
);
235 fName
= wxMacFSRefToPath( &theRef
) ;
243 // AEOApp calls MacNewFile
245 short wxApp::MacHandleAEOApp(const WXEVENTREF
WXUNUSED(event
) , WXEVENTREF
WXUNUSED(reply
))
251 // AEQuit attempts to quit the application
253 short wxApp::MacHandleAEQuit(const WXEVENTREF
WXUNUSED(event
) , WXEVENTREF
WXUNUSED(reply
))
256 wxTheApp
->OnQueryEndSession(event
);
257 if ( !event
.GetVeto() )
260 wxTheApp
->OnEndSession(event
);
265 // AEROApp calls MacReopenApp
267 short wxApp::MacHandleAERApp(const WXEVENTREF
WXUNUSED(event
) , WXEVENTREF
WXUNUSED(reply
))
276 //----------------------------------------------------------------------
277 // Support Routines linking the Mac...File Calls to the Document Manager
278 //----------------------------------------------------------------------
280 void wxApp::MacOpenFiles(const wxArrayString
& fileNames
)
283 const size_t fileCount
= fileNames
.GetCount();
284 for (i
= 0; i
< fileCount
; i
++)
286 MacOpenFile(fileNames
[i
]);
290 void wxApp::MacOpenFile(const wxString
& fileName
)
292 #if wxUSE_DOC_VIEW_ARCHITECTURE
293 wxDocManager
* dm
= wxDocManager::GetDocumentManager() ;
295 dm
->CreateDocument(fileName
, wxDOC_SILENT
) ;
299 void wxApp::MacOpenURL(const wxString
& WXUNUSED(url
) )
303 void wxApp::MacPrintFile(const wxString
& fileName
)
305 #if wxUSE_DOC_VIEW_ARCHITECTURE
307 #if wxUSE_PRINTING_ARCHITECTURE
308 wxDocManager
* dm
= wxDocManager::GetDocumentManager() ;
311 wxDocument
*doc
= dm
->CreateDocument(fileName
, wxDOC_SILENT
) ;
314 wxView
* view
= doc
->GetFirstView() ;
317 wxPrintout
*printout
= view
->OnCreatePrintout();
321 printer
.Print(view
->GetFrame(), printout
, true);
328 doc
->DeleteAllViews();
329 dm
->RemoveDocument(doc
) ;
340 void wxApp::MacNewFile()
344 void wxApp::MacReopenApp()
347 // if there is no open window -> create a new one
348 // if all windows are hidden -> show the first
349 // if some windows are not hidden -> do nothing
351 wxWindowList::compatibility_iterator node
= wxTopLevelWindows
.GetFirst();
358 wxTopLevelWindow
* firstIconized
= NULL
;
359 wxTopLevelWindow
* firstHidden
= NULL
;
362 wxTopLevelWindow
* win
= (wxTopLevelWindow
*) node
->GetData();
363 if ( !win
->IsShown() )
365 // make sure we don't show 'virtual toplevel windows' like wxTaskBarIconWindow
366 if ( firstHidden
== NULL
&& ( wxDynamicCast( win
, wxFrame
) || wxDynamicCast( win
, wxDialog
) ) )
369 else if ( win
->IsIconized() )
371 if ( firstIconized
== NULL
)
372 firstIconized
= win
;
376 // we do have a visible, non-iconized toplevelwindow -> do nothing
380 node
= node
->GetNext();
384 firstIconized
->Iconize( false ) ;
385 else if ( firstHidden
)
386 firstHidden
->Show( true );
390 //----------------------------------------------------------------------
391 // Macintosh CommandID support - converting between native and wx IDs
392 //----------------------------------------------------------------------
394 // if no native match they just return the passed-in id
404 IdPair gCommandIds
[] =
406 { kHICommandCut
, wxID_CUT
} ,
407 { kHICommandCopy
, wxID_COPY
} ,
408 { kHICommandPaste
, wxID_PASTE
} ,
409 { kHICommandSelectAll
, wxID_SELECTALL
} ,
410 { kHICommandClear
, wxID_CLEAR
} ,
411 { kHICommandUndo
, wxID_UNDO
} ,
412 { kHICommandRedo
, wxID_REDO
} ,
415 int wxMacCommandToId( UInt32 macCommandId
)
419 switch ( macCommandId
)
421 case kHICommandPreferences
:
422 wxid
= wxApp::s_macPreferencesMenuItemId
;
425 case kHICommandQuit
:
426 wxid
= wxApp::s_macExitMenuItemId
;
429 case kHICommandAbout
:
430 wxid
= wxApp::s_macAboutMenuItemId
;
435 for ( size_t i
= 0 ; i
< WXSIZEOF(gCommandIds
) ; ++i
)
437 if ( gCommandIds
[i
].macId
== macCommandId
)
439 wxid
= gCommandIds
[i
].wxId
;
448 wxid
= (int) macCommandId
;
453 UInt32
wxIdToMacCommand( int wxId
)
457 if ( wxId
== wxApp::s_macPreferencesMenuItemId
)
458 macId
= kHICommandPreferences
;
459 else if (wxId
== wxApp::s_macExitMenuItemId
)
460 macId
= kHICommandQuit
;
461 else if (wxId
== wxApp::s_macAboutMenuItemId
)
462 macId
= kHICommandAbout
;
465 for ( size_t i
= 0 ; i
< WXSIZEOF(gCommandIds
) ; ++i
)
467 if ( gCommandIds
[i
].wxId
== wxId
)
469 macId
= gCommandIds
[i
].macId
;
481 wxMenu
* wxFindMenuFromMacCommand( const HICommand
&command
, wxMenuItem
* &item
)
483 wxMenu
* itemMenu
= NULL
;
484 #ifndef __WXUNIVERSAL__
487 // for 'standard' commands which don't have a wx-menu
488 if ( command
.commandID
== kHICommandPreferences
|| command
.commandID
== kHICommandQuit
|| command
.commandID
== kHICommandAbout
)
490 id
= wxMacCommandToId( command
.commandID
) ;
492 wxMenuBar
* mbar
= wxMenuBar::MacGetInstalledMenuBar() ;
494 item
= mbar
->FindItem( id
, &itemMenu
) ;
496 else if ( command
.commandID
!= 0 && command
.menu
.menuRef
!= 0 && command
.menu
.menuItemIndex
!= 0 )
498 id
= wxMacCommandToId( command
.commandID
) ;
499 // make sure it is one of our own menus, or of the 'synthetic' apple and help menus , otherwise don't touch
500 MenuItemIndex firstUserHelpMenuItem
;
501 static MenuHandle helpMenuHandle
= NULL
;
502 if ( helpMenuHandle
== NULL
)
504 if ( UMAGetHelpMenuDontCreate( &helpMenuHandle
, &firstUserHelpMenuItem
) != noErr
)
505 helpMenuHandle
= NULL
;
508 // is it part of the application or the Help menu, then look for the id directly
509 if ( ( GetMenuHandle( kwxMacAppleMenuId
) != NULL
&& command
.menu
.menuRef
== GetMenuHandle( kwxMacAppleMenuId
) ) ||
510 ( helpMenuHandle
!= NULL
&& command
.menu
.menuRef
== helpMenuHandle
) ||
511 wxMenuBar::MacGetWindowMenuHMenu() != NULL
&& command
.menu
.menuRef
== wxMenuBar::MacGetWindowMenuHMenu() )
513 wxMenuBar
* mbar
= wxMenuBar::MacGetInstalledMenuBar() ;
515 item
= mbar
->FindItem( id
, &itemMenu
) ;
521 GetMenuItemRefCon( command
.menu
.menuRef
, command
.menu
.menuItemIndex
, &refCon
) ;
522 itemMenu
= wxFindMenuFromMacMenu( command
.menu
.menuRef
) ;
523 if ( itemMenu
!= NULL
&& refCon
!= 0)
524 item
= (wxMenuItem
*) refCon
;
533 //----------------------------------------------------------------------
534 // Carbon Event Handler
535 //----------------------------------------------------------------------
539 static const EventTypeSpec eventList
[] =
541 { kEventClassCommand
, kEventProcessCommand
} ,
542 { kEventClassCommand
, kEventCommandUpdateStatus
} ,
544 { kEventClassMenu
, kEventMenuOpening
},
545 { kEventClassMenu
, kEventMenuClosed
},
546 { kEventClassMenu
, kEventMenuTargetItem
},
548 { kEventClassApplication
, kEventAppActivated
} ,
549 { kEventClassApplication
, kEventAppDeactivated
} ,
550 // handling the quit event is not recommended by apple
551 // rather using the quit apple event - which we do
553 { kEventClassAppleEvent
, kEventAppleEvent
} ,
555 { kEventClassMouse
, kEventMouseDown
} ,
556 { kEventClassMouse
, kEventMouseMoved
} ,
557 { kEventClassMouse
, kEventMouseUp
} ,
558 { kEventClassMouse
, kEventMouseDragged
} ,
562 static pascal OSStatus
563 wxMacAppMenuEventHandler( EventHandlerCallRef
WXUNUSED(handler
),
565 void *WXUNUSED(data
) )
567 wxMacCarbonEvent
cEvent( event
) ;
568 MenuRef menuRef
= cEvent
.GetParameter
<MenuRef
>(kEventParamDirectObject
) ;
569 #ifndef __WXUNIVERSAL__
570 wxMenu
* menu
= wxFindMenuFromMacMenu( menuRef
) ;
574 switch (GetEventKind(event
))
576 case kEventMenuOpening
:
577 menu
->HandleMenuOpened();
580 case kEventMenuClosed
:
581 menu
->HandleMenuClosed();
584 case kEventMenuTargetItem
:
588 command
.menu
.menuRef
= menuRef
;
589 command
.menu
.menuItemIndex
= cEvent
.GetParameter
<MenuItemIndex
>(kEventParamMenuItemIndex
,typeMenuItemIndex
) ;
590 command
.commandID
= cEvent
.GetParameter
<MenuCommand
>(kEventParamMenuCommand
,typeMenuCommand
) ;
591 if (command
.commandID
!= 0)
593 wxMenuItem
* item
= NULL
;
594 wxMenu
* itemMenu
= wxFindMenuFromMacCommand( command
, item
) ;
595 if ( itemMenu
&& item
)
596 itemMenu
->HandleMenuItemHighlighted( item
);
602 wxFAIL_MSG(wxT("Unexpected menu event kind"));
608 return eventNotHandledErr
;
611 static pascal OSStatus
612 wxMacAppCommandEventHandler( EventHandlerCallRef
WXUNUSED(handler
) ,
614 void *WXUNUSED(data
) )
616 OSStatus result
= eventNotHandledErr
;
620 wxMacCarbonEvent
cEvent( event
) ;
621 cEvent
.GetParameter
<HICommand
>(kEventParamDirectObject
,typeHICommand
,&command
) ;
623 wxMenuItem
* item
= NULL
;
624 wxMenu
* itemMenu
= wxFindMenuFromMacCommand( command
, item
) ;
628 wxASSERT( itemMenu
!= NULL
) ;
630 switch ( cEvent
.GetKind() )
632 case kEventProcessCommand
:
633 if ( itemMenu
->HandleCommandProcess( item
) )
637 case kEventCommandUpdateStatus
:
638 if ( itemMenu
->HandleCommandUpdateStatus( item
) )
649 static pascal OSStatus
650 wxMacAppApplicationEventHandler( EventHandlerCallRef
WXUNUSED(handler
) ,
652 void *WXUNUSED(data
) )
654 OSStatus result
= eventNotHandledErr
;
655 switch ( GetEventKind( event
) )
657 case kEventAppActivated
:
659 wxTheApp
->SetActive( true , NULL
) ;
663 case kEventAppDeactivated
:
665 wxTheApp
->SetActive( false , NULL
) ;
676 pascal OSStatus
wxMacAppEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data
)
678 EventRef formerEvent
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ;
679 EventHandlerCallRef formerEventHandlerCallRef
= (EventHandlerCallRef
) wxTheApp
->MacGetCurrentEventHandlerCallRef() ;
680 wxTheApp
->MacSetCurrentEvent( event
, handler
) ;
682 OSStatus result
= eventNotHandledErr
;
683 switch ( GetEventClass( event
) )
686 case kEventClassCommand
:
687 result
= wxMacAppCommandEventHandler( handler
, event
, data
) ;
690 case kEventClassApplication
:
691 result
= wxMacAppApplicationEventHandler( handler
, event
, data
) ;
694 case kEventClassMenu
:
695 result
= wxMacAppMenuEventHandler( handler
, event
, data
) ;
698 case kEventClassMouse
:
700 wxMacCarbonEvent
cEvent( event
) ;
703 Point screenMouseLocation
= cEvent
.GetParameter
<Point
>(kEventParamMouseLocation
) ;
704 ::FindWindow(screenMouseLocation
, &window
);
705 // only send this event in case it had not already been sent to a tlw, as we get
706 // double events otherwise (in case event.skip) was called
707 if ( window
== NULL
)
708 result
= wxMacTopLevelMouseEventHandler( handler
, event
, NULL
) ;
712 case kEventClassAppleEvent
:
713 result
= AEProcessEvent(event
);
720 wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef
) ;
725 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler
)
728 #if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
731 wxMacAssertOutputHandler(OSType
WXUNUSED(componentSignature
),
732 UInt32
WXUNUSED(options
),
733 const char *assertionString
,
734 const char *exceptionLabelString
,
735 const char *errorString
,
736 const char *fileName
,
739 ConstStr255Param
WXUNUSED(outputMsg
))
741 // flow into assert handling
742 wxString fileNameStr
;
743 wxString assertionStr
;
744 wxString exceptionStr
;
748 fileNameStr
= wxString(fileName
, wxConvLocal
);
749 assertionStr
= wxString(assertionString
, wxConvLocal
);
750 exceptionStr
= wxString((exceptionLabelString
!=0) ? exceptionLabelString
: "", wxConvLocal
) ;
751 errorStr
= wxString((errorString
!=0) ? errorString
: "", wxConvLocal
) ;
753 fileNameStr
= fileName
;
754 assertionStr
= assertionString
;
755 exceptionStr
= (exceptionLabelString
!=0) ? exceptionLabelString
: "" ;
756 errorStr
= (errorString
!=0) ? errorString
: "" ;
761 wxLogDebug( wxT("AssertMacros: %s %s %s file: %s, line: %ld (value %p)\n"),
762 assertionStr
.c_str() ,
763 exceptionStr
.c_str() ,
765 fileNameStr
.c_str(), lineNumber
,
769 wxOnAssert(fileNameStr
, lineNumber
, assertionStr
,
770 wxString::Format( wxT("%s %s value (%p)") , exceptionStr
, errorStr
, value
) ) ;
774 #endif // wxDEBUG_LEVEL
776 bool wxApp::Initialize(int& argc
, wxChar
**argv
)
780 #if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
781 InstallDebugAssertOutputHandler( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler
) );
784 // Mac OS X passes a process serial number command line argument when
785 // the application is launched from the Finder. This argument must be
786 // removed from the command line arguments before being handled by the
787 // application (otherwise applications would need to handle it)
790 static const wxChar
*ARG_PSN
= wxT("-psn_");
791 if ( wxStrncmp(argv
[1], ARG_PSN
, wxStrlen(ARG_PSN
)) == 0 )
793 // remove this argument
795 memmove(argv
+ 1, argv
+ 2, argc
* sizeof(wxChar
*));
800 Cocoa supports -Key value options which set the user defaults key "Key"
801 to the value "value" Some of them are very handy for debugging like
802 -NSShowAllViews YES. Cocoa picks these up from the real argv so
803 our removal of them from the wx copy of it does not affect Cocoa's
806 We basically just assume that any "-NS" option and its following
807 argument needs to be removed from argv. We hope that user code does
808 not expect to see -NS options and indeed it's probably a safe bet
809 since most user code accepting options is probably using the
810 double-dash GNU-style syntax.
812 for(int i
=1; i
< argc
; ++i
)
814 static const wxChar
*ARG_NS
= wxT("-NS");
815 if( wxStrncmp(argv
[i
], ARG_NS
, wxStrlen(ARG_NS
)) == 0 )
817 // Only eat this option if it has an argument
820 memmove(argv
+ i
, argv
+ i
+ 2, (argc
-i
-1)*sizeof(wxChar
*));
822 // drop back one position so the next run through the loop
823 // reprocesses the argument at our current index.
829 if ( !wxAppBase::Initialize(argc
, argv
) )
833 wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
836 // these might be the startup dirs, set them to the 'usual' dir containing the app bundle
837 wxString startupCwd
= wxGetCwd() ;
838 if ( startupCwd
== wxT("/") || startupCwd
.Right(15) == wxT("/Contents/MacOS") )
840 CFURLRef url
= CFBundleCopyBundleURL(CFBundleGetMainBundle() ) ;
841 CFURLRef urlParent
= CFURLCreateCopyDeletingLastPathComponent( kCFAllocatorDefault
, url
) ;
843 CFStringRef path
= CFURLCopyFileSystemPath ( urlParent
, kCFURLPOSIXPathStyle
) ;
844 CFRelease( urlParent
) ;
845 wxString cwd
= wxCFStringRef(path
).AsString(wxLocale::GetSystemEncoding());
846 wxSetWorkingDirectory( cwd
) ;
852 #if wxOSX_USE_COCOA_OR_CARBON
853 bool wxApp::CallOnInit()
855 wxMacAutoreleasePool autoreleasepool
;
860 bool wxApp::OnInitGui()
862 if ( !wxAppBase::OnInitGui() )
871 bool wxApp::ProcessIdle()
873 wxMacAutoreleasePool autoreleasepool
;
874 return wxAppBase::ProcessIdle();
879 wxMacAutoreleasePool pool
;
880 return wxAppBase::OnRun();
884 bool wxApp::DoInitGui()
886 InstallStandardEventHandler( GetApplicationEventTarget() ) ;
889 InstallApplicationEventHandler(
890 GetwxMacAppEventHandlerUPP(),
891 GetEventTypeCount(eventList
), eventList
, wxTheApp
, (EventHandlerRef
*)&(wxTheApp
->m_macEventHandler
));
896 sODocHandler
= NewAEEventHandlerUPP(AEHandleODoc
) ;
897 sGURLHandler
= NewAEEventHandlerUPP(AEHandleGURL
) ;
898 sOAppHandler
= NewAEEventHandlerUPP(AEHandleOApp
) ;
899 sPDocHandler
= NewAEEventHandlerUPP(AEHandlePDoc
) ;
900 sRAppHandler
= NewAEEventHandlerUPP(AEHandleRApp
) ;
901 sQuitHandler
= NewAEEventHandlerUPP(AEHandleQuit
) ;
903 AEInstallEventHandler( kCoreEventClass
, kAEOpenDocuments
,
904 sODocHandler
, 0 , FALSE
) ;
905 AEInstallEventHandler( kInternetEventClass
, kAEGetURL
,
906 sGURLHandler
, 0 , FALSE
) ;
907 AEInstallEventHandler( kCoreEventClass
, kAEOpenApplication
,
908 sOAppHandler
, 0 , FALSE
) ;
909 AEInstallEventHandler( kCoreEventClass
, kAEPrintDocuments
,
910 sPDocHandler
, 0 , FALSE
) ;
911 AEInstallEventHandler( kCoreEventClass
, kAEReopenApplication
,
912 sRAppHandler
, 0 , FALSE
) ;
913 AEInstallEventHandler( kCoreEventClass
, kAEQuitApplication
,
914 sQuitHandler
, 0 , FALSE
) ;
917 if ( !wxMacInitCocoa() )
923 void wxApp::DoCleanUp()
926 RemoveEventHandler( (EventHandlerRef
)(wxTheApp
->m_macEventHandler
) );
930 AERemoveEventHandler( kCoreEventClass
, kAEOpenDocuments
,
931 sODocHandler
, FALSE
) ;
932 AERemoveEventHandler( kInternetEventClass
, kAEGetURL
,
933 sGURLHandler
, FALSE
) ;
934 AERemoveEventHandler( kCoreEventClass
, kAEOpenApplication
,
935 sOAppHandler
, FALSE
) ;
936 AERemoveEventHandler( kCoreEventClass
, kAEPrintDocuments
,
937 sPDocHandler
, FALSE
) ;
938 AERemoveEventHandler( kCoreEventClass
, kAEReopenApplication
,
939 sRAppHandler
, FALSE
) ;
940 AERemoveEventHandler( kCoreEventClass
, kAEQuitApplication
,
941 sQuitHandler
, FALSE
) ;
943 DisposeAEEventHandlerUPP( sODocHandler
) ;
944 DisposeAEEventHandlerUPP( sGURLHandler
) ;
945 DisposeAEEventHandlerUPP( sOAppHandler
) ;
946 DisposeAEEventHandlerUPP( sPDocHandler
) ;
947 DisposeAEEventHandlerUPP( sRAppHandler
) ;
948 DisposeAEEventHandlerUPP( sQuitHandler
) ;
954 void wxApp::CleanUp()
956 wxMacAutoreleasePool autoreleasepool
;
958 wxToolTip::RemoveToolTips() ;
963 wxAppBase::CleanUp();
966 //----------------------------------------------------------------------
967 // misc initialization stuff
968 //----------------------------------------------------------------------
972 m_printMode
= wxPRINT_WINDOWS
;
974 m_macCurrentEvent
= NULL
;
975 m_macCurrentEventHandlerCallRef
= NULL
;
976 m_macPool
= new wxMacAutoreleasePool();
985 CFMutableArrayRef
GetAutoReleaseArray()
987 static CFMutableArrayRef array
= 0;
989 array
= CFArrayCreateMutable(kCFAllocatorDefault
,0,&kCFTypeArrayCallBacks
);
993 void wxApp::MacAddToAutorelease( void* cfrefobj
)
995 CFArrayAppendValue( GetAutoReleaseArray(), cfrefobj
);
998 void wxApp::MacReleaseAutoreleasePool()
1002 m_macPool
= new wxMacAutoreleasePool();
1005 void wxApp::OnIdle(wxIdleEvent
& WXUNUSED(event
))
1007 // If they are pending events, we must process them: pending events are
1008 // either events to the threads other than main or events posted with
1009 // wxPostEvent() functions
1010 #ifndef __WXUNIVERSAL__
1012 if (!wxMenuBar::MacGetInstalledMenuBar() && wxMenuBar::MacGetCommonMenuBar())
1013 wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar();
1016 CFArrayRemoveAllValues( GetAutoReleaseArray() );
1019 void wxApp::WakeUpIdle()
1021 wxEventLoopBase
* const loop
= wxEventLoopBase::GetActive();
1027 void wxApp::OnEndSession(wxCloseEvent
& WXUNUSED(event
))
1030 GetTopWindow()->Close(true);
1033 // Default behaviour: close the application with prompts. The
1034 // user can veto the close, and therefore the end session.
1035 void wxApp::OnQueryEndSession(wxCloseEvent
& event
)
1037 if ( !wxDialog::OSXHasModalDialogsOpen() )
1041 if (!GetTopWindow()->Close(!event
.CanVeto()))
1051 extern "C" void wxCYield() ;
1058 void wxApp::MacHandleUnhandledEvent( WXEVENTREF
WXUNUSED(evr
) )
1060 // Override to process unhandled events as you please
1063 #if wxOSX_USE_COCOA_OR_CARBON
1065 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
1067 // adding forward compatible defines for keys that are different on different keyboard layouts
1068 // see Inside Mac Volume V
1094 kVK_ANSI_Equal
= 0x18,
1097 kVK_ANSI_Minus
= 0x1B,
1100 kVK_ANSI_RightBracket
= 0x1E,
1103 kVK_ANSI_LeftBracket
= 0x21,
1108 kVK_ANSI_Quote
= 0x27,
1110 kVK_ANSI_Semicolon
= 0x29,
1111 kVK_ANSI_Backslash
= 0x2A,
1112 kVK_ANSI_Comma
= 0x2B,
1113 kVK_ANSI_Slash
= 0x2C,
1116 kVK_ANSI_Period
= 0x2F,
1117 kVK_ANSI_Grave
= 0x32,
1118 kVK_ANSI_KeypadDecimal
= 0x41,
1119 kVK_ANSI_KeypadMultiply
= 0x43,
1120 kVK_ANSI_KeypadPlus
= 0x45,
1121 kVK_ANSI_KeypadClear
= 0x47,
1122 kVK_ANSI_KeypadDivide
= 0x4B,
1123 kVK_ANSI_KeypadEnter
= 0x4C,
1124 kVK_ANSI_KeypadMinus
= 0x4E,
1125 kVK_ANSI_KeypadEquals
= 0x51,
1126 kVK_ANSI_Keypad0
= 0x52,
1127 kVK_ANSI_Keypad1
= 0x53,
1128 kVK_ANSI_Keypad2
= 0x54,
1129 kVK_ANSI_Keypad3
= 0x55,
1130 kVK_ANSI_Keypad4
= 0x56,
1131 kVK_ANSI_Keypad5
= 0x57,
1132 kVK_ANSI_Keypad6
= 0x58,
1133 kVK_ANSI_Keypad7
= 0x59,
1134 kVK_ANSI_Keypad8
= 0x5B,
1135 kVK_ANSI_Keypad9
= 0x5C
1138 // defines for keys that are the same on all layouts
1148 kVK_CapsLock
= 0x39,
1151 kVK_RightShift
= 0x3C,
1152 kVK_RightOption
= 0x3D,
1153 kVK_RightControl
= 0x3E,
1154 kVK_Function
= 0x3F,
1156 kVK_VolumeUp
= 0x48,
1157 kVK_VolumeDown
= 0x49,
1178 kVK_ForwardDelete
= 0x75,
1182 kVK_PageDown
= 0x79,
1184 kVK_LeftArrow
= 0x7B,
1185 kVK_RightArrow
= 0x7C,
1186 kVK_DownArrow
= 0x7D,
1192 CGKeyCode
wxCharCodeWXToOSX(wxKeyCode code
)
1198 // Clang warns about switch values not of the same type as (enumerated)
1199 // switch controlling expression. This is generally useful but here we
1200 // really want to be able to use letters and digits without making them
1201 // part of wxKeyCode enum.
1203 #pragma clang diagnostic push
1204 #pragma clang diagnostic ignored "-Wswitch"
1207 case 'a': case 'A': keycode
= kVK_ANSI_A
; break;
1208 case 'b': case 'B': keycode
= kVK_ANSI_B
; break;
1209 case 'c': case 'C': keycode
= kVK_ANSI_C
; break;
1210 case 'd': case 'D': keycode
= kVK_ANSI_D
; break;
1211 case 'e': case 'E': keycode
= kVK_ANSI_E
; break;
1212 case 'f': case 'F': keycode
= kVK_ANSI_F
; break;
1213 case 'g': case 'G': keycode
= kVK_ANSI_G
; break;
1214 case 'h': case 'H': keycode
= kVK_ANSI_H
; break;
1215 case 'i': case 'I': keycode
= kVK_ANSI_I
; break;
1216 case 'j': case 'J': keycode
= kVK_ANSI_J
; break;
1217 case 'k': case 'K': keycode
= kVK_ANSI_K
; break;
1218 case 'l': case 'L': keycode
= kVK_ANSI_L
; break;
1219 case 'm': case 'M': keycode
= kVK_ANSI_M
; break;
1220 case 'n': case 'N': keycode
= kVK_ANSI_N
; break;
1221 case 'o': case 'O': keycode
= kVK_ANSI_O
; break;
1222 case 'p': case 'P': keycode
= kVK_ANSI_P
; break;
1223 case 'q': case 'Q': keycode
= kVK_ANSI_Q
; break;
1224 case 'r': case 'R': keycode
= kVK_ANSI_R
; break;
1225 case 's': case 'S': keycode
= kVK_ANSI_S
; break;
1226 case 't': case 'T': keycode
= kVK_ANSI_T
; break;
1227 case 'u': case 'U': keycode
= kVK_ANSI_U
; break;
1228 case 'v': case 'V': keycode
= kVK_ANSI_V
; break;
1229 case 'w': case 'W': keycode
= kVK_ANSI_W
; break;
1230 case 'x': case 'X': keycode
= kVK_ANSI_X
; break;
1231 case 'y': case 'Y': keycode
= kVK_ANSI_Y
; break;
1232 case 'z': case 'Z': keycode
= kVK_ANSI_Z
; break;
1234 case '0': keycode
= kVK_ANSI_0
; break;
1235 case '1': keycode
= kVK_ANSI_1
; break;
1236 case '2': keycode
= kVK_ANSI_2
; break;
1237 case '3': keycode
= kVK_ANSI_3
; break;
1238 case '4': keycode
= kVK_ANSI_4
; break;
1239 case '5': keycode
= kVK_ANSI_5
; break;
1240 case '6': keycode
= kVK_ANSI_6
; break;
1241 case '7': keycode
= kVK_ANSI_7
; break;
1242 case '8': keycode
= kVK_ANSI_8
; break;
1243 case '9': keycode
= kVK_ANSI_9
; break;
1246 #pragma clang diagnostic pop
1249 case WXK_BACK
: keycode
= kVK_Delete
; break;
1250 case WXK_TAB
: keycode
= kVK_Tab
; break;
1251 case WXK_RETURN
: keycode
= kVK_Return
; break;
1252 case WXK_ESCAPE
: keycode
= kVK_Escape
; break;
1253 case WXK_SPACE
: keycode
= kVK_Space
; break;
1254 case WXK_DELETE
: keycode
= kVK_Delete
; break;
1256 case WXK_SHIFT
: keycode
= kVK_Shift
; break;
1257 case WXK_ALT
: keycode
= kVK_Option
; break;
1258 case WXK_RAW_CONTROL
: keycode
= kVK_Control
; break;
1259 case WXK_CONTROL
: keycode
= kVK_Command
; break;
1261 case WXK_CAPITAL
: keycode
= kVK_CapsLock
; break;
1262 case WXK_END
: keycode
= kVK_End
; break;
1263 case WXK_HOME
: keycode
= kVK_Home
; break;
1264 case WXK_LEFT
: keycode
= kVK_LeftArrow
; break;
1265 case WXK_UP
: keycode
= kVK_UpArrow
; break;
1266 case WXK_RIGHT
: keycode
= kVK_RightArrow
; break;
1267 case WXK_DOWN
: keycode
= kVK_DownArrow
; break;
1269 case WXK_HELP
: keycode
= kVK_Help
; break;
1272 case WXK_NUMPAD0
: keycode
= kVK_ANSI_Keypad0
; break;
1273 case WXK_NUMPAD1
: keycode
= kVK_ANSI_Keypad1
; break;
1274 case WXK_NUMPAD2
: keycode
= kVK_ANSI_Keypad2
; break;
1275 case WXK_NUMPAD3
: keycode
= kVK_ANSI_Keypad3
; break;
1276 case WXK_NUMPAD4
: keycode
= kVK_ANSI_Keypad4
; break;
1277 case WXK_NUMPAD5
: keycode
= kVK_ANSI_Keypad5
; break;
1278 case WXK_NUMPAD6
: keycode
= kVK_ANSI_Keypad6
; break;
1279 case WXK_NUMPAD7
: keycode
= kVK_ANSI_Keypad7
; break;
1280 case WXK_NUMPAD8
: keycode
= kVK_ANSI_Keypad8
; break;
1281 case WXK_NUMPAD9
: keycode
= kVK_ANSI_Keypad9
; break;
1282 case WXK_F1
: keycode
= kVK_F1
; break;
1283 case WXK_F2
: keycode
= kVK_F2
; break;
1284 case WXK_F3
: keycode
= kVK_F3
; break;
1285 case WXK_F4
: keycode
= kVK_F4
; break;
1286 case WXK_F5
: keycode
= kVK_F5
; break;
1287 case WXK_F6
: keycode
= kVK_F6
; break;
1288 case WXK_F7
: keycode
= kVK_F7
; break;
1289 case WXK_F8
: keycode
= kVK_F8
; break;
1290 case WXK_F9
: keycode
= kVK_F9
; break;
1291 case WXK_F10
: keycode
= kVK_F10
; break;
1292 case WXK_F11
: keycode
= kVK_F11
; break;
1293 case WXK_F12
: keycode
= kVK_F12
; break;
1294 case WXK_F13
: keycode
= kVK_F13
; break;
1295 case WXK_F14
: keycode
= kVK_F14
; break;
1296 case WXK_F15
: keycode
= kVK_F15
; break;
1297 case WXK_F16
: keycode
= kVK_F16
; break;
1298 case WXK_F17
: keycode
= kVK_F17
; break;
1299 case WXK_F18
: keycode
= kVK_F18
; break;
1300 case WXK_F19
: keycode
= kVK_F19
; break;
1301 case WXK_F20
: keycode
= kVK_F20
; break;
1303 case WXK_PAGEUP
: keycode
= kVK_PageUp
; break;
1304 case WXK_PAGEDOWN
: keycode
= kVK_PageDown
; break;
1306 case WXK_NUMPAD_DELETE
: keycode
= kVK_ANSI_KeypadClear
; break;
1307 case WXK_NUMPAD_EQUAL
: keycode
= kVK_ANSI_KeypadEquals
; break;
1308 case WXK_NUMPAD_MULTIPLY
: keycode
= kVK_ANSI_KeypadMultiply
; break;
1309 case WXK_NUMPAD_ADD
: keycode
= kVK_ANSI_KeypadPlus
; break;
1310 case WXK_NUMPAD_SUBTRACT
: keycode
= kVK_ANSI_KeypadMinus
; break;
1311 case WXK_NUMPAD_DECIMAL
: keycode
= kVK_ANSI_KeypadDecimal
; break;
1312 case WXK_NUMPAD_DIVIDE
: keycode
= kVK_ANSI_KeypadDivide
; break;
1315 wxLogDebug( "Unrecognised keycode %d", code
);
1316 keycode
= static_cast<CGKeyCode
>(-1);
1322 long wxMacTranslateKey(unsigned char key
, unsigned char code
)
1327 case kHomeCharCode
:
1331 case kEnterCharCode
:
1332 retval
= WXK_RETURN
;
1338 case kHelpCharCode
:
1342 case kBackspaceCharCode
:
1350 case kPageUpCharCode
:
1351 retval
= WXK_PAGEUP
;
1354 case kPageDownCharCode
:
1355 retval
= WXK_PAGEDOWN
;
1358 case kReturnCharCode
:
1359 retval
= WXK_RETURN
;
1362 case kFunctionKeyCharCode
:
1432 case kEscapeCharCode
:
1433 retval
= WXK_ESCAPE
;
1436 case kLeftArrowCharCode
:
1440 case kRightArrowCharCode
:
1441 retval
= WXK_RIGHT
;
1444 case kUpArrowCharCode
:
1448 case kDownArrowCharCode
:
1452 case kDeleteCharCode
:
1453 retval
= WXK_DELETE
;
1463 int wxMacKeyCodeToModifier(wxKeyCode key
)
1481 case WXK_RAW_CONTROL
:
1490 #if wxOSX_USE_COCOA && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
1492 // defined in utils.mm
1494 #elif wxOSX_USE_COCOA_OR_CARBON
1496 wxMouseState
wxGetMouseState()
1500 wxPoint pt
= wxGetMousePosition();
1504 UInt32 buttons
= GetCurrentButtonState();
1505 ms
.SetLeftDown( (buttons
& 0x01) != 0 );
1506 ms
.SetMiddleDown( (buttons
& 0x04) != 0 );
1507 ms
.SetRightDown( (buttons
& 0x02) != 0 );
1509 UInt32 modifiers
= GetCurrentKeyModifiers();
1510 ms
.SetRawControlDown(modifiers
& controlKey
);
1511 ms
.SetShiftDown(modifiers
& shiftKey
);
1512 ms
.SetAltDown(modifiers
& optionKey
);
1513 ms
.SetControlDown(modifiers
& cmdKey
);
1520 // TODO : once the new key/char handling is tested, move all the code to wxWindow
1522 bool wxApp::MacSendKeyDownEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1527 wxKeyEvent
event(wxEVT_KEY_DOWN
) ;
1528 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1530 return focus
->OSXHandleKeyEvent(event
);
1533 bool wxApp::MacSendKeyUpEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1538 wxKeyEvent
event( wxEVT_KEY_UP
) ;
1539 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1541 return focus
->OSXHandleKeyEvent(event
) ;
1544 bool wxApp::MacSendCharEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1548 wxKeyEvent
event(wxEVT_CHAR
) ;
1549 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1551 bool handled
= false ;
1553 #if wxOSX_USE_CARBON
1554 long keyval
= event
.m_keyCode
;
1557 wxKeyEvent
eventCharHook(wxEVT_CHAR_HOOK
, event
);
1558 handled
= focus
->HandleWindowEvent( eventCharHook
);
1559 if ( handled
&& eventCharHook
.IsNextEventAllowed() )
1565 handled
= focus
->HandleWindowEvent( event
) ;
1568 if ( !handled
&& (keyval
== WXK_TAB
) )
1570 wxWindow
* iter
= focus
->GetParent() ;
1571 while ( iter
&& !handled
)
1573 if ( iter
->HasFlag( wxTAB_TRAVERSAL
) )
1575 wxNavigationKeyEvent new_event
;
1576 new_event
.SetEventObject( focus
);
1577 new_event
.SetDirection( !event
.ShiftDown() );
1578 /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
1579 new_event
.SetWindowChange( event
.ControlDown() );
1580 new_event
.SetCurrentFocus( focus
);
1581 handled
= focus
->GetParent()->HandleWindowEvent( new_event
);
1582 if ( handled
&& new_event
.GetSkipped() )
1586 iter
= iter
->GetParent() ;
1590 // backdoor handler for default return and command escape
1591 if ( !handled
&& (!focus
->IsKindOf(CLASSINFO(wxControl
) ) || !focus
->AcceptsFocus() ) )
1593 // if window is not having a focus still testing for default enter or cancel
1594 // TODO: add the UMA version for ActiveNonFloatingWindow
1596 wxWindow
* focus
= wxNonOwnedWindow::GetFromWXWindow( (WXWindow
) FrontWindow() ) ;
1599 if ( keyval
== WXK_RETURN
|| keyval
== WXK_NUMPAD_ENTER
)
1601 wxTopLevelWindow
*tlw
= wxDynamicCast(wxGetTopLevelParent(focus
), wxTopLevelWindow
);
1602 if ( tlw
&& tlw
->GetDefaultItem() )
1604 wxButton
*def
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
);
1605 if ( def
&& def
->IsEnabled() )
1607 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, def
->GetId() );
1608 event
.SetEventObject(def
);
1609 def
->Command(event
);
1615 else if (keyval
== WXK_ESCAPE
|| (keyval
== '.' && modifiers
& cmdKey
) )
1617 // generate wxID_CANCEL if command-. or <esc> has been pressed (typically in dialogs)
1618 wxCommandEvent
new_event(wxEVT_COMMAND_BUTTON_CLICKED
,wxID_CANCEL
);
1619 new_event
.SetEventObject( focus
);
1620 handled
= focus
->HandleWindowEvent( new_event
);
1629 // This method handles common code for SendKeyDown, SendKeyUp, and SendChar events.
1630 void wxApp::MacCreateKeyEvent( wxKeyEvent
& event
, wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1632 #if wxOSX_USE_COCOA_OR_CARBON
1634 short keycode
, keychar
;
1636 keychar
= short(keymessage
& charCodeMask
);
1637 keycode
= short(keymessage
& keyCodeMask
) >> 8 ;
1638 if ( !(event
.GetEventType() == wxEVT_CHAR
) && (modifiers
& (controlKey
| shiftKey
| optionKey
) ) )
1640 // control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
1641 // and look at the character after
1643 // TODO new implementation using TextInputSources
1646 UInt32 keyInfo
= KeyTranslate((Ptr
)GetScriptManagerVariable(smKCHRCache
), ( modifiers
& (~(controlKey
| shiftKey
| optionKey
))) | keycode
, &state
);
1647 keychar
= short(keyInfo
& charCodeMask
);
1651 long keyval
= wxMacTranslateKey(keychar
, keycode
) ;
1652 if ( keyval
== keychar
&& ( event
.GetEventType() == wxEVT_KEY_UP
|| event
.GetEventType() == wxEVT_KEY_DOWN
) )
1653 keyval
= wxToupper( keyval
) ;
1655 // Check for NUMPAD keys. For KEY_UP/DOWN events we need to use the
1656 // WXK_NUMPAD constants, but for the CHAR event we want to use the
1657 // standard ascii values
1658 if ( event
.GetEventType() != wxEVT_CHAR
)
1660 if (keyval
>= '0' && keyval
<= '9' && keycode
>= 82 && keycode
<= 92)
1662 keyval
= (keyval
- '0') + WXK_NUMPAD0
;
1664 else if (keycode
>= 65 && keycode
<= 81)
1669 keyval
= WXK_NUMPAD_ENTER
;
1673 keyval
= WXK_NUMPAD_EQUAL
;
1677 keyval
= WXK_NUMPAD_MULTIPLY
;
1681 keyval
= WXK_NUMPAD_DIVIDE
;
1685 keyval
= WXK_NUMPAD_SUBTRACT
;
1689 keyval
= WXK_NUMPAD_ADD
;
1693 keyval
= WXK_NUMPAD_DECIMAL
;
1701 event
.m_shiftDown
= modifiers
& shiftKey
;
1702 event
.m_rawControlDown
= modifiers
& controlKey
;
1703 event
.m_altDown
= modifiers
& optionKey
;
1704 event
.m_controlDown
= modifiers
& cmdKey
;
1705 event
.m_keyCode
= keyval
;
1707 event
.m_uniChar
= uniChar
;
1710 event
.m_rawCode
= keymessage
;
1711 event
.m_rawFlags
= modifiers
;
1714 event
.SetTimestamp(when
);
1715 event
.SetEventObject(focus
);
1719 wxUnusedVar(keymessage
);
1720 wxUnusedVar(modifiers
);
1722 wxUnusedVar(wherex
);
1723 wxUnusedVar(wherey
);
1724 wxUnusedVar(uniChar
);
1729 void wxApp::MacHideApp()
1731 #if wxOSX_USE_CARBON
1732 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
1734 memset( &command
, 0 , sizeof(command
) );
1735 command
.commandID
= kHICommandHide
;
1736 event
.SetParameter
<HICommand
>(kEventParamDirectObject
, command
);
1737 SendEventToApplication( event
);