Added blinking cursor and settings

* The cursor can now be controlled with the cursor command,
  documented in examples and in scripting docs.
This commit is contained in:
Chris 2021-02-16 23:47:52 +01:00
parent e23559fd72
commit 0b3f3e38d1
7 changed files with 94 additions and 1 deletions

View File

@ -46,6 +46,29 @@ Removes all annontations in one go.
clearannotate
### cursor - Cursor display control
Controls cursor visibility and rendering style. Use `cursor show` and
`cursor hide` to toggle the visiblity of the cursor.
cursor show
cursor hide
You can configure the cursor blink rate, f.ex. setting it to 500ms with
`cursor blink 500`, or change its style using `cursor style` followed by
the desired style.
cursor blink <rate>
cursor style {none|block|under|left}
To push (save) the current cursor position, use `cursor push`. Move
wherever and do what you need, followed by `cursor pop`. Don't forget
to pop if you push!
cursor push
cursor pop
### delay - Wait for time to pass
Only useful if you have `set fps` to a non-zero value, this command will

27
examples/cursorblink.ftm Normal file
View File

@ -0,0 +1,27 @@
set terminal 60x10
set colors 16
set typedelay 250
set fps 30
cursor blink 500
cursor show
delay 2000
type "We have a cursor!"
delay 2000
type <return>
cursor style solid
type "We can even change the style..." <return>
cursor blink 0
type "And we can make it blink not at all..."
delay 1000
cursor blink 100
type " or like its life depended on it!"
delay 2000

BIN
examples/cursorblink.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

BIN
examples/cursorblink.mp4 Normal file

Binary file not shown.

View File

@ -1,5 +1,6 @@
set terminal 80x25
cursor style solid
showkeys ctrl alt shift F4 up up down down left right left right B A
savepng keys.png
savepng keys.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -48,6 +48,10 @@ class FakeTerminal
private $writtenFiles = [];
private $cursorBlinkRate = 0;
private $cursorStyle = GdRenderer::CURSOR_BLOCK;
public function __construct()
{
$this->renderer = new GdRenderer();
@ -255,6 +259,30 @@ class FakeTerminal
$this->renderer->setKeyOverlay($args);
break;
case 'cursor':
$op = array_shift($args);
switch ($op) {
case 'push':
// push cursor position
break;
case 'pop':
// pop cursor position
break;
case 'blink':
// set cursorBlinkRate
$this->cursorBlinkRate = intval(array_shift($args));
break;
case 'style':
$style = array_shift($args);
switch ($style) {
case 'none': $this->cursorStyle = GdRenderer::CURSOR_NONE; break;
case 'block': $this->cursorStyle = GdRenderer::CURSOR_BLOCK; break;
case 'solid': $this->cursorStyle = GdRenderer::CURSOR_SOLID; break;
}
break;
}
break;
case 'clear':
$what = array_shift($args);
$tw = $this->term->getColumns();
@ -333,6 +361,20 @@ class FakeTerminal
public function writeFrame($name=null)
{
$ft = ($this->frame * $this->frameDuration);
if ($this->cursorBlinkRate > 0) {
//printf("\nft=%.1f r=%.1f\n", $ft, $this->cursorBlinkRate);
$visible = (floor($ft / $this->cursorBlinkRate) % 2) == 0;
if ($visible) {
$this->renderer->setCursorStyle($this->cursorStyle);
} else {
$this->renderer->setCursorStyle(GdRenderer::CURSOR_NONE);
}
} else {
$this->renderer->setCursorStyle($this->cursorStyle);
}
$this->renderer->render($this->term);
if ($name) {