! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. 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 } ; : ( -- window ) curses-window new-disposable ; M: curses-window dispose* ( window -- ) ptr>> delwin curses-error ; > ] [ 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 ; 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 ;