Automatically use sixel if it's available
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user