IME: fix race condition on closing window (#5455)

This commit is contained in:
Sungyoon Cho 2024-04-06 23:54:02 +09:00 committed by GitHub
parent 1596e2d1f7
commit 04d067d78b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 20 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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() {