Window::Focus() and Blur() follow the platforms' simplest calls and fail in common cases:
- Windows:
Focus() is SetForegroundWindow + SetFocus, which the foreground lock refuses when the app isn't in the foreground (only the taskbar flashes). Consider the AttachThreadInput / AllowSetForegroundWindow approaches, and check IsFocused() after focus changes.
- Linux:
gtk_window_present() without a timestamp is subject to focus-stealing prevention; use gtk_window_present_with_time() with the last event time.
Blur() should hand focus back to the previously active window or app. On macOS it only does orderBack:, and on Windows SetFocus(nullptr), which leaves the app active. Typical use: a launcher/search bar that hides and pastes into the previous app. Related: libnativeapi/nativeapi#59 (app-level hide on macOS).
Background:
Window::Focus()andBlur()follow the platforms' simplest calls and fail in common cases:Focus()isSetForegroundWindow+SetFocus, which the foreground lock refuses when the app isn't in the foreground (only the taskbar flashes). Consider theAttachThreadInput/AllowSetForegroundWindowapproaches, and checkIsFocused()after focus changes.gtk_window_present()without a timestamp is subject to focus-stealing prevention; usegtk_window_present_with_time()with the last event time.Blur()should hand focus back to the previously active window or app. On macOS it only doesorderBack:, and on WindowsSetFocus(nullptr), which leaves the app active. Typical use: a launcher/search bar that hides and pastes into the previous app. Related: libnativeapi/nativeapi#59 (app-level hide on macOS).Background: