uifc.h 21.6 KB
Newer Older
1
/* Text-mode User Interface Library (inspired by Novell SYSCON look & feel) */
2

3
/* $Id: uifc.h,v 1.97 2020/08/16 20:37:08 rswindell Exp $ */
4 5 6 7 8

/****************************************************************************
 * @format.tab-size 4		(Plain Text/Source Code File Header)			*
 * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
 *																			*
9
 * Copyright Rob Swindell - http://www.synchro.net/copyright.html			*
10
 *																			*
rswindell's avatar
rswindell committed
11 12
 * This library is free software; you can redistribute it and/or			*
 * modify it under the terms of the GNU Lesser General Public License		*
13 14
 * as published by the Free Software Foundation; either version 2			*
 * of the License, or (at your option) any later version.					*
rswindell's avatar
rswindell committed
15 16
 * See the GNU Lesser General Public License for more details: lgpl.txt or	*
 * http://www.fsf.org/copyleft/lesser.html									*
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 *																			*
 * Anonymous FTP access to the most recent released source is available at	*
 * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net	*
 *																			*
 * Anonymous CVS access to the development source and modification history	*
 * is available at cvs.synchro.net:/cvsroot/sbbs, example:					*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login			*
 *     (just hit return, no password is necessary)							*
 * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src		*
 *																			*
 * For Synchronet coding style and modification guidelines, see				*
 * http://www.synchro.net/source.html										*
 *																			*
 * You are encouraged to submit any modifications (preferably in Unix diff	*
 * format) via e-mail to mods@synchro.net									*
 *																			*
 * Note: If this box doesn't appear square, then you need to fix your tabs.	*
 ****************************************************************************/
35

deuce's avatar
deuce committed
36 37 38
#ifndef _UIFC_H_
#define _UIFC_H_

39 40 41 42 43 44 45
#include <time.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
rswindell's avatar
rswindell committed
46
/* OS Specific */
47 48 49
#if defined(_WIN32)
    #include <windows.h>
#endif
50 51
#if defined(__unix__)
	#include <sys/param.h>	/* PATH_MAX */
52
#endif
53

deuce's avatar
deuce committed
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#ifdef _WIN32
        #if defined(UIFC_IMPORTS) || defined(UIFC_EXPORTS)
                #if defined(UIFC_IMPORTS)
                        #define UIFCEXPORT __declspec( dllimport )
                        #define UIFCEXPORTVAR __declspec( dllimport )
                #else
                        #define UIFCEXPORT __declspec( dllexport )
                        #define UIFCEXPORTVAR __declspec( dllexport )
                #endif
        #else   /* self-contained executable */
                #define UIFCEXPORT
                #define UIFCEXPORTVAR	extern
        #endif
#else
        #define UIFCEXPORT
        #define UIFCEXPORTVAR	extern
#endif

rswindell's avatar
rswindell committed
72 73
#if defined(__unix__) && !defined(stricmp)
    #define stricmp strcasecmp
74
	#define strnicmp strncasecmp
rswindell's avatar
rswindell committed
75
#endif
76

deuce's avatar
deuce committed
77
#if !defined(FREE_AND_NULL)
deuce's avatar
deuce committed
78
	#define FREE_AND_NULL(x)			if(x!=NULL) { free(x); x=NULL; }
deuce's avatar
deuce committed
79
#endif
80

rswindell's avatar
rswindell committed
81 82 83 84 85 86 87 88 89 90 91 92
#if !defined(MAX_PATH)	/* maximum path length */
	#if defined MAXPATHLEN
		#define MAX_PATH MAXPATHLEN	/* clib.h */
	#elif defined PATH_MAX
		#define MAX_PATH PATH_MAX
	#elif defined _MAX_PATH
		#define MAX_PATH _MAX_PATH
	#else
		#define MAX_PATH 260		
	#endif
#endif

93
#define MAX_OPTS			100000
94 95 96 97 98 99
#define MSK_ON				0xf0000000
#define MSK_OFF 			0x0fffffff
#define MSK_INS 			0x10000000
#define MSK_DEL 			0x20000000
#define MSK_COPY 			0x30000000
#define MSK_CUT 			0x40000000
100 101
#define MSK_PASTE			0x50000000	/* Overwrite selected item with previously copied item */
#define MSK_EDIT			0x60000000
102 103 104

/* Legacy terms (get/put instead of copy/paste) */
#define MSK_GET		MSK_COPY
105
#define MSK_PUT		MSK_PASTE
106

107
/* Don't forget, negative return values are used for extended keys (if WIN_EXTKEYS used)! */
108 109
#define MAX_OPLN	75		/* Maximum length of each option per menu call */
#define MAX_BUFS	7		/* Maximum number of screen buffers to save */
110
#define MIN_LINES   14      /* Minimum number of screen lines supported */
111 112 113
#define MAX_LINES   255     /* Maximum number of screen lines supported (ciolib screenheight is a uchar) */ 
#define MAX_COLS	255		/* Maximum number of screen columns supported (ciolib screenwidth is a uchar) */ 
#define MAX_BFLN	(MAX_COLS*MAX_LINES*2)	/* Maximum size of screen buffers, char + attr */
114 115 116 117 118

#ifndef uint
#define uint unsigned int
#endif

119 120 121 122 123 124 125 126 127 128 129 130
								/**************************/
						        /* Bits in uifcapi_t.mode */
								/**************************/
#define UIFC_INMSG		(1<<0)	/* Currently in Message Routine non-recursive */
#define UIFC_MOUSE		(1<<1)	/* Mouse installed and available */
#define UIFC_MONO		(1<<2)	/* Force monochrome mode */
#define UIFC_COLOR		(1<<3)	/* Force color mode */
#define UIFC_IBM		(1<<4)	/* Force use of IBM charset	*/
#define UIFC_NOCTRL		(1<<5)	/* Don't allow usage of CTRL keys for movement 
								 * etc in menus (Still available in text boxes) */
#define UIFC_NHM		(1<<6)	/* Don't hide the mouse pointer */
#define UIFC_NOMOUSE	(1<<7)	/* Don't enable/use the mouse */
131

132 133 134
							/*******************************/
                            /* Bits in uifcapi_t.list mode */
							/*******************************/
135 136 137 138 139
#define WIN_ORG 	(1<<0)	/* Original menu - destroy valid screen area */
#define WIN_SAV 	(1<<1)	/* Save existing text and replace when finished */
#define WIN_ACT 	(1<<2)	/* Menu remains active after a selection */
#define WIN_L2R 	(1<<3)	/* Center the window based on 'width'   */
#define WIN_T2B 	(1<<4)	/* Center the window based on 'height'  */
rswindell's avatar
rswindell committed
140
#define WIN_INS 	(1<<5)	/* Allows user to use insert key */
141 142 143 144 145
#define WIN_INSACT	(1<<6)	/* Remains active after insert key */
#define WIN_DEL 	(1<<7)	/* Allows user to use delete key */
#define WIN_DELACT	(1<<8)	/* Remains active after delete key */
#define WIN_ESC 	(1<<9)	/* Screen is active when escape is hit			 */
#define WIN_RHT 	(1<<10) /* Place window against right side of screen */
146
#define WIN_BOT 	(1<<11) /* Place window against bottom of screen */
147 148
#define WIN_COPY 	(1<<12) /* Allows F5 to Get (copy) a menu item */
#define WIN_PASTE 	(1<<13) /* Allows F6 to Put (paste) a menu item */
149 150
#define WIN_CHE 	(1<<14) /* Stay active after escape if changes */
#define WIN_XTR 	(1<<15) /* Add extra line at end for inserting at end */
151
#define WIN_DYN 	(1<<16) /* Dynamic window - return at least every second */
152
#define WIN_CUT		(1<<17)	/* Allow ^X (cut) a menu item */
rswindell's avatar
rswindell committed
153
#define WIN_HLP 	(1<<17) /* Parse 'Help codes' - showbuf() */
154
#define WIN_PACK 	(1<<18) /* Pack text in window (No padding) - showbuf() */
155 156
#define WIN_IMM 	(1<<19) /* Draw window and return immediately */
#define WIN_FAT		(1<<20)	/* Do not pad outside borders */
157 158
#define WIN_REDRAW	(1<<21) /* Force redraw on dynamic window */
#define WIN_NODRAW	(1<<22) /* Force not to redraw on dynamic window */
deuce's avatar
deuce committed
159
#define WIN_EXTKEYS	(1<<23) /* Return on any keypress... if it's not handled internally
160 161
							 * Return value is -2 - keyvalue */
#define WIN_NOBRDR	(1<<24)	/* Do not draw a border around the window */
162
#define WIN_FIXEDHEIGHT	(1<<25)	/* Use list_height from uifc struct */
163 164
#define WIN_UNGETMOUSE  (1<<26) /* If the mouse is clicked outside the window, */
								/* Put the mouse event back into the event queue */
165 166 167 168 169 170 171
#define WIN_EDIT		(1<<27)	/* Allow F2 to edit a menu item */
#define WIN_PASTEXTR	(1<<28)	/* Allow paste into extra (blank) item */
#define WIN_INACT		(1<<29)	/* Draw window inactive... intended for use with WIN_IMM */
#define WIN_POP			(1<<30)	/* Exit the list. Act as though ESC was pressed. */
								/* Intended for use after a WIN_EXTKEYS or WIN_DYN */
#define WIN_SEL			(1<<31)	/* Exit the list. Act as though ENTER was pressed. */
								/* Intended for use after a WIN_EXTKEYS or WIN_DYN */
172 173

#define WIN_MID WIN_L2R|WIN_T2B  /* Place window in middle of screen */
174 175
#define WIN_GET	WIN_COPY
#define WIN_PUT WIN_PASTE
176 177 178

#define SCRN_TOP	3
#define SCRN_LEFT	5
179
#define SCRN_RIGHT 	((int)api->scrn_width-4)
180 181 182 183 184 185 186 187 188 189 190 191 192

								/* Bits in 'mode' for getkey and getstr     */
#define K_UPPER 	(1L<<0) 	/* Converts all letters to upper case		*/
#define K_UPRLWR	(1L<<1) 	/* Upper/Lower case automatically			*/
#define K_NUMBER	(1L<<2) 	/* Allow numbers only						*/
#define K_WRAP		(1L<<3) 	/* Allows word wrap 						*/
#define K_MSG		(1L<<4) 	/* Allows ANSI, ^N ^A ^G					*/
#define K_SPIN		(1L<<5) 	/* Spinning cursor (same as SPIN)			*/
#define K_LINE		(1L<<6) 	/* Input line (inverse color)				*/
#define K_EDIT		(1L<<7) 	/* Edit string passed						*/
#define K_CHAT		(1L<<8) 	/* In chat multi-chat						*/
#define K_NOCRLF	(1L<<9) 	/* Don't print CRLF after string input      */
#define K_ALPHA 	(1L<<10)	/* Only allow alphabetic characters 		*/
193
#define K_SCANNING	(1L<<11)	/* UPC Scanner is active... return on '%'	*/
194
#define K_TABEXIT	(1L<<12)	/* Return on TAB or BACKTAB			    	*/
195
#define K_DECIMAL	(1L<<13)	/* Allow floating point numbers only		*/
196 197
#define K_DEUCEEXIT	(1L<<14)	/* Return whenever Deuce wants to exit		*/
								/* Returns on up/down/F2					*/
198 199 200
#define K_MOUSEEXIT	(1L<<15)	/* Returns when mouse is clicked outside of */
								/* Input area (NOT outside of window!)		*/
								/* And ungets the mouse event.				*/
201
#define K_PASSWORD	(1L<<16)	/* Does not display text while editing		*/
202
#define K_FIND		(1L<<17)	/* Don't set the "changes" flag				*/
203

204

205 206 207
						/* Extra exit flags */
#define UIFC_XF_QUIT	(1<<0)	/* Returned -1 due to CIO_KEY_QUIT */

208 209
#define HELPBUF_SIZE 4000

210
#ifndef _GEN_DEFS_H
211 212 213
									/* Control characters */
#define STX 	0x02				/* Start of text			^B	*/
#define ETX 	0x03				/* End of text				^C	*/
214 215 216
#define BS		'\b'				/* Back space				^H	*/
#define TAB 	'\t'				/* Horizontal tabulation	^I	*/
#define LF		'\n'				/* Line feed				^J	*/
217
#define FF		0x0c				/* Form feed				^L	*/
218
#define CR		'\r'				/* Carriage return			^M	*/
219
#define ESC 	0x1b				/* Escape					^[	*/
220
#define DEL     0x7f                /* Delete                   ^BS */
221

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
enum {
	 CTRL_A=1
	,CTRL_B
	,CTRL_C
	,CTRL_D	
	,CTRL_E
	,CTRL_F
	,CTRL_G
	,CTRL_H
	,CTRL_I
	,CTRL_J
	,CTRL_K
	,CTRL_L
	,CTRL_M
	,CTRL_N
	,CTRL_O
	,CTRL_P
	,CTRL_Q
	,CTRL_R
	,CTRL_S
	,CTRL_T
	,CTRL_U
	,CTRL_V
	,CTRL_W
	,CTRL_X
	,CTRL_Y
	,CTRL_Z
};

251
#endif
252 253 254 255 256 257 258 259 260 261 262

#ifndef uchar				/* Short-hand for unsigned data types */
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
#ifndef ulong
#define ulong unsigned long
#endif

263 264
#ifndef BOOL
#define BOOL    int
deuce's avatar
deuce committed
265
#ifndef TRUE
266
#define TRUE    1
deuce's avatar
deuce committed
267 268
#endif
#ifndef FALSE
269 270
#define FALSE   0
#endif
deuce's avatar
deuce committed
271
#endif
272 273

typedef struct {
274
	int		left,top,right,bot;
275
	int		*cur,*bar;
276
    uchar*	buf;
277
} win_t;
278

279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
typedef struct {
	char	background;
	char	help_char;
	char	close_char;
	char	up_arrow;
	char	down_arrow;
	char	button_left;
	char	button_right;

	char	list_top_left;
	char	list_top;
	char	list_top_right;
	char	list_separator_left;
	char	list_separator_right;
	char	list_horizontal_separator;
	char	list_left;
	char	list_right;
	char	list_bottom_left;
	char	list_bottom_right;
	char	list_bottom;
	char	list_scrollbar_separator;

	char	input_top_left;
	char	input_top;
	char	input_top_right;
	char	input_left;
	char	input_right;
	char	input_bottom_left;
	char	input_bottom_right;
	char	input_bottom;

	char	popup_top_left;
	char	popup_top;
	char	popup_top_right;
	char	popup_left;
	char	popup_right;
	char	popup_bottom_left;
	char	popup_bottom_right;
	char	popup_bottom;

	char	help_top_left;
	char	help_top;
	char	help_top_right;
	char	help_left;
	char	help_right;
	char	help_bottom_left;
	char	help_bottom_right;
	char	help_bottom;
	char	help_titlebreak_left;
	char	help_titlebreak_right;
	char	help_hitanykey_left;
	char	help_hitanykey_right;
} uifc_graphics_t;

333
typedef struct {
334 335 336
/****************************************************************************/
/* Size of the structure (for version compatibility verification).			*/
/****************************************************************************/
337
    size_t  size;
338 339 340
/****************************************************************************/
/* Controls general UIFC library behavior.									*/
/****************************************************************************/
341
    long    mode;
342 343 344
/****************************************************************************/
/* Set to TRUE when changes to data have been made by input function.		*/ 
/****************************************************************************/
345
    BOOL    changes;
346
/****************************************************************************/
347 348 349 350
/* Set to TRUE to enable insert mode by default (not overwrite)				*/
/****************************************************************************/
	BOOL	insert_mode;
/****************************************************************************/
351 352
/* The overlapped-window save buffer number.								*/
/****************************************************************************/
353
    uint    savnum;
354 355 356 357 358 359 360
/****************************************************************************/
/* The current overlapped-window save buffer depth.							*/
/****************************************************************************/
    uint    savdepth;
/****************************************************************************/
/* Screen length															*/
/****************************************************************************/
361
    uint    scrn_len;
362
/****************************************************************************/
363 364 365 366
/* Screen Width 															*/
/****************************************************************************/
    uint    scrn_width;
/****************************************************************************/
367 368 369 370
/* ESC key delay for curses													*/
/****************************************************************************/
    uint    esc_delay;
/****************************************************************************/
371 372
/* Alternative method of setting current help text.							*/
/****************************************************************************/
373
    char*   helpbuf;
374 375 376
/****************************************************************************/
/* Location of the help data and index files.								*/
/****************************************************************************/
377 378
    char    helpdatfile[MAX_PATH+1];
    char    helpixbfile[MAX_PATH+1];
379
	BOOL	help_available;
380
/****************************************************************************/
381 382 383 384 385 386 387 388
/* Help and exit button locations for current/last window					*/
/****************************************************************************/
	int		buttony;
	int		exitstart;
	int		exitend;
	int		helpstart;
	int		helpend;
/****************************************************************************/
389 390 391
/* List height for WIN_FIXEDHEIGHT lists.									*/
/****************************************************************************/
	int		list_height;
392 393 394 395

/****************************************************************************/
/* Colours for the various bits												*/
/****************************************************************************/
396
	uchar	hclr,lclr,bclr,cclr,lbclr;
397

398 399 400 401 402
/****************************************************************************/
/* Have we initialized successfully?										*/
/****************************************************************************/
	BOOL	initialized;

403 404 405 406 407
/****************************************************************************/
/* UIFC_XF_* bits for extra exit status										*/
/****************************************************************************/
	uint	exit_flags;

408 409 410 411 412
/****************************************************************************/
/* Custom drawing characters												*/
/****************************************************************************/
	uifc_graphics_t	*chars;

rswindell's avatar
rswindell committed
413 414 415 416 417
/****************************************************************************/
/* Allow application override												*/
/****************************************************************************/
	char** yesNoOpts;

418
/****************************************************************************/
419 420
/* Exit/uninitialize function.												*/
/****************************************************************************/
421
    void    (*bail) (void);
422 423 424 425 426
/****************************************************************************/
/* Fill the screen with the appropriate background attribute.				*/
/* str is the title for the application banner.								*/
/* Returns 0 on success, non-zero on failure.								*/
/****************************************************************************/
Deucе's avatar
Deucе committed
427
    int     (*scrn) (const char* str);
428 429 430
/****************************************************************************/
/* Popup a message, maybe wait for the user to hit a key or click button.	*/
/****************************************************************************/
Deucе's avatar
Deucе committed
431
	int		(*msg)  (const char* str);
rswindell's avatar
rswindell committed
432 433 434
	int		(*msgf) (char* fmt, ...);
	BOOL	(*deny) (char* fmt, ...);
	BOOL	(*confirm) (char* fmt, ...);
435 436 437 438 439
/****************************************************************************/
/* Popup/down a status message.												*/
/* str is the message to display on popup.									*/
/* if str==NULL, then the the status is to be cleared (popdown).			*/
/****************************************************************************/
Deucе's avatar
Deucе committed
440
    void    (*pop)  (const char* str);
441 442 443 444 445 446 447 448
/****************************************************************************/
/* General menu function.													*/
/* mode contains WIN_* flags to control display and functionality.			*/
/* left, top and width specify desired screen locations and window size.	*/
/* cur is a pointer to the current (default) option.						*/
/* bar is a pointer to the current location of the lightbar (which used).	*/
/* title is the caption for the menu.										*/
/* Menus can centered left to right and top to bottom automatically.		*/
449
/* mode bits are set with macros WIN_*.										*/
450 451 452
/* option is an array of char arrays, first element of last char array		*/
/* must be NULL.															*/
/* Returns the 0-based selected option number, -1 for ESC, or the selected	*/
453
/* option number OR'd with MSK_INS, MSK_DEL, MSK_GET, MSK_PUT, or MSK_EDIT.	*/
454
/****************************************************************************/
455
    int     (*list) (int mode, int left, int top, int width, int* dflt
Deucе's avatar
Deucе committed
456
                        ,int* bar, const char *title, char** option);
457 458 459 460 461 462
/****************************************************************************/
/* Windowed string input routine.											*/
/* mode contains WIN_* flags to control display and functionality.			*/
/* left and top specify desired screen location.							*/
/* prompt is displayed before the input is requested.						*/
/* str is the string to input or edit.										*/
463 464 465
/* len is the maximum length of the string.									*/
/* kmode contains flags that control the string input (K_* macros).			*/
/* This function sets uifcapi_t.changes to TRUE if the string is modified.	*/
466 467
/* Returns the length of the string or -1 on escape/abort.					*/
/****************************************************************************/
Deucе's avatar
Deucе committed
468
    int     (*input)(int mode, int left, int top, const char* prompt, char* str
469
            	        ,int len, int kmode);
470 471 472
/****************************************************************************/
/* Sets the current help index by source code file and line number.			*/
/****************************************************************************/
473
    void    (*sethelp)(int line, char* file);
474 475 476 477 478

/****************************************************************************/
/* Shows the current help text												*/
/****************************************************************************/
    void    (*showhelp)(void);
479 480
	
/****************************************************************************/
481
/* Shows a scrollable text buffer - optionally parsing "help markup codes"	*/
482
/****************************************************************************/
483
	void	(*showbuf)(int mode, int left, int top, int width, int height
Deucе's avatar
Deucе committed
484
							,const char *title, const char *hbuf, int *curp, int *barp);
485

486 487 488 489
/****************************************************************************/
/* Updates time in upper left corner of screen with current time in ASCII/  */
/* Unix format																*/
/****************************************************************************/
490
	void	(*timedisplay)(BOOL force);
491

492
/****************************************************************************/
493
/* Displays the bottom line using the WIN_* mode flags						*/
494
/****************************************************************************/
495
    void	(*bottomline)(int mode);
496

497 498 499
/****************************************************************************/
/* String input/exit box at a specified position							*/
/****************************************************************************/
500 501
	int		(*getstrxy)(int left, int top, int width, char *outstr, int max
							,long mode, int *lastkey);
502

503 504 505
/****************************************************************************/
/* Formatted print with attribute											*/
/****************************************************************************/
506
	int		(*printf)(int x, int y, unsigned attr, char *fmat, ...);
507

508 509
} uifcapi_t;

510 511 512 513 514 515 516 517 518 519
#ifdef __cplusplus
extern "C" {
#endif

/* Return value from uifc_api.list() when uifcYesNoOpts is used */
enum {
	uifcYes=0,
	uifcNo=1
};

deuce's avatar
deuce committed
520
UIFCEXPORTVAR char* uifcYesNoOpts[];
521

522 523 524 525 526
/****************************************************************************/
/* Initialization routines for each UIFC implementation.					*/
/* Returns 0 on success, non-zero on failure.								*/
/****************************************************************************/
int uifcini(uifcapi_t*);	/* Original implementation based on conio		*/
527 528
UIFCEXPORT int uifcinix(uifcapi_t*);	/* Standard I/O implementation		*/
UIFCEXPORT int uifcini32(uifcapi_t*);	/* modern implementation			*/
529
/****************************************************************************/
deuce's avatar
deuce committed
530

531 532 533 534
#ifdef __cplusplus
}
#endif

deuce's avatar
deuce committed
535
#endif /* Don't add anything after this line! */