fix(windows/conpty): pass HPCON value, not &hPC (v0.7.8) #18
22
CHANGELOG.md
22
CHANGELOG.md
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||||
|
|
||||||
|
## v0.7.8
|
||||||
|
|
||||||
|
### Fix régression v0.7.6 : terminaux ouverts en fenêtre externe
|
||||||
|
|
||||||
|
Symptôme rapporté : depuis v0.7.6, cliquer sur PowerShell / cmd dans l'onglet Terminal ouvre une **fenêtre console séparée** au lieu de s'afficher dans le tab xterm.js (régression — v0.7.5 fonctionnait).
|
||||||
|
|
||||||
|
**Cause** : le binding ConPTY introduit en v0.7.6 passait `&hPC` (pointeur vers la variable Go locale) à `UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, …)`. Or cet attribut est un quirk de l'API Win32 : `lpValue` doit être la **valeur du handle** (cast en `PVOID`), **pas** un pointeur vers la variable. Avec `&hPC`, le kernel lisait des octets aléatoires, l'attribut PSEUDOCONSOLE était silencieusement ignoré, et `CreateProcessW` créait une nouvelle console pour l'enfant — d'où la fenêtre externe.
|
||||||
|
|
||||||
|
**Fix** (1 ligne) :
|
||||||
|
|
||||||
|
```go
|
||||||
|
// Avant
|
||||||
|
unsafe.Pointer(&hPC)
|
||||||
|
|
||||||
|
// Après
|
||||||
|
unsafe.Pointer(uintptr(hPC)) // le HPCON value comme PVOID
|
||||||
|
```
|
||||||
|
|
||||||
|
Référence : Microsoft EchoCon sample + bibliothèques Go ConPTY existantes (`UserExistsError/conpty`, `aymanbagabas/go-pty`) utilisent toutes la valeur du handle directement.
|
||||||
|
|
||||||
|
Conséquence : terminaux PowerShell / cmd / WSL s'ouvrent à nouveau **dans** le tab xterm.js avec TTY complet (ANSI, prompt couleur, vim, etc.).
|
||||||
|
|
||||||
## v0.7.7
|
## v0.7.7
|
||||||
|
|
||||||
### Fix : install Windows échoue silencieusement quand une version précédente tourne
|
### Fix : install Windows échoue silencieusement quand une version précédente tourne
|
||||||
|
|||||||
@@ -80,9 +80,15 @@ func startConptySession(cmd *exec.Cmd) (termSession, error) {
|
|||||||
windows.CloseHandle(outRead)
|
windows.CloseHandle(outRead)
|
||||||
return nil, fmt.Errorf("NewProcThreadAttributeList: %w", err)
|
return nil, fmt.Errorf("NewProcThreadAttributeList: %w", err)
|
||||||
}
|
}
|
||||||
|
// PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE is a quirk of the Win32 API: lpValue
|
||||||
|
// is the HPCON *value* (cast to PVOID), not a pointer to the handle. If
|
||||||
|
// we pass &hPC the kernel reads garbage, the PC attribute is silently
|
||||||
|
// ignored, and cmd/pwsh get their own external console window — which is
|
||||||
|
// exactly the regression v0.7.6 introduced. The cbSize stays the size of
|
||||||
|
// the handle (8 bytes on amd64). Reference: Microsoft EchoCon sample.
|
||||||
if err := attrList.Update(
|
if err := attrList.Update(
|
||||||
procThreadAttributePseudoconsole,
|
procThreadAttributePseudoconsole,
|
||||||
unsafe.Pointer(&hPC),
|
unsafe.Pointer(uintptr(hPC)),
|
||||||
unsafe.Sizeof(hPC),
|
unsafe.Sizeof(hPC),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
attrList.Delete()
|
attrList.Delete()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
Name = "muyue"
|
Name = "muyue"
|
||||||
Version = "0.7.7"
|
Version = "0.7.8"
|
||||||
Author = "La Légion de Muyue"
|
Author = "La Légion de Muyue"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user