static void wxFillOtherKeyEventFields(wxKeyEvent& event, wxWindowGTK *win, GdkEventKey *gdk_event) { int x = 0; int y = 0; GdkModifierType state; if (gdk_event->window) gdk_window_get_pointer(gdk_event->window, &x, &y, &state); event.SetTimestamp( gdk_event->time ); event.SetId(win->GetId()); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK) != 0; event.m_controlDown = (gdk_event->state & GDK_CONTROL_MASK) != 0; event.m_altDown = (gdk_event->state & GDK_MOD1_MASK) != 0; event.m_metaDown = (gdk_event->state & GDK_MOD2_MASK) != 0; event.m_scanCode = gdk_event->keyval; event.m_rawCode = (wxUint32) gdk_event->keyval; event.m_rawFlags = 0; #if wxUSE_UNICODE event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval); #endif wxGetMousePosition( &x, &y ); win->ScreenToClient( &x, &y ); event.m_x = x; event.m_y = y; event.SetEventObject( win ); }
bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Window WXUNUSED(win), XEvent *xevent, bool isAscii) { switch (XEventGetType(xevent)) { case KeyPress: case KeyRelease: { char buf[20]; KeySym keySym; (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, NULL); int id = wxCharCodeXToWX (keySym); // id may be WXK_xxx code - these are outside ASCII range, so we // can't just use toupper() on id. // Only change this if we want the raw key that was pressed, // and don't change it if we want an ASCII value. if (!isAscii && (id >= 'a' && id <= 'z')) { id = id + 'A' - 'a'; } wxevent.m_shiftDown = XKeyEventShiftIsDown(xevent); wxevent.m_controlDown = XKeyEventCtrlIsDown(xevent); wxevent.m_altDown = XKeyEventAltIsDown(xevent); wxevent.m_metaDown = XKeyEventMetaIsDown(xevent); wxevent.SetEventObject(win); wxevent.m_keyCode = id; wxevent.SetTimestamp(XKeyEventGetTime(xevent)); wxevent.m_x = XKeyEventGetX(xevent); wxevent.m_y = XKeyEventGetY(xevent); return id > -1; } default: break; } return FALSE; }
// This method handles common code for SendKeyDown, SendKeyUp, and SendChar events. void wxApp::MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , wxChar uniChar ) { #if wxOSX_USE_COCOA_OR_CARBON short keycode, keychar ; keychar = short(keymessage & charCodeMask); keycode = short(keymessage & keyCodeMask) >> 8 ; if ( !(event.GetEventType() == wxEVT_CHAR) && (modifiers & (controlKey | shiftKey | optionKey) ) ) { // control interferes with some built-in keys like pgdown, return etc. therefore we remove the controlKey modifier // and look at the character after #ifdef __LP64__ // TODO new implementation using TextInputSources #else UInt32 state = 0; UInt32 keyInfo = KeyTranslate((Ptr)GetScriptManagerVariable(smKCHRCache), ( modifiers & (~(controlKey | shiftKey | optionKey))) | keycode, &state); keychar = short(keyInfo & charCodeMask); #endif } long keyval = wxMacTranslateKey(keychar, keycode) ; if ( keyval == keychar && ( event.GetEventType() == wxEVT_KEY_UP || event.GetEventType() == wxEVT_KEY_DOWN ) ) keyval = wxToupper( keyval ) ; // Check for NUMPAD keys. For KEY_UP/DOWN events we need to use the // WXK_NUMPAD constants, but for the CHAR event we want to use the // standard ascii values if ( event.GetEventType() != wxEVT_CHAR ) { if (keyval >= '0' && keyval <= '9' && keycode >= 82 && keycode <= 92) { keyval = (keyval - '0') + WXK_NUMPAD0; } else if (keycode >= 65 && 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; default: break; } } } event.m_shiftDown = modifiers & shiftKey; event.m_rawControlDown = modifiers & controlKey; event.m_altDown = modifiers & optionKey; event.m_controlDown = modifiers & cmdKey; event.m_keyCode = keyval ; #if wxUSE_UNICODE event.m_uniChar = uniChar ; #endif event.m_rawCode = keymessage; event.m_rawFlags = modifiers; event.SetTimestamp(when); event.SetEventObject(focus); #else wxUnusedVar(event); wxUnusedVar(focus); wxUnusedVar(keymessage); wxUnusedVar(modifiers); wxUnusedVar(when); wxUnusedVar(uniChar); #endif }