v0.1.3 adapters for service and 256 color removed
This commit is contained in:
-54
@@ -1,54 +0,0 @@
|
||||
package terminal
|
||||
|
||||
import "github.com/lixenwraith/color"
|
||||
|
||||
// Generic xterm 256-color constants proxied to the central color package
|
||||
// to maintain backwards compatibility for the terminal package.
|
||||
|
||||
const (
|
||||
P256DeepNavy = color.P256DeepNavy
|
||||
P256DarkBlue = color.P256DarkBlue
|
||||
P256SteelBlue = color.P256SteelBlue
|
||||
P256LightBlue = color.P256LightBlue
|
||||
P256DeepTeal = color.P256DeepTeal
|
||||
P256Teal = color.P256Teal
|
||||
P256Green = color.P256Green
|
||||
P256Cyan = color.P256Cyan
|
||||
P256LightCyan = color.P256LightCyan
|
||||
P256CobaltBlue = color.P256CobaltBlue
|
||||
P256DarkPurpleBlue = color.P256DarkPurpleBlue
|
||||
P256Indigo = color.P256Indigo
|
||||
P256Purple = color.P256Purple
|
||||
P256Violet = color.P256Violet
|
||||
P256MediumPurple = color.P256MediumPurple
|
||||
P256Orchid = color.P256Orchid
|
||||
P256YellowGreen = color.P256YellowGreen
|
||||
P256Maroon = color.P256Maroon
|
||||
P256DarkCrimson = color.P256DarkCrimson
|
||||
P256Crimson = color.P256Crimson
|
||||
P256Red = color.P256Red
|
||||
P256Rose = color.P256Rose
|
||||
P256RedOrange = color.P256RedOrange
|
||||
P256Orange = color.P256Orange
|
||||
P256Amber = color.P256Amber
|
||||
P256Gold = color.P256Gold
|
||||
P256Yellow = color.P256Yellow
|
||||
P256DarkAmber = color.P256DarkAmber
|
||||
P256Gray = color.P256Gray
|
||||
)
|
||||
|
||||
// Cube256 returns the xterm 256-palette index for an RGB cube coordinate.
|
||||
func Cube256(r, g, b uint8) uint8 {
|
||||
return color.Cube256(r, g, b)
|
||||
}
|
||||
|
||||
// CubeRGB256 returns the (r, g, b) cube coordinates for a 256-palette color cube index.
|
||||
func CubeRGB256(index uint8) (r, g, b uint8) {
|
||||
return color.CubeRGB256(index)
|
||||
}
|
||||
|
||||
// Gray256 returns the xterm 256-palette index for a grayscale step.
|
||||
func Gray256(step uint8) uint8 {
|
||||
return color.Gray256(step)
|
||||
}
|
||||
|
||||
-146
@@ -1,146 +0,0 @@
|
||||
package terminal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// TerminalService manages terminal lifecycle and input polling
|
||||
type TerminalService struct {
|
||||
term Terminal
|
||||
colorMode ColorMode
|
||||
eventCh chan Event
|
||||
stopCh chan struct{}
|
||||
doneCh chan struct{}
|
||||
mu sync.Mutex
|
||||
running bool
|
||||
}
|
||||
|
||||
// NewService creates a new terminal service
|
||||
func NewService() *TerminalService {
|
||||
return &TerminalService{
|
||||
eventCh: make(chan Event, 256),
|
||||
stopCh: make(chan struct{}),
|
||||
doneCh: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
// Name implements Service
|
||||
func (s *TerminalService) Name() string {
|
||||
return "terminal"
|
||||
}
|
||||
|
||||
// Dependencies implements Service
|
||||
func (s *TerminalService) Dependencies() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Init implements Service
|
||||
// args[0]: ColorMode (optional, defaults to DetectColorMode())
|
||||
func (s *TerminalService) Init(args ...any) error {
|
||||
s.colorMode = DetectColorMode()
|
||||
if len(args) > 0 {
|
||||
if cm, ok := args[0].(ColorMode); ok {
|
||||
s.colorMode = cm
|
||||
}
|
||||
}
|
||||
|
||||
s.term = New(s.colorMode)
|
||||
if err := s.term.Init(); err != nil {
|
||||
return fmt.Errorf("terminal init: %w", err)
|
||||
}
|
||||
|
||||
// Enable mouse click reporting
|
||||
if err := s.term.SetMouseMode(MouseModeClick); err != nil {
|
||||
// No-op for mouse error, continue
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Start implements Service - launches input polling goroutine
|
||||
func (s *TerminalService) Start() error {
|
||||
s.mu.Lock()
|
||||
if s.running {
|
||||
s.mu.Unlock()
|
||||
return nil
|
||||
}
|
||||
s.running = true
|
||||
s.mu.Unlock()
|
||||
|
||||
go s.pollLoop()
|
||||
return nil
|
||||
}
|
||||
|
||||
// pollLoop reads input events until stop signal
|
||||
func (s *TerminalService) pollLoop() {
|
||||
defer close(s.doneCh)
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
EmergencyReset(os.Stdout)
|
||||
os.Stdout.Sync()
|
||||
os.Stderr.Sync()
|
||||
fmt.Fprintf(os.Stderr, "\r\n\x1b[31mTERMINAL POLL CRASHED: %v\x1b[0m\r\n", r)
|
||||
fmt.Fprintf(os.Stderr, "Stack Trace:\r\n%s\r\n", debug.Stack())
|
||||
os.Stderr.Sync()
|
||||
os.Exit(1)
|
||||
}
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-s.stopCh:
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
||||
ev := s.term.PollEvent()
|
||||
if ev.Type == EventClosed || ev.Type == EventError {
|
||||
return
|
||||
}
|
||||
|
||||
select {
|
||||
case s.eventCh <- ev:
|
||||
case <-s.stopCh:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Stop implements Service - signals stop and restores terminal
|
||||
func (s *TerminalService) Stop() error {
|
||||
s.mu.Lock()
|
||||
if !s.running {
|
||||
s.mu.Unlock()
|
||||
return nil
|
||||
}
|
||||
s.running = false
|
||||
s.mu.Unlock()
|
||||
|
||||
close(s.stopCh)
|
||||
|
||||
// Post synthetic close event to unblock PollEvent
|
||||
if s.term != nil {
|
||||
s.term.PostEvent(Event{Type: EventClosed})
|
||||
}
|
||||
|
||||
<-s.doneCh
|
||||
|
||||
if s.term != nil {
|
||||
s.term.Fini()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Terminal returns the wrapped terminal instance
|
||||
func (s *TerminalService) Terminal() Terminal {
|
||||
return s.term
|
||||
}
|
||||
|
||||
// Events returns the input event channel
|
||||
func (s *TerminalService) Events() <-chan Event {
|
||||
return s.eventCh
|
||||
}
|
||||
Reference in New Issue
Block a user