From 4554892b6a041aed35608a853470fe6f38326696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20B=C3=A4rtschi?= Date: Thu, 30 Jan 2025 11:09:44 +0100 Subject: [PATCH] raw mode --- go.mod | 3 +-- go.sum | 2 ++ main.go | 12 ++++++++---- term/term.go | 6 +++++- term/term_unix.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ utils/utils.go | 3 +-- 6 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 go.sum create mode 100644 term/term_unix.go diff --git a/go.mod b/go.mod index ac05136..11435ba 100644 --- a/go.mod +++ b/go.mod @@ -2,5 +2,4 @@ module robaertschi.xyz/robaertschi/tt go 1.23.4 -require ( -) +require golang.org/x/sys v0.29.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0664caa --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/main.go b/main.go index 977ef7a..388f628 100644 --- a/main.go +++ b/main.go @@ -14,8 +14,12 @@ import ( ) func main() { - r, c, err := term.GetCursorPosition() - fmt.Printf("%d, %d, %v\n", r, c, err) + err := term.EnterRawMode() + if err != nil { + fmt.Printf("could not enter raw mode %v", err) + return + } + defer term.LeaveRawMode() flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s [flags] input\nPossible flags:\n", os.Args[0]) @@ -35,7 +39,7 @@ func main() { input := flag.Arg(0) if input == "" { flag.Usage() - os.Exit(1) + term.Exit(1) } if output == "" { @@ -58,6 +62,6 @@ func main() { err = build.NewSourceProgram(input, output).Build(asm.Fasm, *emitAsmOnly, build.ToPrintFlags(toPrint)) if err != nil { logger.Fatalln(err) - os.Exit(1) + term.Exit(1) } } diff --git a/term/term.go b/term/term.go index 3fff53c..feb7a56 100644 --- a/term/term.go +++ b/term/term.go @@ -3,7 +3,6 @@ package term import ( "errors" "fmt" - "internal/syscall/unix" "os" ) @@ -184,3 +183,8 @@ func GetCursorPosition() (row, column int, err error) { return } + +func Exit(val int) { + LeaveRawMode() + os.Exit(val) +} diff --git a/term/term_unix.go b/term/term_unix.go new file mode 100644 index 0000000..5a966b8 --- /dev/null +++ b/term/term_unix.go @@ -0,0 +1,47 @@ +//go:build unix +// +build unix + +package term + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +var restore unix.Termios +var rawModeEnabled = false + +func EnterRawMode() error { + termios, err := unix.IoctlGetTermios(unix.Stdin, unix.TCGETS) + + if err != nil { + return err + } + + restore = *termios + termios.Lflag = termios.Lflag &^ (unix.ECHO | unix.ICANON | unix.ISIG | unix.IEXTEN) + termios.Iflag = termios.Iflag &^ (unix.IXON | unix.ICRNL | unix.BRKINT | unix.INPCK | unix.ISTRIP) + termios.Cflag = termios.Cflag | unix.CS8 + + if err := unix.IoctlSetTermios(unix.Stdin, unix.TCSETSF, termios); err != nil { + return err + } + + rawModeEnabled = true + + return nil +} + +func LeaveRawMode() error { + if !rawModeEnabled { + return errors.New("raw mode is not enabled") + } + + err := unix.IoctlSetTermios(unix.Stdin, unix.TCSETSF, &restore) + if err != nil { + return err + } + rawModeEnabled = false + return nil +} diff --git a/utils/utils.go b/utils/utils.go index 3d30e06..7d70614 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "os" "strings" "sync" @@ -128,7 +127,7 @@ func (l *Logger) Msg(level Level, msg string) { } if level == Fatal { - os.Exit(1) + term.Exit(1) } }