From 8d9c1063aba135afbbbbcdabad0a479525976c09 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 22 May 2021 15:12:25 +0100 Subject: [PATCH] Cherry picking Windows 10 theme workaround for dark mode Fixes #2184 --- internal/driver/glfw/window.go | 7 +-- .../{window_other.go => window_notlinux.go} | 0 internal/driver/glfw/window_notwindows.go | 6 +++ internal/driver/glfw/window_windows.go | 43 +++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) rename internal/driver/glfw/{window_other.go => window_notlinux.go} (100%) create mode 100644 internal/driver/glfw/window_notwindows.go create mode 100644 internal/driver/glfw/window_windows.go diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index b37c5872e3..2624f24e3f 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -1,6 +1,5 @@ package glfw -import "C" import ( "bytes" "context" @@ -10,6 +9,8 @@ import ( "sync" "time" + "github.com/go-gl/glfw/v3.3/glfw" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/driver/desktop" "fyne.io/fyne/v2/internal" @@ -17,8 +18,6 @@ import ( "fyne.io/fyne/v2/internal/driver" "fyne.io/fyne/v2/internal/painter/gl" "fyne.io/fyne/v2/widget" - - "github.com/go-gl/glfw/v3.3/glfw" ) const ( @@ -1345,6 +1344,8 @@ func (w *window) create() { }) runOnMain(func() { + w.setDarkMode() + win := w.view() win.SetCloseCallback(w.closed) win.SetPosCallback(w.moved) diff --git a/internal/driver/glfw/window_other.go b/internal/driver/glfw/window_notlinux.go similarity index 100% rename from internal/driver/glfw/window_other.go rename to internal/driver/glfw/window_notlinux.go diff --git a/internal/driver/glfw/window_notwindows.go b/internal/driver/glfw/window_notwindows.go new file mode 100644 index 0000000000..e5233c26f4 --- /dev/null +++ b/internal/driver/glfw/window_notwindows.go @@ -0,0 +1,6 @@ +// +build !windows + +package glfw + +func (w *window) setDarkMode() { +} diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go new file mode 100644 index 0000000000..9b72799872 --- /dev/null +++ b/internal/driver/glfw/window_windows.go @@ -0,0 +1,43 @@ +package glfw + +import ( + "runtime" + "syscall" + "unsafe" + + "fyne.io/fyne/v2" + "golang.org/x/sys/windows/registry" +) + +func (w *window) setDarkMode() { + if runtime.GOOS == "windows" { + hwnd := w.view().GetWin32Window() + dark := isDark() + + dwm := syscall.NewLazyDLL("dwmapi.dll") + setAtt := dwm.NewProc("DwmSetWindowAttribute") + ret, _, err := setAtt.Call(uintptr(unsafe.Pointer(hwnd)), // window handle + 20, // DWMWA_USE_IMMERSIVE_DARK_MODE + uintptr(unsafe.Pointer(&dark)), // on or off + 8) // sizeof(darkMode) + + if ret != 0 { // err is always non-nil, we check return value + fyne.LogError("Failed to set dark mode", err) + } + } +} + +func isDark() bool { + k, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize`, registry.QUERY_VALUE) + if err != nil { // older version of Windows will not have this key + return false + } + defer k.Close() + + useLight, _, err := k.GetIntegerValue("AppsUseLightTheme") + if err != nil { // older version of Windows will not have this value + return false + } + + return useLight == 0 +}