Paste: curses
Author: | blei |
Mode: | factor |
Date: | Sun, 18 Oct 2009 16:50:49 |
Plain Text |
USING: accessors alien.c-types alien.strings assocs byte-arrays
classes.struct combinators continuations curses.ffi destructors
fry io io.encodings.8-bit io.encodings.string io.encodings.utf8
kernel libc locals math namespaces prettyprint sequences
strings threads ;
IN: curses
SYMBOL: current-window
: >BOOLEAN ( n -- TRUE/FALSE ) TRUE FALSE ? ; inline
ERROR: duplicate-window window ;
ERROR: unnamed-window window ;
ERROR: window-not-found window ;
ERROR: curses-failed ;
: curses-error ( n -- ) ERR = [ curses-failed ] when ;
: with-curses ( quot -- )
[
initscr curses-error
[
nocbreak curses-error
echo curses-error
endwin curses-error
] [ ] cleanup
] with-destructors ; inline
: with-window ( window quot -- )
[ current-window ] dip with-variable ; inline
TUPLE: curses-window < disposable
name
parent-window
ptr
{ lines integer initial: 0 }
{ columns integer initial: 0 }
{ y integer initial: 0 }
{ x integer initial: 0 }
{ cbreak initial: t }
{ echo initial: t }
{ raw initial: f }
{ scrollok initial: t }
{ leaveok initial: f }
idcok idlok immedok
{ keypad initial: f }
{ encoding initial: utf8 } ;
: <curses-window> ( -- window )
curses-window new-disposable ;
M: curses-window dispose* ( window -- )
ptr>> delwin curses-error ;
<PRIVATE
: window-params ( window -- lines columns y x )
{ [ lines>> ] [ columns>> ] [ y>> ] [ x>> ] } cleave ;
: set-cbreak/raw ( cbreak raw -- )
[ drop raw ] [
[ cbreak ] [ nocbreak ] if
] if curses-error ;
PRIVATE>
: setup-window ( window -- )
{
[
dup
dup parent-window>> [
ptr>> swap window-params derwin
] [
window-params newwin
] if* [ curses-error ] keep >>ptr &dispose drop
]
[ [ cbreak>> ] [ raw>> ] bi set-cbreak/raw ]
[ echo>> [ echo ] [ noecho ] if curses-error ]
[ [ ptr>> ] [ scrollok>> >BOOLEAN ] bi scrollok curses-error ]
[ [ ptr>> ] [ leaveok>> >BOOLEAN ] bi leaveok curses-error ]
[ [ ptr>> ] [ keypad>> >BOOLEAN ] bi keypad curses-error ]
} cleave ;
<PRIVATE
: (window-curses-refresh) ( window-ptr -- ) wrefresh curses-error ; inline
: (window-curses-write) ( string window-ptr -- ) swap waddstr curses-error ; inline
:: (window-curses-read) ( n encoding window-ptr -- string )
[
n 1 + malloc &free :> str
window-ptr str n wgetnstr curses-error
str encoding alien>string
] with-destructors ; inline
: (window-curses-getch) ( window -- key )
wgetch [ curses-error ] keep ;
: (window-curses-move) ( y x window-ptr -- )
-rot wmove curses-error ; inline
: (window-insert-blank-line) ( y window-ptr -- )
[ 0 swap (window-curses-move) ]
[ winsertln curses-error ] bi ; inline
: (window-curses-addch) ( ch window-ptr -- )
swap waddch curses-error ; inline
PRIVATE>
: window-curses-refresh ( window -- ) ptr>> (window-curses-refresh) ;
: curses-refresh ( -- ) current-window get window-curses-refresh ;
: window-curses-write ( string window -- )
ptr>> (window-curses-write) ;
: curses-write ( string -- )
current-window get window-curses-write ;
: window-curses-nl ( window -- )
[ "\n" ] dip ptr>> (window-curses-write) ;
: curses-nl ( -- )
current-window get window-curses-nl ;
: window-curses-print ( string window -- )
ptr>> [ (window-curses-write) ]
[ "\n" swap (window-curses-write) ] bi ;
: curses-print ( string -- )
current-window get window-curses-print ;
: window-curses-print-refresh ( string window -- )
ptr>> [ (window-curses-write) ]
[ "\n" swap (window-curses-write) ]
[ (window-curses-refresh) ] tri ;
: curses-print-refresh ( string -- )
current-window get window-curses-print-refresh ;
: window-curses-write-refresh ( string window -- )
ptr>> [ (window-curses-write) ] [ (window-curses-refresh) ] bi ;
: curses-write-refresh ( string -- )
current-window get window-curses-write-refresh ;
: window-curses-read ( n window -- string )
[ encoding>> ] [ ptr>> ] bi (window-curses-read) ;
: curses-read ( n -- string )
current-window get window-curses-read ;
: window-curses-getch ( window -- key )
ptr>> (window-curses-getch) ;
: curses-getch ( -- key )
current-window get window-curses-getch ;
: window-curses-erase ( window -- )
ptr>> werase curses-error ;
: curses-erase ( -- )
current-window get window-curses-erase ;
: window-curses-move ( y x window -- )
ptr>> [ (window-curses-move) ] [ (window-curses-refresh) ] bi ;
: curses-move ( y x -- )
current-window get window-curses-move ;
: window-delete-line ( y window -- )
ptr>> [ 0 swap (window-curses-move) ]
[ wdeleteln curses-error ] bi ;
: delete-line ( y -- )
current-window get window-delete-line ;
: window-insert-blank-line ( y window -- )
ptr>> (window-insert-blank-line) ;
: insert-blank-line ( y -- )
current-window get window-insert-blank-line ;
: window-insert-line ( string y window -- )
ptr>> [ (window-insert-blank-line) ]
[ (window-curses-write) ] bi ;
: insert-line ( string y -- )
current-window get window-insert-line ;
: window-curses-addch ( ch window -- )
ptr>> (window-curses-addch) ;
: curses-addch ( ch -- )
current-window get window-curses-addch ;
New Annotation