Automatically use sixel if it's available

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-20 18:19:19 +01:00
parent 2598218a4d
commit 45e5302eac
3 changed files with 31 additions and 14 deletions

View File

@@ -25,10 +25,10 @@ class CliGameLoop {
'CliGameLoop requires a CliInput instance.',
),
primaryRenderer = AsciiRenderer(
primaryRenderer = SixelRenderer(),
secondaryRenderer = AsciiRenderer(
mode: AsciiRendererMode.terminalAnsi,
),
secondaryRenderer = SixelRenderer() {
) {
_renderer = primaryRenderer;
}
@@ -44,6 +44,7 @@ class CliGameLoop {
StreamSubscription<List<int>>? _stdinSubscription;
Timer? _timer;
bool _isRunning = false;
bool _isSixelAvailable = false;
Duration _lastTick = Duration.zero;
/// Starts terminal probing, enters raw input mode, and begins the frame timer.
@@ -57,6 +58,11 @@ class CliGameLoop {
sixel.isSixelSupported = await SixelRenderer.checkTerminalSixelSupport(
inputStream: _stdinStream,
);
_isSixelAvailable = sixel.isSixelSupported;
_renderer = _isSixelAvailable ? primaryRenderer : secondaryRenderer;
} else {
_isSixelAvailable = false;
_renderer = secondaryRenderer;
}
if (stdin.hasTerminal) {
@@ -118,6 +124,9 @@ class CliGameLoop {
}
if (input.matchesRendererToggleShortcut(bytes)) {
if (!_isSixelAvailable) {
return;
}
// Allow dynamic renderer-switch bindings configured on the CLI input.
_renderer = identical(_renderer, secondaryRenderer)
? primaryRenderer
@@ -204,6 +213,9 @@ class CliGameLoop {
final int safeCols = cols > 1 ? cols - 1 : cols;
final String hint = _buildShortcutHintText();
if (hint.isEmpty) {
return;
}
final String visible = hint.length > safeCols
? hint.substring(0, safeCols)
: hint;
@@ -214,6 +226,14 @@ class CliGameLoop {
}
String _buildShortcutHintText() {
if (!_isSixelAvailable) {
if (_renderer is AsciiRenderer) {
final AsciiRenderer ascii = _renderer as AsciiRenderer;
return '<${input.asciiThemeCycleKeyLabel}> ${ascii.activeTheme.name}';
}
return '';
}
final String rendererMode = _renderer is SixelRenderer ? 'sixel' : 'ascii';
final String rendererHint =
'<${input.rendererToggleKeyLabel}> $rendererMode';