mirror of https://github.com/liamg/aminal.git
more codes
This commit is contained in:
parent
83988cd2ce
commit
844ac645ce
|
@ -232,18 +232,6 @@ func (buffer *Buffer) MovePosition(x int16, y int16) {
|
||||||
buffer.SetPosition(toX, toY)
|
buffer.SetPosition(toX, toY)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (buffer *Buffer) ShowCursor() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (buffer *Buffer) HideCursor() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (buffer *Buffer) SetCursorBlink(enabled bool) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (buffer *Buffer) SetPosition(col uint16, line uint16) {
|
func (buffer *Buffer) SetPosition(col uint16, line uint16) {
|
||||||
defer buffer.emitDisplayChange()
|
defer buffer.emitDisplayChange()
|
||||||
if col >= buffer.ViewWidth() {
|
if col >= buffer.ViewWidth() {
|
||||||
|
@ -339,11 +327,31 @@ func (buffer *Buffer) EraseDisplay() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) EraseCharacters(n int) {
|
||||||
|
defer buffer.emitDisplayChange()
|
||||||
|
|
||||||
|
line := buffer.getCurrentLine()
|
||||||
|
|
||||||
|
max := int(buffer.cursorX) + n
|
||||||
|
if max > len(line.cells) {
|
||||||
|
max = len(line.cells)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := int(buffer.cursorX); i < max; i++ {
|
||||||
|
line.cells[i].erase()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (buffer *Buffer) EraseDisplayFromCursor() {
|
func (buffer *Buffer) EraseDisplayFromCursor() {
|
||||||
defer buffer.emitDisplayChange()
|
defer buffer.emitDisplayChange()
|
||||||
line := buffer.getCurrentLine()
|
line := buffer.getCurrentLine()
|
||||||
|
|
||||||
line.cells = line.cells[:buffer.cursorX]
|
max := int(buffer.cursorX)
|
||||||
|
if max > len(line.cells) {
|
||||||
|
max = len(line.cells)
|
||||||
|
}
|
||||||
|
|
||||||
|
line.cells = line.cells[:max]
|
||||||
for i := buffer.cursorY + 1; i < buffer.ViewHeight(); i++ {
|
for i := buffer.cursorY + 1; i < buffer.ViewHeight(); i++ {
|
||||||
rawLine := buffer.convertViewLineToRawLine(i)
|
rawLine := buffer.convertViewLineToRawLine(i)
|
||||||
if int(rawLine) < len(buffer.lines) {
|
if int(rawLine) < len(buffer.lines) {
|
||||||
|
|
|
@ -195,9 +195,11 @@ func (gui *GUI) Render() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cx := int(gui.terminal.GetLogicalCursorX())
|
if gui.terminal.Modes().ShowCursor {
|
||||||
cy := int(gui.terminal.GetLogicalCursorY())
|
cx := int(gui.terminal.GetLogicalCursorX())
|
||||||
gui.renderer.DrawCursor(cx, cy, gui.config.ColourScheme.Cursor)
|
cy := int(gui.terminal.GetLogicalCursorY())
|
||||||
|
gui.renderer.DrawCursor(cx, cy, gui.config.ColourScheme.Cursor)
|
||||||
|
}
|
||||||
|
|
||||||
_ = fps
|
_ = fps
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -11,6 +11,69 @@ var csiSequenceMap = map[rune]csiSequenceHandler{
|
||||||
'P': csiDeleteHandler,
|
'P': csiDeleteHandler,
|
||||||
'J': csiEraseInDisplayHandler,
|
'J': csiEraseInDisplayHandler,
|
||||||
'K': csiEraseInLineHandler,
|
'K': csiEraseInLineHandler,
|
||||||
|
'h': csiSetModeHandler,
|
||||||
|
'l': csiResetModeHandler,
|
||||||
|
'd': csiLinePositionAbsolute,
|
||||||
|
't': csiWindowManipulation,
|
||||||
|
'X': csiEraseCharactersHandler,
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiSetMode(modeStr string, enabled bool, terminal *Terminal) error {
|
||||||
|
switch modeStr {
|
||||||
|
case "?1":
|
||||||
|
terminal.modes.ApplicationCursorKeys = enabled
|
||||||
|
case "?12":
|
||||||
|
terminal.modes.BlinkingCursor = enabled
|
||||||
|
case "?25":
|
||||||
|
terminal.modes.ShowCursor = enabled
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("Unsupported CSI %sl code", modeStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiEraseCharactersHandler(params []string, intermediate string, terminal *Terminal) error {
|
||||||
|
count := 1
|
||||||
|
if len(params) > 0 {
|
||||||
|
var err error
|
||||||
|
count, err = strconv.Atoi(params[0])
|
||||||
|
if err != nil {
|
||||||
|
count = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
terminal.buffer.EraseCharacters(count)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiResetModeHandler(params []string, intermediate string, terminal *Terminal) error {
|
||||||
|
return csiSetMode(strings.Join(params, ""), false, terminal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiSetModeHandler(params []string, intermediate string, terminal *Terminal) error {
|
||||||
|
return csiSetMode(strings.Join(params, ""), true, terminal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiWindowManipulation(params []string, intermediate string, terminal *Terminal) error {
|
||||||
|
// @todo this
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func csiLinePositionAbsolute(params []string, intermediate string, terminal *Terminal) error {
|
||||||
|
col := 1
|
||||||
|
if len(params) > 0 {
|
||||||
|
var err error
|
||||||
|
col, err = strconv.Atoi(params[0])
|
||||||
|
if err != nil {
|
||||||
|
col = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
terminal.buffer.SetPosition(uint16(col), terminal.buffer.CursorLine())
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type csiSequenceHandler func(params []string, intermediate string, terminal *Terminal) error
|
type csiSequenceHandler func(params []string, intermediate string, terminal *Terminal) error
|
||||||
|
@ -153,19 +216,7 @@ CSI:
|
||||||
terminal.buffer.SetPosition(uint16(x-1), uint16(y-1))
|
terminal.buffer.SetPosition(uint16(x-1), uint16(y-1))
|
||||||
|
|
||||||
default:
|
default:
|
||||||
switch param + intermediate + string(final) {
|
err = fmt.Errorf("Unknown CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
||||||
case "?25h":
|
|
||||||
terminal.buffer.ShowCursor()
|
|
||||||
case "?25l":
|
|
||||||
terminal.buffer.HideCursor()
|
|
||||||
case "?12h":
|
|
||||||
terminal.buffer.SetCursorBlink(true)
|
|
||||||
case "?12l":
|
|
||||||
terminal.buffer.SetCursorBlink(false)
|
|
||||||
default:
|
|
||||||
err = fmt.Errorf("Unknown CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
terminal.logger.Debugf("Received CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
terminal.logger.Debugf("Received CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
||||||
|
|
|
@ -26,6 +26,13 @@ type Terminal struct {
|
||||||
titleHandlers []chan bool
|
titleHandlers []chan bool
|
||||||
pauseChan chan bool
|
pauseChan chan bool
|
||||||
resumeChan chan bool
|
resumeChan chan bool
|
||||||
|
modes Modes
|
||||||
|
}
|
||||||
|
|
||||||
|
type Modes struct {
|
||||||
|
ShowCursor bool
|
||||||
|
ApplicationCursorKeys bool
|
||||||
|
BlinkingCursor bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Winsize struct {
|
type Winsize struct {
|
||||||
|
@ -53,6 +60,9 @@ func New(pty *os.File, logger *zap.SugaredLogger, config config.Config) *Termina
|
||||||
titleHandlers: []chan bool{},
|
titleHandlers: []chan bool{},
|
||||||
pauseChan: make(chan bool, 1),
|
pauseChan: make(chan bool, 1),
|
||||||
resumeChan: make(chan bool, 1),
|
resumeChan: make(chan bool, 1),
|
||||||
|
modes: Modes{
|
||||||
|
ShowCursor: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +78,10 @@ func (terminal *Terminal) AttachTitleChangeHandler(handler chan bool) {
|
||||||
terminal.titleHandlers = append(terminal.titleHandlers, handler)
|
terminal.titleHandlers = append(terminal.titleHandlers, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (terminal *Terminal) Modes() Modes {
|
||||||
|
return terminal.modes
|
||||||
|
}
|
||||||
|
|
||||||
func (terminal *Terminal) emitTitleChange() {
|
func (terminal *Terminal) emitTitleChange() {
|
||||||
for _, h := range terminal.titleHandlers {
|
for _, h := range terminal.titleHandlers {
|
||||||
go func(c chan bool) {
|
go func(c chan bool) {
|
||||||
|
|
Loading…
Reference in New Issue