OSDN Git Service

ifdef-ed official patches
[jnethack/source.git] / include / mactty.h
1 /* NetHack 3.6  mactty.h        $NHDT-Date: 1447755970 2015/11/17 10:26:10 $  $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */
2 /* Copyright (c) Jon W{tte 1993.                                        */
3 /* NetHack may be freely redistributed.  See license for details.       */
4
5 /*
6  * This header is the supported external interface for the "tty" window
7  * package. This package sports care-free handling of "dumb" tty windows
8  * (preferably using monospaced fonts) - it does NOT remember the strings
9  * sent to it; rather, it uses an offscreen bitmap.
10  *
11  * For best performance, make sure it is aligned on a 32-pixel boundary
12  * (or at least a 16-pixel one) in black & white. For 24bit color,
13  * alignment doesn't matter, and for 8-bit color, alignment to every
14  * fourth pixel is most efficient.
15  *
16  * (c) Copyright 1993 Jon W{tte
17  */
18
19 /*
20  * You should really not poke in the structures used by the tty window.
21  * However, since it uses the wRefCon of windows (by calling GetWRefCon
22  * and SetWRefCon) you lose that possibility. If you still want to store
23  * information about a window, the FIRST location _pointed to_ by the
24  * wRefCon will be a void * that you can use for whatever reasons. Don't
25  * take the address of this variable and expect it to stay the same
26  * across calls to the tty window.
27  *
28  * void * my_config_ptr = * ( void * * ) GetWRefCon ( tty_window ) ;
29  */
30
31 /*
32  * The library uses the window's port temporarily through SetPortBits;
33  * that means you shouldn't do any funky things to the clipping region
34  * etc. Actually, you shouldn't even resize the window, as that will clip
35  * new drawing.
36  *
37  * Also, if you use this library under Pascal, remember that the string
38  * passed to add_tty_string() is a "C" style string with NO length byte,
39  * and a terminating zero byte at the end instead.
40  */
41
42 #ifndef _H_tty_public
43 #define _H_tty_public
44 #undef red /* undef internal color const strings from decl */
45 #undef green
46 #undef blue
47 #if 1 /*!TARGET_API_MAC_CARBON*/
48 #include <windows.h>
49 #endif
50
51 /*
52  * Error code returned when it's probably our fault, or
53  * bad parameters.
54  */
55 #define general_failure 1
56
57 /*
58  * Base resource id's for window types
59  */
60 #define WIN_BASE_RES 128
61 #define WIN_BASE_KIND 128
62
63 /*
64  * Commonly used characters
65  */
66 #define CHAR_ENTER ((char) 3)
67 #define CHAR_BELL ((char) 7)
68 #define CHAR_BS ((char) 8)
69 #define CHAR_LF ((char) 10)
70 #define CHAR_CR ((char) 13)
71 #define CHAR_ESC ((char) 27)
72 #define CHAR_BLANK ((char) 32)
73 #define CHAR_DELETE ((char) 127)
74
75 extern char game_active; /* flag to window rendering routines
76                             not to use ppat */
77 /*
78  * If you want some fancy operations that not a normal TTY device normally
79  * supports, use EXTENDED_SUPPORT. For frames, area erases and area scrolls,
80  * plus bitmap graphics - RESOLUTION DEPENDENT, be sure to call
81  * get_tty_metrics and use those limits.
82  */
83 #define EXTENDED_SUPPORT 0
84 /*
85  * if you print a lot of single characters, accumulating each one in a
86  * clipping region will take too much time. Instead, define this, which
87  * will clip in rects.
88  */
89 #define CLIP_RECT_ONLY 1
90
91 typedef enum tty_attrib {
92
93     /*
94      * Flags relating to the general functioning of the window.
95      * These flags are passed at create_tty time, and changing them
96      * later will clear the screen.
97      */
98     TTY_ATTRIB_FLAGS,
99 /*
100  * When using proportional fonts, this will place each character
101  * separately, ensuring aligned columns (but looking ugly and taking
102  * time)
103  */
104 #define TA_MOVE_EACH_CHAR 1L
105 /*
106  * This means draw each change as it occurs instead of collecting the area
107  * and draw it all at once at update_tty() - slower, but more reliable.
108  */
109 #define TA_ALWAYS_REFRESH 2L
110 /*
111  * When reaching the right end, we either just stop drawing, or wrap to the
112  * next line.
113  */
114 #define TA_WRAP_AROUND 4L
115 /*
116  * Overstrike means that characters are added on top of each other; i e don't
117  * clear the letter beneath. This is faster, using srcOr under QuickDraw
118  */
119 #define TA_OVERSTRIKE 8L
120 /*
121  * We may want the window not to scroll when we reach the end line,
122  * but stop drawing instead.
123  */
124 #define TA_INHIBIT_VERT_SCROLL 16L
125
126     /*
127      * Foreground and background colors. These only affect characters
128      * drawn by subsequent calls; not what's already there (but it does
129      * affect clears)
130      * On b/w screens these do nothing.
131      */
132     TTY_ATTRIB_FOREGROUND,
133     TTY_ATTRIB_BACKGROUND,
134 #define TA_RGB_TO_TTY(r)                       \
135     ((((long) ((r).red >> 8) & 0xff) << 16)    \
136      + (((long) ((r).green >> 8) & 0xff) << 8) \
137      + ((long) ((r).blue >> 8) & 0xff))
138
139     /*
140      * Attributes relating to the cursor, and character set mappings
141      */
142     TTY_ATTRIB_CURSOR,
143 /*
144  * Blinking cursor is more noticeable when it's idle
145  */
146 #define TA_BLINKING_CURSOR 1L
147 /*
148  * When handling input, do we echo characters as they are typed?
149  */
150 #define TA_ECHO_INPUT 2L
151 /*
152  * Do we return each character code separately, or map delete etc? Note
153  * that non-raw input means getchar won't return anything until the user
154  * has typed a return.
155  */
156 #define TA_RAW_INPUT 4L
157 /*
158  * Do we print every character as it is (including BS, NL and CR!) or do
159  * do we interpret characters such as NL, BS and CR?
160  */
161 #define TA_RAW_OUTPUT 8L
162 /*
163  * When getting a NL, do we also move to the left?
164  */
165 #define TA_NL_ADD_CR 16L
166 /*
167  * When getting a CR, do we also move down?
168  */
169 #define TA_CR_ADD_NL 32L
170 /*
171  * Wait for input or return what we've got?
172  */
173 #define TA_NONBLOCKING_IO 64L
174
175 /*
176  * Use this macro to cast a function pointer to a tty attribute; this will
177  * help portability to systems where a function pointer doesn't fit in a long
178  */
179 #define TA_ATTRIB_FUNC(x) ((long) (x))
180
181     /*
182      * This symbolic constant is used to check the number of attributes
183      */
184     TTY_NUMBER_ATTRIBUTES
185
186 } tty_attrib;
187
188 /*
189  * Character returned by end-of-file condition
190  */
191 #define TTY_EOF -1
192
193 /*
194  * Create the window according to a resource WIND template.
195  * The window pointer pointed to by window should be NULL to
196  * allocate the window record dynamically, or point to a
197  * WindowRecord structure already allocated.
198  *
199  * Passing in_color means you have to be sure there's color support;
200  * on the Mac, this means 32bit QuickDraw present, else it will
201  * crash. Not passing in_color means everything's rendered in
202  * black & white.
203  */
204 extern short create_tty(WindowPtr *window, short resource_id,
205                         Boolean in_color);
206
207 /*
208  * Use init_tty_name or init_tty_number to initialize a window
209  * once allocated by create_tty. Size parameters are in characters.
210  */
211
212 extern short init_tty_number(WindowPtr window, short font_number,
213                              short font_size, short x_size, short y_size);
214
215 /*
216  * Close and deallocate a window and its data
217  */
218 extern short destroy_tty(WindowPtr window);
219
220 /*
221  * Change the font and font size used in the window for drawing after
222  * the calls are made. To change the coordinate system, be sure to call
223  * force_tty_coordinate_system_recalc() - else it may look strange if
224  * the new font doesn't match the old one.
225  */
226 extern short set_tty_font_name(winid window_type, char *name);
227 extern short force_tty_coordinate_system_recalc(WindowPtr window);
228
229 /*
230  * Getting some metrics about the tty and its drawing.
231  */
232 extern short get_tty_metrics(WindowPtr window, short *x_size, short *y_size,
233                              short *x_size_pixels, short *y_size_pixels,
234                              short *font_number, short *font_size,
235                              short *char_width, short *row_height);
236
237 /*
238  * The basic move cursor function. 0,0 is topleft.
239  */
240 extern short move_tty_cursor(WindowPtr window, short x_pos, short y_pos);
241
242 /*
243  * Flush all changes done to a tty to the screen (see TA_ALWAYS_UPDATE above)
244  */
245 extern short update_tty(WindowPtr window);
246
247 /*
248  * Add a character to the tty and update the cursor position
249  */
250 extern short add_tty_char(WindowPtr window, short character);
251
252 /*
253  * Add a string of characters to the tty and update the cursor
254  * position. The string is 0-terminated!
255  */
256 extern short add_tty_string(WindowPtr window, const char *string);
257
258 /*
259  * Change or read an attribute of the tty. Note that some attribute changes
260  * may clear the screen. See the above enum and defines for values.
261  * Attributes can be both function pointers and special flag values.
262  */
263 extern short get_tty_attrib(WindowPtr window, tty_attrib attrib, long *value);
264 extern short set_tty_attrib(WindowPtr window, tty_attrib attrib, long value);
265
266 /*
267  * Scroll the actual TTY image, in characters, positive means up/left
268  * scroll_tty ( my_tty , 0 , 1 ) means a linefeed. Is always carried out
269  * directly, regardless of the wait-update setting. Does updates before
270  * scrolling.
271  */
272 extern short scroll_tty(WindowPtr window, short delta_x, short delta_y);
273
274 /*
275  * Erase the offscreen bitmap and move the cursor to 0,0. Re-init some window
276  * values (font etc) Is always carried out directly on-screen, regardless of
277  * the wait-for-update setting. Clears update area.
278  */
279 extern short clear_tty(WindowPtr window);
280
281 /*
282  * Call this routine with a window (always _mt_window) and a time (usually
283  * from most recent event) to determine if cursor in window should be blinked
284  */
285 extern short blink_cursor(WindowPtr window, long when);
286
287 /*
288  * For screen dumps, open the printer port and call this function. Can be used
289  * for clipboard as well (only for a PICT, though; this library doesn't
290  * concern
291  * itself with characters, just bitmaps)
292  */
293 extern short image_tty(EventRecord *theEvent, WindowPtr window);
294
295 /*
296  * For erasing just an area of characters
297  */
298 extern short clear_tty_window(WindowPtr window, short from_row,
299                               short from_col, short to_row, short to_col);
300
301 /*
302  * get and set the invalid region of the main window
303  */
304 extern short get_invalid_region(WindowPtr window, Rect *inval_rect);
305 extern short set_invalid_region(WindowPtr window, Rect *inval_rect);
306
307 /*
308  * Now in macsnd.c, which seemed like a good place
309  */
310 extern void tty_nhbell();
311
312 #if EXTENDED_SUPPORT
313
314 /*
315  * Various versions of delete character/s, insert line/s etc can be handled by
316  * this general-purpose function. Negative num_ means delete, positive means
317  * insert, and you can never be sure which of row and col operations come
318  * first
319  * if you specify both...
320  */
321 extern short mangle_tty_rows_columns(WindowPtr window, short from_row,
322                                      short num_rows, short from_col,
323                                      short num_cols);
324
325 /*
326  * For framing an area without using grahpics characters.
327  * Note that the given limits are those used for framing, you should not
328  * draw in them. frame_fatness should typically be 1-5, and may be clipped
329  * if it is too large.
330  */
331 extern short frame_tty_window(WindowPtr window, short from_row,
332                               short from_col, short to_row, short to_col,
333                               short frame_fatness);
334
335 /*
336  * For inverting specific characters after the fact. May look funny in color.
337  */
338 extern short invert_tty_window(WindowPtr window, short from_row,
339                                short from_col, short to_row, short to_col);
340
341 /*
342  * For drawing lines on the tty - VERY DEVICE DEPENDENT. Use get_tty_metrics.
343  */
344 extern short draw_tty_line(WindowPtr window, short from_x, short from_y,
345                            short to_x, short to_y);
346
347 #endif /* EXTENDED_SUPPORT */
348
349 #endif /* _H_tty_public */