Made posix terminal IO avoid spin looping.

Using raw mode + delay in the right places to
allow tasks to work while also supporting key?
This commit is contained in:
Brad Nelson
2024-02-24 12:10:47 -08:00
parent 9468c53ab9
commit eaa8a3c4c3
4 changed files with 39 additions and 9 deletions

View File

@ -458,6 +458,7 @@ e: check-ansi
e: check-tasks
out: start-task
out: task
out: pause?
out: pause
out: tasks
;e
@ -566,13 +567,13 @@ e: test-windows-forth-namespace
e: test-posix-forth-voclist
internals ' sockets voclist-from
out: sockets
out: termios
out: internals
out: graphics
out: ansi
out: editor
out: streams
out: tasks
out: termios
out: posix
out: structures
out: internalized
@ -589,11 +590,11 @@ e: test-posix-forth-namespace
out: telnetd
out: sockets
out: x11
out: form
out: termios
check-desktop
check-filetools
check-phase2
out: form
out: termios
check-allocation
out: ok
out: pwd

View File

@ -28,6 +28,9 @@ forth definitions tasks also internals
task-list @ cell+ @ sp! rp!
;
( Check if there are other tasks. )
: pause? ( -- f ) task-list @ dup @ <> ;
: task ( xt dsz rsz "name" )
create here >r 0 , 0 , ( link, sp )
swap here cell+ r@ cell+ ! cells allot

View File

@ -15,10 +15,10 @@
needs ../common/phase1.fs
needs posix.fs
needs allocation.fs
needs termios.fs
needs ../common/phase2.fs
needs ../common/phase_filetools.fs
needs ../common/phase_desktop.fs
needs termios.fs
needs x11.fs
needs graphics.fs
needs sockets.fs

View File

@ -38,12 +38,14 @@ create new-termios sizeof(termios) allot
: termios@ ( a -- ) stdin swap tcgetattr drop ;
: termios! ( a -- ) stdin TCSAFLUSH rot tcsetattr throw ;
old-termios termios@
: raw-mode new-termios termios@
: raw-mode stdin isatty 0= if exit then
new-termios termios@
_ECHO ICANON or invert new-termios .c_lflag sl@ and new-termios .c_lflag l!
0 VTIME new-termios .c_cc[] c!
0 VMIN new-termios .c_cc[] c!
new-termios termios! ;
: normal-mode old-termios termios! ;
: normal-mode stdin isatty 0= if exit then
old-termios termios! ;
( Screen Size )
$5413 constant TIOCGWINSZ
@ -53,12 +55,36 @@ create winsize sizeof(winsize) allot
winsize sl@ dup $ffff and swap $10000 / ;
0 value pending
: termios-key? ( -- f ) pending if -1 else stdin-key to pending pending 0<> then ;
: termios-key ( -- n ) begin termios-key? 0= while repeat pending 0 to pending ;
: termios-key? ( -- f )
pending if
-1
else
nodelay-mode
stdin-key to pending
pending 0<>
then
;
: termios-key ( -- n )
begin termios-key? 0= while
pause? if
pause
else
delay-mode
stdin-key to pending
then
repeat
pending 0 to pending
;
raw-mode
: termios-terminate ( n -- )
normal-mode
sysexit
;
' termios-key is key
' termios-key? is key?
' termios-terminate is terminate
forth definitions