//go:build !android && !ios && !mobile && !js && !wasm && !test_web_driver // +build !android,!ios,!mobile,!js,!wasm,!test_web_driver package app import ( "os" "path/filepath" "fyne.io/fyne/v2" "github.com/fsnotify/fsnotify" ) func watchFileAddTarget(watcher *fsnotify.Watcher, path string) { dir := filepath.Dir(path) ensureDirExists(dir) err := watcher.Add(dir) if err != nil { fyne.LogError("Settings watch error:", err) } } func ensureDirExists(dir string) { if stat, err := os.Stat(dir); err == nil && stat.IsDir() { return } err := os.MkdirAll(dir, 0700) if err != nil { fyne.LogError("Unable to create settings storage:", err) } } func watchFile(path string, callback func()) *fsnotify.Watcher { watcher, err := fsnotify.NewWatcher() if err != nil { fyne.LogError("Failed to watch settings file:", err) return nil } go func() { for event := range watcher.Events { if event.Op.Has(fsnotify.Remove) { // if it was deleted then watch again watcher.Remove(path) // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268 watchFileAddTarget(watcher, path) } else { callback() } } err = watcher.Close() if err != nil { fyne.LogError("Settings un-watch error:", err) } }() watchFileAddTarget(watcher, path) return watcher } func (s *settings) watchSettings() { s.watcher = watchFile(s.schema.StoragePath(), s.fileChanged) watchTheme() } func (s *settings) stopWatching() { if s.watcher == nil { return } s.watcher.(*fsnotify.Watcher).Close() // fsnotify returns false positives, see https://github.com/fsnotify/fsnotify/issues/268 }