1/* SCCS Id: @(#)mactty.h 3.4 1993/03/01 */ 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 * (preferrably 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 !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 75extern char game_active; /* flag to window rendering routines not to use ppat */ 76/* 77 * If you want some fancy operations that not a normal TTY device normally 78 * supports, use EXTENDED_SUPPORT. For frames, area erases and area scrolls, 79 * plus bitmap graphics - RESOLUTION DEPENDENT, be sure to call 80 * get_tty_metrics and use those limits. 81 */ 82#define EXTENDED_SUPPORT 0 83/* 84 * if you print a lot of single characters, accumulating each one in a 85 * clipping region will take too much time. Instead, define this, which 86 * will clip in rects. 87 */ 88#define CLIP_RECT_ONLY 1 89 90typedef enum tty_attrib { 91 92/* 93 * Flags relating to the general functioning of the window. 94 * These flags are passed at create_tty time, and changing them 95 * later will clear the screen. 96 */ 97 TTY_ATTRIB_FLAGS , 98/* 99 * When using proportional fonts, this will place each character 100 * separately, ensuring aligned columns (but looking ugly and taking 101 * time) 102 */ 103# define TA_MOVE_EACH_CHAR 1L 104/* 105 * This means draw each change as it occurs instead of collecting the area 106 * and draw it all at once at update_tty() - slower, but more reliable. 107 */ 108# define TA_ALWAYS_REFRESH 2L 109/* 110 * When reaching the right end, we either just stop drawing, or wrap to the 111 * next line. 112 */ 113# define TA_WRAP_AROUND 4L 114/* 115 * Overstrike means that characters are added on top of each other; i e don't 116 * clear the letter beneath. This is faster, using srcOr under QuickDraw 117 */ 118# define TA_OVERSTRIKE 8L 119/* 120 * We may want the window not to scroll when we reach the end line, 121 * but stop drawing instead. 122 */ 123# define TA_INHIBIT_VERT_SCROLL 16L 124 125/* 126 * Foreground and background colors. These only affect characters 127 * drawn by subsequent calls; not what's already there (but it does 128 * affect clears) 129 * On b/w screens these do nothing. 130 */ 131 TTY_ATTRIB_FOREGROUND , 132 TTY_ATTRIB_BACKGROUND , 133# define TA_RGB_TO_TTY(r) ((((long)((r).red>>8)&0xff)<<16)+\ 134 (((long)((r).green>>8)&0xff)<<8)+((long)((r).blue>>8)&0xff)) 135 136/* 137 * Attributes relating to the cursor, and character set mappings 138 */ 139 TTY_ATTRIB_CURSOR , 140/* 141 * Blinking cursor is more noticeable when it's idle 142 */ 143# define TA_BLINKING_CURSOR 1L 144/* 145 * When handling input, do we echo characters as they are typed? 146 */ 147# define TA_ECHO_INPUT 2L 148/* 149 * Do we return each character code separately, or map delete etc? Note 150 * that non-raw input means getchar won't return anything until the user 151 * has typed a return. 152 */ 153# define TA_RAW_INPUT 4L 154/* 155 * Do we print every character as it is (including BS, NL and CR!) or do 156 * do we interpret characters such as NL, BS and CR? 157 */ 158# define TA_RAW_OUTPUT 8L 159/* 160 * When getting a NL, do we also move to the left? 161 */ 162# define TA_NL_ADD_CR 16L 163/* 164 * When getting a CR, do we also move down? 165 */ 166# define TA_CR_ADD_NL 32L 167/* 168 * Wait for input or return what we've got? 169 */ 170# define TA_NONBLOCKING_IO 64L 171 172/* 173 * Use this macro to cast a function pointer to a tty attribute; this will help 174 * portability to systems where a function pointer doesn't fit in a long 175 */ 176# define TA_ATTRIB_FUNC(x) ((long)(x)) 177 178/* 179 * This symbolic constant is used to check the number of attributes 180 */ 181 TTY_NUMBER_ATTRIBUTES 182 183} tty_attrib ; 184 185/* 186 * Character returned by end-of-file condition 187 */ 188# define TTY_EOF -1 189 190 191/* 192 * Create the window according to a resource WIND template. 193 * The window pointer pointed to by window should be NULL to 194 * allocate the window record dynamically, or point to a 195 * WindowRecord structure already allocated. 196 * 197 * Passing in_color means you have to be sure there's color support; 198 * on the Mac, this means 32bit QuickDraw present, else it will 199 * crash. Not passing in_color means everything's rendered in 200 * black & white. 201 */ 202extern short create_tty ( WindowPtr * window , short resource_id , 203 Boolean in_color ) ; 204 205/* 206 * Use init_tty_name or init_tty_number to initialize a window 207 * once allocated by create_tty. Size parameters are in characters. 208 */ 209 210extern short init_tty_number ( WindowPtr window , short font_number , 211 short font_size , short x_size , short y_size ) ; 212 213/* 214 * Close and deallocate a window and its data 215 */ 216extern short destroy_tty ( WindowPtr window ) ; 217 218/* 219 * Change the font and font size used in the window for drawing after 220 * the calls are made. To change the coordinate system, be sure to call 221 * force_tty_coordinate_system_recalc() - else it may look strange if 222 * the new font doesn't match the old one. 223 */ 224extern short set_tty_font_name (winid window_type , char * name ) ; 225extern short force_tty_coordinate_system_recalc ( WindowPtr window ) ; 226 227/* 228 * Getting some metrics about the tty and its drawing. 229 */ 230extern short get_tty_metrics ( WindowPtr window , short * x_size , 231 short * y_size , short * x_size_pixels , short * y_size_pixels , 232 short * font_number , short * font_size , 233 short * char_width , short * row_height ) ; 234 235/* 236 * The basic move cursor function. 0,0 is topleft. 237 */ 238extern short move_tty_cursor ( WindowPtr window , short x_pos , 239 short y_pos ) ; 240 241/* 242 * Flush all changes done to a tty to the screen (see TA_ALWAYS_UPDATE above) 243 */ 244extern short update_tty ( WindowPtr window ) ; 245 246/* 247 * Add a character to the tty and update the cursor position 248 */ 249extern short add_tty_char ( WindowPtr window , short character ) ; 250 251/* 252 * Add a string of characters to the tty and update the cursor 253 * position. The string is 0-terminated! 254 */ 255extern short add_tty_string ( WindowPtr window , const char * string ) ; 256 257/* 258 * Change or read an attribute of the tty. Note that some attribute changes 259 * may clear the screen. See the above enum and defines for values. 260 * Attributes can be both function pointers and special flag values. 261 */ 262extern short get_tty_attrib ( WindowPtr window , tty_attrib attrib , 263 long * value ) ; 264extern short set_tty_attrib ( WindowPtr window , tty_attrib attrib , 265 long value ) ; 266 267/* 268 * Scroll the actual TTY image, in characters, positive means up/left 269 * scroll_tty ( my_tty , 0 , 1 ) means a linefeed. Is always carried out 270 * directly, regardless of the wait-update setting. Does updates before 271 * scrolling. 272 */ 273extern short scroll_tty ( WindowPtr window , short delta_x , 274 short delta_y ) ; 275 276/* 277 * Erase the offscreen bitmap and move the cursor to 0,0. Re-init some window 278 * values (font etc) Is always carried out directly on-screen, regardless of 279 * the wait-for-update setting. Clears update area. 280 */ 281extern short clear_tty ( WindowPtr window ) ; 282 283/* 284 * Call this routine with a window (always _mt_window) and a time (usually 285 * from most recent event) to determine if cursor in window should be blinked 286 */ 287extern short blink_cursor ( WindowPtr window , long when ) ; 288 289/* 290 * For screen dumps, open the printer port and call this function. Can be used 291 * for clipboard as well (only for a PICT, though; this library doesn't concern 292 * itself with characters, just bitmaps) 293 */ 294extern short image_tty ( EventRecord *theEvent, WindowPtr window ) ; 295 296/* 297 * For erasing just an area of characters 298 */ 299extern short clear_tty_window ( WindowPtr window , short from_row , 300 short from_col , short to_row , short to_col ) ; 301 302/* 303 * get and set the invalid region of the main window 304 */ 305 extern short get_invalid_region (WindowPtr window, Rect *inval_rect); 306 extern short set_invalid_region (WindowPtr window, Rect *inval_rect); 307 308/* 309 * Now in macsnd.c, which seemed like a good place 310 */ 311extern void tty_nhbell (); 312 313#if EXTENDED_SUPPORT 314 315/* 316 * Various versions of delete character/s, insert line/s etc can be handled by 317 * this general-purpose function. Negative num_ means delete, positive means 318 * insert, and you can never be sure which of row and col operations come first 319 * if you specify both... 320 */ 321extern short mangle_tty_rows_columns ( WindowPtr window , 322 short from_row , short num_rows , short from_col , short num_cols ) ; 323 324/* 325 * For framing an area without using grahpics characters. 326 * Note that the given limits are those used for framing, you should not 327 * draw in them. frame_fatness should typically be 1-5, and may be clipped 328 * if it is too large. 329 */ 330extern short frame_tty_window ( WindowPtr window , short from_row , 331 short from_col , short to_row , short to_col , short frame_fatness ) ; 332 333/* 334 * For inverting specific characters after the fact. May look funny in color. 335 */ 336extern short invert_tty_window ( WindowPtr window , short from_row , 337 short from_col , short to_row , short to_col ) ; 338 339/* 340 * For drawing lines on the tty - VERY DEVICE DEPENDENT. Use get_tty_metrics. 341 */ 342extern short draw_tty_line ( WindowPtr window , short from_x , 343 short from_y , short to_x , short to_y ) ; 344 345#endif /* EXTENDED_SUPPORT */ 346 347#endif /* _H_tty_public */ 348