From c4b660a33930a0e60e853b6796c1fd76914b1719 Mon Sep 17 00:00:00 2001 From: Sungyoon Cho Date: Fri, 5 Apr 2024 01:34:04 +0900 Subject: [PATCH] IME: fix crash on restarting IME (#5428) --- src/managers/input/InputMethodRelay.cpp | 16 +++++++++++++--- src/managers/input/TextInput.cpp | 18 ++++++++---------- src/protocols/TextInputV1.cpp | 2 ++ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/managers/input/InputMethodRelay.cpp b/src/managers/input/InputMethodRelay.cpp index 2bd98a79..e348dcaf 100644 --- a/src/managers/input/InputMethodRelay.cpp +++ b/src/managers/input/InputMethodRelay.cpp @@ -49,7 +49,7 @@ void CInputMethodRelay::onNewIME(wlr_input_method_v2* pIME) { Debug::log(LOG, "IME Destroy"); if (PTI) - PTI->enter(PTI->focusedSurface()); + PTI->leave(); }, this, "IMERelay"); @@ -92,8 +92,18 @@ void CInputMethodRelay::onNewIME(wlr_input_method_v2* pIME) { }, this, "IMERelay"); - if (const auto PTI = getFocusedTextInput(); PTI) - PTI->enter(PTI->focusedSurface()); + if (!g_pCompositor->m_pLastFocus) + return; + + for (auto& ti : m_vTextInputs) { + if (ti->client() != wl_resource_get_client(g_pCompositor->m_pLastFocus->resource)) + continue; + + if (ti->isV3()) + ti->enter(g_pCompositor->m_pLastFocus); + else + ti->onEnabled(g_pCompositor->m_pLastFocus); + } } void CInputMethodRelay::setIMEPopupFocus(CInputPopup* pPopup, wlr_surface* pSurface) { diff --git a/src/managers/input/TextInput.cpp b/src/managers/input/TextInput.cpp index 8be13a4c..980d599b 100644 --- a/src/managers/input/TextInput.cpp +++ b/src/managers/input/TextInput.cpp @@ -37,12 +37,7 @@ void CTextInput::initCallbacks() { hyprListener_textInputDestroy.initCallback( isV3() ? &pWlrInput->events.destroy : &pV1Input->sDestroy, [this](void* owner, void* data) { - if (!g_pInputManager->m_sIMERelay.m_pWLRIME) { - // Debug::log(WARN, "Disabling TextInput on no IME!"); - return; - } - - if (pWlrInput && pWlrInput->current_enabled) { + 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); @@ -71,10 +66,10 @@ void CTextInput::onEnabled(wlr_surface* surfV1) { // v1 only, map surface to PTI if (!isV3()) { wlr_surface* pSurface = surfV1; - if (g_pCompositor->m_pLastFocus == pSurface) - enter(pSurface); - else - setFocusedSurface(pSurface); + if (g_pCompositor->m_pLastFocus != pSurface || !pV1Input->active) + return; + + enter(pSurface); } wlr_input_method_v2_send_activate(g_pInputManager->m_sIMERelay.m_pWLRIME); @@ -208,6 +203,9 @@ void CTextInput::leave() { setFocusedSurface(nullptr); + if (!g_pInputManager->m_sIMERelay.m_pWLRIME) + return; + if (!g_pInputManager->m_sIMERelay.m_pWLRIME->active) return; diff --git a/src/protocols/TextInputV1.cpp b/src/protocols/TextInputV1.cpp index 7535033a..8fff4db5 100644 --- a/src/protocols/TextInputV1.cpp +++ b/src/protocols/TextInputV1.cpp @@ -167,11 +167,13 @@ void CTextInputV1ProtocolManager::handleActivate(wl_client* client, wl_resource* Debug::log(WARN, "Text-input-v1 PTI{:x}: No surface to activate text input on!", (uintptr_t)PTI); return; } + PTI->active = true; PTI->pTextInput->onEnabled(wlr_surface_from_resource(surface)); } void CTextInputV1ProtocolManager::handleDeactivate(wl_client* client, wl_resource* resource, wl_resource* seat) { const auto PTI = tiFromResource(resource); + PTI->active = false; PTI->pTextInput->onDisabled(); }