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

View File

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

View File

@ -15,10 +15,10 @@
needs ../common/phase1.fs needs ../common/phase1.fs
needs posix.fs needs posix.fs
needs allocation.fs needs allocation.fs
needs termios.fs
needs ../common/phase2.fs needs ../common/phase2.fs
needs ../common/phase_filetools.fs needs ../common/phase_filetools.fs
needs ../common/phase_desktop.fs needs ../common/phase_desktop.fs
needs termios.fs
needs x11.fs needs x11.fs
needs graphics.fs needs graphics.fs
needs sockets.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 swap tcgetattr drop ;
: termios! ( a -- ) stdin TCSAFLUSH rot tcsetattr throw ; : termios! ( a -- ) stdin TCSAFLUSH rot tcsetattr throw ;
old-termios termios@ 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! _ECHO ICANON or invert new-termios .c_lflag sl@ and new-termios .c_lflag l!
0 VTIME new-termios .c_cc[] c! 0 VTIME new-termios .c_cc[] c!
0 VMIN new-termios .c_cc[] c! 0 VMIN new-termios .c_cc[] c!
new-termios termios! ; new-termios termios! ;
: normal-mode old-termios termios! ; : normal-mode stdin isatty 0= if exit then
old-termios termios! ;
( Screen Size ) ( Screen Size )
$5413 constant TIOCGWINSZ $5413 constant TIOCGWINSZ
@ -53,12 +55,36 @@ create winsize sizeof(winsize) allot
winsize sl@ dup $ffff and swap $10000 / ; winsize sl@ dup $ffff and swap $10000 / ;
0 value pending 0 value pending
: termios-key? ( -- f ) pending if -1 else stdin-key to pending pending 0<> then ; : termios-key? ( -- f )
: termios-key ( -- n ) begin termios-key? 0= while repeat pending 0 to pending ; 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
;
nodelay-mode
' termios-key is key ' termios-key is key
' termios-key? is key? ' termios-key? is key?
' termios-terminate is terminate
forth definitions forth definitions