156 lines
4.3 KiB
Factor
156 lines
4.3 KiB
Factor
! Copyright (C) 2008 Doug Coleman.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors alien.c-types alien.strings assocs byte-arrays
|
|
combinators continuations destructors fry io.encodings.8-bit
|
|
io io.encodings.string io.encodings.utf8 kernel math
|
|
namespaces prettyprint sequences
|
|
strings threads curses.ffi ;
|
|
IN: curses
|
|
|
|
SYMBOL: curses-windows
|
|
SYMBOL: current-window
|
|
|
|
: ERR -1 ; inline
|
|
: FALSE 0 ; inline
|
|
: TRUE 1 ; inline
|
|
: >BOOLEAN ( n -- TRUE/FALSE ) >boolean TRUE FALSE ? ; inline
|
|
|
|
ERROR: duplicate-window window ;
|
|
ERROR: unnamed-window window ;
|
|
ERROR: window-not-found window ;
|
|
ERROR: curses-failed ;
|
|
|
|
: get-window ( string -- window )
|
|
dup curses-windows get at*
|
|
[ nip ] [ drop window-not-found ] if ;
|
|
|
|
: window-ptr ( string -- window ) get-window ptr>> ;
|
|
|
|
: curses-error ( n -- ) ERR = [ curses-failed ] when ;
|
|
|
|
: with-curses ( quot -- )
|
|
H{ } clone curses-windows [
|
|
initscr curses-error
|
|
[
|
|
curses-windows get values [ dispose ] each
|
|
nocbreak curses-error
|
|
echo curses-error
|
|
endwin curses-error
|
|
] [ ] cleanup
|
|
] with-variable ; inline
|
|
|
|
: with-window ( name quot -- )
|
|
[ window-ptr current-window ] dip with-variable ; inline
|
|
|
|
TUPLE: curses-window
|
|
name
|
|
parent-name
|
|
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 } ;
|
|
|
|
M: curses-window dispose ( window -- )
|
|
ptr>> delwin curses-error ;
|
|
|
|
<PRIVATE
|
|
|
|
: add-window ( window -- )
|
|
dup name>> [ unnamed-window ] unless*
|
|
curses-windows get 2dup key?
|
|
[ duplicate-window ] [ set-at ] if ;
|
|
|
|
: delete-window ( window -- )
|
|
curses-windows get 2dup key?
|
|
[ delete-at ] [ drop window-not-found ] if ;
|
|
|
|
: window-params ( window -- lines columns y x )
|
|
{ [ lines>> ] [ columns>> ] [ y>> ] [ x>> ] } cleave ;
|
|
|
|
: setup-window ( window -- )
|
|
{
|
|
[
|
|
dup
|
|
dup parent-name>> [
|
|
window-ptr swap window-params derwin
|
|
] [
|
|
window-params newwin
|
|
] if* [ curses-error ] keep >>ptr drop
|
|
]
|
|
[ cbreak>> [ cbreak ] [ nocbreak ] if curses-error ]
|
|
[ echo>> [ echo ] [ noecho ] if curses-error ]
|
|
[ raw>> [ raw ] [ noraw ] if curses-error ]
|
|
[ [ ptr>> ] [ scrollok>> >BOOLEAN ] bi scrollok curses-error ]
|
|
[ [ ptr>> ] [ leaveok>> >BOOLEAN ] bi leaveok curses-error ]
|
|
[ [ ptr>> ] [ keypad>> >BOOLEAN ] bi keypad curses-error ]
|
|
[ add-window ]
|
|
} cleave ;
|
|
|
|
PRIVATE>
|
|
|
|
: add-curses-window ( window -- )
|
|
[ setup-window ] [ ] [ dispose ] cleanup ;
|
|
|
|
: (curses-window-refresh) ( window-ptr -- ) wrefresh curses-error ;
|
|
: wnrefresh ( window -- ) window-ptr (curses-window-refresh) ;
|
|
: curses-refresh ( -- ) current-window get (curses-window-refresh) ;
|
|
|
|
: (curses-wprint) ( window-ptr string -- )
|
|
waddstr curses-error ;
|
|
|
|
: curses-nwrite ( window string -- )
|
|
[ window-ptr ] dip (curses-wprint) ;
|
|
|
|
: curses-wprint ( window string -- )
|
|
[ window-ptr dup ] dip (curses-wprint) "\n" (curses-wprint) ;
|
|
|
|
: curses-printf ( window string -- )
|
|
[ window-ptr dup dup ] dip (curses-wprint)
|
|
"\n" (curses-wprint)
|
|
(curses-window-refresh) ;
|
|
|
|
: curses-writef ( window string -- )
|
|
[ window-ptr dup ] dip (curses-wprint) (curses-window-refresh) ;
|
|
|
|
: (curses-read) ( window-ptr n encoding -- string )
|
|
[ [ <byte-array> tuck ] keep wgetnstr curses-error ] dip alien>string ;
|
|
|
|
: curses-read ( window n -- string )
|
|
utf8 [ window-ptr ] 2dip (curses-read) ;
|
|
|
|
: curses-erase ( window -- ) window-ptr werase curses-error ;
|
|
|
|
: move-cursor ( window-name y x -- )
|
|
[
|
|
window-ptr
|
|
{
|
|
[ ]
|
|
[ (curses-window-refresh) ]
|
|
[ c-window-_curx ]
|
|
[ c-window-_cury ]
|
|
} cleave
|
|
] 2dip mvcur curses-error (curses-window-refresh) ;
|
|
|
|
: delete-line ( window-name y -- )
|
|
[ window-ptr dup ] dip
|
|
0 wmove curses-error wdeleteln curses-error ;
|
|
|
|
: insert-blank-line ( window-name y -- )
|
|
[ window-ptr dup ] dip
|
|
0 wmove curses-error winsertln curses-error ;
|
|
|
|
: insert-line ( window-name y string -- )
|
|
[ dupd insert-blank-line ] dip
|
|
curses-writef ;
|