12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // License: GPLv3 Copyright: 2022, Kovid Goyal, <kovid at kovidgoyal.net>
- package tui
- import (
- "errors"
- "fmt"
- "os"
- "os/exec"
- "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) {
- if len(cmdline) == 0 {
- HoldTillEnter(false)
- os.Exit(0)
- }
- 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 {
- fmt.Fprintln(os.Stderr, err)
- }
- HoldTillEnter(true)
- if err == nil {
- os.Exit(0)
- }
- if is_exit_error {
- os.Exit(ee.ExitCode())
- }
- os.Exit(1)
- }
|