From bb3a0cc54fb0257fd97553469a6ee6bb7eb59710 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Wed, 13 Sep 2023 08:57:09 +1000 Subject: [PATCH] Add `WebviewWindow.IsFocused()` --- v3/pkg/application/linux_cgo.go | 5 +++++ v3/pkg/application/webview_window.go | 9 +++++++++ v3/pkg/application/webview_window_darwin.go | 10 +++++++++- v3/pkg/application/webview_window_linux.go | 4 ++++ v3/pkg/application/webview_window_windows.go | 5 +++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/v3/pkg/application/linux_cgo.go b/v3/pkg/application/linux_cgo.go index 1371a8968..53279064a 100644 --- a/v3/pkg/application/linux_cgo.go +++ b/v3/pkg/application/linux_cgo.go @@ -551,6 +551,11 @@ func windowIsFullscreen(window pointer) bool { return state&C.GDK_WINDOW_STATE_FULLSCREEN > 0 } +func windowIsFocused(window pointer) bool { + // returns true if window is focused + return C.gtk_window_has_toplevel_focus((*C.GtkWindow)(window)) == 1 +} + func windowIsMaximized(window pointer) bool { gdkwindow := C.gtk_widget_get_window((*C.GtkWidget)(window)) state := C.gdk_window_get_state(gdkwindow) diff --git a/v3/pkg/application/webview_window.go b/v3/pkg/application/webview_window.go index 14dbb6e8e..a71a42eee 100644 --- a/v3/pkg/application/webview_window.go +++ b/v3/pkg/application/webview_window.go @@ -53,6 +53,7 @@ type ( isFullscreen() bool isNormal() bool isVisible() bool + isFocused() bool setFullscreenButtonEnabled(enabled bool) focus() show() @@ -482,6 +483,14 @@ func (w *WebviewWindow) Size() (int, int) { return width, height } +// IsFocused returns true if the window is currently focused +func (w *WebviewWindow) IsFocused() bool { + if w.impl == nil { + return false + } + return invokeSyncWithResult(w.impl.isFullscreen) +} + // IsFullscreen returns true if the window is fullscreen func (w *WebviewWindow) IsFullscreen() bool { if w.impl == nil { diff --git a/v3/pkg/application/webview_window_darwin.go b/v3/pkg/application/webview_window_darwin.go index 6981f85ca..3c8560c6d 100644 --- a/v3/pkg/application/webview_window_darwin.go +++ b/v3/pkg/application/webview_window_darwin.go @@ -345,6 +345,10 @@ bool windowIsMinimised(void* nsWindow) { return [(WebviewWindow*)nsWindow isMiniaturized]; } +bool windowIsFocused(void* nsWindow) { + return [(WebviewWindow*)nsWindow isKeyWindow]; +} + // Set Window fullscreen void windowFullscreen(void* nsWindow) { if( windowIsFullscreen(nsWindow) ) { @@ -716,6 +720,10 @@ type macosWebviewWindow struct { parent *WebviewWindow } +func (w *macosWebviewWindow) isFocused() bool { + return bool(C.windowIsFocused(w.nsWindow)) +} + func (w *macosWebviewWindow) setAbsolutePosition(x int, y int) { C.windowSetAbsolutePosition(w.nsWindow, C.int(x), C.int(y)) } @@ -944,7 +952,7 @@ func (w *macosWebviewWindow) setTitle(title string) { } } -func (w *macosWebviewWindow) flash(enabled bool) { +func (w *macosWebviewWindow) flash(_ bool) { // Not supported on macOS } diff --git a/v3/pkg/application/webview_window_linux.go b/v3/pkg/application/webview_window_linux.go index d35aeae99..dce9c9f81 100644 --- a/v3/pkg/application/webview_window_linux.go +++ b/v3/pkg/application/webview_window_linux.go @@ -231,6 +231,10 @@ func (w *linuxWebviewWindow) isMaximised() bool { return windowIsMaximized(w.window) } +func (w *linuxWebviewWindow) isFocused() bool { + return windowIsFocused(w.window) +} + func (w *linuxWebviewWindow) isFullscreen() bool { return windowIsFullscreen(w.window) } diff --git a/v3/pkg/application/webview_window_windows.go b/v3/pkg/application/webview_window_windows.go index 81d686656..cdc971620 100644 --- a/v3/pkg/application/webview_window_windows.go +++ b/v3/pkg/application/webview_window_windows.go @@ -549,6 +549,11 @@ func (w *windowsWebviewWindow) isMaximised() bool { return style&w32.WS_MAXIMIZE != 0 } +func (w *windowsWebviewWindow) isFocused() bool { + // Returns true if the window is currently focused + return w32.GetForegroundWindow() == w.hwnd +} + func (w *windowsWebviewWindow) isFullscreen() bool { // TODO: Actually calculate this based on size of window against screen size // => stffabi: This flag is essential since it indicates that we are in fullscreen mode even before the native properties