settings_desktop.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //go:build !android && !ios && !mobile && !js && !wasm && !test_web_driver
  2. // +build !android,!ios,!mobile,!js,!wasm,!test_web_driver
  3. package app
  4. import (
  5. "os"
  6. "path/filepath"
  7. "fyne.io/fyne/v2"
  8. "github.com/fsnotify/fsnotify"
  9. )
  10. func watchFileAddTarget(watcher *fsnotify.Watcher, path string) {
  11. dir := filepath.Dir(path)
  12. ensureDirExists(dir)
  13. err := watcher.Add(dir)
  14. if err != nil {
  15. fyne.LogError("Settings watch error:", err)
  16. }
  17. }
  18. func ensureDirExists(dir string) {
  19. if stat, err := os.Stat(dir); err == nil && stat.IsDir() {
  20. return
  21. }
  22. err := os.MkdirAll(dir, 0700)
  23. if err != nil {
  24. fyne.LogError("Unable to create settings storage:", err)
  25. }
  26. }
  27. func watchFile(path string, callback func()) *fsnotify.Watcher {
  28. watcher, err := fsnotify.NewWatcher()
  29. if err != nil {
  30. fyne.LogError("Failed to watch settings file:", err)
  31. return nil
  32. }
  33. go func() {
  34. for event := range watcher.Events {
  35. if event.Op.Has(fsnotify.Remove) { // if it was deleted then watch again
  36. watcher.Remove(path) // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268
  37. watchFileAddTarget(watcher, path)
  38. } else {
  39. callback()
  40. }
  41. }
  42. err = watcher.Close()
  43. if err != nil {
  44. fyne.LogError("Settings un-watch error:", err)
  45. }
  46. }()
  47. watchFileAddTarget(watcher, path)
  48. return watcher
  49. }
  50. func (s *settings) watchSettings() {
  51. s.watcher = watchFile(s.schema.StoragePath(), s.fileChanged)
  52. watchTheme()
  53. }
  54. func (s *settings) stopWatching() {
  55. if s.watcher == nil {
  56. return
  57. }
  58. s.watcher.(*fsnotify.Watcher).Close() // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268
  59. }