aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSungyoon Cho <[email protected]>2024-09-06 04:04:23 +0900
committerGitHub <[email protected]>2024-09-05 20:04:23 +0100
commit727f1b54cd1ba48774092a5d54acc0e55f3ffe0f (patch)
treefffdfafce4a875bfd3622e3dc0c9395008229413
parentc80457be02e7b75b590e025708fad38d84c99026 (diff)
downloadHyprland-727f1b54cd1ba48774092a5d54acc0e55f3ffe0f.tar.gz
Hyprland-727f1b54cd1ba48774092a5d54acc0e55f3ffe0f.zip
textinput: fix ime activation in some edge cases (#7660)
* textinput: clear ti3 state when focused surface gets destroyed * textinput: send enter to newly created ti in focus
-rw-r--r--src/managers/input/TextInput.cpp46
-rw-r--r--src/protocols/TextInputV3.cpp13
2 files changed, 40 insertions, 19 deletions
diff --git a/src/managers/input/TextInput.cpp b/src/managers/input/TextInput.cpp
index de14f1ab..4c2e326a 100644
--- a/src/managers/input/TextInput.cpp
+++ b/src/managers/input/TextInput.cpp
@@ -23,10 +23,15 @@ void CTextInput::initCallbacks() {
listeners.disable = INPUT->events.disable.registerListener([this](std::any p) { onDisabled(); });
listeners.commit = INPUT->events.onCommit.registerListener([this](std::any p) { onCommit(); });
listeners.destroy = INPUT->events.destroy.registerListener([this](std::any p) {
+ listeners.surfaceUnmap.reset();
+ listeners.surfaceDestroy.reset();
g_pInputManager->m_sIMERelay.removeTextInput(this);
if (!g_pInputManager->m_sIMERelay.getFocusedTextInput())
g_pInputManager->m_sIMERelay.deactivateIME(this);
});
+
+ if (!g_pCompositor->m_pLastFocus.expired() && g_pCompositor->m_pLastFocus->client() == INPUT->client())
+ enter(g_pCompositor->m_pLastFocus.lock());
} else {
const auto INPUT = pV1Input.lock();
@@ -72,15 +77,19 @@ void CTextInput::onDisabled() {
return;
}
- if (!focusedSurface())
- return;
-
if (!isV3())
leave();
listeners.surfaceUnmap.reset();
listeners.surfaceDestroy.reset();
+ if (!focusedSurface())
+ return;
+
+ const auto PFOCUSEDTI = g_pInputManager->m_sIMERelay.getFocusedTextInput();
+ if (!PFOCUSEDTI || PFOCUSEDTI != this)
+ return;
+
g_pInputManager->m_sIMERelay.deactivateIME(this);
}
@@ -104,12 +113,12 @@ void CTextInput::setFocusedSurface(SP<CWLSurfaceResource> pSurface) {
pFocusedSurface = pSurface;
- listeners.surfaceUnmap.reset();
- listeners.surfaceDestroy.reset();
-
if (!pSurface)
return;
+ listeners.surfaceUnmap.reset();
+ listeners.surfaceDestroy.reset();
+
listeners.surfaceUnmap = pSurface->events.unmap.registerListener([this](std::any d) {
Debug::log(LOG, "Unmap TI owner1");
@@ -118,6 +127,12 @@ void CTextInput::setFocusedSurface(SP<CWLSurfaceResource> pSurface) {
pFocusedSurface.reset();
listeners.surfaceUnmap.reset();
listeners.surfaceDestroy.reset();
+
+ if (isV3() && !pV3Input.expired() && pV3Input->current.enabled)
+ pV3Input->current.enabled = false;
+
+ if (!g_pInputManager->m_sIMERelay.getFocusedTextInput())
+ g_pInputManager->m_sIMERelay.deactivateIME(this);
});
listeners.surfaceDestroy = pSurface->events.destroy.registerListener([this](std::any d) {
@@ -128,6 +143,12 @@ void CTextInput::setFocusedSurface(SP<CWLSurfaceResource> pSurface) {
pFocusedSurface.reset();
listeners.surfaceUnmap.reset();
listeners.surfaceDestroy.reset();
+
+ if (isV3() && !pV3Input.expired() && pV3Input->current.enabled)
+ pV3Input->current.enabled = false;
+
+ if (!g_pInputManager->m_sIMERelay.getFocusedTextInput())
+ g_pInputManager->m_sIMERelay.deactivateIME(this);
});
}
@@ -142,10 +163,8 @@ void CTextInput::enter(SP<CWLSurfaceResource> pSurface) {
if (pSurface == focusedSurface())
return;
- if (focusedSurface()) {
+ if (focusedSurface())
leave();
- setFocusedSurface(nullptr);
- }
enterLocks++;
if (enterLocks != 1) {
@@ -173,11 +192,14 @@ void CTextInput::leave() {
enterLocks = 0;
}
- if (isV3() && focusedSurface())
+ if (isV3()) {
pV3Input->leave(focusedSurface());
- else if (focusedSurface() && pV1Input) {
+ if (pV3Input->current.enabled) {
+ pV3Input->current.enabled = false;
+ onDisabled();
+ }
+ } else
pV1Input->leave();
- }
setFocusedSurface(nullptr);
diff --git a/src/protocols/TextInputV3.cpp b/src/protocols/TextInputV3.cpp
index 99d799f3..42dc659e 100644
--- a/src/protocols/TextInputV3.cpp
+++ b/src/protocols/TextInputV3.cpp
@@ -24,10 +24,9 @@ CTextInputV3::CTextInputV3(SP<CZwpTextInputV3> resource_) : resource(resource_)
current = pending;
serial++;
- if (wasEnabled && !current.enabled) {
- current.reset();
+ if (wasEnabled && !current.enabled)
events.disable.emit();
- } else if (!wasEnabled && current.enabled)
+ else if (!wasEnabled && current.enabled)
events.enable.emit();
else
events.onCommit.emit();
@@ -53,12 +52,12 @@ CTextInputV3::CTextInputV3(SP<CZwpTextInputV3> resource_) : resource(resource_)
pending.box.cursorBox = {x, y, w, h};
});
- resource->setEnable([this](CZwpTextInputV3* r) { pending.enabled = true; });
-
- resource->setDisable([this](CZwpTextInputV3* r) {
- pending.enabled = false;
+ resource->setEnable([this](CZwpTextInputV3* r) {
pending.reset();
+ pending.enabled = true;
});
+
+ resource->setDisable([this](CZwpTextInputV3* r) { pending.enabled = false; });
}
CTextInputV3::~CTextInputV3() {