| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //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
- }
|