From 5b41967a119ca1d0d297c1b12342eb8a4087dba6 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 4 May 2021 19:07:48 +0100 Subject: [PATCH 1/8] Add a windows 10 workaround to force dark mode This seems to work well for my machines, looking for more testing --- internal/driver/glfw/window.go | 35 ++++++++++++++++++++------ internal/driver/glfw/window_linux.go | 3 +++ internal/driver/glfw/window_other.go | 14 +++-------- internal/driver/glfw/window_windows.go | 29 +++++++++++++++++++++ 4 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 internal/driver/glfw/window_windows.go diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index a4bc050794..a2e04c0b50 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -1,25 +1,29 @@ package glfw -import "C" import ( "bytes" "context" - "image" - _ "image/png" // for the icon - "runtime" - "sync" - "time" - "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" - + "fyne.io/fyne/v2/theme" "github.com/go-gl/glfw/v3.3/glfw" + "image" + _ "image/png" // for the icon + "runtime" + "sync" + "time" ) +//#include +//#include +//#define GLFW_EXPOSE_NATIVE_WIN32 +//#include "../../../vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/include/GLFW/glfw3.h" +import "C" + const ( scrollSpeed = float32(10) doubleClickDelay = 300 // ms (maximum interval between clicks for double click detection) @@ -1463,6 +1467,8 @@ func (w *window) create() { }) runOnMain(func() { + w.setDarkMode(fyne.CurrentApp().Settings().ThemeVariant() == theme.VariantDark) + win := w.view() win.SetCloseCallback(w.closed) win.SetPosCallback(w.moved) @@ -1547,3 +1553,16 @@ func isKeyModifier(keyName fyne.KeyName) bool { keyName == desktop.KeyAltLeft || keyName == desktop.KeyAltRight || keyName == desktop.KeySuperLeft || keyName == desktop.KeySuperRight } + +func standardResize(w *window, size fyne.Size) { + d, ok := fyne.CurrentApp().Driver().(*gLDriver) + if !ok { // don't wait to redraw in this way if we are running on test + w.canvas.Resize(size) + return + } + + runOnDraw(w, func() { + w.canvas.Resize(size) + d.repaintWindow(w) + }) +} diff --git a/internal/driver/glfw/window_linux.go b/internal/driver/glfw/window_linux.go index 11e3da0808..3bc35b245d 100644 --- a/internal/driver/glfw/window_linux.go +++ b/internal/driver/glfw/window_linux.go @@ -6,3 +6,6 @@ func (w *window) platformResize(canvasSize fyne.Size) { w.canvas.Resize(canvasSize) w.canvas.Refresh(w.canvas.content) } + +func (w *window) setDarkMode(dark bool) { +} diff --git a/internal/driver/glfw/window_other.go b/internal/driver/glfw/window_other.go index d0b7ec0347..1b9fa010ed 100644 --- a/internal/driver/glfw/window_other.go +++ b/internal/driver/glfw/window_other.go @@ -1,18 +1,12 @@ -// +build !linux +// +build !linux,!windows package glfw import "fyne.io/fyne/v2" func (w *window) platformResize(canvasSize fyne.Size) { - d, ok := fyne.CurrentApp().Driver().(*gLDriver) - if !ok { // don't wait to redraw in this way if we are running on test - w.canvas.Resize(canvasSize) - return - } + standardResize(w, canvasSize) +} - runOnDraw(w, func() { - w.canvas.Resize(canvasSize) - d.repaintWindow(w) - }) +func (w *window) setDarkMode(dark bool) { } diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go new file mode 100644 index 0000000000..423714cfe1 --- /dev/null +++ b/internal/driver/glfw/window_windows.go @@ -0,0 +1,29 @@ +package glfw + +import ( + "fyne.io/fyne/v2" + "runtime" + "syscall" + "unsafe" +) + +func (w *window) platformResize(canvasSize fyne.Size) { + standardResize(w, canvasSize) +} + +func (w *window) setDarkMode(dark bool) { + if runtime.GOOS == "windows" { + hwnd := w.view().GetWin32Window() + + dwm := syscall.NewLazyDLL("dwmapi.dll") + setAtt := dwm.NewProc("DwmSetWindowAttribute") + _, _, 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 err != nil { + fyne.LogError("Failed to set dark mode", err) + } + } +} From 3319a529c318f4beacd98a32baf774407fc52b33 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 4 May 2021 19:20:27 +0100 Subject: [PATCH 2/8] Remove unused code and fix error print --- internal/driver/glfw/window.go | 6 ------ internal/driver/glfw/window_windows.go | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index a2e04c0b50..2fe76ecdf4 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -18,12 +18,6 @@ import ( "time" ) -//#include -//#include -//#define GLFW_EXPOSE_NATIVE_WIN32 -//#include "../../../vendor/github.com/go-gl/glfw/v3.3/glfw/glfw/include/GLFW/glfw3.h" -import "C" - const ( scrollSpeed = float32(10) doubleClickDelay = 300 // ms (maximum interval between clicks for double click detection) diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go index 423714cfe1..515618e6de 100644 --- a/internal/driver/glfw/window_windows.go +++ b/internal/driver/glfw/window_windows.go @@ -17,12 +17,12 @@ func (w *window) setDarkMode(dark bool) { dwm := syscall.NewLazyDLL("dwmapi.dll") setAtt := dwm.NewProc("DwmSetWindowAttribute") - _, _, err := setAtt.Call(uintptr(unsafe.Pointer(hwnd)), // window handle + 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 err != nil { + if ret != 0 { // err is always non-nil, we check return value fyne.LogError("Failed to set dark mode", err) } } From 3e2e976fd3117065924b71c0a346525d426406ac Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 4 May 2021 19:28:24 +0100 Subject: [PATCH 3/8] Fix annoying reordering of imports --- internal/driver/glfw/window.go | 14 ++++++++------ internal/driver/glfw/window_windows.go | 3 ++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index 2fe76ecdf4..4199b7cc70 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -3,6 +3,14 @@ package glfw import ( "bytes" "context" + "image" + _ "image/png" // for the icon + "runtime" + "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" @@ -10,12 +18,6 @@ import ( "fyne.io/fyne/v2/internal/driver" "fyne.io/fyne/v2/internal/painter/gl" "fyne.io/fyne/v2/theme" - "github.com/go-gl/glfw/v3.3/glfw" - "image" - _ "image/png" // for the icon - "runtime" - "sync" - "time" ) const ( diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go index 515618e6de..56a8635618 100644 --- a/internal/driver/glfw/window_windows.go +++ b/internal/driver/glfw/window_windows.go @@ -1,10 +1,11 @@ package glfw import ( - "fyne.io/fyne/v2" "runtime" "syscall" "unsafe" + + "fyne.io/fyne/v2" ) func (w *window) platformResize(canvasSize fyne.Size) { From 12be8dc7428bfa0184b511fd132f4bee8c907dfb Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 4 May 2021 19:39:32 +0100 Subject: [PATCH 4/8] This method is not used on some platforms, placed here for re-use --- internal/driver/glfw/window.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index 4199b7cc70..ab3e48c3bf 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -1550,6 +1550,7 @@ func isKeyModifier(keyName fyne.KeyName) bool { keyName == desktop.KeySuperLeft || keyName == desktop.KeySuperRight } +//lint:ignore U1000 This is fine, just a helper function for some platforms func standardResize(w *window, size fyne.Size) { d, ok := fyne.CurrentApp().Driver().(*gLDriver) if !ok { // don't wait to redraw in this way if we are running on test From 8907efebd310f170787728b17634788d4691d3d9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 4 May 2021 19:57:53 +0100 Subject: [PATCH 5/8] Attempt to resort imports... --- cmd/fyne/internal/commands/package.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/fyne/internal/commands/package.go b/cmd/fyne/internal/commands/package.go index e5d5686491..e1e8083246 100644 --- a/cmd/fyne/internal/commands/package.go +++ b/cmd/fyne/internal/commands/package.go @@ -3,20 +3,21 @@ package commands import ( "flag" "fmt" - "log" - "runtime" - "strconv" - "strings" // import image encodings _ "image/jpeg" _ "image/png" + "log" "os" "path/filepath" + "runtime" + "strconv" + "strings" - "fyne.io/fyne/v2/cmd/fyne/internal/util" "github.com/pkg/errors" "github.com/urfave/cli/v2" + + "fyne.io/fyne/v2/cmd/fyne/internal/util" ) const ( From 1871c58ca4c2041cf702571660ecdea44487aa2e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 8 May 2021 11:09:46 +0100 Subject: [PATCH 6/8] Remove lint ignore --- internal/driver/glfw/window.go | 14 -------------- internal/driver/glfw/window_notlinux.go | 18 ++++++++++++++++++ internal/driver/glfw/window_notwindows.go | 6 ++++++ internal/driver/glfw/window_other.go | 12 ------------ internal/driver/glfw/window_windows.go | 4 ---- 5 files changed, 24 insertions(+), 30 deletions(-) create mode 100644 internal/driver/glfw/window_notlinux.go create mode 100644 internal/driver/glfw/window_notwindows.go delete mode 100644 internal/driver/glfw/window_other.go diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index d7d7640d59..c4f4d7993c 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -1535,17 +1535,3 @@ func isKeyModifier(keyName fyne.KeyName) bool { keyName == desktop.KeyAltLeft || keyName == desktop.KeyAltRight || keyName == desktop.KeySuperLeft || keyName == desktop.KeySuperRight } - -//lint:ignore U1000 This is fine, just a helper function for some platforms -func standardResize(w *window, size fyne.Size) { - d, ok := fyne.CurrentApp().Driver().(*gLDriver) - if !ok { // don't wait to redraw in this way if we are running on test - w.canvas.Resize(size) - return - } - - runOnDraw(w, func() { - w.canvas.Resize(size) - d.repaintWindow(w) - }) -} diff --git a/internal/driver/glfw/window_notlinux.go b/internal/driver/glfw/window_notlinux.go new file mode 100644 index 0000000000..d0b7ec0347 --- /dev/null +++ b/internal/driver/glfw/window_notlinux.go @@ -0,0 +1,18 @@ +// +build !linux + +package glfw + +import "fyne.io/fyne/v2" + +func (w *window) platformResize(canvasSize fyne.Size) { + d, ok := fyne.CurrentApp().Driver().(*gLDriver) + if !ok { // don't wait to redraw in this way if we are running on test + w.canvas.Resize(canvasSize) + return + } + + runOnDraw(w, func() { + w.canvas.Resize(canvasSize) + d.repaintWindow(w) + }) +} diff --git a/internal/driver/glfw/window_notwindows.go b/internal/driver/glfw/window_notwindows.go new file mode 100644 index 0000000000..733d759f6b --- /dev/null +++ b/internal/driver/glfw/window_notwindows.go @@ -0,0 +1,6 @@ +// +build !windows + +package glfw + +func (w *window) setDarkMode(dark bool) { +} diff --git a/internal/driver/glfw/window_other.go b/internal/driver/glfw/window_other.go deleted file mode 100644 index 1b9fa010ed..0000000000 --- a/internal/driver/glfw/window_other.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !linux,!windows - -package glfw - -import "fyne.io/fyne/v2" - -func (w *window) platformResize(canvasSize fyne.Size) { - standardResize(w, canvasSize) -} - -func (w *window) setDarkMode(dark bool) { -} diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go index 56a8635618..9bd9443b64 100644 --- a/internal/driver/glfw/window_windows.go +++ b/internal/driver/glfw/window_windows.go @@ -8,10 +8,6 @@ import ( "fyne.io/fyne/v2" ) -func (w *window) platformResize(canvasSize fyne.Size) { - standardResize(w, canvasSize) -} - func (w *window) setDarkMode(dark bool) { if runtime.GOOS == "windows" { hwnd := w.view().GetWin32Window() From fcb701456442508b9f14c259e5afb3093e41e6e9 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 8 May 2021 11:13:14 +0100 Subject: [PATCH 7/8] Title bar should match OS not Fyne settings --- internal/driver/glfw/window.go | 3 +-- internal/driver/glfw/window_notwindows.go | 2 +- internal/driver/glfw/window_windows.go | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index c4f4d7993c..2b6913e01f 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -17,7 +17,6 @@ import ( "fyne.io/fyne/v2/internal/cache" "fyne.io/fyne/v2/internal/driver" "fyne.io/fyne/v2/internal/painter/gl" - "fyne.io/fyne/v2/theme" ) const ( @@ -1449,7 +1448,7 @@ func (w *window) create() { }) runOnMain(func() { - w.setDarkMode(fyne.CurrentApp().Settings().ThemeVariant() == theme.VariantDark) + w.setDarkMode() win := w.view() win.SetCloseCallback(w.closed) diff --git a/internal/driver/glfw/window_notwindows.go b/internal/driver/glfw/window_notwindows.go index 733d759f6b..e5233c26f4 100644 --- a/internal/driver/glfw/window_notwindows.go +++ b/internal/driver/glfw/window_notwindows.go @@ -2,5 +2,5 @@ package glfw -func (w *window) setDarkMode(dark bool) { +func (w *window) setDarkMode() { } diff --git a/internal/driver/glfw/window_windows.go b/internal/driver/glfw/window_windows.go index 9bd9443b64..9b72799872 100644 --- a/internal/driver/glfw/window_windows.go +++ b/internal/driver/glfw/window_windows.go @@ -6,11 +6,13 @@ import ( "unsafe" "fyne.io/fyne/v2" + "golang.org/x/sys/windows/registry" ) -func (w *window) setDarkMode(dark bool) { +func (w *window) setDarkMode() { if runtime.GOOS == "windows" { hwnd := w.view().GetWin32Window() + dark := isDark() dwm := syscall.NewLazyDLL("dwmapi.dll") setAtt := dwm.NewProc("DwmSetWindowAttribute") @@ -24,3 +26,18 @@ func (w *window) setDarkMode(dark bool) { } } } + +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 +} From 75192b062b88a14a109b87fad0e346f0c641ccd2 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Sat, 8 May 2021 11:24:31 +0100 Subject: [PATCH 8/8] Fix compile error on Linux --- internal/driver/glfw/window_linux.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/driver/glfw/window_linux.go b/internal/driver/glfw/window_linux.go index 3bc35b245d..11e3da0808 100644 --- a/internal/driver/glfw/window_linux.go +++ b/internal/driver/glfw/window_linux.go @@ -6,6 +6,3 @@ func (w *window) platformResize(canvasSize fyne.Size) { w.canvas.Resize(canvasSize) w.canvas.Refresh(w.canvas.content) } - -func (w *window) setDarkMode(dark bool) { -}