DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

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:
Mdgl/src/WindowPrivateData.cpp | 2+-
Mdgl/src/pugl.cpp | 22++++++++++++++++++++++
Mdgl/src/pugl.hpp | 4++++
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);