6#include <private/qmakearray_p.h>
8#include <QtCore/private/qstringiterator_p.h>
9#include <QtCore/qvarlengtharray.h>
10#include <QtCore/QMetaMethod>
12#include <QtGui/QKeyEvent>
13#include <QtGui/private/qguiapplication_p.h>
15#include <qpa/qplatforminputcontext.h>
16#include <qpa/qplatformintegration.h>
23 xkb_state *
state, xkb_keycode_t code,
24 bool superAsMeta,
bool hyperAsMeta);
33 return xkb <= that.xkb;
38 return xkb < that.xkb;
42template<std::
size_t Xkb, std::
size_t Qt>
397 xkb_keysym_t lower, upper;
407 const int size = xkb_state_key_get_utf8(
state, code, chars.
data(), chars.
size());
410 xkb_state_key_get_utf8(
state, code, chars.
data(), chars.
size());
418 const int size = xkb_keysym_to_utf8(keysym, chars.
data(), chars.
size());
424 xkb_keysym_to_utf8(keysym, chars.
data(), chars.
size());
432 int qtKey =
event->key();
448 return elem.qt == static_cast<uint>(qtKey);
456 if (
event->text().isEmpty())
459 ucs4 =
event->text().toUcs4();
464 for (
uint utf32 : std::as_const(ucs4))
465 keysyms.
append(utf32 | 0x01000000);
476 xkb_state *
state, xkb_keycode_t code,
477 bool superAsMeta,
bool hyperAsMeta)
492 if (latinKeysym != XKB_KEY_NoSymbol)
493 keysym = latinKeysym;
500 xkb_state *
state, xkb_keycode_t code,
501 bool superAsMeta,
bool hyperAsMeta)
506 if (keysym >= XKB_KEY_F1 && keysym <= XKB_KEY_F35) {
509 }
else if (keysym >= XKB_KEY_KP_0 && keysym <= XKB_KEY_KP_9) {
525 auto it = std::lower_bound(
KeyTbl.cbegin(),
KeyTbl.cend(), searchKey);
578 if (keysym >= XKB_KEY_KP_Space && keysym <= XKB_KEY_KP_9)
585static const Qt::KeyboardModifiers
ModsTbl[] = {
598 bool superAsMeta,
bool hyperAsMeta)
601 quint32 keycode =
event->nativeScanCode();
605 Qt::KeyboardModifiers
modifiers =
event->modifiers();
606 xkb_keymap *keymap = xkb_state_get_keymap(
state);
612 xkb_state *queryState = scopedXkbQueryState.get();
618 xkb_layout_index_t lockedLayout = xkb_state_serialize_layout(
state, XKB_STATE_LAYOUT_LOCKED);
619 xkb_mod_mask_t latchedMods = xkb_state_serialize_mods(
state, XKB_STATE_MODS_LATCHED);
620 xkb_mod_mask_t lockedMods = xkb_state_serialize_mods(
state, XKB_STATE_MODS_LOCKED);
621 xkb_mod_mask_t depressedMods = xkb_state_serialize_mods(
state, XKB_STATE_MODS_DEPRESSED);
622 xkb_state_update_mask(queryState, depressedMods, latchedMods, lockedMods, 0, 0, lockedLayout);
624 xkb_layout_index_t layoutIndex = xkb_state_key_get_layout(queryState, keycode);
625 xkb_level_index_t levelIndex = 0;
626 if (layoutIndex != XKB_LAYOUT_INVALID) {
627 levelIndex = xkb_state_key_get_level(queryState, keycode, layoutIndex);
628 if (levelIndex == XKB_LEVEL_INVALID)
632 xkb_state_update_mask(queryState, 0, latchedMods, lockedMods, 0, 0, lockedLayout);
634 xkb_keysym_t sym = xkb_state_key_get_one_sym(queryState, keycode);
635 if (sym == XKB_KEY_NoSymbol)
642 xkb_mod_index_t shiftMod = xkb_keymap_mod_get_index(keymap,
"Shift");
643 xkb_mod_index_t altMod = xkb_keymap_mod_get_index(keymap,
"Alt");
644 xkb_mod_index_t controlMod = xkb_keymap_mod_get_index(keymap,
"Control");
645 xkb_mod_index_t metaMod = xkb_keymap_mod_get_index(keymap,
"Meta");
651 xkb_mod_mask_t depressed;
655 Qt::KeyboardModifiers neededMods =
ModsTbl[
i];
656 if ((
modifiers & neededMods) == neededMods) {
665 depressed |= (1 << altMod);
667 depressed |= (1 << shiftMod);
669 depressed |= (1 << controlMod);
671 depressed |= (1 << metaMod);
672 xkb_state_update_mask(queryState, depressed, latchedMods, lockedMods, 0, 0, lockedLayout);
673 sym = xkb_state_key_get_one_sym(queryState, keycode);
675 if (sym == XKB_KEY_NoSymbol)
678 Qt::KeyboardModifiers mods =
modifiers & ~neededMods;
685 bool ambiguous =
false;
704 const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts(keymap);
705 const xkb_keycode_t minKeycode = xkb_keymap_min_keycode(keymap);
706 const xkb_keycode_t maxKeycode = xkb_keymap_max_keycode(keymap);
708 const xkb_keysym_t *keysyms =
nullptr;
711 for (xkb_keycode_t code = minKeycode; code < maxKeycode; ++code) {
712 xkb_keymap_key_get_syms_by_level(keymap, code,
layout, 0, &keysyms);
713 if (keysyms &&
isLatin1(keysyms[0]))
715 if (nrLatinKeys > 10)
727 qCDebug(lcXkbcommon,
"no keyboard layouts with latin keys present");
732 xkb_layout_index_t
layout;
733 xkb_keysym_t sym = XKB_KEY_NoSymbol;
734 xkb_keymap *keymap = xkb_state_get_keymap(
state);
735 const xkb_layout_index_t layoutCount = xkb_keymap_num_layouts_for_key(keymap, keycode);
739 const xkb_keysym_t *syms =
nullptr;
741 if (xkb_keymap_key_get_syms_by_level(keymap, keycode,
layout,
level, &syms) != 1)
757 const char *
const inputContextClassName =
"QComposeInputContext";
758 const char *
const normalizedSignature =
"setXkbContext(xkb_context*)";
764 int methodIndex = inputContext->metaObject()->indexOfMethod(normalizedSignature);
768 qCWarning(lcXkbcommon) << normalizedSignature <<
"not found on" << inputContextClassName;
constexpr bool isDigit() const noexcept
Returns true if the character is a decimal digit (Number_DecimalDigit); otherwise returns false.
int digitValue() const noexcept
Returns the numeric value of the digit, or -1 if the character is not a digit.
The QKeyEvent class describes a key event.
bool isEmpty() const noexcept
void append(parameter_type t)
QString objectName
the name of this object
The QPlatformInputContext class abstracts the input method dependent data and composing state.
\macro QT_RESTRICTED_CAST_FROM_ASCII
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString toUpper() const &
const QChar * unicode() const
Returns a Unicode representation of the string.
constexpr size_type size() const noexcept
void resize(qsizetype sz)
const T * constData() const
static QString lookupStringNoKeysymTransformations(xkb_keysym_t keysym)
static void xkbcommon_XConvertCase(xkb_keysym_t sym, xkb_keysym_t *lower, xkb_keysym_t *upper)
static bool isLatin1(xkb_keysym_t sym)
static QString lookupString(struct xkb_state *state, xkb_keycode_t code)
static void verifyHasLatinLayout(xkb_keymap *keymap)
std::unique_ptr< struct xkb_state, XKBStateDeleter > ScopedXKBState
static QList< xkb_keysym_t > toKeysym(QKeyEvent *event)
static Qt::KeyboardModifiers modifiers(struct xkb_state *state, xkb_keysym_t keysym=XKB_KEY_VoidSymbol)
static xkb_keysym_t lookupLatinKeysym(xkb_state *state, xkb_keycode_t keycode)
static QList< int > possibleKeys(xkb_state *state, const QKeyEvent *event, bool superAsMeta=false, bool hyperAsMeta=false)
static void setXkbContext(QPlatformInputContext *inputContext, struct xkb_context *context)
static int keysymToQtKey(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers)
static xkb_keysym_t qxkbcommon_xkb_keysym_to_upper(xkb_keysym_t ks)
EGLImageKHR int int EGLuint64KHR * modifiers
QSet< QString >::iterator it
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
constexpr QtPrivate::ArrayType< ManualType, Types... > qMakeArray(Types &&... t) noexcept
#define Q_ARG(Type, data)
GLenum GLuint GLint level
GLenum GLuint GLintptr GLsizeiptr size
[1]
static bool operator<(const QSettingsIniKey &k1, const QSettingsIniKey &k2)
static QString qtKey(CFStringRef cfkey)
bool operator<=(const QUuid &lhs, const QUuid &rhs) noexcept
#define XKB_MOD_NAME_SHIFT
#define XKB_MOD_NAME_LOGO
#define XKB_MOD_NAME_CTRL
static constexpr const auto KeyTbl
static QT_BEGIN_NAMESPACE int keysymToQtKey_internal(xkb_keysym_t keysym, Qt::KeyboardModifiers modifiers, xkb_state *state, xkb_keycode_t code, bool superAsMeta, bool hyperAsMeta)
static const Qt::KeyboardModifiers ModsTbl[]
static constexpr Type data() noexcept