aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-12-16 15:45:20 -0500
committerDavid Robillard <d@drobilla.net>2021-12-16 15:45:20 -0500
commit17fa2a0d5d4d0556bf8dfa77609220c6feb98bda (patch)
tree33e3b902d51c563a42f298a2e0dfa0ab116110e8 /src
parent70e6b05604ce56ed3862f9be725137e871f42667 (diff)
downloadpugl-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.
Diffstat (limited to 'src')
-rw-r--r--src/x11.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/x11.c b/src/x11.c
index 455ee20..1c022e6 100644
--- a/src/x11.c
+++ b/src/x11.c
@@ -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;