1
0
mirror of https://github.com/taigrr/gopher-os synced 2025-01-18 04:43:13 -08:00

Make TTYs implement io.ByteWriter and add support for TAB/BS chars

This commit is contained in:
Achilleas Anagnostopoulos 2017-05-12 07:54:42 +01:00
parent 0154c132ea
commit d7028cee00
3 changed files with 57 additions and 16 deletions

View File

@ -5,6 +5,7 @@ import "io"
// Tty is implemented by objects that can register themselves as ttys.
type Tty interface {
io.Writer
io.ByteWriter
// Position returns the current cursor position (x, y).
Position() (uint16, uint16)

View File

@ -5,6 +5,7 @@ import "github.com/achilleasa/gopher-os/kernel/driver/video/console"
const (
defaultFg = console.LightGrey
defaultBg = console.Black
tabWidth = 4
)
// Vt implements a simple terminal that can process LF and CR characters. The
@ -59,26 +60,47 @@ func (t *Vt) SetPosition(x, y uint16) {
// Write implements io.Writer.
func (t *Vt) Write(data []byte) (int, error) {
attr := t.curAttr
for _, b := range data {
switch b {
case '\r':
t.cr()
case '\n':
t.cr()
t.lf()
default:
t.cons.Write(b, attr, t.curX, t.curY)
t.curX++
if t.curX == t.width {
t.lf()
}
}
t.WriteByte(b)
}
return len(data), nil
}
// Write implements io.ByteWriter.
func (t *Vt) WriteByte(b byte) error {
switch b {
case '\r':
t.cr()
case '\n':
t.cr()
t.lf()
case '\b':
if t.curX > 0 {
t.cons.Write(' ', t.curAttr, t.curX, t.curY)
t.curX--
}
case '\t':
for i := 0; i < tabWidth; i++ {
t.cons.Write(' ', t.curAttr, t.curX, t.curY)
t.curX++
if t.curX == t.width {
t.cr()
t.lf()
}
}
default:
t.cons.Write(b, t.curAttr, t.curX, t.curY)
t.curX++
if t.curX == t.width {
t.cr()
t.lf()
}
}
return nil
}
// cls clears the terminal.
func (t *Vt) clear() {
t.cons.Clear(0, 0, t.width, t.height)

View File

@ -44,7 +44,12 @@ func TestWrite(t *testing.T) {
vt.Clear()
vt.SetPosition(0, 1)
vt.Write([]byte("12\n3\n4\r56"))
vt.Write([]byte("12\n\t3\n4\r567\b8"))
// Tab spanning rows
vt.SetPosition(78, 4)
vt.WriteByte('\t')
vt.WriteByte('9')
// Trigger scroll
vt.SetPosition(79, 24)
@ -56,9 +61,22 @@ func TestWrite(t *testing.T) {
}{
{0, 0, '1'},
{1, 0, '2'},
{0, 1, '3'},
// tabs
{0, 1, ' '},
{1, 1, ' '},
{2, 1, ' '},
{3, 1, ' '},
{4, 1, '3'},
// tab spanning 2 rows
{78, 3, ' '},
{79, 3, ' '},
{0, 4, ' '},
{1, 4, ' '},
{2, 4, '9'},
//
{0, 2, '5'},
{1, 2, '6'},
{2, 2, '8'}, // overwritten by BS
{79, 23, '!'},
}