add (restore) support for detach keys

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof 2025-11-10 11:07:07 +01:00 committed by Guillaume Lours
parent 45def51117
commit 6e55832b1c
6 changed files with 34 additions and 19 deletions

View File

@ -22,6 +22,7 @@ import (
"fmt"
"math"
"os"
"strings"
"syscall"
"time"
@ -90,6 +91,7 @@ const (
type LogKeyboard struct {
kError KeyboardError
Watch *KeyboardWatch
Detach func()
IsDockerDesktopActive bool
logLevel KEYBOARD_LOG_LEVEL
signalChannel chan<- os.Signal
@ -161,29 +163,23 @@ func (lk *LogKeyboard) printNavigationMenu() {
}
func (lk *LogKeyboard) navigationMenu() string {
var openDDInfo string
var items []string
if lk.IsDockerDesktopActive {
openDDInfo = shortcutKeyColor("v") + navColor(" View in Docker Desktop")
items = append(items, shortcutKeyColor("v")+navColor(" View in Docker Desktop"))
}
var openDDUI string
if openDDInfo != "" {
openDDUI = navColor(" ")
}
if lk.IsDockerDesktopActive {
openDDUI = openDDUI + shortcutKeyColor("o") + navColor(" View Config")
items = append(items, shortcutKeyColor("o")+navColor(" View Config"))
}
var watchInfo string
if openDDInfo != "" || openDDUI != "" {
watchInfo = navColor(" ")
}
isEnabled := " Enable"
if lk.Watch != nil && lk.Watch.Watching {
isEnabled = " Disable"
}
watchInfo = watchInfo + shortcutKeyColor("w") + navColor(isEnabled+" Watch")
return openDDInfo + openDDUI + watchInfo
items = append(items, shortcutKeyColor("w")+navColor(isEnabled+" Watch"))
items = append(items, shortcutKeyColor("d")+navColor(" Detach"))
return strings.Join(items, " ")
}
func (lk *LogKeyboard) clearNavigationMenu() {
@ -290,6 +286,9 @@ func (lk *LogKeyboard) ToggleWatch(ctx context.Context, options api.UpOptions) {
func (lk *LogKeyboard) HandleKeyEvents(ctx context.Context, event keyboard.KeyEvent, project *types.Project, options api.UpOptions) {
switch kRune := event.Rune; kRune {
case 'd':
lk.clearNavigationMenu()
lk.Detach()
case 'v':
lk.openDockerDesktop(ctx, project)
case 'w':
@ -336,6 +335,10 @@ func (lk *LogKeyboard) EnableWatch(enabled bool, watcher Feature) {
}
}
func (lk *LogKeyboard) EnableDetach(detach func()) {
lk.Detach = detach
}
func allocateSpace(lines int) {
for i := 0; i < lines; i++ {
clearLine()

View File

@ -157,6 +157,7 @@ func (s *composeService) getContainerStreams(ctx context.Context, container stri
Stdout: true,
Stderr: true,
Logs: false,
DetachKeys: s.configFile().DetachKeys,
})
if err == nil {
stdout = ContainerStdout{HijackedResponse: cnx}

View File

@ -31,8 +31,13 @@ func (s *composeService) Attach(ctx context.Context, projectName string, options
return err
}
detachKeys := options.DetachKeys
if detachKeys == "" {
detachKeys = s.configFile().DetachKeys
}
var attach container.AttachOptions
attach.DetachKeys = options.DetachKeys
attach.DetachKeys = detachKeys
attach.NoStdin = options.NoStdin
attach.Proxy = options.Proxy
return container.RunAttach(ctx, s.dockerCli, target.ID, &attach)

View File

@ -49,6 +49,7 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types.
OpenStdin: !opts.Detach && opts.Interactive,
Attach: !opts.Detach,
Containers: []string{containerID},
DetachKeys: s.configFile().DetachKeys,
})
var stErr cli.StatusError
if errors.As(err, &stErr) {

View File

@ -107,6 +107,10 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options
globalCtx, cancel := context.WithCancel(ctx)
defer cancel()
if navigationMenu != nil {
navigationMenu.EnableDetach(cancel)
}
var (
eg errgroup.Group
mu sync.Mutex

View File

@ -597,6 +597,7 @@ func (s *composeService) exec(ctx context.Context, project *types.Project, servi
exec.Privileged = x.Privileged
exec.Command = x.Command
exec.Workdir = x.WorkingDir
exec.DetachKeys = s.configFile().DetachKeys
for _, v := range x.Environment.ToMapping().Values() {
err := exec.Env.Set(v)
if err != nil {