summaryrefslogtreecommitdiff
path: root/src/managers/input
diff options
context:
space:
mode:
authorSungyoon Cho <sungyoon@sungyooncho.dev>2024-04-06 23:54:02 +0900
committerGitHub <noreply@github.com>2024-04-06 15:54:02 +0100
commit04d067d78b0074ff0000b4ce2d8741881b1ace25 (patch)
tree34d1c5b6947b830446f5160ace7551a2bb348529 /src/managers/input
parent1596e2d1f7db76c4a367a6beb814d79db019d8d2 (diff)
IME: fix race condition on closing window (#5455)
Diffstat (limited to 'src/managers/input')
-rw-r--r--src/managers/input/InputMethodRelay.cpp19
-rw-r--r--src/managers/input/InputMethodRelay.hpp2
-rw-r--r--src/managers/input/TextInput.cpp25
3 files changed, 26 insertions, 20 deletions
diff --git a/src/managers/input/InputMethodRelay.cpp b/src/managers/input/InputMethodRelay.cpp
index e348dcaf..8c21247a 100644
--- a/src/managers/input/InputMethodRelay.cpp
+++ b/src/managers/input/InputMethodRelay.cpp
@@ -160,6 +160,25 @@ void CInputMethodRelay::updateAllPopups() {
}
}
+void CInputMethodRelay::activateIME(CTextInput* pInput) {
+ if (!m_pWLRIME)
+ return;
+
+ wlr_input_method_v2_send_activate(g_pInputManager->m_sIMERelay.m_pWLRIME);
+ commitIMEState(pInput);
+}
+
+void CInputMethodRelay::deactivateIME(CTextInput* pInput) {
+ if (!m_pWLRIME)
+ return;
+
+ if (!m_pWLRIME->active)
+ return;
+
+ wlr_input_method_v2_send_deactivate(g_pInputManager->m_sIMERelay.m_pWLRIME);
+ commitIMEState(pInput);
+}
+
void CInputMethodRelay::commitIMEState(CTextInput* pInput) {
if (!m_pWLRIME)
return;
diff --git a/src/managers/input/InputMethodRelay.hpp b/src/managers/input/InputMethodRelay.hpp
index f19b4bb5..eb7c9f64 100644
--- a/src/managers/input/InputMethodRelay.hpp
+++ b/src/managers/input/InputMethodRelay.hpp
@@ -20,6 +20,8 @@ class CInputMethodRelay {
wlr_input_method_v2* m_pWLRIME = nullptr;
+ void activateIME(CTextInput* pInput);
+ void deactivateIME(CTextInput* pInput);
void commitIMEState(CTextInput* pInput);
void removeTextInput(CTextInput* pInput);
diff --git a/src/managers/input/TextInput.cpp b/src/managers/input/TextInput.cpp
index 980d599b..be26d39c 100644
--- a/src/managers/input/TextInput.cpp
+++ b/src/managers/input/TextInput.cpp
@@ -37,11 +37,8 @@ void CTextInput::initCallbacks() {
hyprListener_textInputDestroy.initCallback(
isV3() ? &pWlrInput->events.destroy : &pV1Input->sDestroy,
[this](void* owner, void* data) {
- if (pWlrInput && pWlrInput->current_enabled && g_pInputManager->m_sIMERelay.m_pWLRIME) {
- wlr_input_method_v2_send_deactivate(g_pInputManager->m_sIMERelay.m_pWLRIME);
-
- g_pInputManager->m_sIMERelay.commitIMEState(this);
- }
+ if (pWlrInput && pWlrInput->current_enabled && focusedSurface())
+ g_pInputManager->m_sIMERelay.deactivateIME(this);
hyprListener_textInputCommit.removeCallback();
hyprListener_textInputDestroy.removeCallback();
@@ -72,8 +69,7 @@ void CTextInput::onEnabled(wlr_surface* surfV1) {
enter(pSurface);
}
- wlr_input_method_v2_send_activate(g_pInputManager->m_sIMERelay.m_pWLRIME);
- g_pInputManager->m_sIMERelay.commitIMEState(this);
+ g_pInputManager->m_sIMERelay.activateIME(this);
}
void CTextInput::onDisabled() {
@@ -91,11 +87,7 @@ void CTextInput::onDisabled() {
hyprListener_surfaceDestroyed.removeCallback();
hyprListener_surfaceUnmapped.removeCallback();
- if (!g_pInputManager->m_sIMERelay.m_pWLRIME->active)
- return;
-
- wlr_input_method_v2_send_deactivate(g_pInputManager->m_sIMERelay.m_pWLRIME);
- g_pInputManager->m_sIMERelay.commitIMEState(this);
+ g_pInputManager->m_sIMERelay.deactivateIME(this);
}
void CTextInput::onCommit() {
@@ -203,14 +195,7 @@ void CTextInput::leave() {
setFocusedSurface(nullptr);
- if (!g_pInputManager->m_sIMERelay.m_pWLRIME)
- return;
-
- if (!g_pInputManager->m_sIMERelay.m_pWLRIME->active)
- return;
-
- wlr_input_method_v2_send_deactivate(g_pInputManager->m_sIMERelay.m_pWLRIME);
- g_pInputManager->m_sIMERelay.commitIMEState(this);
+ g_pInputManager->m_sIMERelay.deactivateIME(this);
}
wlr_surface* CTextInput::focusedSurface() {