fix possible crashes with IME

This commit is contained in:
vaxerski 2022-08-05 13:19:16 +02:00
parent 1c4d0e8c18
commit cb5521ec6e
3 changed files with 26 additions and 4 deletions

View file

@ -283,4 +283,6 @@ struct STextInput {
DYNLISTENER(textInputDisable); DYNLISTENER(textInputDisable);
DYNLISTENER(textInputCommit); DYNLISTENER(textInputCommit);
DYNLISTENER(textInputDestroy); DYNLISTENER(textInputDestroy);
DYNLISTENER(pendingSurfaceDestroy);
}; };

View file

@ -57,7 +57,7 @@ void CInputMethodRelay::onNewIME(wlr_input_method_v2* pIME) {
Debug::log(LOG, "IME Destroy"); Debug::log(LOG, "IME Destroy");
if (PTI) { if (PTI) {
PTI->pPendingSurface = PTI->pWlrInput->focused_surface; setPendingSurface(PTI, PTI->pWlrInput->focused_surface);
wlr_text_input_v3_send_leave(PTI->pWlrInput); wlr_text_input_v3_send_leave(PTI->pWlrInput);
} }
@ -68,7 +68,7 @@ void CInputMethodRelay::onNewIME(wlr_input_method_v2* pIME) {
if (PTI) { if (PTI) {
wlr_text_input_v3_send_enter(PTI->pWlrInput, PTI->pPendingSurface); wlr_text_input_v3_send_enter(PTI->pWlrInput, PTI->pPendingSurface);
PTI->pPendingSurface = nullptr; setPendingSurface(PTI, nullptr);
} }
} }
@ -167,6 +167,8 @@ void CInputMethodRelay::createNewTextInput(wlr_text_input_v3* pInput) {
g_pInputManager->m_sIMERelay.commitIMEState(PINPUT->pWlrInput); g_pInputManager->m_sIMERelay.commitIMEState(PINPUT->pWlrInput);
} }
g_pInputManager->m_sIMERelay.setPendingSurface(PINPUT, nullptr);
PINPUT->hyprListener_textInputCommit.removeCallback(); PINPUT->hyprListener_textInputCommit.removeCallback();
PINPUT->hyprListener_textInputDestroy.removeCallback(); PINPUT->hyprListener_textInputDestroy.removeCallback();
PINPUT->hyprListener_textInputDisable.removeCallback(); PINPUT->hyprListener_textInputDisable.removeCallback();
@ -196,7 +198,7 @@ void CInputMethodRelay::onKeyboardFocus(wlr_surface* pSurface) {
if (ti.pPendingSurface) { if (ti.pPendingSurface) {
if (pSurface != ti.pPendingSurface) if (pSurface != ti.pPendingSurface)
ti.pPendingSurface = nullptr; setPendingSurface(&ti, nullptr);
} else if (ti.pWlrInput->focused_surface) { } else if (ti.pWlrInput->focused_surface) {
@ -216,9 +218,25 @@ void CInputMethodRelay::onKeyboardFocus(wlr_surface* pSurface) {
if (m_pWLRIME) { if (m_pWLRIME) {
wlr_text_input_v3_send_enter(ti.pWlrInput, pSurface); wlr_text_input_v3_send_enter(ti.pWlrInput, pSurface);
} else { } else {
ti.pPendingSurface = pSurface; setPendingSurface(&ti, pSurface);
} }
} }
} }
} }
void CInputMethodRelay::setPendingSurface(STextInput* pInput, wlr_surface* pSurface) {
pInput->pPendingSurface = pSurface;
if (pSurface) {
pInput->hyprListener_pendingSurfaceDestroy.initCallback(&pSurface->events.destroy, [](void* owner, void* data) {
const auto PINPUT = (STextInput*)owner;
PINPUT->pPendingSurface = nullptr;
PINPUT->hyprListener_pendingSurfaceDestroy.removeCallback();
}, pInput, "TextInput");
} else {
pInput->hyprListener_pendingSurfaceDestroy.removeCallback();
}
}

View file

@ -20,6 +20,8 @@ public:
STextInput* getFocusedTextInput(); STextInput* getFocusedTextInput();
STextInput* getFocusableTextInput(); STextInput* getFocusableTextInput();
void setPendingSurface(STextInput*, wlr_surface*);
private: private:
std::list<STextInput> m_lTextInputs; std::list<STextInput> m_lTextInputs;