1 ! Copyright (C) 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.strings assocs byte-arrays
4 classes.struct combinators continuations curses.ffi destructors
5 fry io io.encodings.8-bit io.encodings.string io.encodings.utf8
6 io.streams.c kernel libc locals math memoize multiline
7 namespaces prettyprint sequences strings threads ;
10 SYMBOL: current-window
12 CONSTANT: COLOR_BLACK 0
14 CONSTANT: COLOR_GREEN 2
15 CONSTANT: COLOR_YELLO 3
16 CONSTANT: COLOR_BLUE 4
17 CONSTANT: COLOR_MAGEN 5
18 CONSTANT: COLOR_CYAN 6
19 CONSTANT: COLOR_WHITE 7
21 : >BOOLEAN ( ? -- TRUE/FALSE ) TRUE FALSE ? ; inline
23 ERROR: curses-failed ;
24 ERROR: unsupported-curses-terminal ;
26 : curses-error ( n -- ) ERR = [ curses-failed ] when ;
29 { 0 1 2 } [ isatty 0 = not ] all? ;
31 TUPLE: curses-window < disposable
34 { lines integer initial: 0 }
35 { columns integer initial: 0 }
36 { y integer initial: 0 }
37 { x integer initial: 0 }
43 { scrollok initial: t }
44 { leaveok initial: f }
49 { encoding initial: utf8 } ;
51 : <curses-window> ( -- window )
52 curses-window new-disposable ;
54 M: curses-window dispose* ( window -- )
55 ptr>> delwin curses-error ;
59 : window-params ( window -- lines columns y x )
60 { [ lines>> ] [ columns>> ] [ y>> ] [ x>> ] } cleave ;
62 : set-cbreak/raw ( cbreak raw -- )
64 [ cbreak ] [ nocbreak ] if
67 : apply-options ( window -- )
69 [ [ cbreak>> ] [ raw>> ] bi set-cbreak/raw ]
70 [ echo>> [ echo ] [ noecho ] if curses-error ]
71 [ [ ptr>> ] [ scrollok>> >BOOLEAN ] bi scrollok curses-error ]
72 [ [ ptr>> ] [ leaveok>> >BOOLEAN ] bi leaveok curses-error ]
73 [ [ ptr>> ] [ keypad>> >BOOLEAN ] bi keypad curses-error ]
76 SYMBOL: n-registered-colors
78 MEMO: register-color ( fg bg -- n )
79 [ n-registered-colors get ] 2dip init_pair curses-error
80 n-registered-colors [ get ] [ inc ] bi ;
84 : setup-window ( window -- window )
88 ptr>> swap window-params derwin
91 ] if* [ curses-error ] keep >>ptr &dispose
92 ] [ apply-options ] bi ;
94 : with-window ( window quot -- )
95 [ current-window ] dip with-variable ; inline
101 1 n-registered-colors set
102 \ register-color reset-memoized
103 start_color curses-error
106 : curses-pointer-error ( ptr/f -- ptr )
107 dup [ curses-failed ] unless ; inline
111 : with-curses ( window quot -- )
112 curses-ok? [ unsupported-curses-terminal ] unless
115 initscr curses-pointer-error
116 >>ptr dup apply-options
121 [ endwin curses-error ] [ ] cleanup
123 ] with-destructors ; inline
128 : (window-curses-refresh) ( window-ptr -- ) wrefresh curses-error ; inline
129 : (window-curses-write) ( string window-ptr -- ) swap waddstr curses-error ; inline
131 :: (window-curses-read) ( n encoding window-ptr -- string )
133 n 1 + malloc &free :> str
134 window-ptr str n wgetnstr curses-error
135 str encoding alien>string
136 ] with-destructors ; inline
138 : (window-curses-getch) ( window -- key )
139 wgetch [ curses-error ] keep ;
141 : (window-curses-move) ( y x window-ptr -- )
142 -rot wmove curses-error ; inline
144 : (window-insert-blank-line) ( y window-ptr -- )
145 [ 0 swap (window-curses-move) ]
146 [ winsertln curses-error ] bi ; inline
148 : (window-curses-addch) ( ch window-ptr -- )
149 swap waddch curses-error ; inline
153 : window-curses-refresh ( window -- ) ptr>> (window-curses-refresh) ;
154 : curses-refresh ( -- ) current-window get window-curses-refresh ;
156 : window-curses-write ( string window -- )
157 ptr>> (window-curses-write) ;
158 : curses-write ( string -- )
159 current-window get window-curses-write ;
161 : window-curses-nl ( window -- )
162 [ "\n" ] dip ptr>> (window-curses-write) ;
164 current-window get window-curses-nl ;
166 : window-curses-print ( string window -- )
167 ptr>> [ (window-curses-write) ]
168 [ "\n" swap (window-curses-write) ] bi ;
169 : curses-print ( string -- )
170 current-window get window-curses-print ;
172 : window-curses-print-refresh ( string window -- )
173 ptr>> [ (window-curses-write) ]
174 [ "\n" swap (window-curses-write) ]
175 [ (window-curses-refresh) ] tri ;
176 : curses-print-refresh ( string -- )
177 current-window get window-curses-print-refresh ;
179 : window-curses-write-refresh ( string window -- )
180 ptr>> [ (window-curses-write) ] [ (window-curses-refresh) ] bi ;
181 : curses-write-refresh ( string -- )
182 current-window get window-curses-write-refresh ;
184 : window-curses-read ( n window -- string )
185 [ encoding>> ] [ ptr>> ] bi (window-curses-read) ;
186 : curses-read ( n -- string )
187 current-window get window-curses-read ;
189 : window-curses-getch ( window -- key )
190 ptr>> (window-curses-getch) ;
191 : curses-getch ( -- key )
192 current-window get window-curses-getch ;
194 : window-curses-erase ( window -- )
195 ptr>> werase curses-error ;
196 : curses-erase ( -- )
197 current-window get window-curses-erase ;
199 : window-curses-move ( y x window -- )
200 ptr>> [ (window-curses-move) ] [ (window-curses-refresh) ] bi ;
201 : curses-move ( y x -- )
202 current-window get window-curses-move ;
204 : window-delete-line ( y window -- )
205 ptr>> [ 0 swap (window-curses-move) ]
206 [ wdeleteln curses-error ] bi ;
207 : delete-line ( y -- )
208 current-window get window-delete-line ;
210 : window-insert-blank-line ( y window -- )
211 ptr>> (window-insert-blank-line) ;
212 : insert-blank-line ( y -- )
213 current-window get window-insert-blank-line ;
215 : window-insert-line ( string y window -- )
216 ptr>> [ (window-insert-blank-line) ]
217 [ (window-curses-write) ] bi ;
218 : insert-line ( string y -- )
219 current-window get window-insert-line ;
221 : window-curses-addch ( ch window -- )
222 ptr>> (window-curses-addch) ;
223 : curses-addch ( ch -- )
224 current-window get window-curses-addch ;
226 : window-curses-color ( foreground background window -- )
228 2dup [ COLOR_WHITE = ] [ COLOR_BLACK = ] bi* and
229 [ 2drop 0 ] [ register-color ] if COLOR_PAIR
230 ] dip ptr>> swap wattron curses-error ;
231 : curses-color ( foreground background -- )
232 current-window get window-curses-color ;