|
|
1.1 ! root 1: /* uifc.h */ ! 2: ! 3: /* Rob Swindell's Text-mode User Interface Library */ ! 4: ! 5: /* $Id: uifc.h,v 1.75 2006/09/06 22:24:59 deuce Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This library is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU Lesser General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU Lesser General Public License for more details: lgpl.txt or * ! 18: * http://www.fsf.org/copyleft/lesser.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #ifndef _UIFC_H_ ! 39: #define _UIFC_H_ ! 40: ! 41: #include <time.h> ! 42: #include <fcntl.h> ! 43: #include <ctype.h> ! 44: #include <stdio.h> ! 45: #include <string.h> ! 46: #include <stdarg.h> ! 47: #include <stdlib.h> ! 48: /* OS Specific */ ! 49: #if defined(_WIN32) ! 50: #include <windows.h> ! 51: #endif ! 52: #if defined(__unix__) ! 53: #include <sys/param.h> /* PATH_MAX */ ! 54: #endif ! 55: ! 56: #if defined(__unix__) && !defined(stricmp) ! 57: #define stricmp strcasecmp ! 58: #define strnicmp strncasecmp ! 59: #endif ! 60: ! 61: #if !defined(FREE_AND_NULL) ! 62: #define FREE_AND_NULL(x) if(x!=NULL) { free(x); x=NULL; } ! 63: #endif ! 64: ! 65: #if !defined(MAX_PATH) /* maximum path length */ ! 66: #if defined MAXPATHLEN ! 67: #define MAX_PATH MAXPATHLEN /* clib.h */ ! 68: #elif defined PATH_MAX ! 69: #define MAX_PATH PATH_MAX ! 70: #elif defined _MAX_PATH ! 71: #define MAX_PATH _MAX_PATH ! 72: #else ! 73: #define MAX_PATH 260 ! 74: #endif ! 75: #endif ! 76: ! 77: #define MAX_OPTS 10000 ! 78: #define MSK_ON 0xf0000000 ! 79: #define MSK_OFF 0x0fffffff ! 80: #define MSK_INS 0x10000000 ! 81: #define MSK_DEL 0x20000000 ! 82: #define MSK_GET 0x30000000 ! 83: #define MSK_PUT 0x40000000 ! 84: #define MSK_EDIT 0x50000000 ! 85: /* Dont forget, negative return values are used for extended keys (if WIN_EXTKEYS used)! */ ! 86: #define MAX_OPLN 75 /* Maximum length of each option per menu call */ ! 87: #define MAX_BUFS 7 /* Maximum number of screen buffers to save */ ! 88: #define MIN_LINES 14 /* Minimum number of screen lines supported */ ! 89: #define MAX_LINES 60 /* Maximum number of screen rows supported */ ! 90: #define MAX_BFLN 80*MAX_LINES*2 /* Maximum size of screen buffers */ ! 91: ! 92: #ifndef uint ! 93: #define uint unsigned int ! 94: #endif ! 95: ! 96: /**************************/ ! 97: /* Bits in uifcapi_t.mode */ ! 98: /**************************/ ! 99: #define UIFC_INMSG (1<<0) /* Currently in Message Routine non-recursive */ ! 100: #define UIFC_MOUSE (1<<1) /* Mouse installed and available */ ! 101: #define UIFC_MONO (1<<2) /* Force monochrome mode */ ! 102: #define UIFC_COLOR (1<<3) /* Force color mode */ ! 103: #define UIFC_IBM (1<<4) /* Force use of IBM charset */ ! 104: #define UIFC_NOCTRL (1<<5) /* Don't allow useage of CTRL keys for movement ! 105: * etc in menus (Still available in text boxes) */ ! 106: ! 107: /*******************************/ ! 108: /* Bits in uifcapi_t.list mode */ ! 109: /*******************************/ ! 110: #define WIN_ORG (1<<0) /* Original menu - destroy valid screen area */ ! 111: #define WIN_SAV (1<<1) /* Save existing text and replace when finished */ ! 112: #define WIN_ACT (1<<2) /* Menu remains active after a selection */ ! 113: #define WIN_L2R (1<<3) /* Center the window based on 'width' */ ! 114: #define WIN_T2B (1<<4) /* Center the window based on 'height' */ ! 115: #define WIN_INS (1<<5) /* Allows user to user insert key */ ! 116: #define WIN_INSACT (1<<6) /* Remains active after insert key */ ! 117: #define WIN_DEL (1<<7) /* Allows user to use delete key */ ! 118: #define WIN_DELACT (1<<8) /* Remains active after delete key */ ! 119: #define WIN_ESC (1<<9) /* Screen is active when escape is hit */ ! 120: #define WIN_RHT (1<<10) /* Place window against right side of screen */ ! 121: #define WIN_BOT (1<<11) /* Place window against botton of screen */ ! 122: #define WIN_GET (1<<12) /* Allows F5 to Get a menu item */ ! 123: #define WIN_PUT (1<<13) /* Allows F6 to Put a menu item */ ! 124: #define WIN_CHE (1<<14) /* Stay active after escape if changes */ ! 125: #define WIN_XTR (1<<15) /* Add extra line at end for inserting at end */ ! 126: #define WIN_DYN (1<<16) /* Dynamic window - return at least every second */ ! 127: #define WIN_HLP (1<<17) /* Parse 'Help codes' */ ! 128: #define WIN_PACK (1<<18) /* Pack text in window (No padding) */ ! 129: #define WIN_IMM (1<<19) /* Draw window and return immediately */ ! 130: #define WIN_FAT (1<<20) /* Do not pad outside borders */ ! 131: #define WIN_REDRAW (1<<21) /* Force redraw on dynamic window */ ! 132: #define WIN_NODRAW (1<<22) /* Force not to redraw on dynamic window */ ! 133: #define WIN_EXTKEYS (1<<23) /* Return on any keypress... if it's not handled internally ! 134: * Return value is -2 - keyvalue */ ! 135: #define WIN_NOBRDR (1<<24) /* Do not draw a border around the window */ ! 136: #define WIN_FIXEDHEIGHT (1<<25) /* Use list_height from uifc struct */ ! 137: #define WIN_UNGETMOUSE (1<<26) /* If the mouse is clicked outside the window, */ ! 138: /* Put the mouse event back into the event queue */ ! 139: #define WIN_EDIT (1<<27) /* Allow F2 to edit a menu item */ ! 140: #define WIN_EDITACT (1<<28) /* Remain active after edit key */ ! 141: #define WIN_INACT (1<<29) /* Draw window inactive... intended for use with WIN_IMM */ ! 142: ! 143: #define WIN_MID WIN_L2R|WIN_T2B /* Place window in middle of screen */ ! 144: ! 145: #define SCRN_TOP 3 ! 146: #define SCRN_LEFT 5 ! 147: #define SCRN_RIGHT ((int)api->scrn_width-4) ! 148: ! 149: /* Bits in 'mode' for getkey and getstr */ ! 150: #define K_UPPER (1L<<0) /* Converts all letters to upper case */ ! 151: #define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ ! 152: #define K_NUMBER (1L<<2) /* Allow numbers only */ ! 153: #define K_WRAP (1L<<3) /* Allows word wrap */ ! 154: #define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ ! 155: #define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ ! 156: #define K_LINE (1L<<6) /* Input line (inverse color) */ ! 157: #define K_EDIT (1L<<7) /* Edit string passed */ ! 158: #define K_CHAT (1L<<8) /* In chat multi-chat */ ! 159: #define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ ! 160: #define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ ! 161: #define K_SCANNING (1L<<11) /* UPC Scanner is active... return on '%' */ ! 162: #define K_TABEXIT (1L<<12) /* Return on TAB or BACKTAB */ ! 163: #define K_DECIMAL (1L<<13) /* Allow floating point numbers only */ ! 164: #define K_DEUCEEXIT (1L<<14) /* Return whenever Deuce wants to exit */ ! 165: /* Returns on up/down/F2 */ ! 166: #define K_MOUSEEXIT (1L<<15) /* Returns when mouse is clicked outside of */ ! 167: /* Input area (NOT outside of window!) */ ! 168: /* And ungets the mouse event. */ ! 169: #define K_PASSWORD (1L<<16) /* Does not display text while editing */ ! 170: ! 171: /* Bottom line elements */ ! 172: #define BL_INS (1<<0) /* INS key */ ! 173: #define BL_DEL (1<<1) /* DEL key */ ! 174: #define BL_GET (1<<2) /* Get key */ ! 175: #define BL_PUT (1<<3) /* Put key */ ! 176: #define BL_EDIT (1<<4) /* Edit key */ ! 177: #define BL_HELP (1<<5) /* Help key */ ! 178: ! 179: #define HELPBUF_SIZE 4000 ! 180: ! 181: #ifndef _GEN_DEFS_H ! 182: /* Control characters */ ! 183: #define STX 0x02 /* Start of text ^B */ ! 184: #define ETX 0x03 /* End of text ^C */ ! 185: #define BS '\b' /* Back space ^H */ ! 186: #define TAB '\t' /* Horizontal tabulation ^I */ ! 187: #define LF '\n' /* Line feed ^J */ ! 188: #define FF 0x0c /* Form feed ^L */ ! 189: #define CR '\r' /* Carriage return ^M */ ! 190: #define ESC 0x1b /* Escape ^[ */ ! 191: #define DEL 0x7f /* Delete ^BS */ ! 192: ! 193: enum { ! 194: CTRL_A=1 ! 195: ,CTRL_B ! 196: ,CTRL_C ! 197: ,CTRL_D ! 198: ,CTRL_E ! 199: ,CTRL_F ! 200: ,CTRL_G ! 201: ,CTRL_H ! 202: ,CTRL_I ! 203: ,CTRL_J ! 204: ,CTRL_K ! 205: ,CTRL_L ! 206: ,CTRL_M ! 207: ,CTRL_N ! 208: ,CTRL_O ! 209: ,CTRL_P ! 210: ,CTRL_Q ! 211: ,CTRL_R ! 212: ,CTRL_S ! 213: ,CTRL_T ! 214: ,CTRL_U ! 215: ,CTRL_V ! 216: ,CTRL_W ! 217: ,CTRL_X ! 218: ,CTRL_Y ! 219: ,CTRL_Z ! 220: }; ! 221: ! 222: #endif ! 223: ! 224: #ifndef uchar /* Short-hand for unsigned data types */ ! 225: #define uchar unsigned char ! 226: #endif ! 227: #ifndef uint ! 228: #define uint unsigned int ! 229: #endif ! 230: #ifndef ulong ! 231: #define ulong unsigned long ! 232: #endif ! 233: ! 234: #ifndef BOOL ! 235: #define BOOL int ! 236: #ifndef TRUE ! 237: #define TRUE 1 ! 238: #endif ! 239: #ifndef FALSE ! 240: #define FALSE 0 ! 241: #endif ! 242: #endif ! 243: ! 244: typedef struct { ! 245: int left,top,right,bot; ! 246: int *cur,*bar; ! 247: uchar* buf; ! 248: } win_t; ! 249: ! 250: typedef struct { ! 251: /****************************************************************************/ ! 252: /* Size of the structure (for version compatibility verification). */ ! 253: /****************************************************************************/ ! 254: size_t size; ! 255: /****************************************************************************/ ! 256: /* Controls general UIFC library behavior. */ ! 257: /****************************************************************************/ ! 258: long mode; ! 259: /****************************************************************************/ ! 260: /* Set to TRUE when changes to data have been made by input function. */ ! 261: /****************************************************************************/ ! 262: BOOL changes; ! 263: /****************************************************************************/ ! 264: /* The overlapped-window save buffer number. */ ! 265: /****************************************************************************/ ! 266: uint savnum; ! 267: /****************************************************************************/ ! 268: /* The current overlapped-window save buffer depth. */ ! 269: /****************************************************************************/ ! 270: uint savdepth; ! 271: /****************************************************************************/ ! 272: /* Screen length */ ! 273: /****************************************************************************/ ! 274: uint scrn_len; ! 275: /****************************************************************************/ ! 276: /* Screen Width */ ! 277: /****************************************************************************/ ! 278: uint scrn_width; ! 279: /****************************************************************************/ ! 280: /* ESC key delay for curses */ ! 281: /****************************************************************************/ ! 282: uint esc_delay; ! 283: /****************************************************************************/ ! 284: /* Alternative method of setting current help text. */ ! 285: /****************************************************************************/ ! 286: char* helpbuf; ! 287: /****************************************************************************/ ! 288: /* Location of the help data and index files. */ ! 289: /****************************************************************************/ ! 290: char helpdatfile[MAX_PATH+1]; ! 291: char helpixbfile[MAX_PATH+1]; ! 292: /****************************************************************************/ ! 293: /* Help and exit button locations for current/last window */ ! 294: /****************************************************************************/ ! 295: int buttony; ! 296: int exitstart; ! 297: int exitend; ! 298: int helpstart; ! 299: int helpend; ! 300: /****************************************************************************/ ! 301: /* List height for WIN_FIXEDHEIGHT lists. */ ! 302: /****************************************************************************/ ! 303: int list_height; ! 304: ! 305: /****************************************************************************/ ! 306: /* Colours for the various bits */ ! 307: /****************************************************************************/ ! 308: uchar hclr,lclr,bclr,cclr,lbclr; ! 309: ! 310: /****************************************************************************/ ! 311: /* Have we initialized successfully? */ ! 312: /****************************************************************************/ ! 313: BOOL initialized; ! 314: ! 315: /****************************************************************************/ ! 316: /* Exit/uninitialize function. */ ! 317: /****************************************************************************/ ! 318: void (*bail) (void); ! 319: /****************************************************************************/ ! 320: /* Fill the screen with the appropriate background attribute. */ ! 321: /* str is the title for the application banner. */ ! 322: /* Returns 0 on success, non-zero on failure. */ ! 323: /****************************************************************************/ ! 324: int (*scrn) (char* str); ! 325: /****************************************************************************/ ! 326: /* Popup a message, maybe wait for the user to hit a key or click button. */ ! 327: /****************************************************************************/ ! 328: void (*msg) (char* str); ! 329: /****************************************************************************/ ! 330: /* Popup/down a status message. */ ! 331: /* str is the message to display on popup. */ ! 332: /* if str==NULL, then the the status is to be cleared (popdown). */ ! 333: /****************************************************************************/ ! 334: void (*pop) (char* str); ! 335: /****************************************************************************/ ! 336: /* General menu function. */ ! 337: /* mode contains WIN_* flags to control display and functionality. */ ! 338: /* left, top and width specify desired screen locations and window size. */ ! 339: /* cur is a pointer to the current (default) option. */ ! 340: /* bar is a pointer to the current location of the lightbar (which used). */ ! 341: /* title is the caption for the menu. */ ! 342: /* Menus can centered left to right and top to bottom automatically. */ ! 343: /* mode bits are set with macros WIN_*. */ ! 344: /* option is an array of char arrays, first element of last char array */ ! 345: /* must be NULL. */ ! 346: /* Returns the 0-based selected option number, -1 for ESC, or the selected */ ! 347: /* option number OR'd with MSK_INS, MSK_DEL, MSK_GET, MSK_PUT, or MSK_EDIT. */ ! 348: /****************************************************************************/ ! 349: int (*list) (int mode, int left, int top, int width, int* dflt ! 350: ,int* bar, char *title, char** option); ! 351: /****************************************************************************/ ! 352: /* Windowed string input routine. */ ! 353: /* mode contains WIN_* flags to control display and functionality. */ ! 354: /* left and top specify desired screen location. */ ! 355: /* prompt is displayed before the input is requested. */ ! 356: /* str is the string to input or edit. */ ! 357: /* len is the maximum length of the string. */ ! 358: /* kmode contains flags that control the string input (K_* macros). */ ! 359: /* This function sets uifcapi_t.changes to TRUE if the string is modified. */ ! 360: /* Returns the length of the string or -1 on escape/abort. */ ! 361: /****************************************************************************/ ! 362: int (*input)(int mode, int left, int top, char* prompt, char* str ! 363: ,int len, int kmode); ! 364: /****************************************************************************/ ! 365: /* Sets the current help index by source code file and line number. */ ! 366: /****************************************************************************/ ! 367: void (*sethelp)(int line, char* file); ! 368: ! 369: /****************************************************************************/ ! 370: /* Shows the current help text */ ! 371: /****************************************************************************/ ! 372: void (*showhelp)(void); ! 373: ! 374: /****************************************************************************/ ! 375: /* Shows a scrollable text buffer - optionally parsing "help markup codes" */ ! 376: /****************************************************************************/ ! 377: void (*showbuf)(int mode, int left, int top, int width, int height ! 378: ,char *title, char *hbuf, int *curp, int *barp); ! 379: ! 380: /****************************************************************************/ ! 381: /* Updates time in upper left corner of screen with current time in ASCII/ */ ! 382: /* Unix format */ ! 383: /****************************************************************************/ ! 384: void (*timedisplay)(BOOL force); ! 385: ! 386: /****************************************************************************/ ! 387: /* Displays the bottom line using the BL_* macros */ ! 388: /****************************************************************************/ ! 389: void (*bottomline)(int line); ! 390: ! 391: /****************************************************************************/ ! 392: /* String input/exit box at a specified position */ ! 393: /****************************************************************************/ ! 394: int (*getstrxy)(int left, int top, int width, char *outstr, int max ! 395: ,long mode, int *lastkey); ! 396: ! 397: /****************************************************************************/ ! 398: /* Formatted print with attribute */ ! 399: /****************************************************************************/ ! 400: int (*printf)(int x, int y, unsigned attr, char *fmat, ...); ! 401: ! 402: } uifcapi_t; ! 403: ! 404: /****************************************************************************/ ! 405: /* Initialization routines for each UIFC implementation. */ ! 406: /* Returns 0 on success, non-zero on failure. */ ! 407: /****************************************************************************/ ! 408: int uifcini(uifcapi_t*); /* Original implementation based on conio */ ! 409: int uifcinix(uifcapi_t*); /* Standard I/O implementation */ ! 410: int uifcini32(uifcapi_t*); /* conio/curses implementation */ ! 411: /****************************************************************************/ ! 412: ! 413: #endif /* Don't add anything after this line! */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.