summaryrefslogtreecommitdiff
path: root/src/helpers/WLClasses.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-03-22 18:45:24 +0000
committerVaxry <vaxry@vaxry.net>2024-03-22 18:45:28 +0000
commitd2b42e29c66fc0f6411ce64fa7e14e1b5fcc1c3f (patch)
treeef93fcbbb6af3e560ae5e4f2c4a274f9531564cc /src/helpers/WLClasses.cpp
parent461757e2fb39e166db83858d877fcbd730ece4aa (diff)
IME: fix crashes with destroyed text-inputs
ref #5189
Diffstat (limited to 'src/helpers/WLClasses.cpp')
-rw-r--r--src/helpers/WLClasses.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/helpers/WLClasses.cpp b/src/helpers/WLClasses.cpp
index d46f7e40..1c14567d 100644
--- a/src/helpers/WLClasses.cpp
+++ b/src/helpers/WLClasses.cpp
@@ -244,3 +244,39 @@ void SKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
xkb_keymap_unref(NEWKEYMAP);
xkb_context_unref(PCONTEXT);
}
+
+void STextInput::setFocusedSurface(wlr_surface* pSurface) {
+ focusedSurface = pSurface;
+
+ hyprListener_surfaceUnmapped.removeCallback();
+ hyprListener_surfaceDestroyed.removeCallback();
+
+ if (!pSurface)
+ return;
+
+ hyprListener_surfaceUnmapped.initCallback(
+ &pSurface->events.unmap,
+ [this](void* owner, void* data) {
+ if (!focusedSurface)
+ return;
+
+ focusedSurface = nullptr;
+ hyprListener_surfaceUnmapped.removeCallback();
+ hyprListener_surfaceDestroyed.removeCallback();
+ g_pInputManager->m_sIMERelay.removeSurfaceToPTI(this);
+ },
+ this, "STextInput");
+
+ hyprListener_surfaceDestroyed.initCallback(
+ &pSurface->events.destroy,
+ [this](void* owner, void* data) {
+ if (!focusedSurface)
+ return;
+
+ focusedSurface = nullptr;
+ hyprListener_surfaceUnmapped.removeCallback();
+ hyprListener_surfaceDestroyed.removeCallback();
+ g_pInputManager->m_sIMERelay.removeSurfaceToPTI(this);
+ },
+ this, "STextInput");
+} \ No newline at end of file