mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-15 03:08:56 +02:00
Le moteur tourne dans un process detache, qui survit volontairement a la fermeture de l'interface pour garder le modele charge entre deux ouvertures. Mais apres un « Quitter », plus rien ne le pilote et il conserve des dizaines de Go de RAM sans aucune fenetre pour l'expliquer. La fonction de sortie du systray appelle desormais svcStop, qui tue l'arbre (taskkill /T) donc llama-server avec. Windows uniquement : c'est la seule plateforme ou l'app est proprietaire du moteur. Sous Linux et macOS il appartient a systemd ou launchd, et fermer une interface n'a pas a arreter un service systeme. Le redemarrage apres mise a jour ne passe PAS par ce chemin (il a son propre os.Exit), donc une MAJ ne dechargera pas le modele.
56 lines
2.0 KiB
Go
56 lines
2.0 KiB
Go
//go:build darwin
|
|
|
|
package ajean
|
|
|
|
// sys_tray_darwin.go — icône de AJEAN dans la barre de menus macOS (en haut à
|
|
// droite, à côté de l'horloge), pendant exact du system tray Windows : quand on
|
|
// ouvre AJEAN.app, l'UI web s'ouvre dans le navigateur ET l'icône apparaît, avec
|
|
// le menu « Ouvrir AJEAN » / « 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("AJEAN — votre IA locale")
|
|
mOpen := systray.AddMenuItem("Ouvrir AJEAN", "Ouvrir l'interface")
|
|
systray.AddSeparator()
|
|
mQuit := systray.AddMenuItem("Quitter", "Arrêter AJEAN")
|
|
|
|
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)
|
|
})
|
|
}
|