Windows : sous-systeme console, pour qu'ajean se comporte en vraie commande

Dans un terminal, cmd rendait la main avant qu'ajean n'ait rien ecrit : l'invite
se reaffichait puis la sortie arrivait par-dessus. Windows n'attend jamais la fin
d'un programme en sous-systeme graphique. La meme cause empechait les
redirections et les tubes, et rendait 'ajean chat' inutilisable (le shell et
ajean se disputaient l'entree).

Le binaire passe donc en sous-systeme console. La fenetre noire au double-clic,
que le sous-systeme graphique evitait, est traitee autrement : quand aucun autre
processus ne partage notre console, c'est que Windows l'a creee pour nous, donc
que personne ne nous a lances depuis un terminal. On la masque et on la libere.
Les raccourcis demandent en plus un demarrage minimise.

La relance interne (apres mise a jour) passe desormais 'app' explicitement : la
detection ne repond qu'a la question du double-clic, et un processus sans
console du tout ne doit pas avoir a y repondre.

Verifie : ordre d'affichage correct en session cmd, redirection et tube
fonctionnels, 'ajean' sans argument affiche l'aide, et aucune fenetre console
visible au lancement facon double-clic.
This commit is contained in:
nathaninline committed 2026-08-07 21:59:42 +02:00
1 parent 922b7a6862
commit aa965227fc
4 files changed
+68 -85

No files matched your search

+15 -6
View File
@@ -29,11 +29,11 @@ import (
//
// Maintenant, deux cas seulement :
//
// 1. AJEAN n'est pas installé. On DEMANDE : c'est le seul moment où
// l'utilisateur gagne à savoir ce qu'on pose sur sa machine et où. Puis
// copie + PATH + raccourcis, et on démarre depuis la copie installée. Un
// refus vaut « pas maintenant » et la question revient au prochain lancement
// du fichier : mémorisé, il ne laissait AUCUN moyen d'installer AJEAN.
// 1. AJEAN n'est pas installé. On installe, sans demander : rester à
// l'emplacement du fichier téléchargé ne donne pas une installation
// utilisable, la question n'avait donc qu'une réponse. Copie + PATH +
// raccourcis, un message qui dit ce qui a été fait, et on démarre depuis la
// copie installée.
//
// 2. AJEAN est déjà installé. Le fichier téléchargé se comporte en installeur de
// mise à jour, avec trois situations bien distinctes (voir runAsInstaller) :
@@ -131,7 +131,12 @@ func appFirstRun() bool {
// Renvoie false si le lancement échoue, auquel cas l'exécutable courant prend le
// relais : mieux vaut démarrer depuis le mauvais dossier que pas du tout.
func launch(target string) bool {
cmd := exec.Command(target)
// « app » est passé EXPLICITEMENT plutôt que de compter sur la détection du
// mode application. Celle-ci répond à une seule question — « ai-je été
// double-cliqué ? » — en regardant qui partage notre console. Un processus
// lancé sans console du tout (relance après mise à jour) ne peut pas y
// répondre, et se serait retrouvé à afficher l'aide au lieu de démarrer.
cmd := exec.Command(target, "app")
cmd.Dir = filepath.Dir(target)
return cmd.Start() == nil
}
@@ -404,6 +409,10 @@ foreach ($d in @($progs, [Environment]::GetFolderPath('Desktop'))) {
$s.TargetPath=$t
$s.WorkingDirectory=(Split-Path $t)
$s.Description='AJEAN, votre IA locale'
# Minimisé (7) : le binaire étant en sous-système console, Windows lui alloue
# une console au lancement. AJEAN la referme aussitôt, mais demander un
# démarrage minimisé garantit qu'elle n'est jamais peinte à l'écran.
$s.WindowStyle=7
$s.Save()
$done+=$d
} catch {}