Initial IME support

This commit is contained in:
ksuprynowicz 2023-05-27 00:08:24 +02:00
parent ab21945a54
commit 17dc2decf6
4 changed files with 47 additions and 0 deletions

View file

@ -4181,6 +4181,31 @@ static inline bool isKeyEvent(QEvent::Type type) {
return type == QEvent::KeyPress || type == QEvent::KeyRelease; return type == QEvent::KeyPress || type == QEvent::KeyRelease;
} }
bool Application::handleInputMethodEventForFocusedEntity(QEvent* event) {
if (_keyboardFocusedEntity.get() != UNKNOWN_ENTITY_ID) {
switch (event->type()) {
case QEvent::InputMethod:
case QEvent::InputMethodQuery:
{
auto eventHandler = getEntities()->getEventHandler(_keyboardFocusedEntity.get());
if (eventHandler) {
event->setAccepted(false);
QCoreApplication::sendEvent(eventHandler, event);
if (event->isAccepted()) {
_lastAcceptedKeyPress = usecTimestampNow();
return true;
}
}
break;
}
default:
break;
}
}
return false;
}
bool Application::handleKeyEventForFocusedEntity(QEvent* event) { bool Application::handleKeyEventForFocusedEntity(QEvent* event) {
if (_keyboardFocusedEntity.get() != UNKNOWN_ENTITY_ID) { if (_keyboardFocusedEntity.get() != UNKNOWN_ENTITY_ID) {
switch (event->type()) { switch (event->type()) {
@ -4241,6 +4266,10 @@ bool Application::event(QEvent* event) {
return false; return false;
} }
if ((event->type() == QEvent::InputMethod || event->type() == QEvent::InputMethodQuery) && handleInputMethodEventForFocusedEntity(event)) {
return true;
}
// Allow focused Entities to handle keyboard input // Allow focused Entities to handle keyboard input
if (isKeyEvent(event->type()) && handleKeyEventForFocusedEntity(event)) { if (isKeyEvent(event->type()) && handleKeyEventForFocusedEntity(event)) {
return true; return true;

View file

@ -565,6 +565,7 @@ private:
bool initMenu(); bool initMenu();
void pauseUntilLoginDetermined(); void pauseUntilLoginDetermined();
void resumeAfterLoginDialogActionTaken(); void resumeAfterLoginDialogActionTaken();
bool handleInputMethodEventForFocusedEntity(QEvent* event);
bool handleKeyEventForFocusedEntity(QEvent* event); bool handleKeyEventForFocusedEntity(QEvent* event);
bool handleFileOpenEvent(QFileOpenEvent* event); bool handleFileOpenEvent(QFileOpenEvent* event);
void cleanupBeforeQuit(); void cleanupBeforeQuit();

View file

@ -39,6 +39,7 @@ GLWidget::GLWidget() {
setAttribute(Qt::WA_NativeWindow); setAttribute(Qt::WA_NativeWindow);
setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_InputMethodEnabled);
setAutoFillBackground(false); setAutoFillBackground(false);
grabGesture(Qt::PinchGesture); grabGesture(Qt::PinchGesture);
setAcceptDrops(true); setAcceptDrops(true);
@ -106,6 +107,16 @@ bool GLWidget::event(QEvent* event) {
return true; return true;
} }
break; break;
case QEvent::InputMethod:
if (QCoreApplication::sendEvent(QCoreApplication::instance(), event)) {
return true;
}
break;
case QEvent::InputMethodQuery:
if (QCoreApplication::sendEvent(QCoreApplication::instance(), event)) {
return true;
}
break;
default: default:
break; break;

View file

@ -1145,6 +1145,12 @@ bool OffscreenUi::eventFilter(QObject* originalDestination, QEvent* event) {
} }
break; break;
} }
case QEvent::InputMethod:
case QEvent::InputMethodQuery:
if (QCoreApplication::sendEvent(getWindow(), event)) {
return result;
}
break;
default: default:
break; break;
} }