diff options
-rw-r--r-- | pugl/detail/mac.m | 9 | ||||
-rw-r--r-- | pugl/detail/win.c | 8 | ||||
-rw-r--r-- | pugl/detail/x11.c | 9 | ||||
-rw-r--r-- | pugl/pugl.h | 6 |
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 |