bool wxUIActionSimulator::DoKey(int keycode, int modifiers, bool isDown) { wxX11Display display; wxCHECK_MSG(display, false, "No display available!"); int mask, type; if ( isDown ) { type = KeyPress; mask = KeyPressMask; } else { type = KeyRelease; mask = KeyReleaseMask; } WXKeySym xkeysym = wxCharCodeWXToX(keycode); KeyCode xkeycode = XKeysymToKeycode(display, xkeysym); if ( xkeycode == NoSymbol ) return false; Window focus; int revert; XGetInputFocus(display, &focus, &revert); if (focus == None) return false; int mod = 0; if (modifiers & wxMOD_SHIFT) mod |= ShiftMask; //Mod1 is alt in the vast majority of cases if (modifiers & wxMOD_ALT) mod |= Mod1Mask; if (modifiers & wxMOD_CMD) mod |= ControlMask; XKeyEvent event; event.display = display; event.window = focus; event.root = DefaultRootWindow(event.display); event.subwindow = None; event.time = CurrentTime; event.x = 1; event.y = 1; event.x_root = 1; event.y_root = 1; event.same_screen = True; event.type = type; event.state = mod; event.keycode = xkeycode; XSendEvent(event.display, event.window, True, mask, (XEvent*) &event); return true; }
bool wxGetKeyState(wxKeyCode key) { wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key != WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons")); Display *pDisplay = (Display*) wxGetDisplay(); int iKey = wxCharCodeWXToX(key); int iKeyMask = 0; Window wDummy1, wDummy2; int iDummy3, iDummy4, iDummy5, iDummy6; unsigned int iMask; KeyCode keyCode = XKeysymToKeycode(pDisplay,iKey); if (keyCode == NoSymbol) return false; if ( IsModifierKey(iKey) ) // If iKey is a modifier key, use a different method { XModifierKeymap *map = XGetModifierMapping(pDisplay); wxCHECK_MSG( map, false, wxT("failed to get X11 modifiers map") ); for (int i = 0; i < 8; ++i) { if ( map->modifiermap[map->max_keypermod * i] == keyCode) { iKeyMask = 1 << i; } } XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2, &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask ); XFreeModifiermap(map); return (iMask & iKeyMask) != 0; } // From the XLib manual: // The XQueryKeymap() function returns a bit vector for the logical state of the keyboard, // where each bit set to 1 indicates that the corresponding key is currently pressed down. // The vector is represented as 32 bytes. Byte N (from 0) contains the bits for keys 8N to 8N + 7 // with the least-significant bit in the byte representing key 8N. char key_vector[32]; XQueryKeymap(pDisplay, key_vector); return key_vector[keyCode >> 3] & (1 << (keyCode & 7)); }
bool wxGetKeyState(wxKeyCode key) { wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key != WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons")); #if defined(__WXX11__) Display *pDisplay = (Display*) wxApp::GetDisplay(); #elif defined(__WXGTK__) Display *pDisplay = GDK_DISPLAY(); #elif defined(__WXMOTIF__) Display *pDisplay = (Display*) (wxTheApp ? wxTheApp->GetInitialDisplay() : NULL); #else #error Add code to get the DISPLAY for this platform #endif int iKey = wxCharCodeWXToX(key); int iKeyMask = 0; Window wDummy1, wDummy2; int iDummy3, iDummy4, iDummy5, iDummy6; unsigned int iMask; XModifierKeymap* map = XGetModifierMapping(pDisplay); KeyCode keyCode = XKeysymToKeycode(pDisplay,iKey); if (keyCode == NoSymbol) return false; for (int i = 0; i < 8; ++i) { if ( map->modifiermap[map->max_keypermod * i] == keyCode) { iKeyMask = 1 << i; } } XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2, &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask ); XFreeModifiermap(map); return (iMask & iKeyMask) != 0; }