okami.mom/ultraviolet
git clone https://git.nkp.pet/okami.mom/ultraviolet
f678006
upstream
1//go:build windows 2// +build windows 3 4package uv 5 6import ( 7"fmt" 8 9"github.com/charmbracelet/x/term" 10"golang.org/x/sys/windows" 11) 12 13func makeRaw (inTty ,outTty term.File ) (inTtyState ,outTtyState * term.State ,err error ) { 14if inTty == nil || outTty == nil || ! term .IsTerminal (inTty .Fd ())|| ! term .IsTerminal (outTty .Fd ()) { 15return nil ,nil ,ErrNotTerminal 16 } 17 18// Save stdin state and enable VT inpu 19// We also need to enable VT input here. 20inTtyState ,err = term .MakeRaw (inTty .Fd ()) 21if err != nil { 22return nil ,nil ,fmt .Errorf ("error making terminal raw: %w" ,err ) 23 } 24 25// Enable VT input 26var imode uint32 27if err := windows .GetConsoleMode (windows .Handle (inTty .Fd ()),& imode );err != nil { 28return nil ,nil ,fmt .Errorf ("error getting console mode: %w" ,err ) 29 } 30 31if err := windows .SetConsoleMode (windows .Handle (inTty .Fd ()),imode | windows .ENABLE_VIRTUAL_TERMINAL_INPUT );err != nil { 32return nil ,nil ,fmt .Errorf ("error setting console mode: %w" ,err ) 33 } 34 35// Save output screen buffer state and enable VT processing. 36outTtyState ,err = term .GetState (outTty .Fd ()) 37if err != nil { 38return nil ,nil ,fmt .Errorf ("error getting terminal state: %w" ,err ) 39 } 40 41var omode uint32 42if err := windows .GetConsoleMode (windows .Handle (outTty .Fd ()),& omode );err != nil { 43return nil ,nil ,fmt .Errorf ("error getting console mode: %w" ,err ) 44 } 45 46if err := windows .SetConsoleMode (windows .Handle (outTty .Fd ()), 47omode | windows .ENABLE_VIRTUAL_TERMINAL_PROCESSING | 48windows .DISABLE_NEWLINE_AUTO_RETURN );err != nil { 49return nil ,nil ,fmt .Errorf ("error setting console mode: %w" ,err ) 50 } 51 52return inTtyState ,outTtyState ,nil 53} 54 55func getSize (_ ,outTty term.File ) (w ,h int ,err error ) { 56if outTty != nil { 57return term .GetSize (outTty .Fd ())//nolint:wrapcheck 58 } 59return 0 ,0 ,ErrNotTerminal 60} 61 62func getWinsize (inTty ,outTty term.File ) (ws Winsize ,err error ) { 63w ,h ,err := getSize (inTty ,outTty ) 64return Winsize {Col :uint16 (w ),Row :uint16 (h )},err 65} 66 67func optimizeMovements (* term.State ) (useTabs ,useBspace bool ) { 68return supportsBackspace (0 ),supportsHardTabs (0 ) 69} 70 71func supportsBackspace (uint64 )bool { 72return true 73} 74 75func supportsHardTabs (uint64 )bool { 76return true 77}