window_windows.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package glfw
  2. import (
  3. "runtime"
  4. "syscall"
  5. "unsafe"
  6. "fyne.io/fyne/v2"
  7. "fyne.io/fyne/v2/internal"
  8. "golang.org/x/sys/windows/registry"
  9. )
  10. func (w *window) setDarkMode() {
  11. if runtime.GOOS == "windows" {
  12. hwnd := w.view().GetWin32Window()
  13. dark := isDark()
  14. dwm := syscall.NewLazyDLL("dwmapi.dll")
  15. setAtt := dwm.NewProc("DwmSetWindowAttribute")
  16. ret, _, err := setAtt.Call(uintptr(unsafe.Pointer(hwnd)), // window handle
  17. 20, // DWMWA_USE_IMMERSIVE_DARK_MODE
  18. uintptr(unsafe.Pointer(&dark)), // on or off
  19. 8) // sizeof(darkMode)
  20. if ret != 0 && ret != 0x80070057 { // err is always non-nil, we check return value (except erroneous code)
  21. fyne.LogError("Failed to set dark mode", err)
  22. }
  23. }
  24. }
  25. func isDark() bool {
  26. k, err := registry.OpenKey(registry.CURRENT_USER, `SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize`, registry.QUERY_VALUE)
  27. if err != nil { // older version of Windows will not have this key
  28. return false
  29. }
  30. defer k.Close()
  31. useLight, _, err := k.GetIntegerValue("AppsUseLightTheme")
  32. if err != nil { // older version of Windows will not have this value
  33. return false
  34. }
  35. return useLight == 0
  36. }
  37. func (w *window) computeCanvasSize(width, height int) fyne.Size {
  38. if w.fixedSize {
  39. return fyne.NewSize(internal.UnscaleInt(w.canvas, w.width), internal.UnscaleInt(w.canvas, w.height))
  40. }
  41. return fyne.NewSize(internal.UnscaleInt(w.canvas, width), internal.UnscaleInt(w.canvas, height))
  42. }