diff --git a/dgl/src/WindowPrivateData.cpp b/dgl/src/WindowPrivateData.cpp index ceeb2362..865f0c22 100644 --- 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 index eb9df4b6..28e3f97b 100644 --- a/dgl/src/pugl.cpp +++ b/dgl/src/pugl.cpp @@ -506,6 +506,28 @@ void puglWin32SetWindowResizable(PuglView* const view, const bool resizable) #endif #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 diff --git a/dgl/src/pugl.hpp b/dgl/src/pugl.hpp index 149d6b88..9be12209 100644 --- 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);