diff --git a/cmd/fyne/internal/commands/package.go b/cmd/fyne/internal/commands/package.go index 29f6d31242..a27e5e21cb 100644 --- a/cmd/fyne/internal/commands/package.go +++ b/cmd/fyne/internal/commands/package.go @@ -3,6 +3,7 @@ package commands import ( "flag" "fmt" + // import image encodings _ "image/jpeg" _ "image/png" diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index 3f06637dab..2b6913e01f 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,14 +9,14 @@ 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" "fyne.io/fyne/v2/internal/cache" "fyne.io/fyne/v2/internal/driver" "fyne.io/fyne/v2/internal/painter/gl" - - "github.com/go-gl/glfw/v3.3/glfw" ) const ( @@ -1449,6 +1448,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 +}