diff options
author | David Robillard <d@drobilla.net> | 2021-12-16 15:45:20 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2021-12-16 15:45:20 -0500 |
commit | 17fa2a0d5d4d0556bf8dfa77609220c6feb98bda (patch) | |
tree | 33e3b902d51c563a42f298a2e0dfa0ab116110e8 | |
parent | 70e6b05604ce56ed3862f9be725137e871f42667 (diff) | |
download | pugl-17fa2a0d5d4d0556bf8dfa77609220c6feb98bda.tar.gz pugl-17fa2a0d5d4d0556bf8dfa77609220c6feb98bda.tar.bz2 pugl-17fa2a0d5d4d0556bf8dfa77609220c6feb98bda.zip |
X11: Fix potential crash in puglGrabFocus()
This is really a mistake in user code, but things shouldn't crash in general.
So, this commit fixes the crash and adds some documentation so that developers
hopefully don't try to grab focus before it makes sense.
The case that was previously a crash will now gracefully fail, that is, the
focus will not be (and can not be) grabbed.
-rw-r--r-- | include/pugl/pugl.h | 9 | ||||
-rw-r--r-- | src/x11.c | 11 |
2 files changed, 18 insertions, 2 deletions
diff --git a/include/pugl/pugl.h b/include/pugl/pugl.h index 6e783e7..59b8847 100644 --- a/include/pugl/pugl.h +++ b/include/pugl/pugl.h @@ -1137,7 +1137,14 @@ typedef enum { PUGL_CURSOR_UP_DOWN, ///< Up/down arrow for vertical resize } PuglCursor; -/// Grab the keyboard input focus +/** + Grab the keyboard input focus. + + Note that this will fail if the view is not mapped and so should not, for + example, be called immediately after puglShow(). + + @return #PUGL_SUCCESS if the focus was successfully grabbed, or an error. +*/ PUGL_API PuglStatus puglGrabFocus(PuglView* view); @@ -795,7 +795,16 @@ translateEvent(PuglView* const view, XEvent xevent) PuglStatus puglGrabFocus(PuglView* const view) { - PuglInternals* const impl = view->impl; + PuglInternals* const impl = view->impl; + XWindowAttributes attrs = {0}; + + if (!impl->win || !XGetWindowAttributes(impl->display, impl->win, &attrs)) { + return PUGL_UNKNOWN_ERROR; + } + + if (attrs.map_state != IsViewable) { + return PUGL_FAILURE; + } XSetInputFocus(impl->display, impl->win, RevertToNone, CurrentTime); return PUGL_SUCCESS; |