Initial commit
This commit is contained in:
87
xkeyhandler.cpp
Normal file
87
xkeyhandler.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
#include "xkeyhandler.h"
|
||||
|
||||
#include <X11/keysym.h>
|
||||
#include <X11/extensions/XTest.h>
|
||||
|
||||
std::map<SpecialKey, KeySym> XKeyHandler::s_keymap = {
|
||||
{ SpecialKey::UP, XK_Up },
|
||||
{ SpecialKey::DOWN, XK_Down },
|
||||
{ SpecialKey::LEFT, XK_Left },
|
||||
{ SpecialKey::RIGHT, XK_Right },
|
||||
{ SpecialKey::HOME, XK_Home },
|
||||
{ SpecialKey::END, XK_End },
|
||||
{ SpecialKey::RETURN, XK_Return },
|
||||
{ SpecialKey::ESCAPE, XK_Escape },
|
||||
};
|
||||
|
||||
XKeyHandler::XKeyHandler()
|
||||
{
|
||||
m_disp = XOpenDisplay(nullptr);
|
||||
}
|
||||
|
||||
XKeyHandler::~XKeyHandler()
|
||||
{
|
||||
XCloseDisplay(m_disp);
|
||||
}
|
||||
|
||||
void XKeyHandler::Key(SpecialKey key, KeyModifiers mods)
|
||||
{
|
||||
WaitUntilNotPaused();
|
||||
|
||||
HandleModifierKeys(mods, true);
|
||||
|
||||
KeyCode keyCode = XKeysymToKeycode(m_disp, s_keymap.at(key));
|
||||
XTestFakeKeyEvent(m_disp, keyCode, true, 0);
|
||||
XTestFakeKeyEvent(m_disp, keyCode, false, 0);
|
||||
|
||||
HandleModifierKeys(mods, false);
|
||||
|
||||
XFlush(m_disp);
|
||||
}
|
||||
|
||||
void XKeyHandler::Key(char key, KeyModifiers mods)
|
||||
{
|
||||
WaitUntilNotPaused();
|
||||
|
||||
if (key >= 0x20) {
|
||||
HandleModifierKeys(mods, true);
|
||||
|
||||
KeyCode keyCode = XKeysymToKeycode(m_disp, static_cast<KeySym>(key));
|
||||
XTestFakeKeyEvent(m_disp, keyCode, true, 0);
|
||||
XTestFakeKeyEvent(m_disp, keyCode, false, 0);
|
||||
|
||||
HandleModifierKeys(mods, false);
|
||||
|
||||
XFlush(m_disp);
|
||||
}
|
||||
}
|
||||
|
||||
void XKeyHandler::HandleModifierKeys(KeyModifiers mods, bool press)
|
||||
{
|
||||
// Modifier key up
|
||||
if (mods & KM_LMETA) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Meta_L), press, 0);
|
||||
}
|
||||
if (mods & KM_RMETA) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Meta_R), press, 0);
|
||||
}
|
||||
if (mods & KM_LCTRL) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Control_L), press, 0);
|
||||
}
|
||||
if (mods & KM_RCTRL) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Control_R), press, 0);
|
||||
}
|
||||
if (mods & KM_LALT) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Alt_L), press, 0);
|
||||
}
|
||||
if (mods & KM_RALT) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Alt_R), press, 0);
|
||||
}
|
||||
if (mods & KM_LSHIFT) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Shift_L), press, 0);
|
||||
}
|
||||
if (mods & KM_RSHIFT) {
|
||||
XTestFakeKeyEvent(m_disp, XKeysymToKeycode(m_disp, XK_Shift_R), press, 0);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user