From 19f476b932f0d2defd1baee36081198d800fc953 Mon Sep 17 00:00:00 2001 From: Apologieze <47333595+Apologieze@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:49:39 -0400 Subject: [PATCH] Added single instance --- go.mod | 1 + go.sum | 2 ++ src/main.go | 17 ++++++++++--- src/singleInstance.go | 58 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 src/singleInstance.go diff --git a/go.mod b/go.mod index c85ccb4..a09c872 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/dweymouth/fyne-tooltip v0.2.1 github.com/gen2brain/beeep v0.0.0-20240516210008-9c006672e7f4 github.com/hugolgst/rich-go v0.0.0-20240715122152-74618cc1ace2 + github.com/nightlyone/lockfile v1.0.0 ) require ( diff --git a/go.sum b/go.sum index f2be666..ae9d6e0 100644 --- a/go.sum +++ b/go.sum @@ -275,6 +275,8 @@ github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nightlyone/lockfile v1.0.0 h1:RHep2cFKK4PonZJDdEl4GmkabuhbsRMgk/k3uAmxBiA= +github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= diff --git a/src/main.go b/src/main.go index 70a7841..33454d2 100644 --- a/src/main.go +++ b/src/main.go @@ -29,7 +29,7 @@ import ( const ( AppID = "fr.apologize.benri" - AppName = "AnimeGUI" + AppName = "Benri" ) var ( @@ -48,11 +48,19 @@ var ( ) func main() { + appW = app.NewWithID(AppID) + + config.CreateConfig(appW.Preferences()) + if config.Setting.TrayIcon { + // Initialize lockfile + lock := initLock() + defer lock.Unlock() + } + + go pollingNewAppDetection() go dowloadMPV() - appW = app.NewWithID(AppID) - window = appW.NewWindow(AppName) window.Resize(fyne.NewSize(1000, 700)) window.CenterOnScreen() @@ -69,8 +77,10 @@ func main() { if !changedToken { fmt.Println(window.Title(), AppName) initMainApp() + appW.Run() } + } func updateAnimeNames(data *binding.ExternalStringList) (first bool) { @@ -336,7 +346,6 @@ func initMainApp() { imageContainer.Refresh() } - config.CreateConfig(appW.Preferences()) initSettingDialog() initPlayMorePopUp() diff --git a/src/singleInstance.go b/src/singleInstance.go new file mode 100644 index 0000000..ef28273 --- /dev/null +++ b/src/singleInstance.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "github.com/charmbracelet/log" + "github.com/nightlyone/lockfile" + "os" + "time" +) + +var ( + lockPath = os.TempDir() + "/" + AppName + ".lock" + notifyPath = os.TempDir() + "/" + AppName + ".notify" +) + +func initLock() lockfile.Lockfile { + lock, err := lockfile.New(lockPath) + if err != nil { + fmt.Printf("Cannot init lockfile: %v\n", err) + os.Exit(1) + } + + // Try to acquire the lock + err = lock.TryLock() + if err != nil { + fmt.Println("Application is already running") + + // Touch the notification file to signal the first instance + currentTime := []byte(fmt.Sprintf("%d", time.Now().UnixNano())) + _ = os.WriteFile(notifyPath, currentTime, 0644) + + os.Exit(0) + } + return lock +} + +func pollingNewAppDetection() { + var lastModTime time.Time + + info, err := os.Stat(notifyPath) + if err == nil { + lastModTime = info.ModTime() + } + + for { + // Check if notification file exists + info, err := os.Stat(notifyPath) + + if err == nil && info.ModTime().After(lastModTime) { + log.Info("New instance detected, bringing to front") + window.Show() + window.RequestFocus() + lastModTime = info.ModTime() + } + + time.Sleep(500 * time.Millisecond) + } +}