aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pugl/detail/mac.m9
-rw-r--r--pugl/detail/win.c8
-rw-r--r--pugl/detail/x11.c9
-rw-r--r--pugl/pugl.h6
4 files changed, 31 insertions, 1 deletions
diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m
index a438701..385070d 100644
--- a/pugl/detail/mac.m
+++ b/pugl/detail/mac.m
@@ -778,6 +778,15 @@ puglGrabFocus(PuglView* view)
[window makeFirstResponder:view->impl->wrapperView];
}
+bool
+puglHasFocus(const PuglView* view)
+{
+ PuglInternals* const impl = view->impl;
+
+ return ([[impl->wrapperView window] isKeyWindow] &&
+ [[impl->wrapperView window] firstResponder] == impl->wrapperView);
+}
+
void
puglRequestAttention(PuglView* view)
{
diff --git a/pugl/detail/win.c b/pugl/detail/win.c
index 42b9427..a4597b5 100644
--- a/pugl/detail/win.c
+++ b/pugl/detail/win.c
@@ -631,10 +631,16 @@ puglGrabFocus(PuglView* view)
SetFocus(view->impl->hwnd);
}
+bool
+puglHasFocus(const PuglView* view)
+{
+ return GetFocus() == view->impl->hwnd;
+}
+
void
puglRequestAttention(PuglView* view)
{
- if (!view->impl->mouseTracked || GetFocus() != view->impl->hwnd) {
+ if (!view->impl->mouseTracked || !puglHasFocus(view)) {
FlashWindow(view->impl->hwnd, TRUE);
SetTimer(view->impl->hwnd, PUGL_URGENT_TIMER_ID, 500, NULL);
view->impl->flashing = true;
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index a766ace..cb9f0e2 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -443,6 +443,15 @@ puglGrabFocus(PuglView* view)
view->impl->display, view->impl->win, RevertToNone, CurrentTime);
}
+bool
+puglHasFocus(const PuglView* view)
+{
+ int revertTo = 0;
+ Window focusedWindow = 0;
+ XGetInputFocus(view->impl->display, &focusedWindow, &revertTo);
+ return focusedWindow == view->impl->win;
+}
+
void
puglRequestAttention(PuglView* view)
{
diff --git a/pugl/pugl.h b/pugl/pugl.h
index f352766..b176696 100644
--- a/pugl/pugl.h
+++ b/pugl/pugl.h
@@ -641,6 +641,12 @@ PUGL_API PUGL_DEPRECATED_BY("puglInitWindowHint") void
puglIgnoreKeyRepeat(PuglView* view, bool ignore);
/**
+ Return true iff `view` has the input focus.
+*/
+PUGL_API bool
+puglHasFocus(const PuglView* view);
+
+/**
Grab the input focus.
*/
PUGL_API void