mirror of
https://github.com/1f349/voidterm.git
synced 2024-12-22 07:54:12 +00:00
Old code
This commit is contained in:
parent
75f4e611be
commit
7080321cb9
59
buffer.go
Normal file
59
buffer.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Buffer struct {
|
||||||
|
lines []Line
|
||||||
|
cursor Position
|
||||||
|
|
||||||
|
inputStream io.Reader
|
||||||
|
|
||||||
|
width, height atomic.Uint64
|
||||||
|
|
||||||
|
done chan struct{}
|
||||||
|
updateBuffer chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBuffer(width, height uint64, input io.Reader) *Buffer {
|
||||||
|
v := &Buffer{
|
||||||
|
lines: make([]Line, 0),
|
||||||
|
cursor: Position{0, 0},
|
||||||
|
inputStream: input,
|
||||||
|
done: make(chan struct{}),
|
||||||
|
updateBuffer: make(chan struct{}),
|
||||||
|
}
|
||||||
|
v.width.Store(width)
|
||||||
|
v.height.Store(height)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Buffer) renderBuffer() [][]Cell {
|
||||||
|
width := v.width.Load()
|
||||||
|
height := v.height.Load()
|
||||||
|
buf := make([][]Cell, height)
|
||||||
|
y := v.height.Load() - 1
|
||||||
|
lineIdx := len(v.lines) - 1
|
||||||
|
for _, i := range v.lines {
|
||||||
|
w := i.Wrap(width)
|
||||||
|
for _, j := range w {
|
||||||
|
buf[y] = j
|
||||||
|
y++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var specialChars = map[rune]func(t *Buffer){
|
||||||
|
0x07: handleOutputBell,
|
||||||
|
0x08: handleOutputBackspace,
|
||||||
|
'\n': handleOutputLineFeed,
|
||||||
|
'\v': handleOutputLineFeed,
|
||||||
|
'\f': handleOutputLineFeed,
|
||||||
|
'\r': handleOutputCarriageReturn,
|
||||||
|
'\t': handleOutputTab,
|
||||||
|
0x0e: handleShiftOut, // handle switch to G1 character set
|
||||||
|
0x0f: handleShiftIn, // handle switch to G0 character set
|
||||||
|
}
|
18
cell-attributes.go
Normal file
18
cell-attributes.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"image/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CellAttributes struct {
|
||||||
|
fg color.Color
|
||||||
|
bg color.Color
|
||||||
|
bold bool
|
||||||
|
italic bool
|
||||||
|
dim bool
|
||||||
|
underline bool
|
||||||
|
strikethrough bool
|
||||||
|
blink bool
|
||||||
|
inverse bool
|
||||||
|
hidden bool
|
||||||
|
}
|
14
cell.go
Normal file
14
cell.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
type Cell struct {
|
||||||
|
r MeasuredRune
|
||||||
|
attr CellAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Cell) Attr() CellAttributes {
|
||||||
|
return c.attr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Cell) Rune() MeasuredRune {
|
||||||
|
return c.r
|
||||||
|
}
|
32
line.go
Normal file
32
line.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
type Line struct {
|
||||||
|
wrapped bool
|
||||||
|
cells []Cell
|
||||||
|
}
|
||||||
|
|
||||||
|
func LineFromRunes(runes []rune, style CellAttributes) Line {
|
||||||
|
l := make(Line, len(runes))
|
||||||
|
for i, r := range runes {
|
||||||
|
l[i] = Cell{
|
||||||
|
r: r,
|
||||||
|
s: style,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l Line) Wrap(width uint64) WrappedLine {
|
||||||
|
if uint64(len(l)) <= width {
|
||||||
|
return WrappedLine{l}
|
||||||
|
}
|
||||||
|
a := l
|
||||||
|
w := make(WrappedLine, 0, 1+uint64(len(l)-1)/width)
|
||||||
|
for uint64(len(a)) > width {
|
||||||
|
w = append(w, a[:width])
|
||||||
|
a = a[width:]
|
||||||
|
}
|
||||||
|
return w
|
||||||
|
}
|
||||||
|
|
||||||
|
type WrappedLine []Line
|
23
line_test.go
Normal file
23
line_test.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLine_Wrap(t *testing.T) {
|
||||||
|
t.Run("too wide", func(t *testing.T) {
|
||||||
|
l := LineFromRunes([]rune("Hello world!"), CellAttributes{}).Wrap(16)
|
||||||
|
assert.Equal(t, WrappedLine{
|
||||||
|
LineFromRunes([]rune("Hello world!"), CellAttributes{}),
|
||||||
|
}, l)
|
||||||
|
})
|
||||||
|
t.Run("too thin", func(t *testing.T) {
|
||||||
|
l := LineFromRunes([]rune("Hello world!"), CellAttributes{}).Wrap(4)
|
||||||
|
assert.Equal(t, WrappedLine{
|
||||||
|
LineFromRunes([]rune("Hell"), CellAttributes{}),
|
||||||
|
LineFromRunes([]rune("o wo"), CellAttributes{}),
|
||||||
|
LineFromRunes([]rune("rld!"), CellAttributes{}),
|
||||||
|
}, l)
|
||||||
|
})
|
||||||
|
}
|
6
measured-rune.go
Normal file
6
measured-rune.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
type MeasuredRune struct {
|
||||||
|
Rune rune
|
||||||
|
Width int
|
||||||
|
}
|
33
modes.go
Normal file
33
modes.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
type Modes struct {
|
||||||
|
ShowCursor bool
|
||||||
|
ApplicationCursorKeys bool
|
||||||
|
BlinkingCursor bool
|
||||||
|
ReplaceMode bool
|
||||||
|
OriginMode bool
|
||||||
|
LineFeedMode bool
|
||||||
|
ScreenMode bool
|
||||||
|
AutoWrap bool
|
||||||
|
SixelScrolling bool
|
||||||
|
BracketedPasteMode bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type MouseMode uint
|
||||||
|
type MouseExtMode uint
|
||||||
|
|
||||||
|
const (
|
||||||
|
MouseModeNone MouseMode = iota
|
||||||
|
MouseModeX10
|
||||||
|
MouseModeVT200
|
||||||
|
MouseModeVT200Highlight
|
||||||
|
MouseModeButtonEvent
|
||||||
|
MouseModeAnyEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MouseExtNone MouseExtMode = iota
|
||||||
|
MouseExtUTF
|
||||||
|
MouseExtSGR
|
||||||
|
MouseExtURXVT
|
||||||
|
)
|
5
position.go
Normal file
5
position.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
type Position struct {
|
||||||
|
X, Y int
|
||||||
|
}
|
27
voidterm.go
Normal file
27
voidterm.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package voidterm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MainBuffer uint8 = 0
|
||||||
|
AltBuffer uint8 = 1
|
||||||
|
InternalBuffer uint8 = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type VoidTerm struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
pty *os.File
|
||||||
|
updateChan chan struct{}
|
||||||
|
processChan chan MeasuredRune
|
||||||
|
closeChan chan struct{}
|
||||||
|
buffers []*Buffer
|
||||||
|
activeBuffer *Buffer
|
||||||
|
mouseMode MouseMode
|
||||||
|
mouseExtMode MouseExtMode
|
||||||
|
running bool
|
||||||
|
shell string
|
||||||
|
initialCommand string
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user