summaryrefslogtreecommitdiffstats
path: root/src/lib/platform/XWindowsKeyState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/platform/XWindowsKeyState.cpp')
-rw-r--r--src/lib/platform/XWindowsKeyState.cpp85
1 files changed, 48 insertions, 37 deletions
diff --git a/src/lib/platform/XWindowsKeyState.cpp b/src/lib/platform/XWindowsKeyState.cpp
index 1ca4629..37fd5e8 100644
--- a/src/lib/platform/XWindowsKeyState.cpp
+++ b/src/lib/platform/XWindowsKeyState.cpp
@@ -40,23 +40,26 @@
static const size_t ModifiersFromXDefaultSize = 32;
-XWindowsKeyState::XWindowsKeyState(
+XWindowsKeyState::XWindowsKeyState(IXWindowsImpl* impl,
Display* display, bool useXKB,
IEventQueue* events) :
KeyState(events),
m_display(display),
m_modifierFromX(ModifiersFromXDefaultSize)
{
+ m_impl = impl;
+
init(display, useXKB);
}
-XWindowsKeyState::XWindowsKeyState(
+XWindowsKeyState::XWindowsKeyState(IXWindowsImpl* impl,
Display* display, bool useXKB,
IEventQueue* events, barrier::KeyMap& keyMap) :
KeyState(events, keyMap),
m_display(display),
m_modifierFromX(ModifiersFromXDefaultSize)
{
+ m_impl = impl;
init(display, useXKB);
}
@@ -64,7 +67,7 @@ XWindowsKeyState::~XWindowsKeyState()
{
#if HAVE_XKB_EXTENSION
if (m_xkb != NULL) {
- XkbFreeKeyboard(m_xkb, 0, True);
+ m_impl->XkbFreeKeyboard(m_xkb, 0, True);
}
#endif
}
@@ -75,8 +78,9 @@ XWindowsKeyState::init(Display* display, bool useXKB)
XGetKeyboardControl(m_display, &m_keyboardState);
#if HAVE_XKB_EXTENSION
if (useXKB) {
- m_xkb = XkbGetMap(m_display, XkbKeyActionsMask | XkbKeyBehaviorsMask |
- XkbAllClientInfoMask, XkbUseCoreKbd);
+ m_xkb = m_impl->XkbGetMap(m_display,
+ XkbKeyActionsMask | XkbKeyBehaviorsMask |
+ XkbAllClientInfoMask, XkbUseCoreKbd);
}
else {
m_xkb = NULL;
@@ -177,8 +181,9 @@ XWindowsKeyState::pollActiveModifiers() const
Window root = DefaultRootWindow(m_display), window;
int xRoot, yRoot, xWindow, yWindow;
unsigned int state = 0;
- if (XQueryPointer(m_display, root, &root, &window,
- &xRoot, &yRoot, &xWindow, &yWindow, &state) == False) {
+ if (m_impl->XQueryPointer(m_display, root, &root, &window,
+ &xRoot, &yRoot, &xWindow, &yWindow, &state
+ ) == False) {
state = 0;
}
return mapModifiersFromX(state);
@@ -195,7 +200,7 @@ XWindowsKeyState::pollActiveGroup() const
#if HAVE_XKB_EXTENSION
if (m_xkb != NULL) {
XkbStateRec state;
- if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) {
+ if (m_impl->XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) {
return state.group;
}
}
@@ -207,7 +212,7 @@ void
XWindowsKeyState::pollPressedKeys(KeyButtonSet& pressedKeys) const
{
char keys[32];
- XQueryKeymap(m_display, keys);
+ m_impl->XQueryKeymap(m_display, keys);
for (UInt32 i = 0; i < 32; ++i) {
for (UInt32 j = 0; j < 8; ++j) {
if ((keys[i] & (1u << j)) != 0) {
@@ -228,8 +233,9 @@ XWindowsKeyState::getKeyMap(barrier::KeyMap& keyMap)
#if HAVE_XKB_EXTENSION
if (m_xkb != NULL) {
- if (XkbGetUpdatedMap(m_display, XkbKeyActionsMask |
- XkbKeyBehaviorsMask | XkbAllClientInfoMask, m_xkb) == Success) {
+ unsigned mask = XkbKeyActionsMask | XkbKeyBehaviorsMask |
+ XkbAllClientInfoMask;
+ if (m_impl->XkbGetUpdatedMap(m_display, mask, m_xkb) == Success) {
updateKeysymMapXKB(keyMap);
return;
}
@@ -254,9 +260,9 @@ XWindowsKeyState::fakeKey(const Keystroke& keystroke)
break;
}
}
- XTestFakeKeyEvent(m_display, keystroke.m_data.m_button.m_button,
- keystroke.m_data.m_button.m_press ? True : False,
- CurrentTime);
+ m_impl->XTestFakeKeyEvent(m_display, keystroke.m_data.m_button.m_button,
+ keystroke.m_data.m_button.m_press,
+ CurrentTime);
break;
case Keystroke::kGroup:
@@ -264,8 +270,9 @@ XWindowsKeyState::fakeKey(const Keystroke& keystroke)
LOG((CLOG_DEBUG1 " group %d", keystroke.m_data.m_group.m_group));
#if HAVE_XKB_EXTENSION
if (m_xkb != NULL) {
- if (XkbLockGroup(m_display, XkbUseCoreKbd,
- keystroke.m_data.m_group.m_group) == False) {
+ if (m_impl->XkbLockGroup(m_display, XkbUseCoreKbd,
+ keystroke.m_data.m_group.m_group
+ ) == False) {
LOG((CLOG_DEBUG1 "XkbLockGroup request not sent"));
}
}
@@ -279,9 +286,10 @@ XWindowsKeyState::fakeKey(const Keystroke& keystroke)
LOG((CLOG_DEBUG1 " group %+d", keystroke.m_data.m_group.m_group));
#if HAVE_XKB_EXTENSION
if (m_xkb != NULL) {
- if (XkbLockGroup(m_display, XkbUseCoreKbd,
- getEffectiveGroup(pollActiveGroup(),
- keystroke.m_data.m_group.m_group)) == False) {
+ if (m_impl->XkbLockGroup(m_display, XkbUseCoreKbd,
+ getEffectiveGroup(pollActiveGroup(),
+ keystroke.m_data.m_group.m_group)
+ ) == False) {
LOG((CLOG_DEBUG1 "XkbLockGroup request not sent"));
}
}
@@ -320,14 +328,14 @@ XWindowsKeyState::updateKeysymMap(barrier::KeyMap& keyMap)
// get the number of keycodes
int minKeycode, maxKeycode;
- XDisplayKeycodes(m_display, &minKeycode, &maxKeycode);
+ m_impl->XDisplayKeycodes(m_display, &minKeycode, &maxKeycode);
int numKeycodes = maxKeycode - minKeycode + 1;
// get the keyboard mapping for all keys
int keysymsPerKeycode;
- KeySym* allKeysyms = XGetKeyboardMapping(m_display,
- minKeycode, numKeycodes,
- &keysymsPerKeycode);
+ KeySym* allKeysyms = m_impl->XGetKeyboardMapping(m_display,
+ minKeycode, numKeycodes,
+ &keysymsPerKeycode);
// it's more convenient to always have maxKeysyms KeySyms per key
{
@@ -343,7 +351,7 @@ XWindowsKeyState::updateKeysymMap(barrier::KeyMap& keyMap)
}
}
}
- XFree(allKeysyms);
+ m_impl->XFree(allKeysyms);
allKeysyms = tmpKeysyms;
}
@@ -365,7 +373,7 @@ XWindowsKeyState::updateKeysymMap(barrier::KeyMap& keyMap)
// going to ignore all KeySyms except the first modifier KeySym,
// which means button 1 above won't map to Meta, just Alt.
std::map<KeyCode, unsigned int> modifierButtons;
- XModifierKeymap* modifiers = XGetModifierMapping(m_display);
+ XModifierKeymap* modifiers = m_impl->XGetModifierMapping(m_display);
for (unsigned int i = 0; i < 8; ++i) {
const KeyCode* buttons =
modifiers->modifiermap + i * modifiers->max_keypermod;
@@ -560,7 +568,7 @@ XWindowsKeyState::updateKeysymMapXKB(barrier::KeyMap& keyMap)
// find the number of groups
int maxNumGroups = 0;
for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) {
- int numGroups = XkbKeyNumGroups(m_xkb, static_cast<KeyCode>(i));
+ int numGroups = m_impl->do_XkbKeyNumGroups(m_xkb, static_cast<KeyCode>(i));
if (numGroups > maxNumGroups) {
maxNumGroups = numGroups;
}
@@ -596,7 +604,7 @@ XWindowsKeyState::updateKeysymMapXKB(barrier::KeyMap& keyMap)
item.m_client = 0;
// skip keys with no groups (they generate no symbols)
- if (XkbKeyNumGroups(m_xkb, keycode) == 0) {
+ if (m_impl->do_XkbKeyNumGroups(m_xkb, keycode) == 0) {
continue;
}
@@ -612,7 +620,8 @@ XWindowsKeyState::updateKeysymMapXKB(barrier::KeyMap& keyMap)
int eGroup = getEffectiveGroup(keycode, group);
// get key info
- XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, eGroup);
+ XkbKeyTypePtr type = m_impl->do_XkbKeyKeyType(m_xkb, keycode,
+ eGroup);
// set modifiers the item is sensitive to
item.m_sensitive = type->mods.mask;
@@ -641,16 +650,18 @@ XWindowsKeyState::updateKeysymMapXKB(barrier::KeyMap& keyMap)
}
// get the keysym for this item
- KeySym keysym = XkbKeySymEntry(m_xkb, keycode, level, eGroup);
+ KeySym keysym = m_impl->do_XkbKeySymEntry(m_xkb, keycode, level,
+ eGroup);
// check for group change actions, locking modifiers, and
// modifier masks.
item.m_lock = false;
bool isModifier = false;
UInt32 modifierMask = m_xkb->map->modmap[keycode];
- if (XkbKeyHasActions(m_xkb, keycode) == True) {
+ if (m_impl->do_XkbKeyHasActions(m_xkb, keycode) == True) {
XkbAction* action =
- XkbKeyActionEntry(m_xkb, keycode, level, eGroup);
+ m_impl->do_XkbKeyActionEntry(m_xkb, keycode, level,
+ eGroup);
if (action->type == XkbSA_SetMods ||
action->type == XkbSA_LockMods) {
isModifier = true;
@@ -799,19 +810,19 @@ XWindowsKeyState::hasModifiersXKB() const
// iterate over all keycodes
for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) {
KeyCode keycode = static_cast<KeyCode>(i);
- if (XkbKeyHasActions(m_xkb, keycode) == True) {
+ if (m_impl->do_XkbKeyHasActions(m_xkb, keycode) == True) {
// iterate over all groups
- int numGroups = XkbKeyNumGroups(m_xkb, keycode);
+ int numGroups = m_impl->do_XkbKeyNumGroups(m_xkb, keycode);
for (int group = 0; group < numGroups; ++group) {
// iterate over all shift levels for the button (including none)
- XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, group);
+ XkbKeyTypePtr type = m_impl->do_XkbKeyKeyType(m_xkb, keycode, group);
for (int j = -1; j < type->map_count; ++j) {
if (j != -1 && !type->map[j].active) {
continue;
}
int level = ((j == -1) ? 0 : type->map[j].level);
XkbAction* action =
- XkbKeyActionEntry(m_xkb, keycode, level, group);
+ m_impl->do_XkbKeyActionEntry(m_xkb, keycode, level, group);
if (action->type == XkbSA_SetMods ||
action->type == XkbSA_LockMods) {
return true;
@@ -830,9 +841,9 @@ XWindowsKeyState::getEffectiveGroup(KeyCode keycode, int group) const
(void)keycode;
#if HAVE_XKB_EXTENSION
// get effective group for key
- int numGroups = XkbKeyNumGroups(m_xkb, keycode);
+ int numGroups = m_impl->do_XkbKeyNumGroups(m_xkb, keycode);
if (group >= numGroups) {
- unsigned char groupInfo = XkbKeyGroupInfo(m_xkb, keycode);
+ unsigned char groupInfo = m_impl->do_XkbKeyGroupInfo(m_xkb, keycode);
switch (XkbOutOfRangeGroupAction(groupInfo)) {
case XkbClampIntoRange:
group = numGroups - 1;