Files
Loki/internal/loki/sys_tray_darwin.go
T
Loki de6551a153 Rebaptise AJEAN en Loki (fork, lignée conservée)
- module github.com/R0m1k3/Loki, cmd/loki, internal/loki (package loki)
- LOKI_HOME, LOKI_MODEL_DIRS, LOKI_SERVICE, LOKI_DL_CONNS ; /etc/loki ;
  units loki-engine / loki-ui ; binaire et aide CLI
- updateRepo pointe sur R0m1k3/Loki (l'auto-update ne tirera plus les
  binaires AJEAN amont)

Conservé à l'identique : le domaine ajean.link (service de tunnel amont),
les littéraux de migration 0.7.x (migrate_07.go), RELEASE_NOTES.md et
LICENSE (historique et licence de l'amont).

go build/vet/test : verts.
2026-08-14 21:33:15 +00:00

56 lines
2.0 KiB
Go

//go:build darwin
package loki
// sys_tray_darwin.go — icône de Loki dans la barre de menus macOS (en haut à
// droite, à côté de l'horloge), pendant exact du system tray Windows : quand on
// ouvre Loki.app, l'UI web s'ouvre dans le navigateur ET l'icône apparaît, avec
// le menu « Ouvrir Loki » / « Quitter ».
//
// Contrairement à Windows, systray passe ici par Cocoa → CGO obligatoire : les
// binaires macOS sont donc compilés sur un runner macOS (voir release.yml), et
// le bundle est marqué LSUIElement (pas d'icône dans le Dock, uniquement la
// barre de menus).
import (
"os"
"github.com/getlantern/systray"
)
// runTray fait tourner l'icône de la barre de menus. Bloque jusqu'à « Quitter ».
// À appeler depuis la goroutine principale : Cocoa exige le thread main.
func runTray(url string) {
systray.Run(func() {
// Icône « template » : macOS n'en garde que la forme (couche alpha) et la
// colore selon le thème. Indispensable depuis que la marque est noire —
// une icône noire « en dur » est illisible sur une barre de menus sombre.
systray.SetTemplateIcon(brandTemplatePNG(trayIconSize), BrandIconPNG(trayIconSize))
systray.SetTooltip("Loki — votre IA locale")
mOpen := systray.AddMenuItem("Ouvrir Loki", "Ouvrir l'interface")
systray.AddSeparator()
mQuit := systray.AddMenuItem("Quitter", "Arrêter Loki")
go func() {
for {
select {
case <-mOpen.ClickedCh:
_ = openBrowser(url)
case <-mQuit.ClickedCh:
systray.Quit()
return
}
}
}()
}, func() {
// « Quitter » arrête l'application : l'interface et, avec elle, le
// tunnel d'accès distant qui tourne dans ce process.
//
// Le MOTEUR, lui, n'est pas arrêté : sous macOS c'est un daemon launchd,
// que seul root peut piloter. Fermer une interface n'a pas à arrêter un
// service système. Sous Windows, où l'app est propriétaire du moteur,
// « Quitter » l'arrête bel et bien (voir sys_tray_windows.go).
os.Exit(0)
})
}