Use c stdlib function to set up raw mode
Some checks failed
timw4mail/php-kilo/pipeline/head There was a failure building this commit
Some checks failed
timw4mail/php-kilo/pipeline/head There was a failure building this commit
This commit is contained in:
parent
fd478b697f
commit
998102816e
2
kilo
2
kilo
@ -3,6 +3,8 @@
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
|
||||
use Aviat\Kilo\Terminal\Termios;
|
||||
|
||||
require_once __DIR__ . '/src/Kilo.php';
|
||||
|
||||
// Remove the composer install requirement by
|
||||
|
@ -2,16 +2,11 @@
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
|
||||
use Aviat\Kilo\Type\TerminalSize;
|
||||
use Aviat\Kilo\Enum\{
|
||||
Color,
|
||||
Color256,
|
||||
RawKeyCode,
|
||||
KeyType,
|
||||
Highlight,
|
||||
SearchDirection
|
||||
};
|
||||
use Aviat\Kilo\Enum\{Color, Highlight, KeyType, RawKeyCode, SearchDirection};
|
||||
use Aviat\Kilo\Terminal\ANSI;
|
||||
use Aviat\Kilo\Terminal\Terminal;
|
||||
use Aviat\Kilo\Type\{Point, StatusMessage};
|
||||
use Aviat\Kilo\Type\TerminalSize;
|
||||
|
||||
/**
|
||||
* // Don't highlight this!
|
||||
|
@ -1,7 +1,8 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
namespace Aviat\Kilo\Terminal;
|
||||
|
||||
use Aviat\Kilo\Enum;
|
||||
use Aviat\Kilo\Enum\Color;
|
||||
use Aviat\Kilo\Enum\Color256;
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
namespace Aviat\Kilo\Terminal;
|
||||
|
||||
use Aviat\Kilo\Traits;
|
||||
|
@ -1,9 +1,9 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
namespace Aviat\Kilo\Terminal;
|
||||
|
||||
use Aviat\Kilo\Enum\RawKeyCode;
|
||||
use Aviat\Kilo\Enum\KeyType;
|
||||
use Aviat\Kilo\Enum\RawKeyCode;
|
||||
use Aviat\Kilo\Type\TerminalSize;
|
||||
|
||||
class Terminal {
|
||||
@ -126,7 +126,6 @@ class Terminal {
|
||||
/**
|
||||
* Write to the stdout stream
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
* @param string $str
|
||||
* @param int|NULL $len
|
||||
* @return int|false
|
||||
@ -154,7 +153,6 @@ class Terminal {
|
||||
* See if tput exists for fallback terminal size detection
|
||||
*
|
||||
* @return bool
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
private static function has_tput(): bool
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
namespace Aviat\Kilo\Terminal;
|
||||
|
||||
use FFI;
|
||||
use FFI\CData;
|
||||
@ -57,14 +57,9 @@ class Termios {
|
||||
register_shutdown_function([static::class, 'disableRawMode']);
|
||||
|
||||
$termios = clone $instance->originalTermios;
|
||||
$termios->c_iflag &= ~(C::BRKINT | C::ICRNL | C::INPCK | C::ISTRIP | C::IXON);
|
||||
$termios->c_oflag &= ~(C::OPOST);
|
||||
$termios->c_cflag |= (C::CS8);
|
||||
$termios->c_lflag &= ~( C::ECHO | C::ICANON | C::IEXTEN | C::ISIG );
|
||||
$termios->c_cc[C::VMIN] = 0;
|
||||
$termios->c_cc[C::VTIME] = 1;
|
||||
|
||||
// Turn on raw mode
|
||||
self::ffi()->cfmakeraw(FFI::addr($termios));
|
||||
$res = self::ffi()
|
||||
->tcsetattr(C::STDIN_FILENO, C::TCSAFLUSH, FFI::addr($termios));
|
||||
|
@ -1,11 +1,14 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Aviat\Kilo;
|
||||
namespace Aviat\Kilo\Terminal;
|
||||
|
||||
use Throwable;
|
||||
|
||||
class TermiosException extends \UnexpectedValueException {
|
||||
public function __construct($message = 'Failed to apply terminal settings', $code = 0, Throwable $previous = NULL)
|
||||
public function __construct(
|
||||
string $message = 'Failed to apply terminal settings',
|
||||
int $code = 0,
|
||||
Throwable $previous = NULL)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
// PHP 'constants' for FFI integration
|
||||
// These seem to be the only define statements supported by the FFI integration
|
||||
#define FFI_SCOPE "terminal"
|
||||
#define FFI_LIB "libc.so.6"
|
||||
#define FFI_LIB "libc.so"
|
||||
|
||||
// Nonsense for a test with a single quote
|
||||
// Ignored by PHP due to the octothorpe (#)
|
||||
@ -55,6 +55,7 @@ struct termios
|
||||
|
||||
int tcgetattr (int fd, struct termios *termios_p);
|
||||
int tcsetattr (int fd, int optional_actions, const struct termios *termios_p);
|
||||
void cfmakeraw(struct termios *);
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
//! <sys/ioctl.h>
|
@ -2,8 +2,8 @@
|
||||
|
||||
namespace Aviat\Kilo\Tests;
|
||||
|
||||
use Aviat\Kilo\ANSI;
|
||||
use Aviat\Kilo\Enum\Color;
|
||||
use Aviat\Kilo\Terminal\ANSI;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ANSITest extends TestCase {
|
||||
|
@ -47,7 +47,7 @@ class EditorTest extends TestCase {
|
||||
|
||||
public function testOpen(): void
|
||||
{
|
||||
$editor = MockEditor::mock('src/ffi.h');
|
||||
$editor = MockEditor::mock('src/Terminal/ffi.h');
|
||||
|
||||
$state = json_encode($editor->__debugInfo(), JSON_THROW_ON_ERROR);
|
||||
$this->assertMatchesJsonSnapshot($state);
|
||||
|
@ -2,10 +2,9 @@
|
||||
|
||||
namespace Aviat\Kilo\Tests;
|
||||
|
||||
use Aviat\Kilo\Terminal\Terminal;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
use Aviat\Kilo\Terminal;
|
||||
|
||||
|
||||
class TerminalTest extends TestCase {
|
||||
public function test_getWindowSize(): void
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
namespace Aviat\Kilo\Tests;
|
||||
|
||||
use Aviat\Kilo\{Termios, TermiosException};
|
||||
use Aviat\Kilo\{Terminal\Termios, Terminal\TermiosException};
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class TermiosTest extends TestCase {
|
||||
|
@ -103,7 +103,7 @@
|
||||
}
|
||||
},
|
||||
"tokens": [],
|
||||
"filename": "src\/ffi.h",
|
||||
"filename": "src\/Terminal\/ffi.h",
|
||||
"rows": [
|
||||
{
|
||||
"render": "\/**",
|
||||
@ -465,7 +465,7 @@
|
||||
"idx": 10
|
||||
},
|
||||
{
|
||||
"render": "#define FFI_LIB \"libc.so.6\"",
|
||||
"render": "#define FFI_LIB \"libc.so\"",
|
||||
"hl": [
|
||||
"Keyword2",
|
||||
"Keyword2",
|
||||
@ -491,8 +491,6 @@
|
||||
"String",
|
||||
"String",
|
||||
"String",
|
||||
"String",
|
||||
"String",
|
||||
"String"
|
||||
],
|
||||
"idx": 11
|
||||
@ -1740,10 +1738,49 @@
|
||||
],
|
||||
"idx": 56
|
||||
},
|
||||
{
|
||||
"render": "void cfmakeraw(struct termios *);",
|
||||
"hl": [
|
||||
"Keyword2",
|
||||
"Keyword2",
|
||||
"Keyword2",
|
||||
"Keyword2",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Delimiter",
|
||||
"Keyword1",
|
||||
"Keyword1",
|
||||
"Keyword1",
|
||||
"Keyword1",
|
||||
"Keyword1",
|
||||
"Keyword1",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Normal",
|
||||
"Operator",
|
||||
"Delimiter",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 57
|
||||
},
|
||||
{
|
||||
"render": "",
|
||||
"hl": [],
|
||||
"idx": 57
|
||||
"idx": 58
|
||||
},
|
||||
{
|
||||
"render": "\/\/ -----------------------------------------------------------------------------",
|
||||
@ -1829,7 +1866,7 @@
|
||||
"Comment",
|
||||
"Comment"
|
||||
],
|
||||
"idx": 58
|
||||
"idx": 59
|
||||
},
|
||||
{
|
||||
"render": "\/\/! <sys\/ioctl.h>",
|
||||
@ -1852,7 +1889,7 @@
|
||||
"Comment",
|
||||
"Comment"
|
||||
],
|
||||
"idx": 59
|
||||
"idx": 60
|
||||
},
|
||||
{
|
||||
"render": "\/\/ -----------------------------------------------------------------------------",
|
||||
@ -1938,7 +1975,7 @@
|
||||
"Comment",
|
||||
"Comment"
|
||||
],
|
||||
"idx": 60
|
||||
"idx": 61
|
||||
},
|
||||
{
|
||||
"render": "struct winsize {",
|
||||
@ -1960,7 +1997,7 @@
|
||||
"Normal",
|
||||
"Delimiter"
|
||||
],
|
||||
"idx": 61
|
||||
"idx": 62
|
||||
},
|
||||
{
|
||||
"render": " unsigned short ws_row;",
|
||||
@ -1992,7 +2029,7 @@
|
||||
"Normal",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 62
|
||||
"idx": 63
|
||||
},
|
||||
{
|
||||
"render": " unsigned short ws_col;",
|
||||
@ -2024,7 +2061,7 @@
|
||||
"Normal",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 63
|
||||
"idx": 64
|
||||
},
|
||||
{
|
||||
"render": " unsigned short ws_xpixel;",
|
||||
@ -2059,7 +2096,7 @@
|
||||
"Normal",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 64
|
||||
"idx": 65
|
||||
},
|
||||
{
|
||||
"render": " unsigned short ws_ypixel;",
|
||||
@ -2094,7 +2131,7 @@
|
||||
"Normal",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 65
|
||||
"idx": 66
|
||||
},
|
||||
{
|
||||
"render": "};",
|
||||
@ -2102,7 +2139,7 @@
|
||||
"Delimiter",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 66
|
||||
"idx": 67
|
||||
},
|
||||
{
|
||||
"render": "int ioctl (int, int, ...);",
|
||||
@ -2134,7 +2171,7 @@
|
||||
"Delimiter",
|
||||
"Operator"
|
||||
],
|
||||
"idx": 67
|
||||
"idx": 68
|
||||
}
|
||||
],
|
||||
"dirty": false
|
||||
|
Loading…
Reference in New Issue
Block a user