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:
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
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-key? is key?
|
' termios-key? is key?
|
||||||
|
' termios-terminate is terminate
|
||||||
|
|
||||||
forth definitions
|
forth definitions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user