refactor: XDGKeyUtil, make s_keySymToUCS4 static map
This commit is contained in:
parent
186a20a1ac
commit
f45df39032
2 changed files with 144 additions and 170 deletions
|
|
@ -12,6 +12,145 @@
|
||||||
|
|
||||||
#include <xkbcommon/xkbcommon-keysyms.h>
|
#include <xkbcommon/xkbcommon-keysyms.h>
|
||||||
|
|
||||||
|
KeyID XDGKeyUtil::mapKeySymToKeyID(KeySym k)
|
||||||
|
{
|
||||||
|
switch (k & 0xffffff00) {
|
||||||
|
case 0x0000:
|
||||||
|
// Latin-1
|
||||||
|
return static_cast<KeyID>(k);
|
||||||
|
|
||||||
|
case 0xfe00:
|
||||||
|
// ISO 9995 Function and Modifier Keys
|
||||||
|
switch (k) {
|
||||||
|
case XKB_KEY_ISO_Left_Tab:
|
||||||
|
return kKeyLeftTab;
|
||||||
|
|
||||||
|
case XKB_KEY_ISO_Level3_Shift:
|
||||||
|
return kKeyAltGr;
|
||||||
|
|
||||||
|
#ifdef XKB_KEY_ISO_Level5_Shift
|
||||||
|
case XKB_KEY_ISO_Level5_Shift:
|
||||||
|
return XKB_KEY_ISO_Level5_Shift; // there is no "usual" key for this...
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case XKB_KEY_ISO_Next_Group:
|
||||||
|
return kKeyNextGroup;
|
||||||
|
|
||||||
|
case XKB_KEY_ISO_Prev_Group:
|
||||||
|
return kKeyPrevGroup;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_grave:
|
||||||
|
return kKeyDeadGrave;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_acute:
|
||||||
|
return kKeyDeadAcute;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_circumflex:
|
||||||
|
return kKeyDeadCircumflex;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_tilde:
|
||||||
|
return kKeyDeadTilde;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_macron:
|
||||||
|
return kKeyDeadMacron;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_breve:
|
||||||
|
return kKeyDeadBreve;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_abovedot:
|
||||||
|
return kKeyDeadAbovedot;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_diaeresis:
|
||||||
|
return kKeyDeadDiaeresis;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_abovering:
|
||||||
|
return kKeyDeadAbovering;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_doubleacute:
|
||||||
|
return kKeyDeadDoubleacute;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_caron:
|
||||||
|
return kKeyDeadCaron;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_cedilla:
|
||||||
|
return kKeyDeadCedilla;
|
||||||
|
|
||||||
|
case XKB_KEY_dead_ogonek:
|
||||||
|
return kKeyDeadOgonek;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return kKeyNone;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 0xff00:
|
||||||
|
// MISCELLANY
|
||||||
|
return static_cast<KeyID>(k - 0xff00 + 0xef00);
|
||||||
|
|
||||||
|
case 0x1008ff00:
|
||||||
|
// "Internet" keys
|
||||||
|
return static_cast<KeyID>(s_map1008FF.at(k & 0xff));
|
||||||
|
|
||||||
|
default: {
|
||||||
|
// lookup character in table
|
||||||
|
auto index = s_keySymToUCS4.find(k);
|
||||||
|
if (index != s_keySymToUCS4.end()) {
|
||||||
|
return static_cast<KeyID>(index->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
// unknown character
|
||||||
|
return kKeyNone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::uint32_t XDGKeyUtil::getModifierBitForKeySym(KeySym keysym)
|
||||||
|
{
|
||||||
|
switch (keysym) {
|
||||||
|
case XKB_KEY_Shift_L:
|
||||||
|
case XKB_KEY_Shift_R:
|
||||||
|
return kKeyModifierBitShift;
|
||||||
|
|
||||||
|
case XKB_KEY_Control_L:
|
||||||
|
case XKB_KEY_Control_R:
|
||||||
|
return kKeyModifierBitControl;
|
||||||
|
|
||||||
|
case XKB_KEY_Alt_L:
|
||||||
|
case XKB_KEY_Alt_R:
|
||||||
|
return kKeyModifierBitAlt;
|
||||||
|
|
||||||
|
case XKB_KEY_Meta_L:
|
||||||
|
case XKB_KEY_Meta_R:
|
||||||
|
return kKeyModifierBitMeta;
|
||||||
|
|
||||||
|
case XKB_KEY_Super_L:
|
||||||
|
case XKB_KEY_Super_R:
|
||||||
|
case XKB_KEY_Hyper_L:
|
||||||
|
case XKB_KEY_Hyper_R:
|
||||||
|
return kKeyModifierBitSuper;
|
||||||
|
|
||||||
|
case XKB_KEY_Mode_switch:
|
||||||
|
case XKB_KEY_ISO_Level3_Shift:
|
||||||
|
return kKeyModifierBitAltGr;
|
||||||
|
|
||||||
|
#ifdef XKB_KEY_ISO_Level5_Shift
|
||||||
|
case XKB_KEY_ISO_Level5_Shift:
|
||||||
|
return kKeyModifierBitLevel5Lock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case XKB_KEY_Caps_Lock:
|
||||||
|
return kKeyModifierBitCapsLock;
|
||||||
|
|
||||||
|
case XKB_KEY_Num_Lock:
|
||||||
|
return kKeyModifierBitNumLock;
|
||||||
|
|
||||||
|
case XKB_KEY_Scroll_Lock:
|
||||||
|
return kKeyModifierBitScrollLock;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return kKeyModifierBitNone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This table maps keysym values into the corresponding ISO 10646
|
* This table maps keysym values into the corresponding ISO 10646
|
||||||
* (UCS, Unicode) values.
|
* (UCS, Unicode) values.
|
||||||
|
|
@ -27,12 +166,7 @@
|
||||||
*
|
*
|
||||||
* This software is in the public domain. Share and enjoy!
|
* This software is in the public domain. Share and enjoy!
|
||||||
*/
|
*/
|
||||||
|
const KeySymMap XDGKeyUtil::s_keySymToUCS4 = {
|
||||||
struct codepair
|
|
||||||
{
|
|
||||||
KeySym keysym;
|
|
||||||
std::uint32_t ucs4;
|
|
||||||
} s_keymap[] = {
|
|
||||||
{XKB_KEY_Aogonek, 0x0104}, /* LATIN CAPITAL LETTER A WITH OGONEK */
|
{XKB_KEY_Aogonek, 0x0104}, /* LATIN CAPITAL LETTER A WITH OGONEK */
|
||||||
{XKB_KEY_breve, 0x02d8}, /* BREVE */
|
{XKB_KEY_breve, 0x02d8}, /* BREVE */
|
||||||
{XKB_KEY_Lstroke, 0x0141}, /* LATIN CAPITAL LETTER L WITH STROKE */
|
{XKB_KEY_Lstroke, 0x0141}, /* LATIN CAPITAL LETTER L WITH STROKE */
|
||||||
|
|
@ -1200,163 +1334,7 @@ XKB_KEY_Uhorn
|
||||||
XKB_KEY_uhorn
|
XKB_KEY_uhorn
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//
|
const std::array<KeySym, 256> XDGKeyUtil::s_map1008FF = {
|
||||||
// XDGKeyUtil
|
|
||||||
//
|
|
||||||
|
|
||||||
XDGKeyUtil::KeySymMap XDGKeyUtil::s_keySymToUCS4;
|
|
||||||
|
|
||||||
KeyID XDGKeyUtil::mapKeySymToKeyID(KeySym k)
|
|
||||||
{
|
|
||||||
initKeyMaps();
|
|
||||||
|
|
||||||
switch (k & 0xffffff00) {
|
|
||||||
case 0x0000:
|
|
||||||
// Latin-1
|
|
||||||
return static_cast<KeyID>(k);
|
|
||||||
|
|
||||||
case 0xfe00:
|
|
||||||
// ISO 9995 Function and Modifier Keys
|
|
||||||
switch (k) {
|
|
||||||
case XKB_KEY_ISO_Left_Tab:
|
|
||||||
return kKeyLeftTab;
|
|
||||||
|
|
||||||
case XKB_KEY_ISO_Level3_Shift:
|
|
||||||
return kKeyAltGr;
|
|
||||||
|
|
||||||
#ifdef XKB_KEY_ISO_Level5_Shift
|
|
||||||
case XKB_KEY_ISO_Level5_Shift:
|
|
||||||
return XKB_KEY_ISO_Level5_Shift; // there is no "usual" key for this...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case XKB_KEY_ISO_Next_Group:
|
|
||||||
return kKeyNextGroup;
|
|
||||||
|
|
||||||
case XKB_KEY_ISO_Prev_Group:
|
|
||||||
return kKeyPrevGroup;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_grave:
|
|
||||||
return kKeyDeadGrave;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_acute:
|
|
||||||
return kKeyDeadAcute;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_circumflex:
|
|
||||||
return kKeyDeadCircumflex;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_tilde:
|
|
||||||
return kKeyDeadTilde;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_macron:
|
|
||||||
return kKeyDeadMacron;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_breve:
|
|
||||||
return kKeyDeadBreve;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_abovedot:
|
|
||||||
return kKeyDeadAbovedot;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_diaeresis:
|
|
||||||
return kKeyDeadDiaeresis;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_abovering:
|
|
||||||
return kKeyDeadAbovering;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_doubleacute:
|
|
||||||
return kKeyDeadDoubleacute;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_caron:
|
|
||||||
return kKeyDeadCaron;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_cedilla:
|
|
||||||
return kKeyDeadCedilla;
|
|
||||||
|
|
||||||
case XKB_KEY_dead_ogonek:
|
|
||||||
return kKeyDeadOgonek;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return kKeyNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 0xff00:
|
|
||||||
// MISCELLANY
|
|
||||||
return static_cast<KeyID>(k - 0xff00 + 0xef00);
|
|
||||||
|
|
||||||
case 0x1008ff00:
|
|
||||||
// "Internet" keys
|
|
||||||
return static_cast<KeyID>(s_map1008FF.at(k & 0xff));
|
|
||||||
|
|
||||||
default: {
|
|
||||||
// lookup character in table
|
|
||||||
auto index = s_keySymToUCS4.find(k);
|
|
||||||
if (index != s_keySymToUCS4.end()) {
|
|
||||||
return static_cast<KeyID>(index->second);
|
|
||||||
}
|
|
||||||
|
|
||||||
// unknown character
|
|
||||||
return kKeyNone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uint32_t XDGKeyUtil::getModifierBitForKeySym(KeySym keysym)
|
|
||||||
{
|
|
||||||
switch (keysym) {
|
|
||||||
case XKB_KEY_Shift_L:
|
|
||||||
case XKB_KEY_Shift_R:
|
|
||||||
return kKeyModifierBitShift;
|
|
||||||
|
|
||||||
case XKB_KEY_Control_L:
|
|
||||||
case XKB_KEY_Control_R:
|
|
||||||
return kKeyModifierBitControl;
|
|
||||||
|
|
||||||
case XKB_KEY_Alt_L:
|
|
||||||
case XKB_KEY_Alt_R:
|
|
||||||
return kKeyModifierBitAlt;
|
|
||||||
|
|
||||||
case XKB_KEY_Meta_L:
|
|
||||||
case XKB_KEY_Meta_R:
|
|
||||||
return kKeyModifierBitMeta;
|
|
||||||
|
|
||||||
case XKB_KEY_Super_L:
|
|
||||||
case XKB_KEY_Super_R:
|
|
||||||
case XKB_KEY_Hyper_L:
|
|
||||||
case XKB_KEY_Hyper_R:
|
|
||||||
return kKeyModifierBitSuper;
|
|
||||||
|
|
||||||
case XKB_KEY_Mode_switch:
|
|
||||||
case XKB_KEY_ISO_Level3_Shift:
|
|
||||||
return kKeyModifierBitAltGr;
|
|
||||||
|
|
||||||
#ifdef XKB_KEY_ISO_Level5_Shift
|
|
||||||
case XKB_KEY_ISO_Level5_Shift:
|
|
||||||
return kKeyModifierBitLevel5Lock;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case XKB_KEY_Caps_Lock:
|
|
||||||
return kKeyModifierBitCapsLock;
|
|
||||||
|
|
||||||
case XKB_KEY_Num_Lock:
|
|
||||||
return kKeyModifierBitNumLock;
|
|
||||||
|
|
||||||
case XKB_KEY_Scroll_Lock:
|
|
||||||
return kKeyModifierBitScrollLock;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return kKeyModifierBitNone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XDGKeyUtil::initKeyMaps()
|
|
||||||
{
|
|
||||||
if (s_keySymToUCS4.empty()) {
|
|
||||||
for (size_t i = 0; i < sizeof(s_keymap) / sizeof(s_keymap[0]); ++i) {
|
|
||||||
s_keySymToUCS4[s_keymap[i].keysym] = s_keymap[i].ucs4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::array<KeySym, 256> XDGKeyUtil::s_map1008FF = {
|
|
||||||
/* 0x00 */ 0,
|
/* 0x00 */ 0,
|
||||||
0,
|
0,
|
||||||
kKeyBrightnessUp,
|
kKeyBrightnessUp,
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
using KeySym = unsigned long;
|
using KeySym = unsigned long;
|
||||||
|
using KeySymMap = std::map<KeySym, uint32_t>;
|
||||||
|
|
||||||
//! XKB utility functions
|
//! XKB utility functions
|
||||||
class XDGKeyUtil
|
class XDGKeyUtil
|
||||||
|
|
@ -34,12 +35,7 @@ public:
|
||||||
static std::uint32_t getModifierBitForKeySym(KeySym keysym);
|
static std::uint32_t getModifierBitForKeySym(KeySym keysym);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void initKeyMaps();
|
static const KeySymMap s_keySymToUCS4;
|
||||||
|
|
||||||
typedef std::map<KeySym, std::uint32_t> KeySymMap;
|
|
||||||
|
|
||||||
static KeySymMap s_keySymToUCS4;
|
|
||||||
|
|
||||||
// map "Internet" keys to KeyIDs
|
// map "Internet" keys to KeyIDs
|
||||||
static std::array<KeySym, 256> s_map1008FF;
|
static const std::array<KeySym, 256> s_map1008FF;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue