mirror of https://github.com/AxioDL/boo.git
Xlib input text-case handling
This commit is contained in:
parent
fd01dbb17a
commit
1ed592e0a1
|
@ -100,31 +100,7 @@ enum class EModifierKey
|
||||||
Shift = 1<<3,
|
Shift = 1<<3,
|
||||||
Command = 1<<4
|
Command = 1<<4
|
||||||
};
|
};
|
||||||
|
ENABLE_BITWISE_ENUM(EModifierKey)
|
||||||
inline EModifierKey operator|(EModifierKey a, EModifierKey b)
|
|
||||||
{
|
|
||||||
using T = std::underlying_type_t<EModifierKey>;
|
|
||||||
return EModifierKey(static_cast<T>(a) | static_cast<T>(b));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline EModifierKey operator&(EModifierKey a, EModifierKey b)
|
|
||||||
{
|
|
||||||
using T = std::underlying_type_t<EModifierKey>;
|
|
||||||
return EModifierKey(static_cast<T>(a) & static_cast<T>(b));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline EModifierKey& operator|=(EModifierKey& a, const EModifierKey& b)
|
|
||||||
{
|
|
||||||
using T = std::underlying_type_t<EModifierKey>;
|
|
||||||
a = EModifierKey(static_cast<T>(a) | static_cast<T>(b));
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline EModifierKey operator~(const EModifierKey& key)
|
|
||||||
{
|
|
||||||
using T = std::underlying_type_t<EModifierKey>;
|
|
||||||
return EModifierKey(~static_cast<T>(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
class IWindowCallback
|
class IWindowCallback
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#define XK_LATIN1
|
#define XK_LATIN1
|
||||||
#include <X11/keysymdef.h>
|
#include <X11/keysymdef.h>
|
||||||
#include <xkbcommon/xkbcommon.h>
|
#include <xkbcommon/xkbcommon.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
#include <X11/extensions/XInput2.h>
|
#include <X11/extensions/XInput2.h>
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <LogVisor/LogVisor.hpp>
|
#include <LogVisor/LogVisor.hpp>
|
||||||
|
@ -70,7 +71,8 @@ void GLXEnableVSync(Display* disp, GLXWindow drawable);
|
||||||
|
|
||||||
extern int XINPUT_OPCODE;
|
extern int XINPUT_OPCODE;
|
||||||
|
|
||||||
static uint32_t translateKeysym(KeySym sym, ESpecialKey& specialSym, EModifierKey& modifierSym)
|
static uint32_t translateKeysym(KeySym sym, ESpecialKey& specialSym, EModifierKey& modifierSym,
|
||||||
|
Display* d, unsigned state)
|
||||||
{
|
{
|
||||||
specialSym = ESpecialKey::None;
|
specialSym = ESpecialKey::None;
|
||||||
modifierSym = EModifierKey::None;
|
modifierSym = EModifierKey::None;
|
||||||
|
@ -109,7 +111,15 @@ static uint32_t translateKeysym(KeySym sym, ESpecialKey& specialSym, EModifierKe
|
||||||
else if (sym == XK_Alt_L || sym == XK_Alt_R)
|
else if (sym == XK_Alt_L || sym == XK_Alt_R)
|
||||||
modifierSym = EModifierKey::Alt;
|
modifierSym = EModifierKey::Alt;
|
||||||
else
|
else
|
||||||
return xkb_keysym_to_utf32(sym);
|
{
|
||||||
|
unsigned n;
|
||||||
|
XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
|
||||||
|
uint32_t utf = xkb_keysym_to_utf32(sym);
|
||||||
|
if ((n & 0x01) != 0 ^ (state & ShiftMask) != 0)
|
||||||
|
return toupper(utf);
|
||||||
|
else
|
||||||
|
return utf;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -995,7 +1005,7 @@ public:
|
||||||
ESpecialKey specialKey;
|
ESpecialKey specialKey;
|
||||||
EModifierKey modifierKey;
|
EModifierKey modifierKey;
|
||||||
uint32_t charCode = translateKeysym(XLookupKeysym(&event->xkey, 0),
|
uint32_t charCode = translateKeysym(XLookupKeysym(&event->xkey, 0),
|
||||||
specialKey, modifierKey);
|
specialKey, modifierKey, m_xDisp, event->xkey.state);
|
||||||
EModifierKey modifierMask = translateModifiers(event->xkey.state);
|
EModifierKey modifierMask = translateModifiers(event->xkey.state);
|
||||||
if (charCode)
|
if (charCode)
|
||||||
m_callback->charKeyDown(charCode, modifierMask, false);
|
m_callback->charKeyDown(charCode, modifierMask, false);
|
||||||
|
@ -1013,7 +1023,7 @@ public:
|
||||||
ESpecialKey specialKey;
|
ESpecialKey specialKey;
|
||||||
EModifierKey modifierKey;
|
EModifierKey modifierKey;
|
||||||
uint32_t charCode = translateKeysym(XLookupKeysym(&event->xkey, 0),
|
uint32_t charCode = translateKeysym(XLookupKeysym(&event->xkey, 0),
|
||||||
specialKey, modifierKey);
|
specialKey, modifierKey, m_xDisp, event->xkey.state);
|
||||||
EModifierKey modifierMask = translateModifiers(event->xkey.state);
|
EModifierKey modifierMask = translateModifiers(event->xkey.state);
|
||||||
if (charCode)
|
if (charCode)
|
||||||
m_callback->charKeyUp(charCode, modifierMask);
|
m_callback->charKeyUp(charCode, modifierMask);
|
||||||
|
|
Loading…
Reference in New Issue