X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/44353523d85ba44f62bad4ab7b27a14001d4b1ae..0a164d4c4e75bd48f6a0a484fb267b0dc337c541:/src/mac/carbon/app.cpp diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index 43c7cf1b29..cf429f727e 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -72,7 +72,7 @@ extern wxList wxPendingDelete; // set wxMAC_USE_RAEL to 1 if RunApplicationEventLoop should be used // if 0 the lower level CarbonEventLoop will be used // on the long run RAEL should replace the low level event loop -// we will have to clean up event handling to make sure we don't +// we will have to clean up event handling to make sure we don't // miss handling of things like pending events etc // perhaps we will also have to pipe events through an ueber-event-handler // to make sure we have one place to do all these house-keeping functions @@ -85,19 +85,17 @@ extern size_t g_numberOfThreads; // statics for implementation -static bool s_inYield = FALSE; +static bool s_inYield = false; -static bool s_inReceiveEvent = FALSE ; +static bool s_inReceiveEvent = false ; static EventTime sleepTime = kEventDurationNoWait ; -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler) BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) EVT_IDLE(wxApp::OnIdle) EVT_END_SESSION(wxApp::OnEndSession) EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession) END_EVENT_TABLE() -#endif const short kMacMinHeap = (29 * 1024) ; @@ -180,7 +178,7 @@ short wxApp::MacHandleAEODoc(const WXEVENTREF event, WXEVENTREF WXUNUSED(reply)) PSN.lowLongOfPSN = kCurrentProcess ; SetFrontProcess( &PSN ) ; - for (i = 1; i <= itemsInList; i++) + for (i = 1; i <= itemsInList; i++) { wxString fName ; @@ -248,7 +246,7 @@ short wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNU { wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId); if (!win->ProcessEvent(exitEvent)) - win->Close(TRUE ) ; + win->Close(true) ; } else { @@ -299,7 +297,7 @@ void wxApp::MacPrintFile(const wxString & fileName ) if (printout) { wxPrinter printer; - printer.Print(view->GetFrame(), printout, TRUE); + printer.Print(view->GetFrame(), printout, true); delete printout; } } @@ -327,10 +325,10 @@ void wxApp::MacReopenApp() // if there is no open window -> create a new one // if all windows are hidden -> show the first // if some windows are not hidden -> do nothing - + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); if ( node == NULL ) - { + { MacNewFile() ; } else @@ -385,14 +383,14 @@ static const EventTypeSpec eventList[] = static pascal OSStatus wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) -{ +{ wxMacCarbonEvent cEvent( event ) ; MenuRef menuRef = cEvent.GetParameter(kEventParamDirectObject) ; wxMenu* menu = wxFindMenuFromMacMenu( menuRef ) ; - + if ( menu ) { - wxEventType type=0; + wxEventType type=0; MenuCommand cmd=0; switch (GetEventKind(event)) { @@ -404,7 +402,7 @@ wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *d break; case kEventMenuTargetItem: cmd = cEvent.GetParameter(kEventParamMenuCommand,typeMenuCommand) ; - if (cmd != 0) + if (cmd != 0) type = wxEVT_MENU_HIGHLIGHT; break; default: @@ -425,12 +423,12 @@ wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *d else { wxWindow *win = menu->GetInvokingWindow(); - if (win) + if (win) win->GetEventHandler()->ProcessEvent(wxevent); } } } - + return eventNotHandledErr; } @@ -442,14 +440,14 @@ static pascal OSStatus wxMacAppCommandEventHandler( EventHandlerCallRef handler wxMacCarbonEvent cEvent( event ) ; cEvent.GetParameter(kEventParamDirectObject,typeHICommand,&command) ; - + wxMenuItem* item = NULL ; MenuCommand id = command.commandID ; // for items we don't really control if ( id == kHICommandPreferences ) { id = wxApp::s_macPreferencesMenuItemId ; - + wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ; if ( mbar ) { @@ -461,7 +459,7 @@ static pascal OSStatus wxMacAppCommandEventHandler( EventHandlerCallRef handler { GetMenuItemRefCon( command.menu.menuRef , command.menu.menuItemIndex , (UInt32*) &item ) ; } - + if ( item ) { switch( cEvent.GetKind() ) @@ -534,7 +532,7 @@ pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef eve case kEventClassMouse : { wxMacCarbonEvent cEvent( event ) ; - + WindowRef window ; Point screenMouseLocation = cEvent.GetParameter(kEventParamMouseLocation) ; ::FindWindow(screenMouseLocation, &window); @@ -569,8 +567,8 @@ WXIMPORT char std::__throws_bad_alloc ; #if __WXDEBUG__ -pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options, - const char *assertionString, const char *exceptionLabelString, +pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options, + const char *assertionString, const char *exceptionLabelString, const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg) { // flow into assert handling @@ -592,10 +590,10 @@ pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 op #if 1 // flow into log - wxLogDebug( wxT("AssertMacros: %s %s %s file: %s, line: %ld (value %p)\n"), - assertionStr.c_str() , - exceptionStr.c_str() , - errorStr.c_str(), + wxLogDebug( wxT("AssertMacros: %s %s %s file: %s, line: %ld (value %p)\n"), + assertionStr.c_str() , + exceptionStr.c_str() , + errorStr.c_str(), fileNameStr.c_str(), lineNumber , value ) ; #else @@ -607,6 +605,16 @@ pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 op #endif //__WXDEBUG__ +#ifdef __WXMAC_OSX__ +extern "C" { + /* m_macEventPosted run loop source callback: */ + void macPostedEventCallback(void *unused); +} + +void macPostedEventCallback(void *unused) { + wxTheApp->ProcessPendingEvents(); } +#endif + bool wxApp::Initialize(int& argc, wxChar **argv) { // Mac-specific @@ -667,18 +675,33 @@ bool wxApp::Initialize(int& argc, wxChar **argv) CFRelease( url ) ; CFStringRef path = CFURLCopyFileSystemPath ( urlParent , kCFURLPOSIXPathStyle ) ; CFRelease( urlParent ) ; - wxString cwd = wxMacCFStringHolder(path).AsString(wxLocale::GetSystemEncoding()); + wxString cwd = wxMacCFStringHolder(path).AsString(wxLocale::GetSystemEncoding()); wxSetWorkingDirectory( cwd ) ; } #endif wxMacCreateNotifierTable() ; +#ifdef __WXMAC_OSX__ + /* connect posted events to common-mode run loop so that wxPostEvent events + are handled even while we're in the menu or on a scrollbar */ + CFRunLoopSourceContext event_posted_context = {0}; + event_posted_context.perform = macPostedEventCallback; + m_macEventPosted = CFRunLoopSourceCreate(NULL,0,&event_posted_context); + CFRunLoopAddSource(CFRunLoopGetCurrent(), m_macEventPosted, kCFRunLoopCommonModes); +#endif + UMAShowArrowCursor() ; return true; } +AEEventHandlerUPP sODocHandler = NULL ; +AEEventHandlerUPP sOAppHandler = NULL ; +AEEventHandlerUPP sPDocHandler = NULL ; +AEEventHandlerUPP sRAppHandler = NULL ; +AEEventHandlerUPP sQuitHandler = NULL ; + bool wxApp::OnInitGui() { if( !wxAppBase::OnInitGui() ) @@ -695,24 +718,25 @@ bool wxApp::OnInitGui() if (!sm_isEmbedded) { + sODocHandler = NewAEEventHandlerUPP(AEHandleODoc) ; + sOAppHandler = NewAEEventHandlerUPP(AEHandleOApp) ; + sPDocHandler = NewAEEventHandlerUPP(AEHandlePDoc) ; + sRAppHandler = NewAEEventHandlerUPP(AEHandleRApp) ; + sQuitHandler = NewAEEventHandlerUPP(AEHandleQuit) ; + AEInstallEventHandler( kCoreEventClass , kAEOpenDocuments , - NewAEEventHandlerUPP(AEHandleODoc) , - 0 , FALSE ) ; + sODocHandler , 0 , FALSE ) ; AEInstallEventHandler( kCoreEventClass , kAEOpenApplication , - NewAEEventHandlerUPP(AEHandleOApp) , - 0 , FALSE ) ; + sOAppHandler , 0 , FALSE ) ; AEInstallEventHandler( kCoreEventClass , kAEPrintDocuments , - NewAEEventHandlerUPP(AEHandlePDoc) , - 0 , FALSE ) ; + sPDocHandler , 0 , FALSE ) ; AEInstallEventHandler( kCoreEventClass , kAEReopenApplication , - NewAEEventHandlerUPP(AEHandleRApp) , - 0 , FALSE ) ; + sRAppHandler , 0 , FALSE ) ; AEInstallEventHandler( kCoreEventClass , kAEQuitApplication , - NewAEEventHandlerUPP(AEHandleQuit) , - 0 , FALSE ) ; + sQuitHandler , 0 , FALSE ) ; } - return TRUE ; + return true ; } void wxApp::CleanUp() @@ -721,6 +745,14 @@ void wxApp::CleanUp() wxToolTip::RemoveToolTips() ; #endif +#ifdef __WXMAC_OSX__ + if (m_macEventPosted) + { + CFRelease(m_macEventPosted); + } + m_macEventPosted = NULL; +#endif + // One last chance for pending objects to be cleaned up wxTheApp->DeletePendingObjects(); @@ -738,9 +770,30 @@ void wxApp::CleanUp() ::DisposeRgn((RgnHandle)s_macCursorRgn); } - #if 0 - TerminateAE() ; - #endif + if (!sm_isEmbedded) + { + RemoveEventHandler( (EventHandlerRef)(wxTheApp->m_macEventHandler) ); + } + + if (!sm_isEmbedded) + { + AERemoveEventHandler( kCoreEventClass , kAEOpenDocuments , + sODocHandler , FALSE ) ; + AERemoveEventHandler( kCoreEventClass , kAEOpenApplication , + sOAppHandler , FALSE ) ; + AERemoveEventHandler( kCoreEventClass , kAEPrintDocuments , + sPDocHandler , FALSE ) ; + AERemoveEventHandler( kCoreEventClass , kAEReopenApplication , + sRAppHandler , FALSE ) ; + AERemoveEventHandler( kCoreEventClass , kAEQuitApplication , + sQuitHandler , FALSE ) ; + + DisposeAEEventHandlerUPP( sODocHandler ) ; + DisposeAEEventHandlerUPP( sOAppHandler ) ; + DisposeAEEventHandlerUPP( sPDocHandler ) ; + DisposeAEEventHandlerUPP( sRAppHandler ) ; + DisposeAEEventHandlerUPP( sQuitHandler ) ; + } wxAppBase::CleanUp(); } @@ -853,15 +906,18 @@ bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec) wxApp::wxApp() { - m_printMode = wxPRINT_WINDOWS; + m_printMode = wxPRINT_WINDOWS; - m_macCurrentEvent = NULL ; - m_macCurrentEventHandlerCallRef = NULL ; + m_macCurrentEvent = NULL ; + m_macCurrentEventHandlerCallRef = NULL ; +#ifdef __WXMAC_OSX__ + m_macEventPosted = NULL ; +#endif } int wxApp::MainLoop() { - m_keepGoing = TRUE; + m_keepGoing = true; #if wxMAC_USE_RAEL RunApplicationEventLoop() ; #else @@ -875,7 +931,7 @@ int wxApp::MainLoop() void wxApp::ExitMainLoop() { - m_keepGoing = FALSE; + m_keepGoing = false; #if wxMAC_USE_RAEL QuitApplicationEventLoop() ; #endif @@ -887,7 +943,7 @@ bool wxApp::Pending() // without the receive event (with pull param = false ) nothing is ever reported EventRef theEvent; ReceiveNextEvent (0, NULL, kEventDurationNoWait, false, &theEvent); - return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ; + return GetNumEventsInQueue( GetMainEventQueue() ) > 0 ; } // Dispatch a message. @@ -913,6 +969,12 @@ void wxApp::OnIdle(wxIdleEvent& event) void wxApp::WakeUpIdle() { +#ifdef __WXMAC_OSX__ + if (m_macEventPosted) + { + CFRunLoopSourceSignal(m_macEventPosted); + } +#endif wxMacWakeUp() ; } @@ -925,7 +987,7 @@ void wxApp::Exit() void wxApp::OnEndSession(wxCloseEvent& WXUNUSED(event)) { if (GetTopWindow()) - GetTopWindow()->Close(TRUE); + GetTopWindow()->Close(true); } // Default behaviour: close the application with prompts. The @@ -935,7 +997,7 @@ void wxApp::OnQueryEndSession(wxCloseEvent& event) if (GetTopWindow()) { if (!GetTopWindow()->Close(!event.CanVeto())) - event.Veto(TRUE); + event.Veto(true); } } @@ -956,10 +1018,10 @@ bool wxApp::Yield(bool onlyIfNeeded) wxFAIL_MSG( wxT("wxYield called recursively" ) ); } - return FALSE; + return false; } - s_inYield = TRUE; + s_inYield = true; // by definition yield should handle all non-processed events @@ -990,9 +1052,9 @@ bool wxApp::Yield(bool onlyIfNeeded) } while( status == noErr ) ; wxMacProcessNotifierAndPendingEvents() ; - s_inYield = FALSE; + s_inYield = false; - return TRUE; + return true; } void wxApp::MacDoOneEvent() @@ -1028,7 +1090,7 @@ void wxApp::MacDoOneEvent() /*virtual*/ void wxApp::MacHandleUnhandledEvent( WXEVENTREF evr ) { - // Override to process unhandled events as you please + // Override to process unhandled events as you please } void wxApp::MacHandleOneEvent( WXEVENTREF evr ) @@ -1054,102 +1116,118 @@ long wxMacTranslateKey(unsigned char key, unsigned char code) switch (key) { case kHomeCharCode : - retval = WXK_HOME; - break; + retval = WXK_HOME; + break; + case kEnterCharCode : - retval = WXK_RETURN; - break; + retval = WXK_RETURN; + break; case kEndCharCode : - retval = WXK_END; - break; + retval = WXK_END; + break; + case kHelpCharCode : - retval = WXK_HELP; - break; + retval = WXK_HELP; + break; + case kBackspaceCharCode : - retval = WXK_BACK; - break; + retval = WXK_BACK; + break; + case kTabCharCode : - retval = WXK_TAB; - break; + retval = WXK_TAB; + break; + case kPageUpCharCode : - retval = WXK_PAGEUP; - break; + retval = WXK_PAGEUP; + break; + case kPageDownCharCode : - retval = WXK_PAGEDOWN; - break; + retval = WXK_PAGEDOWN; + break; + case kReturnCharCode : - retval = WXK_RETURN; - break; - case kFunctionKeyCharCode : + retval = WXK_RETURN; + break; + + case kFunctionKeyCharCode : + { + switch( code ) { - switch( code ) - { - case 0x7a : - retval = WXK_F1 ; - break; - case 0x78 : - retval = WXK_F2 ; - break; - case 0x63 : - retval = WXK_F3 ; - break; - case 0x76 : - retval = WXK_F4 ; - break; - case 0x60 : - retval = WXK_F5 ; - break; - case 0x61 : - retval = WXK_F6 ; - break; - case 0x62: - retval = WXK_F7 ; - break; - case 0x64 : - retval = WXK_F8 ; - break; - case 0x65 : - retval = WXK_F9 ; - break; - case 0x6D : - retval = WXK_F10 ; - break; - case 0x67 : - retval = WXK_F11 ; - break; - case 0x6F : - retval = WXK_F12 ; - break; - case 0x69 : - retval = WXK_F13 ; - break; - case 0x6B : - retval = WXK_F14 ; - break; - case 0x71 : - retval = WXK_F15 ; - break; - } + case 0x7a : + retval = WXK_F1 ; + break; + case 0x78 : + retval = WXK_F2 ; + break; + case 0x63 : + retval = WXK_F3 ; + break; + case 0x76 : + retval = WXK_F4 ; + break; + case 0x60 : + retval = WXK_F5 ; + break; + case 0x61 : + retval = WXK_F6 ; + break; + case 0x62: + retval = WXK_F7 ; + break; + case 0x64 : + retval = WXK_F8 ; + break; + case 0x65 : + retval = WXK_F9 ; + break; + case 0x6D : + retval = WXK_F10 ; + break; + case 0x67 : + retval = WXK_F11 ; + break; + case 0x6F : + retval = WXK_F12 ; + break; + case 0x69 : + retval = WXK_F13 ; + break; + case 0x6B : + retval = WXK_F14 ; + break; + case 0x71 : + retval = WXK_F15 ; + break; } + } + break ; + + case kEscapeCharCode : + retval = WXK_ESCAPE ; break ; - case kEscapeCharCode : - retval = WXK_ESCAPE ; + + case kLeftArrowCharCode : + retval = WXK_LEFT ; break ; - case kLeftArrowCharCode : - retval = WXK_LEFT ; + + case kRightArrowCharCode : + retval = WXK_RIGHT ; break ; - case kRightArrowCharCode : - retval = WXK_RIGHT ; + + case kUpArrowCharCode : + retval = WXK_UP ; break ; - case kUpArrowCharCode : - retval = WXK_UP ; + + case kDownArrowCharCode : + retval = WXK_DOWN ; break ; - case kDownArrowCharCode : - retval = WXK_DOWN ; + + case kDeleteCharCode : + retval = WXK_DELETE ; break ; - case kDeleteCharCode : - retval = WXK_DELETE ; - default: + + default: break ; } // end switch @@ -1190,9 +1268,9 @@ bool wxGetKeyState(wxKeyCode key) //virtual key code if < 10.2.x, else see below //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() & wxMacKeyCodeToModifier(key)); + return !!(GetCurrentKeyModifiers() & wxMacKeyCodeToModifier(key)); //else -// KeyMapByteArray keymap; +// KeyMapByteArray keymap; // GetKeys((BigEndianLong*)keymap); // return !!(BitTst(keymap, (sizeof(KeyMapByteArray)*8) - iKey)); } @@ -1216,7 +1294,6 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi UInt32 state = 0; UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey|shiftKey|optionKey))) | keycode, &state); keychar = short(keyInfo & charCodeMask); - keycode = short(keyInfo & keyCodeMask) >> 8 ; } long keyval = wxMacTranslateKey(keychar, keycode) ; long realkeyval = keyval ; @@ -1227,6 +1304,39 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi keyval = wxToupper( keyval ) ; } + // Check for NUMPAD keys + if (keyval >= '0' && keyval <= '9' && keycode >= 82 && keycode <= 92) + { + keyval = keyval - '0' + WXK_NUMPAD0; + } + else if (keycode >= 67 && keycode <= 81) + { + switch (keycode) + { + case 76 : + keyval = WXK_NUMPAD_ENTER; + break; + case 81: + keyval = WXK_NUMPAD_EQUAL; + break; + case 67: + keyval = WXK_NUMPAD_MULTIPLY; + break; + case 75: + keyval = WXK_NUMPAD_DIVIDE; + break; + case 78: + keyval = WXK_NUMPAD_SUBTRACT; + break; + case 69: + keyval = WXK_NUMPAD_ADD; + break; + case 65: + keyval = WXK_NUMPAD_DECIMAL; + break; + } // end switch + } + wxKeyEvent event(wxEVT_KEY_DOWN); bool handled = false ; event.m_shiftDown = modifiers & shiftKey; @@ -1237,7 +1347,8 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi #if wxUSE_UNICODE event.m_uniChar = uniChar ; #endif - + event.m_rawCode = keymessage; + event.m_rawFlags = modifiers; event.m_x = wherex; event.m_y = wherey; event.SetTimestamp(when); @@ -1245,35 +1356,34 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi handled = focus->GetEventHandler()->ProcessEvent( event ) ; if ( handled && event.GetSkipped() ) handled = false ; + +#if wxUSE_ACCEL if ( !handled ) { -#if wxUSE_ACCEL - if (!handled) + wxWindow *ancestor = focus; + while (ancestor) { - wxWindow *ancestor = focus; - while (ancestor) + int command = ancestor->GetAcceleratorTable()->GetCommand( event ); + if (command != -1) { - int command = ancestor->GetAcceleratorTable()->GetCommand( event ); - if (command != -1) - { - wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); - handled = ancestor->GetEventHandler()->ProcessEvent( command_event ); - break; - } - if (ancestor->IsTopLevel()) - break; - ancestor = ancestor->GetParent(); + wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); + handled = ancestor->GetEventHandler()->ProcessEvent( command_event ); + break; } + if (ancestor->IsTopLevel()) + break; + ancestor = ancestor->GetParent(); } -#endif // wxUSE_ACCEL } +#endif // wxUSE_ACCEL + if (!handled) { wxTopLevelWindowMac *tlw = focus->MacGetTopLevelWindow() ; if (tlw) { - event.Skip( FALSE ) ; + event.Skip( false ) ; event.SetEventType( wxEVT_CHAR_HOOK ); // raw value again event.m_keyCode = realkeyval ; @@ -1283,10 +1393,10 @@ bool wxApp::MacSendKeyDownEvent( wxWindow* focus , long keymessage , long modifi handled = false ; } } - + if ( !handled ) - { - event.Skip( FALSE ) ; + { + event.Skip( false ) ; event.SetEventType( wxEVT_CHAR ) ; // raw value again event.m_keyCode = realkeyval ; @@ -1363,7 +1473,6 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier UInt32 state = 0; UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey|shiftKey|optionKey))) | keycode, &state); keychar = short(keyInfo & charCodeMask); - keycode = short(keyInfo & keyCodeMask) >> 8 ; } long keyval = wxMacTranslateKey(keychar, keycode) ; @@ -1371,6 +1480,40 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier { keyval = wxToupper( keyval ) ; } + + // Check for NUMPAD keys + if (keyval >= '0' && keyval <= '9' && keycode >= 82 && keycode <= 92) + { + keyval = keyval - '0' + WXK_NUMPAD0; + } + else if (keycode >= 67 && keycode <= 81) + { + switch (keycode) + { + case 76 : + keyval = WXK_NUMPAD_ENTER; + break; + case 81: + keyval = WXK_NUMPAD_EQUAL; + break; + case 67: + keyval = WXK_NUMPAD_MULTIPLY; + break; + case 75: + keyval = WXK_NUMPAD_DIVIDE; + break; + case 78: + keyval = WXK_NUMPAD_SUBTRACT; + break; + case 69: + keyval = WXK_NUMPAD_ADD; + break; + case 65: + keyval = WXK_NUMPAD_DECIMAL; + break; + } // end switch + } + bool handled = false ; wxKeyEvent event(wxEVT_KEY_UP); @@ -1383,6 +1526,8 @@ bool wxApp::MacSendKeyUpEvent( wxWindow* focus , long keymessage , long modifier event.m_uniChar = uniChar ; #endif + event.m_rawCode = keymessage; + event.m_rawFlags = modifiers; event.m_x = wherex; event.m_y = wherey; event.SetTimestamp(when);