forked from genewildish/Mainline
99 lines
2.6 KiB
Markdown
99 lines
2.6 KiB
Markdown
---
|
|
name: mainline-display
|
|
description: Display backend implementation and the Display protocol
|
|
compatibility: opencode
|
|
metadata:
|
|
audience: developers
|
|
source_type: codebase
|
|
---
|
|
|
|
## What This Skill Covers
|
|
|
|
This skill covers Mainline's display backend system - how to implement new display backends and how the Display protocol works.
|
|
|
|
## Key Concepts
|
|
|
|
### Display Protocol
|
|
|
|
All backends implement a common Display protocol (in `engine/display/__init__.py`):
|
|
|
|
```python
|
|
class Display(Protocol):
|
|
width: int
|
|
height: int
|
|
|
|
def init(self, width: int, height: int, reuse: bool = False) -> None:
|
|
"""Initialize the display"""
|
|
...
|
|
|
|
def show(self, buf: list[str], border: bool = False) -> None:
|
|
"""Display the buffer"""
|
|
...
|
|
|
|
def clear(self) -> None:
|
|
"""Clear the display"""
|
|
...
|
|
|
|
def cleanup(self) -> None:
|
|
"""Clean up resources"""
|
|
...
|
|
|
|
def get_dimensions(self) -> tuple[int, int]:
|
|
"""Return (width, height)"""
|
|
...
|
|
```
|
|
|
|
### DisplayRegistry
|
|
|
|
Discovers and manages backends:
|
|
|
|
```python
|
|
from engine.display import DisplayRegistry
|
|
display = DisplayRegistry.create("terminal") # or "websocket", "null", "multi"
|
|
```
|
|
|
|
### Available Backends
|
|
|
|
| Backend | File | Description |
|
|
|---------|------|-------------|
|
|
| terminal | backends/terminal.py | ANSI terminal output |
|
|
| websocket | backends/websocket.py | Web browser via WebSocket |
|
|
| null | backends/null.py | Headless for testing |
|
|
| multi | backends/multi.py | Forwards to multiple displays |
|
|
| moderngl | backends/moderngl.py | GPU-accelerated OpenGL rendering (optional) |
|
|
|
|
### WebSocket Backend
|
|
|
|
- WebSocket server: port 8765
|
|
- HTTP server: port 8766 (serves client/index.html)
|
|
- Client has ANSI color parsing and fullscreen support
|
|
|
|
### Multi Backend
|
|
|
|
Forwards to multiple displays simultaneously - useful for `terminal + websocket`.
|
|
|
|
## Adding a New Backend
|
|
|
|
1. Create `engine/display/backends/my_backend.py`
|
|
2. Implement the Display protocol methods
|
|
3. Register in `engine/display/__init__.py`'s `DisplayRegistry`
|
|
|
|
Required methods:
|
|
- `init(width: int, height: int, reuse: bool = False)` - Initialize display
|
|
- `show(buf: list[str], border: bool = False)` - Display buffer
|
|
- `clear()` - Clear screen
|
|
- `cleanup()` - Clean up resources
|
|
- `get_dimensions() -> tuple[int, int]` - Get terminal dimensions
|
|
|
|
Optional methods:
|
|
- `title(text: str)` - Set window title
|
|
- `cursor(show: bool)` - Control cursor
|
|
|
|
## Usage
|
|
|
|
```bash
|
|
python mainline.py --display terminal # default
|
|
python mainline.py --display websocket
|
|
python mainline.py --display moderngl # GPU-accelerated (requires moderngl)
|
|
```
|