1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
// License: GPLv3 Copyright: 2022, Kovid Goyal, <kovid at kovidgoyal.net>
package tui
import (
"errors"
"fmt"
"os"
"os/exec"
"github.com/kovidgoyal/kitty/tools/tui/loop"
)
var _ = fmt.Print
func HoldTillEnter(start_with_newline bool) {
lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking)
if err != nil {
return
}
lp.OnInitialize = func() (string, error) {
lp.SetCursorVisible(false)
if start_with_newline {
lp.QueueWriteString("\r\n")
}
lp.QueueWriteString("\x1b[1;32mPress Enter or Esc to exit\x1b[m")
return "", nil
}
lp.OnFinalize = func() string {
lp.SetCursorVisible(true)
return ""
}
lp.OnKeyEvent = func(event *loop.KeyEvent) error {
if event.MatchesPressOrRepeat("enter") || event.MatchesPressOrRepeat("kp_enter") || event.MatchesPressOrRepeat("esc") || event.MatchesPressOrRepeat("ctrl+c") || event.MatchesPressOrRepeat("ctrl+d") {
event.Handled = true
lp.Quit(0)
}
return nil
}
lp.Run()
}
func ExecAndHoldTillEnter(cmdline []string) (int, error) {
if len(cmdline) == 0 {
HoldTillEnter(false)
return 0, nil
}
var cmd *exec.Cmd
if len(cmdline) == 1 {
cmd = exec.Command(cmdline[0])
} else {
cmd = exec.Command(cmdline[0], cmdline[1:]...)
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
var ee *exec.ExitError
err := cmd.Run()
is_exit_error := err != nil && errors.As(err, &ee)
if err != nil && !is_exit_error {
return 1, err
}
HoldTillEnter(true)
if err == nil {
return 0, nil
}
if is_exit_error {
return ee.ExitCode(), nil
}
return 1, err
}
|