okami.mom/ultraviolet
git clone https://git.nkp.pet/okami.mom/ultraviolet
f678006
main
1//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || aix 2// +build darwin dragonfly freebsd linux netbsd openbsd solaris aix 3 4package uv 5 6import ( 7"github.com/charmbracelet/x/term" 8"github.com/charmbracelet/x/termios" 9) 10 11func makeRaw (inTty ,outTty term.File ) (inTtyState ,outTtyState * term.State ,err error ) { 12if inTty == nil && outTty == nil { 13return nil ,nil ,ErrNotTerminal 14 } 15 16// Check if we have a terminal. 17for _ ,f := range []term.File {inTty ,outTty } { 18if f == nil { 19continue 20 } 21inTtyState ,err = term .MakeRaw (f .Fd ()) 22if err == nil { 23break 24 } 25 } 26 27if err != nil { 28return nil ,nil ,err //nolint:wrapcheck 29 } 30 31return inTtyState ,outTtyState ,nil 32} 33 34func getWinsize (inTty ,outTty term.File ) (ws Winsize ,err error ) { 35// Try both inTty and outTty to get the size. 36err = ErrNotTerminal 37for _ ,f := range []term.File {inTty ,outTty } { 38if f == nil { 39continue 40 } 41size ,err := termios .GetWinsize (int (f .Fd ())) 42if err == nil { 43return Winsize (* size ),nil 44 } 45 } 46return 47} 48 49func getSize (inTty ,outTty term.File ) (w ,h int ,err error ) { 50ws ,err := getWinsize (inTty ,outTty ) 51return int (ws .Col ),int (ws .Row ),err 52} 53 54func optimizeMovements (state * term.State ) (useTabs ,useBspace bool ) { 55return supportsHardTabs (uint64 (state .Oflag )),supportsBackspace (uint64 (state .Lflag ))//nolint:unconvert,nolintlint 56}