commit 091c919cd6c030b0fb2e61fcd87851a6662b62e8
parent 1e029513f628a424918e55ef314f635aa30f0d08
Author: falkTX <falktx@falktx.com>
Date: Sat, 14 Aug 2021 14:38:04 +0100
Add puglX11GrabFocus as a safer way to grab focus on X11
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp
@@ -363,7 +363,7 @@ void Window::PrivateData::focus()
if (! isEmbed)
puglRaiseWindow(view);
- puglGrabFocus(view);
+ puglX11GrabFocus(view);
}
// -----------------------------------------------------------------------
diff --git a/dgl/src/pugl.cpp b/dgl/src/pugl.cpp
@@ -507,6 +507,28 @@ void puglWin32SetWindowResizable(PuglView* const view, const bool resizable)
#ifdef HAVE_X11
// --------------------------------------------------------------------------------------------------------------------
+// X11 specific, safer way to grab focus
+
+PuglStatus puglX11GrabFocus(PuglView* const view)
+{
+ PuglInternals* const impl = view->impl;
+
+ XWindowAttributes wa;
+ std::memset(&wa, 0, sizeof(wa));
+
+ DISTRHO_SAFE_ASSERT_RETURN(XGetWindowAttributes(impl->display, impl->win, &wa), PUGL_UNKNOWN_ERROR);
+
+ if (wa.map_state == IsViewable)
+ {
+ XRaiseWindow(impl->display, impl->win);
+ XSetInputFocus(impl->display, impl->win, RevertToPointerRoot, CurrentTime);
+ XSync(impl->display, False);
+ }
+
+ return PUGL_SUCCESS;
+}
+
+// --------------------------------------------------------------------------------------------------------------------
// X11 specific, setup event loop filter for sofd file dialog
static bool sofd_has_action;
diff --git a/dgl/src/pugl.hpp b/dgl/src/pugl.hpp
@@ -120,6 +120,10 @@ puglWin32SetWindowResizable(PuglView* view, bool resizable);
#endif
#ifdef HAVE_X11
+// X11 specific, safer way to grab focus
+PUGL_API PuglStatus
+puglX11GrabFocus(PuglView* view);
+
// X11 specific, setup event loop filter for sofd file dialog
PUGL_API void
sofdFileDialogSetup(PuglWorld* world);