36 qCWarning(lcXkbCompose) <<
"error: xkb context has not been set on" << metaObject()->className();
43 const char *locale = getenv(
"LC_ALL");
44 if (!locale || !*locale)
45 locale = getenv(
"LC_CTYPE");
46 if (!locale || !*locale)
47 locale = getenv(
"LANG");
48 if (!locale || !*locale)
50 qCDebug(lcXkbCompose) <<
"detected locale:" << locale;
52 m_composeTable = xkb_compose_table_new_from_locale(m_XkbContext, locale, XKB_COMPOSE_COMPILE_NO_FLAGS);
54 m_composeState = xkb_compose_state_new(m_composeTable, XKB_COMPOSE_STATE_NO_FLAGS);
56 if (!m_composeTable) {
57 qCWarning(lcXkbCompose,
"failed to create compose table");
60 if (!m_composeState) {
61 qCWarning(lcXkbCompose,
"failed to create compose state");
68 auto keyEvent =
static_cast<
const QKeyEvent *>(event);
69 if (keyEvent->type() != QEvent::KeyPress)
72 if (!inputMethodAccepted())
78 if (!m_composeTable || !m_composeState)
81 xkb_compose_state_feed(m_composeState, keyEvent->nativeVirtualKey());
83 switch (xkb_compose_state_get_status(m_composeState)) {
84 case XKB_COMPOSE_COMPOSING:
86 case XKB_COMPOSE_CANCELLED:
89 case XKB_COMPOSE_COMPOSED:
91 const int size = xkb_compose_state_get_utf8(m_composeState,
nullptr, 0);
92 QVarLengthArray<
char, 32> buffer(size + 1);
93 xkb_compose_state_get_utf8(m_composeState, buffer.data(), buffer.size());
94 QString composedText = QString::fromUtf8(buffer.constData());
96 QInputMethodEvent event;
97 event.setCommitString(composedText);
99 if (!m_focusObject && qApp)
100 m_focusObject = qApp->focusObject();
103 QCoreApplication::sendEvent(m_focusObject, &event);
105 qCWarning(lcXkbCompose,
"no focus object");
110 case XKB_COMPOSE_NOTHING:
113 Q_UNREACHABLE_RETURN(
false);