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
:
714 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
715 if ( AEProcessEvent
!= NULL
)
717 result
= AEProcessEvent(event
);
720 #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
724 wxMacConvertEventToRecord( event
, &rec
) ;
725 result
= AEProcessAppleEvent( &rec
) ;
735 wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef
) ;
740 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler
)
743 #if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
746 wxMacAssertOutputHandler(OSType
WXUNUSED(componentSignature
),
747 UInt32
WXUNUSED(options
),
748 const char *assertionString
,
749 const char *exceptionLabelString
,
750 const char *errorString
,
751 const char *fileName
,
754 ConstStr255Param
WXUNUSED(outputMsg
))
756 // flow into assert handling
757 wxString fileNameStr
;
758 wxString assertionStr
;
759 wxString exceptionStr
;
763 fileNameStr
= wxString(fileName
, wxConvLocal
);
764 assertionStr
= wxString(assertionString
, wxConvLocal
);
765 exceptionStr
= wxString((exceptionLabelString
!=0) ? exceptionLabelString
: "", wxConvLocal
) ;
766 errorStr
= wxString((errorString
!=0) ? errorString
: "", wxConvLocal
) ;
768 fileNameStr
= fileName
;
769 assertionStr
= assertionString
;
770 exceptionStr
= (exceptionLabelString
!=0) ? exceptionLabelString
: "" ;
771 errorStr
= (errorString
!=0) ? errorString
: "" ;
776 wxLogDebug( wxT("AssertMacros: %s %s %s file: %s, line: %ld (value %p)\n"),
777 assertionStr
.c_str() ,
778 exceptionStr
.c_str() ,
780 fileNameStr
.c_str(), lineNumber
,
784 wxOnAssert(fileNameStr
, lineNumber
, assertionStr
,
785 wxString::Format( wxT("%s %s value (%p)") , exceptionStr
, errorStr
, value
) ) ;
789 #endif // wxDEBUG_LEVEL
791 bool wxApp::Initialize(int& argc
, wxChar
**argv
)
795 #if wxDEBUG_LEVEL && wxOSX_USE_COCOA_OR_CARBON
796 InstallDebugAssertOutputHandler( NewDebugAssertOutputHandlerUPP( wxMacAssertOutputHandler
) );
799 // Mac OS X passes a process serial number command line argument when
800 // the application is launched from the Finder. This argument must be
801 // removed from the command line arguments before being handled by the
802 // application (otherwise applications would need to handle it)
805 static const wxChar
*ARG_PSN
= wxT("-psn_");
806 if ( wxStrncmp(argv
[1], ARG_PSN
, wxStrlen(ARG_PSN
)) == 0 )
808 // remove this argument
810 memmove(argv
+ 1, argv
+ 2, argc
* sizeof(wxChar
*));
815 Cocoa supports -Key value options which set the user defaults key "Key"
816 to the value "value" Some of them are very handy for debugging like
817 -NSShowAllViews YES. Cocoa picks these up from the real argv so
818 our removal of them from the wx copy of it does not affect Cocoa's
821 We basically just assume that any "-NS" option and its following
822 argument needs to be removed from argv. We hope that user code does
823 not expect to see -NS options and indeed it's probably a safe bet
824 since most user code accepting options is probably using the
825 double-dash GNU-style syntax.
827 for(int i
=1; i
< argc
; ++i
)
829 static const wxChar
*ARG_NS
= wxT("-NS");
830 if( wxStrncmp(argv
[i
], ARG_NS
, wxStrlen(ARG_NS
)) == 0 )
832 // Only eat this option if it has an argument
835 memmove(argv
+ i
, argv
+ i
+ 2, (argc
-i
-1)*sizeof(wxChar
*));
837 // drop back one position so the next run through the loop
838 // reprocesses the argument at our current index.
844 if ( !wxAppBase::Initialize(argc
, argv
) )
848 wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
851 // these might be the startup dirs, set them to the 'usual' dir containing the app bundle
852 wxString startupCwd
= wxGetCwd() ;
853 if ( startupCwd
== wxT("/") || startupCwd
.Right(15) == wxT("/Contents/MacOS") )
855 CFURLRef url
= CFBundleCopyBundleURL(CFBundleGetMainBundle() ) ;
856 CFURLRef urlParent
= CFURLCreateCopyDeletingLastPathComponent( kCFAllocatorDefault
, url
) ;
858 CFStringRef path
= CFURLCopyFileSystemPath ( urlParent
, kCFURLPOSIXPathStyle
) ;
859 CFRelease( urlParent
) ;
860 wxString cwd
= wxCFStringRef(path
).AsString(wxLocale::GetSystemEncoding());
861 wxSetWorkingDirectory( cwd
) ;
867 #if wxOSX_USE_COCOA_OR_CARBON
868 bool wxApp::CallOnInit()
870 wxMacAutoreleasePool autoreleasepool
;
875 bool wxApp::OnInitGui()
877 if ( !wxAppBase::OnInitGui() )
886 bool wxApp::ProcessIdle()
888 wxMacAutoreleasePool autoreleasepool
;
889 return wxAppBase::ProcessIdle();
894 wxMacAutoreleasePool pool
;
895 return wxAppBase::OnRun();
899 bool wxApp::DoInitGui()
901 InstallStandardEventHandler( GetApplicationEventTarget() ) ;
904 InstallApplicationEventHandler(
905 GetwxMacAppEventHandlerUPP(),
906 GetEventTypeCount(eventList
), eventList
, wxTheApp
, (EventHandlerRef
*)&(wxTheApp
->m_macEventHandler
));
911 sODocHandler
= NewAEEventHandlerUPP(AEHandleODoc
) ;
912 sGURLHandler
= NewAEEventHandlerUPP(AEHandleGURL
) ;
913 sOAppHandler
= NewAEEventHandlerUPP(AEHandleOApp
) ;
914 sPDocHandler
= NewAEEventHandlerUPP(AEHandlePDoc
) ;
915 sRAppHandler
= NewAEEventHandlerUPP(AEHandleRApp
) ;
916 sQuitHandler
= NewAEEventHandlerUPP(AEHandleQuit
) ;
918 AEInstallEventHandler( kCoreEventClass
, kAEOpenDocuments
,
919 sODocHandler
, 0 , FALSE
) ;
920 AEInstallEventHandler( kInternetEventClass
, kAEGetURL
,
921 sGURLHandler
, 0 , FALSE
) ;
922 AEInstallEventHandler( kCoreEventClass
, kAEOpenApplication
,
923 sOAppHandler
, 0 , FALSE
) ;
924 AEInstallEventHandler( kCoreEventClass
, kAEPrintDocuments
,
925 sPDocHandler
, 0 , FALSE
) ;
926 AEInstallEventHandler( kCoreEventClass
, kAEReopenApplication
,
927 sRAppHandler
, 0 , FALSE
) ;
928 AEInstallEventHandler( kCoreEventClass
, kAEQuitApplication
,
929 sQuitHandler
, 0 , FALSE
) ;
932 if ( !wxMacInitCocoa() )
938 void wxApp::DoCleanUp()
941 RemoveEventHandler( (EventHandlerRef
)(wxTheApp
->m_macEventHandler
) );
945 AERemoveEventHandler( kCoreEventClass
, kAEOpenDocuments
,
946 sODocHandler
, FALSE
) ;
947 AERemoveEventHandler( kInternetEventClass
, kAEGetURL
,
948 sGURLHandler
, FALSE
) ;
949 AERemoveEventHandler( kCoreEventClass
, kAEOpenApplication
,
950 sOAppHandler
, FALSE
) ;
951 AERemoveEventHandler( kCoreEventClass
, kAEPrintDocuments
,
952 sPDocHandler
, FALSE
) ;
953 AERemoveEventHandler( kCoreEventClass
, kAEReopenApplication
,
954 sRAppHandler
, FALSE
) ;
955 AERemoveEventHandler( kCoreEventClass
, kAEQuitApplication
,
956 sQuitHandler
, FALSE
) ;
958 DisposeAEEventHandlerUPP( sODocHandler
) ;
959 DisposeAEEventHandlerUPP( sGURLHandler
) ;
960 DisposeAEEventHandlerUPP( sOAppHandler
) ;
961 DisposeAEEventHandlerUPP( sPDocHandler
) ;
962 DisposeAEEventHandlerUPP( sRAppHandler
) ;
963 DisposeAEEventHandlerUPP( sQuitHandler
) ;
969 void wxApp::CleanUp()
971 wxMacAutoreleasePool autoreleasepool
;
973 wxToolTip::RemoveToolTips() ;
978 wxAppBase::CleanUp();
981 //----------------------------------------------------------------------
982 // misc initialization stuff
983 //----------------------------------------------------------------------
985 #if wxOSX_USE_CARBON && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
986 bool wxMacConvertEventToRecord( EventRef event
, EventRecord
*rec
)
988 OSStatus err
= noErr
;
989 bool converted
= ConvertEventRefToEventRecord( event
, rec
) ;
993 switch ( GetEventClass( event
) )
995 case kEventClassKeyboard
:
998 switch ( GetEventKind(event
) )
1000 case kEventRawKeyDown
:
1001 rec
->what
= keyDown
;
1004 case kEventRawKeyRepeat
:
1005 rec
->what
= autoKey
;
1008 case kEventRawKeyUp
:
1012 case kEventRawKeyModifiersChanged
:
1013 rec
->what
= nullEvent
;
1024 unsigned char charCode
;
1026 GetMouse( &rec
->where
) ;
1027 err
= GetEventParameter(event
, kEventParamKeyModifiers
, typeUInt32
, NULL
, 4, NULL
, &modifiers
);
1028 err
= GetEventParameter(event
, kEventParamKeyCode
, typeUInt32
, NULL
, 4, NULL
, &keyCode
);
1029 err
= GetEventParameter(event
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, 1, NULL
, &charCode
);
1030 rec
->modifiers
= modifiers
;
1031 rec
->message
= (keyCode
<< 8 ) + charCode
;
1036 case kEventClassTextInput
:
1038 switch ( GetEventKind( event
) )
1040 case kEventTextInputUnicodeForKeyEvent
:
1043 err
= GetEventParameter(
1044 event
, kEventParamTextInputSendKeyboardEvent
, typeEventRef
, NULL
,
1045 sizeof(rawEvent
), NULL
, &rawEvent
) ;
1049 UInt32 keyCode
, modifiers
;
1050 unsigned char charCode
;
1051 GetMouse( &rec
->where
) ;
1052 rec
->what
= keyDown
;
1053 err
= GetEventParameter(rawEvent
, kEventParamKeyModifiers
, typeUInt32
, NULL
, 4, NULL
, &modifiers
);
1054 err
= GetEventParameter(rawEvent
, kEventParamKeyCode
, typeUInt32
, NULL
, 4, NULL
, &keyCode
);
1055 err
= GetEventParameter(rawEvent
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, 1, NULL
, &charCode
);
1056 rec
->modifiers
= modifiers
;
1057 rec
->message
= (keyCode
<< 8 ) + charCode
;
1079 m_printMode
= wxPRINT_WINDOWS
;
1081 m_macCurrentEvent
= NULL
;
1082 m_macCurrentEventHandlerCallRef
= NULL
;
1083 m_macPool
= new wxMacAutoreleasePool();
1092 CFMutableArrayRef
GetAutoReleaseArray()
1094 static CFMutableArrayRef array
= 0;
1096 array
= CFArrayCreateMutable(kCFAllocatorDefault
,0,&kCFTypeArrayCallBacks
);
1100 void wxApp::MacAddToAutorelease( void* cfrefobj
)
1102 CFArrayAppendValue( GetAutoReleaseArray(), cfrefobj
);
1105 void wxApp::MacReleaseAutoreleasePool()
1109 m_macPool
= new wxMacAutoreleasePool();
1112 void wxApp::OnIdle(wxIdleEvent
& WXUNUSED(event
))
1114 // If they are pending events, we must process them: pending events are
1115 // either events to the threads other than main or events posted with
1116 // wxPostEvent() functions
1117 #ifndef __WXUNIVERSAL__
1119 if (!wxMenuBar::MacGetInstalledMenuBar() && wxMenuBar::MacGetCommonMenuBar())
1120 wxMenuBar::MacGetCommonMenuBar()->MacInstallMenuBar();
1123 CFArrayRemoveAllValues( GetAutoReleaseArray() );
1126 void wxApp::WakeUpIdle()
1128 wxEventLoopBase
* const loop
= wxEventLoopBase::GetActive();
1134 void wxApp::OnEndSession(wxCloseEvent
& WXUNUSED(event
))
1137 GetTopWindow()->Close(true);
1140 // Default behaviour: close the application with prompts. The
1141 // user can veto the close, and therefore the end session.
1142 void wxApp::OnQueryEndSession(wxCloseEvent
& event
)
1144 if ( !wxDialog::OSXHasModalDialogsOpen() )
1148 if (!GetTopWindow()->Close(!event
.CanVeto()))
1158 extern "C" void wxCYield() ;
1165 void wxApp::MacHandleUnhandledEvent( WXEVENTREF
WXUNUSED(evr
) )
1167 // Override to process unhandled events as you please
1170 #if wxOSX_USE_COCOA_OR_CARBON
1172 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
1174 // adding forward compatible defines for keys that are different on different keyboard layouts
1175 // see Inside Mac Volume V
1201 kVK_ANSI_Equal
= 0x18,
1204 kVK_ANSI_Minus
= 0x1B,
1207 kVK_ANSI_RightBracket
= 0x1E,
1210 kVK_ANSI_LeftBracket
= 0x21,
1215 kVK_ANSI_Quote
= 0x27,
1217 kVK_ANSI_Semicolon
= 0x29,
1218 kVK_ANSI_Backslash
= 0x2A,
1219 kVK_ANSI_Comma
= 0x2B,
1220 kVK_ANSI_Slash
= 0x2C,
1223 kVK_ANSI_Period
= 0x2F,
1224 kVK_ANSI_Grave
= 0x32,
1225 kVK_ANSI_KeypadDecimal
= 0x41,
1226 kVK_ANSI_KeypadMultiply
= 0x43,
1227 kVK_ANSI_KeypadPlus
= 0x45,
1228 kVK_ANSI_KeypadClear
= 0x47,
1229 kVK_ANSI_KeypadDivide
= 0x4B,
1230 kVK_ANSI_KeypadEnter
= 0x4C,
1231 kVK_ANSI_KeypadMinus
= 0x4E,
1232 kVK_ANSI_KeypadEquals
= 0x51,
1233 kVK_ANSI_Keypad0
= 0x52,
1234 kVK_ANSI_Keypad1
= 0x53,
1235 kVK_ANSI_Keypad2
= 0x54,
1236 kVK_ANSI_Keypad3
= 0x55,
1237 kVK_ANSI_Keypad4
= 0x56,
1238 kVK_ANSI_Keypad5
= 0x57,
1239 kVK_ANSI_Keypad6
= 0x58,
1240 kVK_ANSI_Keypad7
= 0x59,
1241 kVK_ANSI_Keypad8
= 0x5B,
1242 kVK_ANSI_Keypad9
= 0x5C
1245 // defines for keys that are the same on all layouts
1255 kVK_CapsLock
= 0x39,
1258 kVK_RightShift
= 0x3C,
1259 kVK_RightOption
= 0x3D,
1260 kVK_RightControl
= 0x3E,
1261 kVK_Function
= 0x3F,
1263 kVK_VolumeUp
= 0x48,
1264 kVK_VolumeDown
= 0x49,
1285 kVK_ForwardDelete
= 0x75,
1289 kVK_PageDown
= 0x79,
1291 kVK_LeftArrow
= 0x7B,
1292 kVK_RightArrow
= 0x7C,
1293 kVK_DownArrow
= 0x7D,
1299 CGKeyCode
wxCharCodeWXToOSX(wxKeyCode code
)
1305 case 'a': case 'A': keycode
= kVK_ANSI_A
; break;
1306 case 'b': case 'B': keycode
= kVK_ANSI_B
; break;
1307 case 'c': case 'C': keycode
= kVK_ANSI_C
; break;
1308 case 'd': case 'D': keycode
= kVK_ANSI_D
; break;
1309 case 'e': case 'E': keycode
= kVK_ANSI_E
; break;
1310 case 'f': case 'F': keycode
= kVK_ANSI_F
; break;
1311 case 'g': case 'G': keycode
= kVK_ANSI_G
; break;
1312 case 'h': case 'H': keycode
= kVK_ANSI_H
; break;
1313 case 'i': case 'I': keycode
= kVK_ANSI_I
; break;
1314 case 'j': case 'J': keycode
= kVK_ANSI_J
; break;
1315 case 'k': case 'K': keycode
= kVK_ANSI_K
; break;
1316 case 'l': case 'L': keycode
= kVK_ANSI_L
; break;
1317 case 'm': case 'M': keycode
= kVK_ANSI_M
; break;
1318 case 'n': case 'N': keycode
= kVK_ANSI_N
; break;
1319 case 'o': case 'O': keycode
= kVK_ANSI_O
; break;
1320 case 'p': case 'P': keycode
= kVK_ANSI_P
; break;
1321 case 'q': case 'Q': keycode
= kVK_ANSI_Q
; break;
1322 case 'r': case 'R': keycode
= kVK_ANSI_R
; break;
1323 case 's': case 'S': keycode
= kVK_ANSI_S
; break;
1324 case 't': case 'T': keycode
= kVK_ANSI_T
; break;
1325 case 'u': case 'U': keycode
= kVK_ANSI_U
; break;
1326 case 'v': case 'V': keycode
= kVK_ANSI_V
; break;
1327 case 'w': case 'W': keycode
= kVK_ANSI_W
; break;
1328 case 'x': case 'X': keycode
= kVK_ANSI_X
; break;
1329 case 'y': case 'Y': keycode
= kVK_ANSI_Y
; break;
1330 case 'z': case 'Z': keycode
= kVK_ANSI_Z
; break;
1332 case '0': keycode
= kVK_ANSI_0
; break;
1333 case '1': keycode
= kVK_ANSI_1
; break;
1334 case '2': keycode
= kVK_ANSI_2
; break;
1335 case '3': keycode
= kVK_ANSI_3
; break;
1336 case '4': keycode
= kVK_ANSI_4
; break;
1337 case '5': keycode
= kVK_ANSI_5
; break;
1338 case '6': keycode
= kVK_ANSI_6
; break;
1339 case '7': keycode
= kVK_ANSI_7
; break;
1340 case '8': keycode
= kVK_ANSI_8
; break;
1341 case '9': keycode
= kVK_ANSI_9
; break;
1343 case WXK_BACK
: keycode
= kVK_Delete
; break;
1344 case WXK_TAB
: keycode
= kVK_Tab
; break;
1345 case WXK_RETURN
: keycode
= kVK_Return
; break;
1346 case WXK_ESCAPE
: keycode
= kVK_Escape
; break;
1347 case WXK_SPACE
: keycode
= kVK_Space
; break;
1348 case WXK_DELETE
: keycode
= kVK_Delete
; break;
1350 case WXK_SHIFT
: keycode
= kVK_Shift
; break;
1351 case WXK_ALT
: keycode
= kVK_Option
; break;
1352 case WXK_RAW_CONTROL
: keycode
= kVK_Control
; break;
1353 case WXK_CONTROL
: keycode
= kVK_Command
; break;
1355 case WXK_CAPITAL
: keycode
= kVK_CapsLock
; break;
1356 case WXK_END
: keycode
= kVK_End
; break;
1357 case WXK_HOME
: keycode
= kVK_Home
; break;
1358 case WXK_LEFT
: keycode
= kVK_LeftArrow
; break;
1359 case WXK_UP
: keycode
= kVK_UpArrow
; break;
1360 case WXK_RIGHT
: keycode
= kVK_RightArrow
; break;
1361 case WXK_DOWN
: keycode
= kVK_DownArrow
; break;
1363 case WXK_HELP
: keycode
= kVK_Help
; break;
1366 case WXK_NUMPAD0
: keycode
= kVK_ANSI_Keypad0
; break;
1367 case WXK_NUMPAD1
: keycode
= kVK_ANSI_Keypad1
; break;
1368 case WXK_NUMPAD2
: keycode
= kVK_ANSI_Keypad2
; break;
1369 case WXK_NUMPAD3
: keycode
= kVK_ANSI_Keypad3
; break;
1370 case WXK_NUMPAD4
: keycode
= kVK_ANSI_Keypad4
; break;
1371 case WXK_NUMPAD5
: keycode
= kVK_ANSI_Keypad5
; break;
1372 case WXK_NUMPAD6
: keycode
= kVK_ANSI_Keypad6
; break;
1373 case WXK_NUMPAD7
: keycode
= kVK_ANSI_Keypad7
; break;
1374 case WXK_NUMPAD8
: keycode
= kVK_ANSI_Keypad8
; break;
1375 case WXK_NUMPAD9
: keycode
= kVK_ANSI_Keypad9
; break;
1376 case WXK_F1
: keycode
= kVK_F1
; break;
1377 case WXK_F2
: keycode
= kVK_F2
; break;
1378 case WXK_F3
: keycode
= kVK_F3
; break;
1379 case WXK_F4
: keycode
= kVK_F4
; break;
1380 case WXK_F5
: keycode
= kVK_F5
; break;
1381 case WXK_F6
: keycode
= kVK_F6
; break;
1382 case WXK_F7
: keycode
= kVK_F7
; break;
1383 case WXK_F8
: keycode
= kVK_F8
; break;
1384 case WXK_F9
: keycode
= kVK_F9
; break;
1385 case WXK_F10
: keycode
= kVK_F10
; break;
1386 case WXK_F11
: keycode
= kVK_F11
; break;
1387 case WXK_F12
: keycode
= kVK_F12
; break;
1388 case WXK_F13
: keycode
= kVK_F13
; break;
1389 case WXK_F14
: keycode
= kVK_F14
; break;
1390 case WXK_F15
: keycode
= kVK_F15
; break;
1391 case WXK_F16
: keycode
= kVK_F16
; break;
1392 case WXK_F17
: keycode
= kVK_F17
; break;
1393 case WXK_F18
: keycode
= kVK_F18
; break;
1394 case WXK_F19
: keycode
= kVK_F19
; break;
1395 case WXK_F20
: keycode
= kVK_F20
; break;
1397 case WXK_PAGEUP
: keycode
= kVK_PageUp
; break;
1398 case WXK_PAGEDOWN
: keycode
= kVK_PageDown
; break;
1400 case WXK_NUMPAD_DELETE
: keycode
= kVK_ANSI_KeypadClear
; break;
1401 case WXK_NUMPAD_EQUAL
: keycode
= kVK_ANSI_KeypadEquals
; break;
1402 case WXK_NUMPAD_MULTIPLY
: keycode
= kVK_ANSI_KeypadMultiply
; break;
1403 case WXK_NUMPAD_ADD
: keycode
= kVK_ANSI_KeypadPlus
; break;
1404 case WXK_NUMPAD_SUBTRACT
: keycode
= kVK_ANSI_KeypadMinus
; break;
1405 case WXK_NUMPAD_DECIMAL
: keycode
= kVK_ANSI_KeypadDecimal
; break;
1406 case WXK_NUMPAD_DIVIDE
: keycode
= kVK_ANSI_KeypadDivide
; break;
1409 wxLogDebug( "Unrecognised keycode %d", code
);
1410 keycode
= static_cast<CGKeyCode
>(-1);
1416 long wxMacTranslateKey(unsigned char key
, unsigned char code
)
1421 case kHomeCharCode
:
1425 case kEnterCharCode
:
1426 retval
= WXK_RETURN
;
1432 case kHelpCharCode
:
1436 case kBackspaceCharCode
:
1444 case kPageUpCharCode
:
1445 retval
= WXK_PAGEUP
;
1448 case kPageDownCharCode
:
1449 retval
= WXK_PAGEDOWN
;
1452 case kReturnCharCode
:
1453 retval
= WXK_RETURN
;
1456 case kFunctionKeyCharCode
:
1526 case kEscapeCharCode
:
1527 retval
= WXK_ESCAPE
;
1530 case kLeftArrowCharCode
:
1534 case kRightArrowCharCode
:
1535 retval
= WXK_RIGHT
;
1538 case kUpArrowCharCode
:
1542 case kDownArrowCharCode
:
1546 case kDeleteCharCode
:
1547 retval
= WXK_DELETE
;
1557 int wxMacKeyCodeToModifier(wxKeyCode key
)
1575 case WXK_RAW_CONTROL
:
1584 #if wxOSX_USE_COCOA && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
1586 // defined in utils.mm
1588 #elif wxOSX_USE_COCOA_OR_CARBON
1590 wxMouseState
wxGetMouseState()
1594 wxPoint pt
= wxGetMousePosition();
1598 UInt32 buttons
= GetCurrentButtonState();
1599 ms
.SetLeftDown( (buttons
& 0x01) != 0 );
1600 ms
.SetMiddleDown( (buttons
& 0x04) != 0 );
1601 ms
.SetRightDown( (buttons
& 0x02) != 0 );
1603 UInt32 modifiers
= GetCurrentKeyModifiers();
1604 ms
.SetRawControlDown(modifiers
& controlKey
);
1605 ms
.SetShiftDown(modifiers
& shiftKey
);
1606 ms
.SetAltDown(modifiers
& optionKey
);
1607 ms
.SetControlDown(modifiers
& cmdKey
);
1614 // TODO : once the new key/char handling is tested, move all the code to wxWindow
1616 bool wxApp::MacSendKeyDownEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1621 wxKeyEvent
event(wxEVT_KEY_DOWN
) ;
1622 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1624 return focus
->OSXHandleKeyEvent(event
);
1627 bool wxApp::MacSendKeyUpEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1632 wxKeyEvent
event( wxEVT_KEY_UP
) ;
1633 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1635 return focus
->OSXHandleKeyEvent(event
) ;
1638 bool wxApp::MacSendCharEvent( wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1642 wxKeyEvent
event(wxEVT_CHAR
) ;
1643 MacCreateKeyEvent( event
, focus
, keymessage
, modifiers
, when
, wherex
, wherey
, uniChar
) ;
1645 bool handled
= false ;
1647 #if wxOSX_USE_CARBON
1648 long keyval
= event
.m_keyCode
;
1651 wxKeyEvent
eventCharHook(wxEVT_CHAR_HOOK
, event
);
1652 handled
= focus
->HandleWindowEvent( eventCharHook
);
1653 if ( handled
&& eventCharHook
.IsNextEventAllowed() )
1659 handled
= focus
->HandleWindowEvent( event
) ;
1662 if ( !handled
&& (keyval
== WXK_TAB
) )
1664 wxWindow
* iter
= focus
->GetParent() ;
1665 while ( iter
&& !handled
)
1667 if ( iter
->HasFlag( wxTAB_TRAVERSAL
) )
1669 wxNavigationKeyEvent new_event
;
1670 new_event
.SetEventObject( focus
);
1671 new_event
.SetDirection( !event
.ShiftDown() );
1672 /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
1673 new_event
.SetWindowChange( event
.ControlDown() );
1674 new_event
.SetCurrentFocus( focus
);
1675 handled
= focus
->GetParent()->HandleWindowEvent( new_event
);
1676 if ( handled
&& new_event
.GetSkipped() )
1680 iter
= iter
->GetParent() ;
1684 // backdoor handler for default return and command escape
1685 if ( !handled
&& (!focus
->IsKindOf(CLASSINFO(wxControl
) ) || !focus
->AcceptsFocus() ) )
1687 // if window is not having a focus still testing for default enter or cancel
1688 // TODO: add the UMA version for ActiveNonFloatingWindow
1690 wxWindow
* focus
= wxNonOwnedWindow::GetFromWXWindow( (WXWindow
) FrontWindow() ) ;
1693 if ( keyval
== WXK_RETURN
|| keyval
== WXK_NUMPAD_ENTER
)
1695 wxTopLevelWindow
*tlw
= wxDynamicCast(wxGetTopLevelParent(focus
), wxTopLevelWindow
);
1696 if ( tlw
&& tlw
->GetDefaultItem() )
1698 wxButton
*def
= wxDynamicCast(tlw
->GetDefaultItem(), wxButton
);
1699 if ( def
&& def
->IsEnabled() )
1701 wxCommandEvent
event(wxEVT_COMMAND_BUTTON_CLICKED
, def
->GetId() );
1702 event
.SetEventObject(def
);
1703 def
->Command(event
);
1709 else if (keyval
== WXK_ESCAPE
|| (keyval
== '.' && modifiers
& cmdKey
) )
1711 // generate wxID_CANCEL if command-. or <esc> has been pressed (typically in dialogs)
1712 wxCommandEvent
new_event(wxEVT_COMMAND_BUTTON_CLICKED
,wxID_CANCEL
);
1713 new_event
.SetEventObject( focus
);
1714 handled
= focus
->HandleWindowEvent( new_event
);
1723 // This method handles common code for SendKeyDown, SendKeyUp, and SendChar events.
1724 void wxApp::MacCreateKeyEvent( wxKeyEvent
& event
, wxWindow
* focus
, long keymessage
, long modifiers
, long when
, short wherex
, short wherey
, wxChar uniChar
)
1726 #if wxOSX_USE_COCOA_OR_CARBON
1728 short keycode
, keychar
;
1730 keychar
= short(keymessage
& charCodeMask
);
1731 keycode
= short(keymessage
& keyCodeMask
) >> 8 ;
1732 if ( !(event
.GetEventType() == wxEVT_CHAR
) && (modifiers
& (controlKey
| shiftKey
| optionKey
) ) )
1734 // control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier
1735 // and look at the character after
1737 // TODO new implementation using TextInputSources
1740 UInt32 keyInfo
= KeyTranslate((Ptr
)GetScriptManagerVariable(smKCHRCache
), ( modifiers
& (~(controlKey
| shiftKey
| optionKey
))) | keycode
, &state
);
1741 keychar
= short(keyInfo
& charCodeMask
);
1745 long keyval
= wxMacTranslateKey(keychar
, keycode
) ;
1746 if ( keyval
== keychar
&& ( event
.GetEventType() == wxEVT_KEY_UP
|| event
.GetEventType() == wxEVT_KEY_DOWN
) )
1747 keyval
= wxToupper( keyval
) ;
1749 // Check for NUMPAD keys. For KEY_UP/DOWN events we need to use the
1750 // WXK_NUMPAD constants, but for the CHAR event we want to use the
1751 // standard ascii values
1752 if ( event
.GetEventType() != wxEVT_CHAR
)
1754 if (keyval
>= '0' && keyval
<= '9' && keycode
>= 82 && keycode
<= 92)
1756 keyval
= (keyval
- '0') + WXK_NUMPAD0
;
1758 else if (keycode
>= 65 && keycode
<= 81)
1763 keyval
= WXK_NUMPAD_ENTER
;
1767 keyval
= WXK_NUMPAD_EQUAL
;
1771 keyval
= WXK_NUMPAD_MULTIPLY
;
1775 keyval
= WXK_NUMPAD_DIVIDE
;
1779 keyval
= WXK_NUMPAD_SUBTRACT
;
1783 keyval
= WXK_NUMPAD_ADD
;
1787 keyval
= WXK_NUMPAD_DECIMAL
;
1795 event
.m_shiftDown
= modifiers
& shiftKey
;
1796 event
.m_rawControlDown
= modifiers
& controlKey
;
1797 event
.m_altDown
= modifiers
& optionKey
;
1798 event
.m_controlDown
= modifiers
& cmdKey
;
1799 event
.m_keyCode
= keyval
;
1801 event
.m_uniChar
= uniChar
;
1804 event
.m_rawCode
= keymessage
;
1805 event
.m_rawFlags
= modifiers
;
1808 event
.SetTimestamp(when
);
1809 event
.SetEventObject(focus
);
1813 wxUnusedVar(keymessage
);
1814 wxUnusedVar(modifiers
);
1816 wxUnusedVar(wherex
);
1817 wxUnusedVar(wherey
);
1818 wxUnusedVar(uniChar
);
1823 void wxApp::MacHideApp()
1825 #if wxOSX_USE_CARBON
1826 wxMacCarbonEvent
event( kEventClassCommand
, kEventCommandProcess
);
1828 memset( &command
, 0 , sizeof(command
) );
1829 command
.commandID
= kHICommandHide
;
1830 event
.SetParameter
<HICommand
>(kEventParamDirectObject
, command
);
1831 SendEventToApplication( event
);