|
|
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.