mirror of https://github.com/liamg/aminal.git
extra demo tests, more key handling
This commit is contained in:
parent
d3e7784b4d
commit
af62fef8d5
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
||||||
|
echo "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
|
||||||
|
echo "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
|
||||||
|
echo "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
|
||||||
|
echo -n "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
|
||||||
|
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
echo -ne "\x1b[D" # left
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
echo -ne "\x1b[D" # left
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
echo -ne "\x1b[D" # left
|
||||||
|
sleep 2
|
||||||
|
echo -ne "\x1b[J0"
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
printf " "
|
||||||
|
for b in 0 1 2 3 4 5 6 7; do printf " 4${b}m "; done
|
||||||
|
echo
|
||||||
|
for f in "" 30 31 32 33 34 35 36 37; do
|
||||||
|
for s in "" "1;"; do
|
||||||
|
printf "%4sm" "${s}${f}"
|
||||||
|
printf " \033[%sm%s\033[0m" "$s$f" "gYw "
|
||||||
|
for b in 0 1 2 3 4 5 6 7; do
|
||||||
|
printf " \033[4%s;%sm%s\033[0m" "$b" "$s$f" " gYw "
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
done
|
|
@ -0,0 +1,40 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "ABCDEFGHIJKLM"
|
||||||
|
echo "NOPQRSTUVWXYZ"
|
||||||
|
echo "ABCDEFGHIJKLM"
|
||||||
|
echo "NOPQRSTUVWXYZ"
|
||||||
|
echo "ABCDEFGHIJKLM"
|
||||||
|
echo "NOPQRSTUVWXYZ"
|
||||||
|
echo "ABCDEFGHIJKLM"
|
||||||
|
echo "NOPQRSTUVWXYZ"
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[D" # left
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[C" # right
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[C" # right
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[C" # right
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[A" # up
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[B" # down
|
||||||
|
sleep 1
|
||||||
|
echo -n "123"
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[E" # line down (col 0)
|
||||||
|
sleep 1
|
||||||
|
echo -n "ZZZ"
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[F" # line up (col 0)
|
||||||
|
sleep 1
|
||||||
|
echo -n "XXX"
|
||||||
|
sleep 1
|
||||||
|
echo -ne "\x1b[E" # line down (col 0)
|
||||||
|
sleep 1
|
||||||
|
echo
|
10
gui/gui.go
10
gui/gui.go
|
@ -100,7 +100,13 @@ func (gui *GUI) updateTexts() {
|
||||||
|
|
||||||
c, err := gui.terminal.GetCellAtPos(terminal.Position{Line: row, Col: col})
|
c, err := gui.terminal.GetCellAtPos(terminal.Position{Line: row, Col: col})
|
||||||
|
|
||||||
if err != nil || c == nil || c.IsHidden() {
|
if err != nil {
|
||||||
|
//gui.logger.Errorf("Failed to get cell: %s", err)
|
||||||
|
gui.cells[row][col].Hide()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if c == nil || c.IsHidden() {
|
||||||
gui.cells[row][col].Hide()
|
gui.cells[row][col].Hide()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -176,7 +182,7 @@ func (gui *GUI) Render() error {
|
||||||
|
|
||||||
gui.logger.Debugf("Loading font...")
|
gui.logger.Debugf("Loading font...")
|
||||||
//if err := gui.loadFont("/usr/share/fonts/nerd-fonts-complete/ttf/Roboto Mono Nerd Font Complete.ttf", 12); err != nil {
|
//if err := gui.loadFont("/usr/share/fonts/nerd-fonts-complete/ttf/Roboto Mono Nerd Font Complete.ttf", 12); err != nil {
|
||||||
if err := gui.loadFont("./fonts/Roboto.ttf", 12); err != nil {
|
if err := gui.loadFont("./fonts/Roboto.ttf", 13); err != nil {
|
||||||
return fmt.Errorf("Failed to load font: %s", err)
|
return fmt.Errorf("Failed to load font: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
gui/input.go
28
gui/input.go
|
@ -39,6 +39,34 @@ func (gui *GUI) key(w *glfw.Window, key glfw.Key, scancode int, action glfw.Acti
|
||||||
gui.terminal.Write([]byte{0x0a})
|
gui.terminal.Write([]byte{0x0a})
|
||||||
case glfw.KeyBackspace:
|
case glfw.KeyBackspace:
|
||||||
gui.terminal.Write([]byte{0x08})
|
gui.terminal.Write([]byte{0x08})
|
||||||
|
case glfw.KeyUp:
|
||||||
|
gui.terminal.Write([]byte{
|
||||||
|
0x1b,
|
||||||
|
'[',
|
||||||
|
'A',
|
||||||
|
})
|
||||||
|
case glfw.KeyDown:
|
||||||
|
gui.terminal.Write([]byte{
|
||||||
|
0x1b,
|
||||||
|
'[',
|
||||||
|
'B',
|
||||||
|
})
|
||||||
|
case glfw.KeyLeft:
|
||||||
|
gui.terminal.Write([]byte{
|
||||||
|
0x1b,
|
||||||
|
'[',
|
||||||
|
'D',
|
||||||
|
})
|
||||||
|
case glfw.KeyRight:
|
||||||
|
gui.terminal.Write([]byte{
|
||||||
|
0x1b,
|
||||||
|
'[',
|
||||||
|
'C',
|
||||||
|
})
|
||||||
|
case glfw.KeyTab:
|
||||||
|
gui.terminal.Write([]byte{
|
||||||
|
0x09,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//gui.logger.Debugf("Key pressed: 0x%X %q", key, string([]byte{byte(key)}))
|
//gui.logger.Debugf("Key pressed: 0x%X %q", key, string([]byte{byte(key)}))
|
||||||
|
|
|
@ -15,7 +15,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
if b == 0x1b { // if the byte is an escape character, read the next byte to determine which one
|
if b == 0x1b { // if the byte is an escape character, read the next byte to determine which one
|
||||||
b = <-buffer
|
b = <-buffer
|
||||||
switch b {
|
switch b {
|
||||||
case 0x5b: // CSI: Control Sequence Introducer ]
|
case '[': // CSI: Control Sequence Introducer [
|
||||||
var final rune
|
var final rune
|
||||||
param := ""
|
param := ""
|
||||||
intermediate := ""
|
intermediate := ""
|
||||||
|
@ -61,7 +61,12 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
terminal.position.Line += distance
|
_, h := terminal.GetSize()
|
||||||
|
if terminal.position.Line+distance >= h {
|
||||||
|
terminal.position.Line = h - 1
|
||||||
|
} else {
|
||||||
|
terminal.position.Line += distance
|
||||||
|
}
|
||||||
case 'C':
|
case 'C':
|
||||||
|
|
||||||
distance := 1
|
distance := 1
|
||||||
|
@ -167,6 +172,23 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch n {
|
switch n {
|
||||||
|
|
||||||
|
case "1":
|
||||||
|
line := terminal.getBufferedLine(terminal.position.Line)
|
||||||
|
if line != nil {
|
||||||
|
for i := 0; i <= terminal.position.Col; i++ {
|
||||||
|
if i < len(line.Cells) {
|
||||||
|
line.Cells[i].r = ' '
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < terminal.position.Line; i++ {
|
||||||
|
line := terminal.getBufferedLine(i)
|
||||||
|
if line != nil {
|
||||||
|
line.Cells = []Cell{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case "0", "":
|
case "0", "":
|
||||||
line := terminal.getBufferedLine(terminal.position.Line)
|
line := terminal.getBufferedLine(terminal.position.Line)
|
||||||
if line != nil {
|
if line != nil {
|
||||||
|
@ -179,19 +201,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
line.Cells = []Cell{}
|
line.Cells = []Cell{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "1":
|
|
||||||
line := terminal.getBufferedLine(terminal.position.Line)
|
|
||||||
if line != nil {
|
|
||||||
for i := 0; i < terminal.position.Col; i++ {
|
|
||||||
line.Cells[i].r = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for i := 0; i < terminal.position.Line; i++ {
|
|
||||||
line := terminal.getBufferedLine(i)
|
|
||||||
if line != nil {
|
|
||||||
line.Cells = []Cell{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "2":
|
case "2":
|
||||||
_, h := terminal.GetSize()
|
_, h := terminal.GetSize()
|
||||||
for i := 0; i < h; i++ {
|
for i := 0; i < h; i++ {
|
||||||
|
@ -206,6 +216,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
terminal.lines = []Line{}
|
terminal.lines = []Line{}
|
||||||
terminal.position.Col = 0
|
terminal.position.Col = 0
|
||||||
terminal.position.Line = 0
|
terminal.position.Line = 0
|
||||||
|
|
||||||
default:
|
default:
|
||||||
terminal.logger.Errorf("Unknown CSI ED sequence: %s", n)
|
terminal.logger.Errorf("Unknown CSI ED sequence: %s", n)
|
||||||
}
|
}
|
||||||
|
@ -217,20 +228,20 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch n {
|
switch n {
|
||||||
case "0", "":
|
|
||||||
line := terminal.getBufferedLine(terminal.position.Line)
|
|
||||||
if line != nil {
|
|
||||||
if terminal.position.Col < len(line.Cells) {
|
|
||||||
line.Cells = line.Cells[:terminal.position.Col]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "1":
|
case "1":
|
||||||
line := terminal.getBufferedLine(terminal.position.Line)
|
line := terminal.getBufferedLine(terminal.position.Line)
|
||||||
if line != nil {
|
if line != nil {
|
||||||
for i := 0; i < terminal.position.Col; i++ {
|
for i := 0; i <= terminal.position.Col; i++ {
|
||||||
line.Cells[i].r = 0
|
if i < len(line.Cells) {
|
||||||
|
line.Cells[i].r = ' '
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case "0", "":
|
||||||
|
line := terminal.getBufferedLine(terminal.position.Line)
|
||||||
|
if line != nil {
|
||||||
|
line.Cells = line.Cells[:terminal.position.Col]
|
||||||
|
}
|
||||||
case "2":
|
case "2":
|
||||||
line := terminal.getBufferedLine(terminal.position.Line)
|
line := terminal.getBufferedLine(terminal.position.Line)
|
||||||
if line != nil {
|
if line != nil {
|
||||||
|
@ -247,17 +258,17 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
switch param {
|
switch param {
|
||||||
case "0", "":
|
case "0", "":
|
||||||
terminal.cellAttr = terminal.defaultCellAttr
|
terminal.cellAttr = terminal.defaultCellAttr
|
||||||
case "1":
|
case "1", "01":
|
||||||
terminal.cellAttr.Bold = true
|
terminal.cellAttr.Bold = true
|
||||||
case "2":
|
case "2", "02":
|
||||||
terminal.cellAttr.Dim = true
|
terminal.cellAttr.Dim = true
|
||||||
case "4":
|
case "4", "04":
|
||||||
terminal.cellAttr.Underline = true
|
terminal.cellAttr.Underline = true
|
||||||
case "5":
|
case "5", "05":
|
||||||
terminal.cellAttr.Blink = true
|
terminal.cellAttr.Blink = true
|
||||||
case "7":
|
case "7", "07":
|
||||||
terminal.cellAttr.Reverse = true
|
terminal.cellAttr.Reverse = true
|
||||||
case "8":
|
case "8", "08":
|
||||||
terminal.cellAttr.Hidden = true
|
terminal.cellAttr.Hidden = true
|
||||||
case "21":
|
case "21":
|
||||||
terminal.cellAttr.Bold = false
|
terminal.cellAttr.Bold = false
|
||||||
|
@ -288,7 +299,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
case "36":
|
case "36":
|
||||||
terminal.cellAttr.FgColour = terminal.colourScheme.CyanFg
|
terminal.cellAttr.FgColour = terminal.colourScheme.CyanFg
|
||||||
case "37":
|
case "37":
|
||||||
terminal.cellAttr.FgColour = terminal.colourScheme.LightGreyFg
|
terminal.cellAttr.FgColour = terminal.colourScheme.WhiteFg
|
||||||
case "90":
|
case "90":
|
||||||
terminal.cellAttr.FgColour = terminal.colourScheme.DarkGreyFg
|
terminal.cellAttr.FgColour = terminal.colourScheme.DarkGreyFg
|
||||||
case "91":
|
case "91":
|
||||||
|
@ -322,7 +333,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
case "46":
|
case "46":
|
||||||
terminal.cellAttr.BgColour = terminal.colourScheme.CyanBg
|
terminal.cellAttr.BgColour = terminal.colourScheme.CyanBg
|
||||||
case "47":
|
case "47":
|
||||||
terminal.cellAttr.BgColour = terminal.colourScheme.LightGreenBg
|
terminal.cellAttr.BgColour = terminal.colourScheme.WhiteBg
|
||||||
case "100":
|
case "100":
|
||||||
terminal.cellAttr.BgColour = terminal.colourScheme.DarkGreyBg
|
terminal.cellAttr.BgColour = terminal.colourScheme.DarkGreyBg
|
||||||
case "101":
|
case "101":
|
||||||
|
@ -344,7 +355,7 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
terminal.logger.Errorf("Unknown SGR control sequence: (ESC[%s%s%s)", param, intermediate, string(final))
|
terminal.logger.Errorf("Unknown SGR control sequence: (ESC[%s%s%s)", param, intermediate, string(final))
|
||||||
}
|
}
|
||||||
|
|
||||||
terminal.logger.Debugf("SGR control sequence: (ESC[%s%s%s)", param, intermediate, string(final))
|
//terminal.logger.Debugf("SGR control sequence: (ESC[%s%s%s)", param, intermediate, string(final))
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -353,6 +364,10 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
terminal.showCursor()
|
terminal.showCursor()
|
||||||
case "?25l":
|
case "?25l":
|
||||||
terminal.hideCursor()
|
terminal.hideCursor()
|
||||||
|
case "?12h":
|
||||||
|
// todo enable cursor blink
|
||||||
|
case "?12l":
|
||||||
|
// todo disable cursor blink
|
||||||
default:
|
default:
|
||||||
terminal.logger.Errorf("Unknown CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
terminal.logger.Errorf("Unknown CSI control sequence: 0x%02X (ESC[%s%s%s)", final, param, intermediate, string(final))
|
||||||
}
|
}
|
||||||
|
@ -396,12 +411,14 @@ func (terminal *Terminal) processInput(buffer chan rune) {
|
||||||
|
|
||||||
switch b {
|
switch b {
|
||||||
case 0x0a:
|
case 0x0a:
|
||||||
terminal.position.Line++
|
|
||||||
_, h := terminal.GetSize()
|
_, h := terminal.GetSize()
|
||||||
if terminal.position.Line >= h {
|
if terminal.position.Line+1 >= h {
|
||||||
terminal.position.Line--
|
terminal.lines = append(terminal.lines, NewLine())
|
||||||
|
} else {
|
||||||
|
terminal.position.Line++
|
||||||
}
|
}
|
||||||
terminal.lines = append(terminal.lines, NewLine())
|
|
||||||
case 0x0d:
|
case 0x0d:
|
||||||
terminal.position.Col = 0
|
terminal.position.Col = 0
|
||||||
case 0x08:
|
case 0x08:
|
||||||
|
|
|
@ -105,6 +105,7 @@ func New(pty *os.File, logger *zap.SugaredLogger, colourScheme ColourScheme) *Te
|
||||||
cellAttr: defaultCellAttr,
|
cellAttr: defaultCellAttr,
|
||||||
defaultCellAttr: defaultCellAttr,
|
defaultCellAttr: defaultCellAttr,
|
||||||
colourScheme: colourScheme,
|
colourScheme: colourScheme,
|
||||||
|
cursorVisible: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,10 +247,6 @@ func (terminal *Terminal) setRuneAtPos(pos Position, r rune) error {
|
||||||
return fmt.Errorf("Col %d does not exist", pos.Col)
|
return fmt.Errorf("Col %d does not exist", pos.Col)
|
||||||
}
|
}
|
||||||
|
|
||||||
if pos.Line == 0 && pos.Col == 0 {
|
|
||||||
fmt.Printf("\n\nSetting %d %d to %q\n\n\n", pos.Line, pos.Col, string(r))
|
|
||||||
}
|
|
||||||
|
|
||||||
for terminal.position.Line >= len(terminal.lines) {
|
for terminal.position.Line >= len(terminal.lines) {
|
||||||
terminal.lines = append(terminal.lines, NewLine())
|
terminal.lines = append(terminal.lines, NewLine())
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ package v41
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/4ydx/gltext"
|
"github.com/4ydx/gltext"
|
||||||
"github.com/go-gl/gl/v4.1-core/gl"
|
"github.com/go-gl/gl/v4.1-core/gl"
|
||||||
"github.com/go-gl/mathgl/mgl32"
|
"github.com/go-gl/mathgl/mgl32"
|
||||||
|
|
Loading…
Reference in New Issue