diff --git a/src/uifc/uifcc.c b/src/uifc/uifcc.c deleted file mode 100644 index 1f5d1b42ecc6f01065cc501f6ab10a3249d0ff61..0000000000000000000000000000000000000000 --- a/src/uifc/uifcc.c +++ /dev/null @@ -1,2596 +0,0 @@ -/* uifcc.c */ - -/* Curses implementation of UIFC (user interface) library based on uifc.c */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * 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. * - ****************************************************************************/ - -#include <stdio.h> -#include <curs_fix.h> -#include <unistd.h> -#include <sys/time.h> -#include "uifc.h" -#ifdef __QNX__ -#include <strings.h> -#endif - -#if defined(__OS2__) - -#define INCL_BASE -#include <os2.h> - -void mswait(int msec) -{ - DosSleep(msec ? msec : 1); -} - -#elif defined(_WIN32) - #include <windows.h> - #define mswait(x) Sleep(x) -#elif defined(__FLAT__) - #define mswait(x) delay(x) -#endif - - /* Bottom line elements */ -#define BL_INS (1<<0) /* INS key */ -#define BL_DEL (1<<1) /* DEL key */ -#define BL_GET (1<<2) /* Get key */ -#define BL_PUT (1<<3) /* Put key */ - -enum { - BLACK - ,BLUE - ,GREEN - ,CYAN - ,RED - ,MAGENTA - ,BROWN - ,LIGHTGRAY - ,DARKGRAY - ,LIGHTBLUE - ,LIGHTGREEN - ,LIGHTCYAN - ,LIGHTRED - ,LIGHTMAGENTA - ,YELLOW - ,WHITE -}; - -#define BLINK 128 -#define SH_DENYWR 1 -#define SH_DENYRW 2 -#ifndef O_BINARY -#define O_BINARY 0 -#endif - -static char hfclr,hbclr,hclr,lclr,bclr,cclr,show_free_mem=0; -static char* helpfile=0; -static uint helpline=0; -static char blk_scrn[MAX_BFLN]; -static win_t sav[MAX_BUFS]; -static uint max_opts=MAX_OPTS; -static uifcapi_t* api; -static int lastattr=0; - -/* Prototypes */ -static int uprintf(int x, int y, unsigned char attr, char *fmt,...); -static void bottomline(int line); -static char *utimestr(time_t *intime); -static void help(); -static int puttext(int sx, int sy, int ex, int ey, unsigned char *fill); -static int gettext(int sx, int sy, int ex, int ey, unsigned char *fill); -static short curses_color(short color); -static void textattr(unsigned char attr); -static int kbhit(void); -#ifndef __QNX__ -static void delay(int msec); -#endif -static int ugetstr(char *outstr, int max, long mode); -static int wherey(void); -static int wherex(void); -static int cprintf(char *fmat, ...); -static void cputs(char *str); -static void gotoxy(int x, int y); -static void _putch(unsigned char ch, BOOL refresh); -static void timedisplay(void); -#define putch(x) _putch(x,TRUE) - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, int left, int top, char *prompt, char *str - ,int len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); -void showbuf(int mode, int left, int top, int width, int height, char *title, char *hbuf, int *curp, int *barp); - -/* Dynamic menu support */ -static int *last_menu_cur=NULL; -static int *last_menu_bar=NULL; -static int save_menu_cur=-1; -static int save_menu_bar=-1; - -void reset_dynamic(void) { - last_menu_cur=NULL; - last_menu_bar=NULL; - save_menu_cur=-1; - save_menu_bar=-1; -} - -int inkey(int mode) -{ - if(mode) - return(kbhit()); - return(getch()); -} - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinic(uifcapi_t* uifcapi) -{ - int i; - int height, width; - short fg, bg, pair=0; -#ifndef __FLAT__ - union REGS r; -#endif - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=showbuf; - api->timedisplay=timedisplay; - -#if defined(LOCALE) - (void) setlocale(LC_ALL, ""); -#endif - - initscr(); - start_color(); - cbreak(); - noecho(); - nonl(); -// intrflush(stdscr, FALSE); - keypad(stdscr, TRUE); - scrollok(stdscr,FALSE); - raw(); - #ifdef NCURSES_VERSION_MAJOR - ESCDELAY=api->esc_delay; - #endif - - // Set up color pairs - for(bg=0;bg<8;bg++) { - for(fg=0;fg<8;fg++) { - init_pair(++pair,curses_color(fg),curses_color(bg)); - } - } - - clear(); - refresh(); - getmaxyx(stdscr,height,width); - /* unsupported mode? */ - if(height<MIN_LINES - || height>MAX_LINES - || width<80) { - } - - api->scrn_len=height; - if(api->scrn_len<MIN_LINES || api->scrn_len>MAX_LINES) { - uifcbail(); - fprintf(stderr,"\7UIFC: Screen length (%u) must be between %d and %d lines\n" - ,api->scrn_len,MIN_LINES,MAX_LINES); - return(-2); - } - if(width*height*2>MAX_BFLN) { - uifcbail(); - fprintf(stderr,"\7UIFC: Screen size (%u x %u) must be smaller than %u\n" - ,width,height,(uchar)(MAX_BFLN/2)); - return(-2); - } - api->scrn_len--; /* account for status line */ - api->scrn_width=width; - - - if(width<80) { - uifcbail(); - fprintf(stderr,"\7UIFC: Screen width (%u) must be at least 80 characters\n" - ,width); - return(-3); - } - - -/* ToDo - Set up mousemask() here */ - - if(!has_colors()) { - bclr=BLACK; - hclr=WHITE; - lclr=LIGHTGRAY; - cclr=LIGHTGRAY; - hbclr=BLACK; /* Highlight Background Colour */ - hfclr=WHITE; /* Highlight Foreground Colour */ - } else { - bclr=BLUE; - hclr=YELLOW; - lclr=WHITE; - cclr=CYAN; - hbclr=LIGHTGRAY; - hfclr=YELLOW; - } - for(i=0;i<MAX_BFLN;i+=2) { - blk_scrn[i]='�'; - blk_scrn[i+1]=cclr|(bclr<<4); - } - - curs_set(0); - refresh(); - - return(0); -} - -short curses_color(short color) -{ - switch(color) - { - case 0 : - return(COLOR_BLACK); - case 1 : - return(COLOR_BLUE); - case 2 : - return(COLOR_GREEN); - case 3 : - return(COLOR_CYAN); - case 4 : - return(COLOR_RED); - case 5 : - return(COLOR_MAGENTA); - case 6 : - return(COLOR_YELLOW); - case 7 : - return(COLOR_WHITE); - case 8 : - return(COLOR_BLACK); - case 9 : - return(COLOR_BLUE); - case 10 : - return(COLOR_GREEN); - case 11 : - return(COLOR_CYAN); - case 12 : - return(COLOR_RED); - case 13 : - return(COLOR_MAGENTA); - case 14 : - return(COLOR_YELLOW); - case 15 : - return(COLOR_WHITE); - } - return(0); -} - -static void hidemouse(void) -{ -/* ToDo - Mouse stuff here */ -} - -static void showmouse(void) -{ -/* ToDo - Mouse stuff here */ -} - - -void uifcbail(void) -{ - curs_set(1); - clear(); - nl(); - nocbreak(); - noraw(); - refresh(); - endwin(); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - textattr(bclr|(cclr<<4)); - gotoxy(1,1); - clrtoeol(); - gotoxy(3,1); - cputs(str); - if(!puttext(1,2,api->scrn_width,api->scrn_len,blk_scrn)) - return(-1); - gotoxy(1,api->scrn_len+1); - clrtoeol(); - refresh(); - reset_dynamic(); - return(0); -} - -/****************************************************************************/ -/****************************************************************************/ -static void scroll_text(int x1, int y1, int x2, int y2, int down) -{ - uchar buf[MAX_BFLN]; - - gettext(x1,y1,x2,y2,buf); - if(down) - puttext(x1,y1+1,x2,y2,buf); - else - puttext(x1,y1,x2,y2-1,buf+(((x2-x1)+1)*2)); -} - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ -static void timedisplay() -{ - static time_t savetime; - time_t now; - - now=time(NULL); - if(difftime(now,savetime)>=60) { - uprintf(55,1,bclr|(cclr<<4),utimestr(&now)); - savetime=now; - } -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' */ -/****************************************************************************/ -static void truncsp(char *str) -{ - uint c; - - c=strlen(str); - while(c && (uchar)str[c-1]<=' ') c--; - if(str[c]!=0) /* don't write to string constants */ - str[c]=0; -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , char *title, char **option) -{ - uchar line[256],shade[256],win[MAX_BFLN],*ptr,a,b,c,longopt - ,search[MAX_OPLN],bline=0; - int height,y; - int i,j,opts=0,s=0; /* s=search index into options */ - int is_redraw=0; - - #ifndef __FLAT__ - /* ToDo Mouse stuff */ - #endif - - if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) - putch(7); - i=0; - if(mode&WIN_INS) bline|=BL_INS; - if(mode&WIN_DEL) bline|=BL_DEL; - if(mode&WIN_GET) bline|=BL_GET; - if(mode&WIN_PUT) bline|=BL_PUT; - bottomline(bline); - while(opts<max_opts && opts<MAX_OPTS) - if(option[opts]==NULL || option[opts][0]==0) - break; - else opts++; - if(mode&WIN_XTR && opts<max_opts && opts<MAX_OPTS) - option[opts++][0]=0; - height=opts+4; - if(top+height>api->scrn_len-3) - height=(api->scrn_len-3)-top; - if(!width || width<strlen(title)+6) { - width=strlen(title)+6; - for(i=0;i<opts;i++) { - truncsp(option[i]); - if((j=strlen(option[i])+5)>width) - width=j; - } - } - if(width>(SCRN_RIGHT+1)-SCRN_LEFT) - width=(SCRN_RIGHT+1)-SCRN_LEFT; - if(mode&WIN_L2R) - left=36-(width/2); - else if(mode&WIN_RHT) - left=SCRN_RIGHT-(width+4+left); - if(mode&WIN_T2B) - top=(api->scrn_len/2)-(height/2)-2; - else if(mode&WIN_BOT) - top=api->scrn_len-height-3-top; - - /* Dynamic Menus */ - if(mode&WIN_DYN - && cur != NULL - && bar != NULL - && last_menu_cur==cur - && last_menu_bar==bar - && save_menu_cur==*cur - && save_menu_bar==*bar) - is_redraw=1; - - if(!is_redraw) { - if(mode&WIN_SAV && api->savdepth==api->savnum) { - if((sav[api->savnum].buf=(char *)MALLOC((width+3)*(height+2)*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*2); - return(-1); - } - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,sav[api->savnum].buf); - sav[api->savnum].left=SCRN_LEFT+left; - sav[api->savnum].top=SCRN_TOP+top; - sav[api->savnum].right=SCRN_LEFT+left+width+1; - sav[api->savnum].bot=SCRN_TOP+top+height; - api->savdepth++; - } - else if(mode&WIN_SAV - && (sav[api->savnum].left!=SCRN_LEFT+left - || sav[api->savnum].top!=SCRN_TOP+top - || sav[api->savnum].right!=SCRN_LEFT+left+width+1 - || sav[api->savnum].bot!=SCRN_TOP+top+height)) { /* dimensions have changed */ - puttext(sav[api->savnum].left,sav[api->savnum].top,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); /* put original window back */ - FREE(sav[api->savnum].buf); - if((sav[api->savnum].buf=(char *)MALLOC((width+3)*(height+2)*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*2); - return(-1); - } - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,sav[api->savnum].buf); /* save again */ - sav[api->savnum].left=SCRN_LEFT+left; - sav[api->savnum].top=SCRN_TOP+top; - sav[api->savnum].right=SCRN_LEFT+left+width+1; - sav[api->savnum].bot=SCRN_TOP+top+height; - } - } - - - #ifndef __FLAT__ - if(show_free_mem) { - /* ToDo Show free memory */ - // uprintf(58,1,bclr|(cclr<<4),"%10u bytes free",coreleft()); - } - #endif - - - if(!is_redraw) { - if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - puttext(SCRN_LEFT,SCRN_TOP,SCRN_RIGHT+2,SCRN_TOP+top-1,blk_scrn); - if(SCRN_TOP+height+top<=api->scrn_len) - puttext(SCRN_LEFT,SCRN_TOP+height+top,SCRN_RIGHT+2,api->scrn_len,blk_scrn); - if(left) - puttext(SCRN_LEFT,SCRN_TOP+top,SCRN_LEFT+left-1,SCRN_TOP+height+top - ,blk_scrn); - if(SCRN_LEFT+left+width<=SCRN_RIGHT) - puttext(SCRN_LEFT+left+width,SCRN_TOP+top,SCRN_RIGHT+2 - ,SCRN_TOP+height+top,blk_scrn); - } - ptr=win; - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - - if(api->mode&UIFC_MOUSE) { - /* ToDo Mouse stuff */ - i=0; - } - else - i=0; - for(;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - a=strlen(title); - b=(width-a-1)/2; - for(i=0;i<b;i++) { - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); - } - for(i=0;i<a;i++) { - *(ptr++)=title[i]; - *(ptr++)=hclr|(bclr<<4); - } - for(i=0;i<width-(a+b)-2;i++) { - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - for(i=0;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if(!bar) { - if((*cur)>height-5) - (*cur)=height-5; - i=0; - } - else { - if((*bar)>=opts) - (*bar)=opts-1; - if((*bar)>height-5) - (*bar)=height-5; - if((*cur)==opts-1) - (*bar)=height-5; - if((*bar)<0) - (*bar)=0; - if((*cur)<(*bar)) - (*cur)=(*bar); - i=(*cur)-(*bar); - // - if(i+(height-5)>=opts) { - i=opts-(height-4); - (*cur)=i+(*bar); - } - } - if((*cur)<0) - (*cur)=0; - - j=0; - if(i<0) i=0; - longopt=0; - while(j<height-4 && i<opts) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='�'; - *(ptr++)=lclr|(bclr<<4); - if(i==(*cur)) - a=hfclr|(hbclr<<4); - else - a=lclr|(bclr<<4); - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+4>width) - b=width-4; - for(c=0;c<b;c++) { - *(ptr++)=option[i][c]; - *(ptr++)=a; - } - while(c<width-4) { - *(ptr++)=' '; - *(ptr++)=a; - c++; - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - i++; - j++; - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - for(i=0;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width-1 - ,SCRN_TOP+top+height-1,win); - if(bar) - y=top+3+(*bar); - else - y=top+3+(*cur); - if(opts+4>height && ((!bar && (*cur)!=opts-1) - || (bar && ((*cur)-(*bar))+(height-4)<opts))) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(31); /* put down arrow */ - textattr(hclr|(bclr<<4)); - } - - if(bar && (*bar)!=(*cur)) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - textattr(hclr|(bclr<<4)); - } - - if(bclr==BLUE) { - gettext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height-1,shade); - for(i=1;i<height*4;i+=2) - shade[i]=DARKGRAY; - puttext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height-1,shade); - gettext(SCRN_LEFT+left+2,SCRN_TOP+top+height,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - for(i=1;i<width*2;i+=2) - shade[i]=DARKGRAY; - puttext(SCRN_LEFT+left+2,SCRN_TOP+top+height,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - } - showmouse(); - } - else { /* Is a redraw */ - i=(*cur)-(*bar); - j=2; - - longopt=0; - while(j<height-2 && i<opts) { - ptr=win; - if(i==(*cur)) - a=hfclr|(hbclr<<4); - else - a=lclr|(bclr<<4); - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+4>width) - b=width-4; - for(c=0;c<b;c++) { - *(ptr++)=option[i][c]; - *(ptr++)=a; - } - while(c<width-4) { - *(ptr++)=' '; - *(ptr++)=a; - c++; - } - i++; - j++; - puttext(SCRN_LEFT+left+3,SCRN_TOP+top+j,SCRN_LEFT+left+width-2 - ,SCRN_TOP+top+j,win); - } - if(bar) - y=top+3+(*bar); - else - y=top+3+(*cur); - } - - last_menu_cur=cur; - last_menu_bar=bar; - while(1) { - #if 0 /* debug */ - gotoxy(30,1); - cprintf("y=%2d h=%2d c=%2d b=%2d s=%2d o=%2d" - ,y,height,*cur,bar ? *bar :0xff,api->savdepth,opts); - #endif - if(!show_free_mem) - timedisplay(); - #ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - /* ToDo Serious mouse stuff here */ - } - #endif - - i=0; - if(inkey(1)) { - i=inkey(0); - if(i==KEY_BACKSPACE || i==BS) - i=ESC; - if(i>255) { - s=0; - switch(i) { - /* ToDo extended keys */ - case KEY_HOME: /* home */ - if(!opts) - break; - if(opts+4>height) { - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,hfclr|(hbclr<<4) - ,"%-*.*s",width-4,width-4,option[0]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+3; - showmouse(); - break; - } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+3; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; - case KEY_UP: /* up arrow */ - if(!opts) - break; - if(!(*cur) && opts+4>height) { - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); /* like end */ - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); /* delete the down arrow */ - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==opts-1 ? hfclr|(hbclr<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=opts-1; - if(bar) - (*bar)=height-5; - y=top+height-2; - showmouse(); - break; - } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - if(!(*cur)) { - y=top+height-2; - (*cur)=opts-1; - if(bar) - (*bar)=height-5; - } - else { - (*cur)--; - y--; - if(bar && *bar) - (*bar)--; - } - if(y<top+3) { /* scroll */ - hidemouse(); - if(!(*cur)) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the up arrow */ - } - if((*cur)+height-4==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(31); /* put the dn arrow */ - } - y++; - scroll_text(SCRN_LEFT+left+2,SCRN_TOP+top+3 - ,SCRN_LEFT+left+width-3,SCRN_TOP+top+height-2,1); - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,hfclr|(hbclr<<4) - ,"%-*.*s",width-4,width-4,option[*cur]); - showmouse(); - } - else { - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - } - break; -#if 0 - case KEY_PPAGE; /* PgUp */ - case KEY_NPAGE; /* PgDn */ - if(!opts || (*cur)==(opts-1)) - break; - (*cur)+=(height-4); - if((*cur)>(opts-1)) - (*cur)=(opts-1); - - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==(*cur) hfclr|(hbclr<<4) : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - y=top+height-2; - if(bar) - (*bar)=height-5; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<148;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; -#endif - case KEY_END: /* end */ - if(!opts) - break; - if(opts+4>height) { /* Scroll mode */ - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); /* delete the down arrow */ - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==opts-1 ? hfclr|(hbclr<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=opts-1; - y=top+height-2; - if(bar) - (*bar)=height-5; - showmouse(); - break; - } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - (*cur)=opts-1; - y=top+height-2; - if(bar) - (*bar)=height-5; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<148;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; - case KEY_DOWN: /* dn arrow */ - if(!opts) - break; - if((*cur)==opts-1 && opts+4>height) { /* like home */ - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,hfclr|(hbclr<<4) - ,"%-*.*s",width-4,width-4,option[0]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=0; - y=top+3; - if(bar) - (*bar)=0; - showmouse(); - break; - } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - if((*cur)==opts-1) { - (*cur)=0; - y=top+3; - if(bar) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)=0; - } - } - else { - (*cur)++; - y++; - if(bar && (*bar)<height-5) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)++; - } - } - if(y==top+height-1) { /* scroll */ - hidemouse(); - if(*cur==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(' '); /* delete the down arrow */ - } - if((*cur)+4==height) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - } - y--; - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - scroll_text(SCRN_LEFT+left+2,SCRN_TOP+top+3 - ,SCRN_LEFT+left+width-3,SCRN_TOP+top+height-2,0); - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+height-2 - ,hfclr|(hbclr<<4) - ,"%-*.*s",width-4,width-4,option[*cur]); - showmouse(); - } - else { - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y - ,line); - for(i=1;i<width*2;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y - ,line); - showmouse(); - } - break; - case KEY_F(1): /* F1 */ - help(); - break; - case KEY_F(5): /* F5 */ - if(mode&WIN_GET && !(mode&WIN_XTR && (*cur)==opts-1)) { - return((*cur)|MSK_GET); - } - break; - case KEY_F(6): /* F6 */ - if(mode&WIN_PUT && !(mode&WIN_XTR && (*cur)==opts-1)) { - return((*cur)|MSK_PUT); - } - break; - case KEY_IC: /* insert */ - if(mode&WIN_INS) { - if(mode&WIN_INSACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - if(opts) { - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - } - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); - } - if(!opts) { - return(MSK_INS); - } - return((*cur)|MSK_INS); - } - break; - case KEY_DC: /* delete */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't delete */ - break; /* extra line */ - if(mode&WIN_DEL) { - if(mode&WIN_DELACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); - } - return((*cur)|MSK_DEL); - } - break; - } - } - else { - i&=0xff; - if(isalnum(i) && opts && option[0][0]) { - search[s]=i; - search[s+1]=0; - for(j=(*cur)+1,a=b=0;a<2;j++) { /* a = search count */ - if(j==opts) { /* j = option count */ - j=-1; /* b = letter count */ - continue; - } - if(j==(*cur)) { - b++; - continue; - } - if(b>=longopt) { - b=0; - a++; - } - if(a==1 && !s) - break; - if(strlen(option[j])>b - && ((!a && s && !strncasecmp(option[j]+b,search,s+1)) - || ((a || !s) && toupper(option[j][b])==toupper(i)))) { - if(a) s=0; - else s++; - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); /* delete the down arrow */ - } - for(i=((*cur)+5)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==(*cur) ? hfclr|(hbclr<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - y=top+height-2; - if(bar) - (*bar)=height-5; - break; - } - if(y-((*cur)-j)<top+3) { - (*cur)=j; - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,hfclr|(hbclr<<4) - ,"%-*.*s",width-4,width-4,option[(*cur)]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4 - ,option[(*cur)+i]); - y=top+3; - if(bar) - (*bar)=0; - break; - } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); - } - (*cur)=j; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=hfclr|(hbclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; - } - } - if(a==2) - s=0; - } - else - switch(i) { - case CR: - if(!opts || (mode&WIN_XTR && (*cur)==opts-1)) - break; - if(mode&WIN_ACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); - } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; - } - return(*cur); - case 3: - case ESC: - if((mode&WIN_ESC || (mode&WIN_CHE && api->changes)) - && !(mode&WIN_SAV)) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); - } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; - } - return(-1); - } - } - } - else - mswait(1); - if(mode&WIN_DYN) { - save_menu_cur=*cur; - save_menu_bar=*bar; - return(-2-i); - } - } -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, char *prompt, char *str, - int max, int kmode) -{ - unsigned char c,save_buf[2048],in_win[2048] - ,shade[160],width,height=3; - int i,plen,slen; - - hidemouse(); - reset_dynamic(); - plen=strlen(prompt); - if(!plen) - slen=4; - else - slen=6; - width=plen+slen+max; - if(mode&WIN_T2B) - top=(api->scrn_len/2)-(height/2)-2; - if(mode&WIN_L2R) - left=36-(width/2); - if(mode&WIN_SAV) - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,save_buf); - i=0; - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - for(c=1;c<width-1;c++) { - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - } - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - - if(plen) { - in_win[i++]=' '; - in_win[i++]=lclr|(bclr<<4); - } - - for(c=0;prompt[c];c++) { - in_win[i++]=prompt[c]; - in_win[i++]=lclr|(bclr<<4); - } - - if(plen) { - in_win[i++]=':'; - in_win[i++]=lclr|(bclr<<4); - c++; - } - - for(c=0;c<max+2;c++) { - in_win[i++]=' '; - in_win[i++]=lclr|(bclr<<4); - } - - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - for(c=1;c<width-1;c++) { - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - } - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width-1 - ,SCRN_TOP+top+height-1,in_win); - - if(bclr==BLUE) { - gettext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+(height-1),shade); - for(c=1;c<12;c+=2) - shade[c]=DARKGRAY; - puttext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+(height-1),shade); - gettext(SCRN_LEFT+left+2,SCRN_TOP+top+3,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - for(c=1;c<width*2;c+=2) - shade[c]=DARKGRAY; - puttext(SCRN_LEFT+left+2,SCRN_TOP+top+3,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - } - - textattr(lclr|(bclr<<4)); - if(!plen) - gotoxy(SCRN_LEFT+left+2,SCRN_TOP+top+1); - else - gotoxy(SCRN_LEFT+left+plen+4,SCRN_TOP+top+1); - i=ugetstr(str,max,kmode); - if(mode&WIN_SAV) - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,save_buf); - showmouse(); - return(i); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - int i=0; - char *ok[2]={"OK",""}; - - if(api->mode&UIFC_INMSG) /* non-cursive */ - return; - api->mode|=UIFC_INMSG; - if(api->savdepth) api->savnum++; - ulist(WIN_SAV|WIN_MID,0,0,0,&i,0,str,ok); - if(api->savdepth) api->savnum--; - api->mode&=~UIFC_INMSG; -} - -/****************************************************************************/ -/* Gets a string of characters from the user. Turns cursor on. Allows */ -/* Different modes - K_* macros. ESC aborts input. */ -/* Cursor should be at END of where string prompt will be placed. */ -/****************************************************************************/ -static int ugetstr(char *outstr, int max, long mode) -{ - uchar str[256],ins=0,buf[256],y; - int ch; - int i,j,k,f=0; /* i=offset, j=length */ -#ifndef __FLAT__ - union REGS r; -#endif - - curs_set(1); - y=wherey(); - if(mode&K_EDIT && outstr[0]) { - /*** - truncsp(outstr); - ***/ - outstr[max]=0; - textattr(hfclr|(hbclr<<4)); - cputs(outstr); - textattr(lclr|(bclr<<4)); - strcpy(str,outstr); - i=j=strlen(str); -#if 0 - while(inkey(1)==0) { -#ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - /* ToDo More mouse stuff */ - } -#endif - mswait(1); - } -#endif - f=inkey(0); - gotoxy(wherex()-i,y); - if(f == CR || f >= 0xff) - { - cputs(outstr); - } - else - { - cprintf("%*s",i,""); - gotoxy(wherex()-i,y); - i=j=0; - } - } - else - i=j=0; - - ch=0; - while(ch!=CR) - { - if(i>j) j=i; -#ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) - { - /* ToDo More Mouse Stuff */ - } -#endif - if(f || inkey(1)) - { - if(f) - ch=f; - else - ch=inkey(0); - f=0; - switch(ch) - { - case KEY_F(1): /* F1 Help */ - help(); - continue; - case KEY_LEFT: /* left arrow */ - if(i) - { - gotoxy(wherex()-1,y); - i--; - } - continue; - case KEY_RIGHT: /* right arrow */ - if(i<j) - { - gotoxy(wherex()+1,y); - i++; - } - continue; - case KEY_HOME: /* home */ - if(i) - { - gotoxy(wherex()-i,y); - i=0; - } - continue; - case KEY_END: /* end */ - if(i<j) - { - gotoxy(wherex()+(j-i),y); - i=j; - } - continue; - case KEY_IC: /* insert */ - ins=!ins; - if(ins) - { - curs_set(2); - refresh(); - } - else - { - curs_set(1); - refresh(); - } - continue; - case BS: - case KEY_BACKSPACE: - if(i) - { - if(i==j) - { - cputs("\b \b"); - j--; - i--; - } - else { - gettext(wherex(),y,wherex()+(j-i),y,buf); - puttext(wherex()-1,y,wherex()+(j-i)-1,y,buf); - gotoxy(wherex()+(j-i),y); - putch(' '); - gotoxy(wherex()-((j-i)+2),y); - i--; - j--; - for(k=i;k<j;k++) - str[k]=str[k+1]; - } - continue; - } - case KEY_DC: /* delete */ - if(i<j) - { - gettext(wherex()+1,y,wherex()+(j-i),y,buf); - puttext(wherex(),y,wherex()+(j-i)-1,y,buf); - gotoxy(wherex()+(j-i),y); - putch(' '); - gotoxy(wherex()-((j-i)+1),y); - for(k=i;k<j;k++) - str[k]=str[k+1]; - j--; - } - continue; - case 3: - case ESC: - { - curs_set(0); - refresh(); - return(-1); - } - case CR: - break; - case 24: /* ctrl-x */ - if(j) - { - gotoxy(wherex()-i,y); - cprintf("%*s",j,""); - gotoxy(wherex()-j,y); - i=j=0; - } - continue; - case 25: /* ctrl-y */ - if(i<j) - { - cprintf("%*s",(j-i),""); - gotoxy(wherex()-(j-i),y); - j=i; - } - continue; - } - if(mode&K_NUMBER && !isdigit(ch)) - continue; - if(mode&K_ALPHA && !isalpha(ch)) - continue; - if((ch>=' ' || (ch==1 && mode&K_MSG)) && i<max && (!ins || j<max) && isprint(ch)) - { - if(mode&K_UPPER) - ch=toupper(ch); - if(ins) - { - gettext(wherex(),y,wherex()+(j-i),y,buf); - puttext(wherex()+1,y,wherex()+(j-i)+1,y,buf); - for(k=++j;k>i;k--) - str[k]=str[k-1]; - } - putch(ch); - str[i++]=ch; - } - } - else - mswait(1); - } - - - str[j]=0; - if(mode&K_EDIT) - { - truncsp(str); - if(strcmp(outstr,str)) - api->changes=1; - } - else - { - if(j) - api->changes=1; - } - strcpy(outstr,str); - curs_set(0); - refresh(); - return(j); -} - -/****************************************************************************/ -/* Performs printf() through puttext() routine */ -/****************************************************************************/ -static int uprintf(int x, int y, unsigned char attr, char *fmat, ...) -{ - va_list argptr; - char str[256],buf[512]; - int i,j; - - va_start(argptr,fmat); - vsprintf(str,fmat,argptr); - va_end(argptr); - for(i=j=0;str[i];i++) { - buf[j++]=str[i]; - buf[j++]=attr; - } - puttext(x,y,x+(i-1),y,buf); - return(i); -} - - -/****************************************************************************/ -/* Display bottom line of screen in inverse */ -/****************************************************************************/ -void bottomline(int line) -{ - int i=4; - - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F1 "); - i+=3; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Help "); - i+=6; - if(line&BL_GET) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F5 "); - i+=3; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Copy Item "); - i+=11; - } - if(line&BL_PUT) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F6 "); - i+=3; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Paste "); - i+=7; - } - if(line&BL_INS) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"INS "); - i+=4; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Add Item "); - i+=10; - } - if(line&BL_DEL) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"DEL "); - i+=4; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Delete Item "); - i+=13; - } - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"ESC "); /* Backspace is no good no way to abort editing */ - i+=4; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Exit"); - i+=4; - gotoxy(i,api->scrn_len+1); - textattr(BLACK|(cclr<<4)); - clrtoeol(); -} - - -/*****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/*****************************************************************************/ -char *utimestr(time_t *intime) -{ - static char str[25]; - char wday[4],mon[4],mer[3],hour; - struct tm *gm; - - gm=localtime(intime); - switch(gm->tm_wday) { - case 0: - strcpy(wday,"Sun"); - break; - case 1: - strcpy(wday,"Mon"); - break; - case 2: - strcpy(wday,"Tue"); - break; - case 3: - strcpy(wday,"Wed"); - break; - case 4: - strcpy(wday,"Thu"); - break; - case 5: - strcpy(wday,"Fri"); - break; - case 6: - strcpy(wday,"Sat"); - break; - } - switch(gm->tm_mon) { - case 0: - strcpy(mon,"Jan"); - break; - case 1: - strcpy(mon,"Feb"); - break; - case 2: - strcpy(mon,"Mar"); - break; - case 3: - strcpy(mon,"Apr"); - break; - case 4: - strcpy(mon,"May"); - break; - case 5: - strcpy(mon,"Jun"); - break; - case 6: - strcpy(mon,"Jul"); - break; - case 7: - strcpy(mon,"Aug"); - break; - case 8: - strcpy(mon,"Sep"); - break; - case 9: - strcpy(mon,"Oct"); - break; - case 10: - strcpy(mon,"Nov"); - break; - case 11: - strcpy(mon,"Dec"); - break; - } - if(gm->tm_hour>12) { - strcpy(mer,"pm"); - hour=gm->tm_hour-12; - } - else { - if(!gm->tm_hour) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); - } - sprintf(str,"%s %s %02d %4d %02d:%02d %s",wday,mon,gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); - return(str); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - static char sav[26*3*2]; - char buf[26*3*2]; - int i,j,k; - - reset_dynamic(); - hidemouse(); - if(!str) { - puttext(28,12,53,14,sav); - showmouse(); - return; - } - gettext(28,12,53,14,sav); - memset(buf,' ',25*3*2); - for(i=1;i<26*3*2;i+=2) - buf[i]=(hclr|(bclr<<4)); - buf[0]='�'; - for(i=2;i<25*2;i+=2) - buf[i]='�'; - buf[i]='�'; i+=2; - buf[i]='�'; i+=2; - i+=2; - k=strlen(str); - i+=(((23-k)/2)*2); - for(j=0;j<k;j++,i+=2) { - buf[i]=str[j]; - buf[i+1]|=BLINK; - } - i=((25*2)+1)*2; - buf[i]='�'; i+=2; - buf[i]='�'; i+=2; - for(;i<((26*3)-1)*2;i+=2) - buf[i]='�'; - buf[i]='�'; - - puttext(28,12,53,14,buf); - showmouse(); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/****************************************************************************/ -/* Shows a scrollable text buffer - optionally parsing "help markup codes" */ -/****************************************************************************/ -void showbuf(int mode, int left, int top, int width, int height, char *title, char *hbuf, int *curp, int *barp) -{ - char *savscrn,inverse=0,high=0; - char *buf; - char *textbuf; - char *p; - uint i,j,k,len; - int old_curs; - int lines; -#ifndef __FLAT__ - union REGS r; -#endif - int pad=1; - int is_redraw=0; - - if(top+height>api->scrn_len-3) - height=(api->scrn_len-3)-top; - if(!width || width<strlen(title)+6) - width=strlen(title)+6; - if(width>api->scrn_width) - width=api->scrn_width; - if(mode&WIN_L2R) - left=(api->scrn_width-width)/2+1; - else if(mode&WIN_RHT) - left=api->scrn_width-(width+4+left); - if(mode&WIN_T2B) - top=(api->scrn_len/2)-(height/2)-2; - else if(mode&WIN_BOT) - top=api->scrn_len-height-3-top; - - if(mode&WIN_PACK) - pad=0; - - old_curs=curs_set(0); - - /* Dynamic Menus */ - if(mode&WIN_DYN - && curp != NULL - && barp != NULL - && last_menu_cur==curp - && last_menu_bar==barp - && save_menu_cur==*curp - && save_menu_bar==*barp) - is_redraw=1; - - if((savscrn=(char *)MALLOC(api->scrn_width*api->scrn_len*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,api->scrn_width*25*2); - curs_set(1); - return; - } - if((buf=(char *)MALLOC(width*height*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,width*21*2); - FREE(savscrn); - curs_set(1); - return; - } - hidemouse(); - gettext(1,1,api->scrn_width,api->scrn_len,savscrn); - - if(!is_redraw) { - memset(buf,' ',width*height*2); - for(i=1;i<width*height*2;i+=2) - buf[i]=(hclr|(bclr<<4)); - buf[0]='�'; - j=strlen(title); - if(j>width-6) - *(title+width-6)=0; - for(i=2;i<((width-6)/2-(j/2))*2;i+=2) - buf[i]='�'; - buf[i]='�'; i+=4; - for(p=title;*p;p++) { - buf[i]=*p; - i+=2; - } - i+=2; - buf[i]='�'; i+=2; - for(j=i;j<((width-1)*2);j+=2) - buf[j]='�'; - i=j; - buf[i]='�'; i+=2; - j=i; /* leave i alone */ - for(k=0;k<(height-2);k++) { /* the sides of the box */ - buf[j]='�'; j+=2; - j+=((width-2)*2); - buf[j]='�'; j+=2; - } - buf[j]='�'; j+=2; - if(!(mode&WIN_DYN) && (width>31)) { - for(k=j;k<j+(((width-4)/2-13)*2);k+=2) - buf[k]='�'; - buf[k]='�'; k+=4; - buf[k]='H'; k+=2; - buf[k]='i'; k+=2; - buf[k]='t'; k+=4; - buf[k]='a'; k+=2; - buf[k]='n'; k+=2; - buf[k]='y'; k+=4; - buf[k]='k'; k+=2; - buf[k]='e'; k+=2; - buf[k]='y'; k+=4; - buf[k]='t'; k+=2; - buf[k]='o'; k+=4; - buf[k]='c'; k+=2; - buf[k]='o'; k+=2; - buf[k]='n'; k+=2; - buf[k]='t'; k+=2; - buf[k]='i'; k+=2; - buf[k]='n'; k+=2; - buf[k]='u'; k+=2; - buf[k]='e'; k+=4; - buf[k]='�'; k+=2; - for(j=k;j<k+(((width-4)/2-12)*2);j+=2) - buf[j]='�'; - } - else { - for(k=j;k<j+((width-2)*2);k+=2) - buf[k]='�'; - j=k; - } - buf[j]='�'; - puttext(left,top+1,left+width-1,top+height,buf); - } - len=strlen(hbuf); - - i=0; - lines=1; /* The first one is free */ - k=0; - for(j=0;j<len;j++) { - k++; - if(hbuf[j]==LF) - lines++; - if(k>72) { - k=0; - lines++; - } - } - if(lines < height-2-pad-pad) - lines=height-2-pad-pad; - - if((buf=(char *)textbuf=MALLOC((width-2-pad-pad)*lines*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,(width-2-pad-pad)*lines*2); - FREE(savscrn); - FREE(buf); - curs_set(1); - return; - } - memset(textbuf,' ',(width-2-pad-pad)*lines*2); - for(i=1;i<(width-2-pad-pad)*lines*2;i+=2) - buf[i]=(hclr|(bclr<<4)); - i=0; - for(j=0;j<len;j++,i+=2) { - if(hbuf[j]==LF) { - i+=2; - while(i%((width-2-pad-pad)*2)) i++; i-=2; - } - else if(mode&WIN_HLP && (hbuf[j]==2 || hbuf[j]=='~')) { /* Ctrl-b toggles inverse */ - inverse=!inverse; - i-=2; - } - else if(mode&WIN_HLP && (hbuf[j]==1 || hbuf[j]=='`')) { /* Ctrl-a toggles high intensity */ - high=!high; - i-=2; - } - else if(hbuf[j]!=CR) { - textbuf[i]=hbuf[j]; - textbuf[i+1]=inverse ? (bclr|(cclr<<4)) - : high ? (hclr|(bclr<<4)) : (lclr|(bclr<<4)); - } - } - showmouse(); - i=0; - p=textbuf; - if(mode&WIN_DYN) { - puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - } - else { - while(i==0) { - puttext(left+1+pad,top+2+pad,left+width-2-pad,top+height-1-pad,p); - if(inkey(1)) { - switch(inkey(0)) { - case KEY_HOME: /* home */ - p=textbuf; - break; - - case KEY_UP: /* up arrow */ - p = p-((width-4)*2); - if(p<textbuf) - p=textbuf; - break; - - case KEY_PPAGE: /* PgUp */ - p = p-((width-4)*2*(height-5)); - if(p<textbuf) - p=textbuf; - break; - - case KEY_NPAGE: /* PgDn */ - p=p+(width-4)*2*(height-5); - if(p > textbuf+(lines-height+1)*(width-4)*2) - p=textbuf+(lines-height+1)*(width-4)*2; - if(p<textbuf) - p=textbuf; - break; - - case KEY_END: /* end */ - p=textbuf+(lines-height+1)*(width-4)*2; - if(p<textbuf) - p=textbuf; - break; - - case KEY_DOWN: /* dn arrow */ - p = p+((width-4)*2); - if(p > textbuf+(lines-height+1)*(width-4)*2) - p=textbuf+(lines-height+1)*(width-4)*2; - if(p<textbuf) - p=textbuf; - break; - - default: - i=1; - } - } - mswait(1); - } - #ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - /* ToDo more mouse stiff */ - } - #endif - - hidemouse(); - puttext(1,1,api->scrn_width,api->scrn_len,savscrn); - showmouse(); - } - if(is_redraw) /* Force redraw of menu also. */ - reset_dynamic(); - FREE(savscrn); - FREE(buf); - if(old_curs != ERR) - curs_set(old_curs); -} - -/************************************************************/ -/* Help (F1) key function. Uses helpbuf as the help input. */ -/************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - int old_curs; -#ifndef __FLAT__ - union REGS r; -#endif - - old_curs=curs_set(0); - - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - sprintf(hbuf," ERROR Cannot open help index:\r\n %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line!=helpline) { - fseek(fp,4,SEEK_CUR); - continue; - } - fread(&l,4,1,fp); - break; - } - fclose(fp); - if(l==-1L) - sprintf(hbuf," ERROR Cannot locate help key (%s:%u) in:\r\n" - " %s",p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - sprintf(hbuf," ERROR Cannot open help file:\r\n %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); - } - } - } - } - else - strcpy(hbuf,api->helpbuf); - - showbuf(WIN_MID|WIN_HLP, 0, 0, 76, api->scrn_len-2, "Online Help", hbuf, NULL, NULL); -} - -static int puttext(int sx, int sy, int ex, int ey, unsigned char *fill) -{ - int x,y; - int fillpos=0; - unsigned char attr; - unsigned char fill_char; - unsigned char orig_attr; - int oldx, oldy; - - getyx(stdscr,oldy,oldx); - orig_attr=lastattr; - for(y=sy-1;y<=ey-1;y++) - { - for(x=sx-1;x<=ex-1;x++) - { - fill_char=fill[fillpos++]; - attr=fill[fillpos++]; - textattr(attr); - move(y, x); - _putch(fill_char,FALSE); - } - } - textattr(orig_attr); - move(oldy, oldx); - refresh(); - return(1); -} - -static int gettext(int sx, int sy, int ex, int ey, unsigned char *fill) -{ - int x,y; - int fillpos=0; - chtype attr; - unsigned char attrib; - unsigned char colour; - int oldx, oldy; - unsigned char thischar; - int ext_char; - - getyx(stdscr,oldy,oldx); - for(y=sy-1;y<=ey-1;y++) - { - for(x=sx-1;x<=ex-1;x++) - { - attr=mvinch(y, x); - if(attr&A_ALTCHARSET && !(api->mode&UIFC_IBM)){ - ext_char=A_ALTCHARSET|(attr&255); - /* likely ones */ - if (ext_char == ACS_CKBOARD) - { - thischar=176; - } - else if (ext_char == ACS_BOARD) - { - thischar=177; - } - else if (ext_char == ACS_BSSB) - { - thischar=218; - } - else if (ext_char == ACS_SSBB) - { - thischar=192; - } - else if (ext_char == ACS_BBSS) - { - thischar=191; - } - else if (ext_char == ACS_SBBS) - { - thischar=217; - } - else if (ext_char == ACS_SBSS) - { - thischar=180; - } - else if (ext_char == ACS_SSSB) - { - thischar=195; - } - else if (ext_char == ACS_SSBS) - { - thischar=193; - } - else if (ext_char == ACS_BSSS) - { - thischar=194; - } - else if (ext_char == ACS_BSBS) - { - thischar=196; - } - else if (ext_char == ACS_SBSB) - { - thischar=179; - } - else if (ext_char == ACS_SSSS) - { - thischar=197; - } - else if (ext_char == ACS_BLOCK) - { - thischar=219; - } - else if (ext_char == ACS_UARROW) - { - thischar=30; - } - else if (ext_char == ACS_DARROW) - { - thischar=31; - } - - /* unlikely (Not in ncurses) */ - else if (ext_char == ACS_SBSD) - { - thischar=181; - } - else if (ext_char == ACS_DBDS) - { - thischar=182; - } - else if (ext_char == ACS_BBDS) - { - thischar=183; - } - else if (ext_char == ACS_BBSD) - { - thischar=184; - } - else if (ext_char == ACS_DBDD) - { - thischar=185; - } - else if (ext_char == ACS_DBDB) - { - thischar=186; - } - else if (ext_char == ACS_BBDD) - { - thischar=187; - } - else if (ext_char == ACS_DBBD) - { - thischar=188; - } - else if (ext_char == ACS_DBBS) - { - thischar=189; - } - else if (ext_char == ACS_SBBD) - { - thischar=190; - } - else if (ext_char == ACS_SDSB) - { - thischar=198; - } - else if (ext_char == ACS_DSDB) - { - thischar=199; - } - else if (ext_char == ACS_DDBB) - { - thischar=200; - } - else if (ext_char == ACS_BDDB) - { - thischar=201; - } - else if (ext_char == ACS_DDBD) - { - thischar=202; - } - else if (ext_char == ACS_BDDD) - { - thischar=203; - } - else if (ext_char == ACS_DDDB) - { - thischar=204; - } - else if (ext_char == ACS_BDBD) - { - thischar=205; - } - else if (ext_char == ACS_DDDD) - { - thischar=206; - } - else if (ext_char == ACS_SDBD) - { - thischar=207; - } - else if (ext_char == ACS_DSBS) - { - thischar=208; - } - else if (ext_char == ACS_BDSD) - { - thischar=209; - } - else if (ext_char == ACS_BSDS) - { - thischar=210; - } - else if (ext_char == ACS_DSBB) - { - thischar=211; - } - else if (ext_char == ACS_SDBB) - { - thischar=212; - } - else if (ext_char == ACS_BDSB) - { - thischar=213; - } - else if (ext_char == ACS_BSDB) - { - thischar=214; - } - else if (ext_char == ACS_DSDS) - { - thischar=215; - } - else if (ext_char == ACS_SDSD) - { - thischar=216; - } - else - { - thischar=attr&255; - } - } - else - thischar=attr; - fill[fillpos++]=(unsigned char)(thischar); - attrib=0; - if (attr & A_BOLD) - { - attrib |= 8; - } - if (attr & A_BLINK) - { - attrib |= 128; - } - colour=PAIR_NUMBER(attr&A_COLOR)-1; - colour=((colour&56)<<1)|(colour&7); - fill[fillpos++]=colour|attrib; - } - } - move(oldy, oldx); - return(1); -} - -static void textattr(unsigned char attr) -{ - int attrs=A_NORMAL; - short colour; - - if (lastattr==attr) - return; - - lastattr=attr; - - if (attr & 8) { - attrs |= A_BOLD; - } - if (attr & 128) - { - attrs |= A_BLINK; - } - attrset(attrs); - colour = COLOR_PAIR( ((attr&7)|((attr>>1)&56))+1 ); - #ifdef NCURSES_VERSION_MAJOR - color_set(colour,NULL); - #endif - bkgdset(colour); -} - -static int kbhit(void) -{ - struct timeval timeout; - fd_set rfds; - - timeout.tv_sec=1; - timeout.tv_usec=0; - FD_ZERO(&rfds); - FD_SET(fileno(stdin),&rfds); - - return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout)); -} - -#ifndef __QNX__ -static void delay(msec) -{ - usleep(msec*1000); -} -#endif - -static int wherey(void) -{ - int x,y; - getyx(stdscr,y,x); - return(y+1); -} - -static int wherex(void) -{ - int x,y; - getyx(stdscr,y,x); - return(x+1); -} - -static void _putch(unsigned char ch, BOOL refresh_now) -{ - int cha; - - if(!(api->mode&UIFC_IBM)) - { - switch(ch) - { - case 30: - cha=ACS_UARROW; - break; - case 31: - cha=ACS_DARROW; - break; - case 176: - cha=ACS_CKBOARD; - break; - case 177: - cha=ACS_BOARD; - break; - case 178: - cha=ACS_BOARD; - break; - case 179: - cha=ACS_SBSB; - break; - case 180: - cha=ACS_SBSS; - break; - case 181: - cha=ACS_SBSD; - break; - case 182: - cha=ACS_DBDS; - break; - case 183: - cha=ACS_BBDS; - break; - case 184: - cha=ACS_BBSD; - break; - case 185: - cha=ACS_DBDD; - break; - case 186: - cha=ACS_DBDB; - break; - case 187: - cha=ACS_BBDD; - break; - case 188: - cha=ACS_DBBD; - break; - case 189: - cha=ACS_DBBS; - break; - case 190: - cha=ACS_SBBD; - break; - case 191: - cha=ACS_BBSS; - break; - case 192: - cha=ACS_SSBB; - break; - case 193: - cha=ACS_SSBS; - break; - case 194: - cha=ACS_BSSS; - break; - case 195: - cha=ACS_SSSB; - break; - case 196: - cha=ACS_BSBS; - break; - case 197: - cha=ACS_SSSS; - break; - case 198: - cha=ACS_SDSB; - break; - case 199: - cha=ACS_DSDB; - break; - case 200: - cha=ACS_DDBB; - break; - case 201: - cha=ACS_BDDB; - break; - case 202: - cha=ACS_DDBD; - break; - case 203: - cha=ACS_BDDD; - break; - case 204: - cha=ACS_DDDB; - break; - case 205: - cha=ACS_BDBD; - break; - case 206: - cha=ACS_DDDD; - break; - case 207: - cha=ACS_SDBD; - break; - case 208: - cha=ACS_DSBS; - break; - case 209: - cha=ACS_BDSD; - break; - case 210: - cha=ACS_BSDS; - break; - case 211: - cha=ACS_DSBB; - break; - case 212: - cha=ACS_SDBB; - break; - case 213: - cha=ACS_BDSB; - break; - case 214: - cha=ACS_BSDB; - break; - case 215: - cha=ACS_DSDS; - break; - case 216: - cha=ACS_SDSD; - break; - case 217: - cha=ACS_SBBS; - break; - case 218: - cha=ACS_BSSB; - break; - case 219: - cha=ACS_BLOCK; - break; - default: - cha=ch; - } - } - else - { - switch(ch) { - case 30: - cha=ACS_UARROW; - break; - case 31: - cha=ACS_DARROW; - break; - default: - cha=ch; - } - } - - - addch(cha); - if(refresh_now) - refresh(); -} - -static int cprintf(char *fmat, ...) -{ - va_list argptr; - char str[MAX_BFLN]; - int pos; - - va_start(argptr,fmat); - vsprintf(str,fmat,argptr); - va_end(argptr); - for(pos=0;str[pos];pos++) - { - _putch(str[pos],FALSE); - } - refresh(); - return(1); -} - -static void cputs(char *str) -{ - int pos; - - for(pos=0;str[pos];pos++) - { - _putch(str[pos],FALSE); - } - refresh(); -} - -static void gotoxy(int x, int y) -{ - move(y-1,x-1); - refresh(); -} diff --git a/src/uifc/uifcd.c b/src/uifc/uifcd.c deleted file mode 100644 index 6149f538180a25e75bcfe3df76905e95b76fd6e9..0000000000000000000000000000000000000000 --- a/src/uifc/uifcd.c +++ /dev/null @@ -1,441 +0,0 @@ -/* uifcd.c */ - -/* Unix libdialog implementation of UIFC library (by Deuce) */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * 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. * - ****************************************************************************/ - -#include "uifc.h" -#include "dialog.h" - -static char app_title[81]=""; -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Prototypes */ -static void help(); - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, int left, int top, char *prompt, char *str - ,int len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinid(uifcapi_t* uifcapi) -{ - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=NULL; - api->timedisplay=NULL; - - setvbuf(stdout,NULL,_IONBF,0); - api->scrn_len=24; - - init_dialog(); - - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ - end_dialog(); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - sprintf(app_title,"%.*s",(int)sizeof(app_title)-1,str); - /**********************************************************************/ - /* ToDo - Does not display application title... mostly 'cause I clear */ - /* the screen so often */ - /**********************************************************************/ - dialog_clear(); - return(0); -} - -/**************************************************************************/ -/* General menu display function. see uifc.h for details */ -/**************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , char *title, char **option) -{ - - int cnt; - int cnt2; - int options; - int freecnt; - int i; - int scrollpos; - int height=14; /* default menu height */ - size_t app_title_len; - char **it; - char str[128]; - char tmpstr[MAX_OPLN+1]; // Used for restoring the <-- At End --> bit - char tmpstr2[MAX_OPLN+1]; // for Add and Paste - int ret; - - /* Count number of menu options */ - for(cnt=0;cnt<MAX_OPTS;cnt++) - if(option[cnt]==NULL || option[cnt][0]==0) - break; - options=cnt; - freecnt=cnt+5; /* Add, Delete, Copy, Paste, At End */ - - // Allocate and fill **it - it=(char **)MALLOC(sizeof(char *)*2*(freecnt)); - if(it==NULL) - return(-1); - - for(i=0;i<freecnt*2;i++) { - it[i]=(char *)MALLOC(MAX_OPLN+1); - if(it[i]==NULL) - return(-1); - } - - strcpy(str,"1"); - - cnt2 = 0; - for(i=0;i<cnt;i++) { - sprintf(it[cnt2++],"%u",i+1); - strcpy(it[cnt2++],option[i]); - - /* Adjust width if it's too small */ - if(width<strlen(option[i])+12) - width=strlen(option[i])+12; - } - - // Make up for expanding first column in width adjustment. - i=cnt; - while(i>9) { - i /= 10; - width+=1; - } - - if(mode&WIN_INS) { - strcpy(it[cnt2++],"A"); /* Changed from "I" */ - strcpy(it[cnt2++],"Add New"); - cnt++; - } - if(mode&WIN_DEL) { - strcpy(it[cnt2++],"D"); - strcpy(it[cnt2++],"Delete"); - cnt++; - } - if(mode&WIN_GET) { - strcpy(it[cnt2++],"C"); - strcpy(it[cnt2++],"Copy"); - cnt++; - } - if(mode&WIN_PUT) { - strcpy(it[cnt2++],"P"); - strcpy(it[cnt2++],"Paste"); - cnt++; - } - - if(width<strlen(title)+4) - width=strlen(title)+4; - app_title_len=strlen(app_title); - - if(*cur<0 || *cur>cnt)*cur=0; - - if(height>cnt) - height=cnt; /* no reason to display overly "tall" menus */ - - while(1) { - i=*cur; - if(i<0) i=0; - if(cnt==2 && strcmp(option[0],"Yes")==0 && strcmp(option[1],"No")==0) { - if(i==0) - ret=dialog_yesno((char*)NULL,title,5,width); - else - ret=dialog_noyes((char*)NULL,title,5,width); - break; - } - /* make sure we're wide enough to display the application title */ - if(width<app_title_len+4) - width=app_title_len+4; - dialog_clear_norefresh(); - scrollpos=0; - - if(i>=height) // Whenever advanced was returned from, it had something - scrollpos=i-height+1; // Beyond the bottom selected - i=i-scrollpos; // Apparently, *ch is the current position ON THE SCREEN - ret=dialog_menu(app_title, title, height+8, width, height, cnt, it, str, &i, &scrollpos); - - if(ret==1) { /* Cancel */ - ret = -1; - *cur = -1; - break; - } - if(ret==-1) /* ESC */ - break; - if(ret==-2) { /* Help */ - help(); - continue; - } - if(ret!=0) /* ??? */ - continue; - switch(str[0]) { - case 'A': /* Add */ - dialog_clear_norefresh(); - if(options>0) { - strncpy(tmpstr,it[options*2],MAX_OPLN); - sprintf(it[options*2],"%u",options+1); - strncpy(tmpstr2,it[options*2+1],MAX_OPLN); - strcpy(it[options*2+1],"<-- At End -->"); - ret=dialog_menu(title, "Insert Where?", height+8, width, height, options+1, it, str, 0, 0); - strncpy(it[options*2],tmpstr,MAX_OPLN); - strncpy(it[(options*2)+1],tmpstr2,MAX_OPLN); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_INS; - } - } - else { - *cur=0; - ret=MSK_INS; - } - break; - case 'D': /* Delete */ - dialog_clear_norefresh(); - if(options>0) { - ret=dialog_menu(title, "Delete Which?", height+8, width, height, options, it, str, 0, 0); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_DEL; - } - } - else { - *cur=0; - ret=MSK_DEL; - } - break; - case 'C': /* Copy */ - dialog_clear_norefresh(); - if(options>0) { - ret=dialog_menu(title, "Copy Which?", height+8, width, height, options, it, str, 0, 0); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_GET; - } - } - else { - *cur=0; - ret=MSK_GET; - } - break; - case 'P': /* Paste */ - dialog_clear_norefresh(); - if(options>0) { - strncpy(tmpstr,it[options*2],MAX_OPLN); - sprintf(it[options*2],"%u",options+1); - strncpy(tmpstr2,it[options*2+1],MAX_OPLN); - strcpy(it[options*2+1],"<-- At End -->"); - ret=dialog_menu(title, "Paste Where?", height+8, width, height, options+1, it, str, 0, 0); - strncpy(it[options*2],tmpstr,MAX_OPLN); - strncpy(it[(options*2)+1],tmpstr2,MAX_OPLN); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_PUT; - } - } - else { - *cur=0; - ret=MSK_PUT; - } - break; - default: - *cur=atoi(str)-1; - ret=*cur; - break; - } - break; - } - - // free() the strings! - for(i=0;i<freecnt*2;i++) - free(it[i]); - free(it); - - return(ret); -} - -/****************************************************************************/ -/* Convert ASCIIZ string to upper case */ -/****************************************************************************/ -#if defined(__unix__) -static char* strupr(char* str) -{ - char* p=str; - - while(*p) { - *p=toupper(*p); - p++; - } - return(str); -} -#endif - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, char *prompt, char *outstr, - int max, int kmode) -{ - char str[256]; - if(!(kmode&K_EDIT)) - outstr[0]=0; - sprintf(str,"%.*s",(int)sizeof(str)-1,outstr); - while(dialog_inputbox((char*)NULL, prompt, 9, max+4, str)==-2) - help(); - if(kmode&K_UPPER) /* convert to uppercase? */ - strupr(str); - if(strcmp(str,outstr)) { /* changed? */ - api->changes=TRUE; - sprintf(outstr,"%.*s",max,str); - } - return strlen(outstr); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - dialog_mesgbox((char*)NULL, str, 7, strlen(str)+4); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - // Pop-down doesn't do much... the mext item should over-write this. - if(str!=NULL) - dialog_gauge((char*)NULL,str,8,20,7,40,0); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpfile=file; - helpline=line; -} - -/************************************************************/ -/* Help function. */ -/************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - - printf("\n"); - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help index: %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line!=helpline) { - fseek(fp,4,SEEK_CUR); - continue; } - fread(&l,4,1,fp); - break; } - fclose(fp); - if(l==-1L) - sprintf(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help file: %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); - } - } - } - } - else - strcpy(hbuf,api->helpbuf); - - dialog_mesgbox((char*)NULL, hbuf, 24, 80); -} diff --git a/src/uifc/uifcfltk.cpp b/src/uifc/uifcfltk.cpp deleted file mode 100644 index a622bcb6562f582fb3a25cccd3d1913c9ba2c718..0000000000000000000000000000000000000000 --- a/src/uifc/uifcfltk.cpp +++ /dev/null @@ -1,1376 +0,0 @@ -/* uifcfltk.c */ - -/* X/Windows Implementation of UIFC (user interface) library */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * 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. * - ****************************************************************************/ - -/*********************************************/ -/* UIFC Defines specific to the FLTK version */ -/*********************************************/ -#define MAX_POPUPS 10 // Maximum number of popup()s -#define MAX_WINDOWS 100 // Maximum number of list()s -#define UIFC_CANCEL -1 // Return value for Cancel -#define UIFC_MENU -2 // Keep looping value -#define UIFC_INPUT -3 // Input Box -#define UIFC_HELP -4 // Return value for Help -#define UIFC_RCLICK -5 // Right-click - -/*********************** - * Fast Light Includes * - ***********************/ -#include <FL/Fl.H> -#include <FL/Fl_Double_Window.H> -#include <FL/Fl_Scroll.H> -#include <FL/Fl_Button.H> -#include <FL/Fl_Input_.H> -#include <FL/Fl_Text_Display.H> -#include <FL/Fl_Box.H> -#include <FL/fl_ask.H> // fl_beep(), fl_message() - -/* How can we tell if the user has num lock down or not? */ -#define FL_KP_Home (FL_KP+'7') -#define FL_KP_End (FL_KP+'1') -#define FL_KP_Up (FL_KP+'8') -#define FL_KP_Down (FL_KP+'2') -#define FL_KP_Left (FL_KP+'4') -#define FL_KP_Right (FL_KP+'6') -#define FL_KP_PgUp (FL_KP+'9') -#define FL_KP_PgDn (FL_KP+'3') -#define FL_KP_Ins (FL_KP+'0') -#define FL_KP_Del (FL_KP+'.') - -/******************/ -/* Layout Defines */ -/******************/ -#define UIFC_CHAR_WIDTH 8 // Width of one "Character" (Assumes 80x25) -#define UIFC_CHAR_HEIGHT 12 // Height of one Character -#define UIFC_LINE_HEIGHT 16 // Height of one "Line" -#define UIFC_BORDER_WIDTH 2 // Width of a single border -#define UIFC_SCROLL_WIDTH 18 // Width of the scroll bar -#define UIFC_MAIN_BG_COLOR FL_DARK_CYAN -#define UIFC_BORDER_COLOR FL_YELLOW -#define UIFC_BUTTON_TEXT_COLOR FL_WHITE -#define UIFC_BUTTON_COLOR FL_DARK_BLUE -#define UIFC_BUTTON_SELECTED_COLOR FL_BLUE -#define UIFC_WINDOW_TITLE_COLOR FL_YELLOW -#define UIFC_INPUT_WIN_BG_COLOR FL_DARK_BLUE -#define UIFC_INPUT_TEXT_COLOR FL_WHITE -#define UIFC_INPUT_BOX_BG_COLOR FL_DARK_BLUE -#define UIFC_INPUT_PROMPT_COLOR FL_YELLOW -#define UIFC_HELP_PLAIN_COLOR FL_WHITE -#define UIFC_HELP_HIGH_COLOR FL_YELLOW -#define UIFC_HELP_INVERSE_COLOR FL_CYAN -#define UIFC_HELP_BOTH_COLOR FL_MAGENTA -#define UIFC_HELP_WIN_BG_COLOR FL_DARK_BLUE -#define UIFC_LIST_WIN_BG_COLOR FL_DARK_BLUE -#define UIFC_FOREGROUND 255,255,0 -#define UIFC_BACKGROUND 0,64,64 -#define UIFC_BACKGROUND2 0,0,255 - - -#include <sys/types.h> -#include "uifc.h" - -#ifdef __unix__ -#include <unistd.h> -#else -#include <stdio.h> -#endif - -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Typedefs */ -typedef struct { - int mode; - int max; - Fl_Input_ *InputBox; -} modes_t; - -/* Prototypes */ -static void help(void); -static void GenCallback(Fl_Widget *, void *); -static void LBCallback(Fl_Widget *, void *); - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, int left, int top, int width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, int left, int top, char *prompt, char *str - ,int len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); - -/* Interal routines */ -void delwin(int WinNum); - -/* Classes */ -class UIFC_PopUp : public Fl_Double_Window { - int handle(int); -public: - UIFC_PopUp(int w,int h,const char *title) : Fl_Double_Window(w,h,title) { - border(FALSE); - box(FL_UP_BOX); - set_modal(); - } -}; - -class UIFC_Button : public Fl_Button { - char uifc_label[MAX_OPLN+1]; -public: - int retval; - int mode; - int handle(int); - UIFC_Button(int x,int y,int w,int h,const char *label) : Fl_Button(x,y,w,h,label) { - if(label==NULL) - strcpy(uifc_label,""); - else - strcpy(uifc_label,label); - this->label(uifc_label); - labelfont(FL_COURIER); - labelsize(UIFC_CHAR_HEIGHT); - when(FL_WHEN_RELEASE|FL_WHEN_CHANGED); - box(FL_FLAT_BOX); - if(!(api->mode&UIFC_MONO)) { - color(UIFC_BUTTON_COLOR,UIFC_BUTTON_SELECTED_COLOR); - labelcolor(UIFC_BUTTON_TEXT_COLOR); - } - } -}; - -class UIFC_Window : public Fl_Double_Window { -public: - UIFC_Window(int x,int y,int w,int h,const char *title) : Fl_Double_Window(x,y,w,h,title) { - box(FL_UP_BOX); - if(!(api->mode&UIFC_MONO)) - color(UIFC_LIST_WIN_BG_COLOR); - UIFC_Button *HButton = new UIFC_Button( - w-(UIFC_LINE_HEIGHT*2)+UIFC_BORDER_WIDTH*3, - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*2), - UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*2), - "?"); - HButton->box(FL_NO_BOX); - HButton->labelfont(FL_SCREEN); - HButton->labelsize(UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*4)); - HButton->callback(GenCallback); - HButton->retval=UIFC_HELP; - HButton->when(FL_WHEN_CHANGED); - if(!(api->mode&UIFC_MONO)) { - HButton->color(FL_BLUE,FL_BLUE); - HButton->labelcolor(UIFC_WINDOW_TITLE_COLOR); - } - UIFC_Button *CButton = new UIFC_Button( - w-(UIFC_LINE_HEIGHT)+UIFC_BORDER_WIDTH, - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*2), - UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*2), - "X"); - CButton->box(FL_NO_BOX); - CButton->labelfont(FL_SCREEN); - CButton->labelsize(UIFC_LINE_HEIGHT-(UIFC_BORDER_WIDTH*4)); - CButton->callback(GenCallback); - CButton->retval=UIFC_CANCEL; - CButton->when(FL_WHEN_CHANGED); - if(!(api->mode&UIFC_MONO)) { - CButton->color(FL_BLUE,FL_BLUE); - CButton->labelcolor(UIFC_WINDOW_TITLE_COLOR); - } - } -}; - -class UIFC_Menu : public UIFC_Window { -public: - int *uifc_id; - UIFC_Menu(int x,int y,int w,int h,const char *title,int mode,int opts,int *cur,char **option) : UIFC_Window(x,y,w,h,title) { - UIFC_Button *Button; - Fl_Scroll *SGroup; - int opt=0; - int scrolloffset=0; - - uifc_id=cur; - if(opts>20) - scrolloffset=UIFC_SCROLL_WIDTH; - - SGroup = new Fl_Scroll( - UIFC_CHAR_WIDTH-UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT-UIFC_BORDER_WIDTH, - w-(2*UIFC_CHAR_WIDTH)+(UIFC_BORDER_WIDTH*2), - UIFC_LINE_HEIGHT*(((opts<20)?opts:20))+(UIFC_BORDER_WIDTH*4), - title); - SGroup->box(FL_DOWN_BOX); - SGroup->labelfont(FL_COURIER_BOLD); - SGroup->labelsize(UIFC_CHAR_HEIGHT); - if(!(api->mode&UIFC_MONO)) { - SGroup->labelcolor(UIFC_WINDOW_TITLE_COLOR); - SGroup->color(UIFC_BORDER_COLOR); - } - for(opt=0;option[opt][0];opt++) { - Button=new UIFC_Button( - UIFC_CHAR_WIDTH+UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*(opt+1)+UIFC_BORDER_WIDTH, - w-(2*UIFC_CHAR_WIDTH)-(2*UIFC_BORDER_WIDTH)-scrolloffset, - UIFC_LINE_HEIGHT, - option[opt]); - Button->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CENTER); - Button->callback(LBCallback); - Button->retval=opt; - Button->mode=mode; - } - if((mode&WIN_XTR)&&(mode&WIN_INS)) { - Button=new UIFC_Button( - UIFC_CHAR_WIDTH+UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*(opt+1)+UIFC_BORDER_WIDTH, - w-(2*UIFC_CHAR_WIDTH)-(2*UIFC_BORDER_WIDTH)-scrolloffset, - UIFC_LINE_HEIGHT, - NULL); - Button->callback(LBCallback); - Button->retval=opt|MSK_INS; - Button->mode=mode; - opt++; - } - } -}; - -class UIFC_Input_Box : public Fl_Input_ { - int handle(int); - void draw(); - int handle_key(); - int shift_position(int); -public: - int mode; - int max; - UIFC_Input_Box(int x,int y,int w,int h,const char *title,int inmode,int inmax,char *outval) : Fl_Input_(x,y,w,h,title) { - mode=inmode; - max=inmax; - if(mode&K_EDIT) - value(outval); - else - value(""); - position(strlen(value())); - maximum_size(max); - if(!(api->mode&UIFC_MONO)) { - labelcolor(UIFC_INPUT_PROMPT_COLOR); - color(UIFC_INPUT_BOX_BG_COLOR); - textcolor(UIFC_INPUT_TEXT_COLOR); - } - } -}; - -class UIFC_Input : public UIFC_Window { -public: - char invalue[256]; - UIFC_Input(int x,int y,int w,int h,const char *title,int inmode,int inmax,int len,int width,char *outval) : UIFC_Window(x,y,w,h,title) { - box(FL_UP_BOX); - new UIFC_Input_Box( - UIFC_CHAR_WIDTH*(len+2), - UIFC_LINE_HEIGHT, - (width)*UIFC_CHAR_WIDTH, - UIFC_LINE_HEIGHT, - title, - inmode, - inmax, - outval); - int button_left=w/2-(UIFC_CHAR_WIDTH*10); - UIFC_Button *OkButton = new UIFC_Button( - button_left, - UIFC_LINE_HEIGHT*3, - (8)*UIFC_CHAR_WIDTH, - UIFC_LINE_HEIGHT, - "Ok"); - OkButton->callback(GenCallback); - OkButton->retval=0; - UIFC_Button *CancelButton=new UIFC_Button( - button_left+UIFC_CHAR_WIDTH*10, - UIFC_LINE_HEIGHT*3, - (10)*UIFC_CHAR_WIDTH - ,UIFC_LINE_HEIGHT - ,"Cancel"); - CancelButton->retval=UIFC_CANCEL; - CancelButton->shortcut(FL_Escape); - CancelButton->callback(GenCallback); - if(inmode&K_EDIT) - snprintf(invalue,inmax,"%s",outval); - else - invalue[0]=0; - } -}; - -/* Globals */ -Fl_Double_Window *MainWin; -int GUI_RetVal; -UIFC_Menu *Windows[MAX_WINDOWS]; // Array of windows for ulist -int CurrWin; // Current window in array. -int *uifc_cur=NULL; // Current selection. - -/*****************************/ -/* UIFC_Button ENTER catcher */ -/*****************************/ -int UIFC_Button::handle(int event) { - if (event == FL_FOCUS) { - if(uifc_cur != NULL) - *uifc_cur=retval&MSK_OFF; - - if(!(api->mode&UIFC_MONO)) - color(UIFC_BUTTON_SELECTED_COLOR); - Fl_Scroll *s=(Fl_Scroll *)parent(); - /****************************************************************************** - * This works, it will always work if there is vertical room for at least one * - * button in the scroll box. For gods sake, don't touch this unless you KNOW * - * how it works, and can do it better. * - ******************************************************************************/ - if(s->type()==Fl_Scroll::BOTH) { - if(y() + h() + Fl::box_dy(box()) + Fl::box_dh(box()) > s->y()+Fl::box_dy(s->box())+s->h()-Fl::box_dh(s->box())) { - // Scroll Down - s->position(0,s->yposition()-(s->y() + Fl::box_dy(s->box()) + s->h() - Fl::box_dh(s->box()) - y() - h() - Fl::box_dy(box()) - Fl::box_dh(box()))); - } - if(y() < s->y()+Fl::box_dy(s->box())) { - // Scroll Up - s->position(0,s->yposition()-(s->y() + Fl::box_dy(s->box()) - y())); - } - } - } - else if (event == FL_UNFOCUS) { - if(!(api->mode&UIFC_MONO)) - color(UIFC_BUTTON_COLOR); - } - else if (event == FL_KEYBOARD) { - int key=Fl::event_key(); - int i; - if (key == FL_Enter || key == FL_KP_Enter) { - do_callback(); - return 1; - } - if(key==FL_Page_Up || key==FL_KP_PgUp) { - for(i=0;i<parent()->children() && this!=parent()->child(i);i++) {} - i=i-((parent()->h() - Fl::box_dh(parent()->box()))/UIFC_LINE_HEIGHT)+1; - if(i<0) - i=0; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - if(key==FL_Page_Down || key==FL_KP_PgDn) { - for(i=0;i<parent()->children() && this!=parent()->child(i);i++) {} - i=i+((parent()->h() - Fl::box_dh(parent()->box()))/UIFC_LINE_HEIGHT)-1; - if(i>parent()->children()-3) - i=parent()->children()-3; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - if(key==FL_Up || key==FL_KP_Up) { - for(i=0;i<parent()->children() && this!=parent()->child(i);i++) {} - i=i-1; - if(i<0) - i=parent()->children()-3; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - if(key==FL_Down || key==FL_KP_Down) { - for(i=0;i<parent()->children() && this!=parent()->child(i);i++) {} - i=i+1; - if(i>parent()->children()-3) - i=0; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - if(key==FL_Home || key==FL_KP_Home) { - i=0; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - if(key==FL_End || key==FL_KP_End) { - i=parent()->children()-3; - Fl::focus(parent()->child(i)); - parent()->child(i)->handle(FL_FOCUS); - return(1); - } - } - return Fl_Button::handle(event); -} - -/**********************************/ -/* right-click menu event handler */ -/**********************************/ -int UIFC_PopUp::handle(int event) { - int i; - - if(event == FL_SHORTCUT && Fl::test_shortcut(FL_Escape)) { - GUI_RetVal=UIFC_CANCEL; - return(1); - } - if(event==FL_PUSH) { - for(i=0;i<children();i++) { - if(Fl::event_inside(child(i))) { - GUI_RetVal=((UIFC_Button *)child(i))->retval; - return(1); - } - } - GUI_RetVal=UIFC_CANCEL; - return(1); - } - return(0); -} - -/*******************/ -/* Input Box stuff */ -/*******************/ - -void UIFC_Input_Box::draw() { - if (input_type() == FL_HIDDEN_INPUT) return; - Fl_Boxtype b = box(); - if (damage() & FL_DAMAGE_ALL) draw_box(b, color()); - Fl_Input_::drawtext(x()+Fl::box_dx(b), y()+Fl::box_dy(b), - w()-Fl::box_dw(b), h()-Fl::box_dh(b)); -} - -// kludge so shift causes selection to extend: -int UIFC_Input_Box::shift_position(int p) { - return position(p, Fl::event_state(FL_SHIFT) ? mark() : p); -} - -#define ctrl(x) (x^0x40) -int UIFC_Input_Box::handle_key() { - char ascii = Fl::event_text()[0]; - int del; - - if (Fl::compose(del)) { - // Insert characters into numeric fields after checking for legality: - if (mode&K_NUMBER) { - Fl::compose_reset(); // ignore any foreign letters... - // This is complex to allow "0xff12" hex to be typed: - if (ascii >= '0' && ascii <= '9') { - if (readonly()) - fl_beep(); - else - replace(position(), mark(), &ascii, 1); - } - strcpy(((UIFC_Input *)parent())->invalue,value()); - return 1; - } - - if (del || Fl::event_length()) { - if (readonly()) - fl_beep(); - else - replace(position(), del ? position()-del : mark(), - Fl::event_text(), Fl::event_length()); - } - strcpy(((UIFC_Input *)parent())->invalue,value()); - return 1; - } - - switch (Fl::event_key()) { - case FL_Insert: - case FL_KP_Ins: - if (Fl::event_state() & FL_CTRL) - ascii = ctrl('C'); - else - if (Fl::event_state() & FL_SHIFT) - ascii = ctrl('V'); - break; - case FL_Delete: - case FL_KP_Del: - if (Fl::event_state() & FL_SHIFT) - ascii = ctrl('X'); - else - ascii = ctrl('D'); - break; - case FL_Left: - case FL_KP_Left: - return shift_position(position()-1) + 1; - break; - case FL_Right: - case FL_KP_Right: - ascii = ctrl('F'); - break; - case FL_Home: - case FL_KP_Home: - if (Fl::event_state() & FL_CTRL) { - shift_position(0); - return 1; - } - return shift_position(line_start(position())) + 1; - break; - case FL_End: - case FL_KP_End: - if (Fl::event_state() & FL_CTRL) { - shift_position(size()); - return 1; - } - ascii = ctrl('E'); break; - case FL_BackSpace: - ascii = ctrl('H'); - break; - case FL_Enter: - case FL_KP_Enter: - GUI_RetVal=0; - return 1; - } - - int i; - switch (ascii) { - case ctrl('C'): // copy - return copy(1); - case ctrl('D'): - case ctrl('?'): - if (readonly()) { - fl_beep(); - return 1; - } - if (mark() != position()) { - i=cut(); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - } - else { - i=cut(1); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - } - case ctrl('E'): - return shift_position(line_end(position())) + 1; - case ctrl('F'): - return shift_position(position()+1) + 1; - case ctrl('H'): - if (readonly()) { - fl_beep(); - return 1; - } - if (mark() != position()) { - i=cut(); - strcpy(((UIFC_Input *)parent())->invalue,value()); - } - else { - i=cut(-1); - strcpy(((UIFC_Input *)parent())->invalue,value()); - } - return i; - case ctrl('K'): - if (readonly()) { - fl_beep(); - return 1; - } - if (position()>=size()) return 0; - i = line_end(position()); - if (i == position() && i < size()) - i++; - cut(position(), i); - i=copy_cuts(); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - case ctrl('U'): - if (readonly()) { - fl_beep(); - return 1; - } - i=cut(0, size()); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - case ctrl('V'): - case ctrl('Y'): - if (readonly()) { - fl_beep(); - return 1; - } - Fl::paste(*this, 1); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return 1; - case ctrl('X'): - case ctrl('W'): - if (readonly()) { - fl_beep(); - return 1; - } - copy(1); - i=cut(); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - case ctrl('Z'): - case ctrl('_'): - if (readonly()) { - fl_beep(); - return 1; - } - i=undo(); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - case ctrl('A'): - case ctrl('G'): - if (readonly()) { - fl_beep(); - return 1; - } - // insert a few selected control characters literally: - if (!(mode&K_NUMBER) && (mode&K_MSG)) { - i=replace(position(), mark(), &ascii, 1); - strcpy(((UIFC_Input *)parent())->invalue,value()); - return i; - } - } - return 0; -} - -int UIFC_Input_Box::handle(int event) { - static int drag_start = -1; - switch (event) { - case FL_FOCUS: - switch (Fl::event_key()) { - case FL_Right: - position(0); - break; - case FL_Left: - position(size()); - break; - case FL_Down: - up_down_position(0); - break; - case FL_Up: - up_down_position(line_start(size())); - break; - case FL_Tab: - case 0xfe20: // XK_ISO_Left_Tab - position(size(),0); - break; - default: - position(position(),mark());// turns off the saved up/down arrow position - break; - } - break; - - case FL_KEYBOARD: - if (Fl::event_key() == FL_Tab && mark() != position()) { - // Set the current cursor position to the end of the selection... - if (mark() > position()) - position(mark()); - else - position(position()); - return (1); - } - else - return handle_key(); - case FL_PUSH: - if (Fl::focus() != this) { - Fl::focus(this); - handle(FL_FOCUS); - } - break; - - case FL_RELEASE: - if (Fl::event_button() == 2) { - Fl::event_is_click(0); // stop double click from picking a word - Fl::paste(*this, 0); - } - else if (!Fl::event_is_click()) { - // copy drag-selected text to the clipboard. - copy(0); - } - else if (Fl::event_is_click() && drag_start >= 0) { - // user clicked in the field and wants to reset the cursor position... - position(drag_start, drag_start); - drag_start = -1; - } - // For output widgets, do the callback so the app knows the user - // did something with the mouse... - if (readonly()) - do_callback(); - return 1; - - } - Fl_Boxtype b = box(); - return Fl_Input_::handletext(event, - x()+Fl::box_dx(b), y()+Fl::box_dy(b), - w()-Fl::box_dw(b), h()-Fl::box_dh(b)); -} - -/*********************/ -/* top level handler */ -/*********************/ -static int handle_escape(int event) { - UIFC_Button *w=(UIFC_Button *)Fl::focus(); - int i,j,key; - - if(event == FL_SHORTCUT && Fl::test_shortcut(FL_Escape)) { - GUI_RetVal=UIFC_CANCEL; - return(1); - } - if(event == FL_SHORTCUT && Fl::focus()->type()==FL_NORMAL_BUTTON) { - int mode=((UIFC_Button *)Fl::focus())->mode; - key=Fl::event_key(); - if((key==FL_Insert || key==FL_KP_Ins) && (mode&WIN_INS)) { - GUI_RetVal=w->retval|MSK_INS; - return(1); - } - if((key==FL_Delete || key==FL_KP_Del) && (mode&WIN_DEL)) { - GUI_RetVal=w->retval|MSK_DEL; - return(1); - } - if(key==FL_F+5 && (mode&WIN_GET)) { - GUI_RetVal=w->retval|MSK_GET; - return(1); - } - if(key==FL_F+6 && (mode&WIN_PUT)) { - GUI_RetVal=w->retval|MSK_PUT; - return(1); - } - if(key==FL_F+1) { - GUI_RetVal=UIFC_HELP; - return(1); - } - if((key>='a' && key<='z')||(key>='0' && key<='9')) { - for(i=0;i<w->parent()->children() && w!=w->parent()->child(i);i++) {} - if(i!=w->parent()->children()) { - j=i; - for(i++;i!=j;i++) { - if(i>=w->parent()->children()) - i=0; - if(w->parent()->child(i)->type()==FL_NORMAL_BUTTON - && w->parent()->child(i)!=NULL - && w->parent()->child(i)->label()!=NULL) { - if(toupper(key)==toupper(*(char *)w->parent()->child(i)->label())) { - Fl::focus(w->parent()->child(i)); - w->parent()->child(i)->handle(FL_FOCUS); - return(1); - } - } - } - } - } - } - return(0); -} - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinifltk(uifcapi_t* uifcapi) -{ - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - api->showhelp=help; - api->showbuf=NULL; - api->timedisplay=NULL; - - api->scrn_len=24; - api->scrn_width=80; - api->mode |= UIFC_MOUSE; - -// Fl::scheme("plastic"); - Fl::add_handler(handle_escape); - Fl::visible_focus(TRUE); - Fl::visual(FL_DOUBLE|FL_INDEX); - if(!(api->mode&UIFC_MONO)) { - Fl::foreground(UIFC_FOREGROUND); - Fl::background(UIFC_BACKGROUND); - Fl::background2(UIFC_BACKGROUND2); - } - Windows[0]=NULL; - - CurrWin=0; - MainWin=NULL; - -#if defined(_WIN32) && !defined(_DEBUG) - FreeConsole(); // close popup console window -#endif - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ - int i; - - for(i=CurrWin;i>=0;i--) { - delwin(i); - } - - if(MainWin != NULL) { - MainWin->hide(); - delete MainWin; - } - Fl::wait(5); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - if(MainWin==NULL) { - MainWin=new Fl_Double_Window(UIFC_CHAR_WIDTH*80,UIFC_LINE_HEIGHT*25,str); - if(!(api->mode&UIFC_MONO)) - MainWin->color(UIFC_MAIN_BG_COLOR,UIFC_MAIN_BG_COLOR); - } - MainWin->show(); - return(0); -} - -/**********************************/ -/* Delete window and all children */ -/**********************************/ -void delwin(int WinNum) { - - if(WinNum<0) - return; - if(Windows[WinNum]!=NULL) { - MainWin->remove(Windows[WinNum]); - delete Windows[WinNum]; - Windows[WinNum]=NULL; - } -} - - -/********************/ -/* Generic callback */ -/********************/ -static void GenCallback(Fl_Widget *w, void *data) { - GUI_RetVal=((UIFC_Button *)w)->retval; -} - -/*****************/ -/* NULL callback */ -/*****************/ -static void NULLCallback(int i, void *data) { -} - -/***************/ -/* Pop up menu */ -/***************/ -static void doPopUp(int mode) { - int height=0; - int width=3; - int curry=0; - Fl_Widget *w=Fl::pushed(); - if(w->type()==FL_NORMAL_BUTTON) { - ((Fl_Button *)w)->value(0); - if(!(api->mode&UIFC_MONO)) - w->color(UIFC_BUTTON_SELECTED_COLOR); - } - - // Right Click - if(mode&WIN_INS) { - height++; - width=7; - } - if(mode&WIN_DEL) { - height++; - width=7; - } - if(mode&WIN_GET) { - height++; - } - if(mode&WIN_PUT) { - height++; - } - if(height) { - UIFC_PopUp *PopUp=new UIFC_PopUp( - UIFC_CHAR_WIDTH*width+UIFC_BORDER_WIDTH*2, - UIFC_LINE_HEIGHT*height+UIFC_BORDER_WIDTH*2, - "PopUp"); - PopUp->position(Fl::event_x_root()+3,Fl::event_y_root()+3); - if(mode&WIN_INS) { - UIFC_Button *InsertButton=new UIFC_Button( - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*curry+UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*width, - UIFC_LINE_HEIGHT, - "Insert"); - InsertButton->retval=((UIFC_Button *)w)->retval|MSK_INS; - InsertButton->mode=0; - InsertButton->box(FL_NO_BOX); - curry++; - } - if(mode&WIN_DEL) { - UIFC_Button *DeleteButton=new UIFC_Button( - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*curry+UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*width, - UIFC_LINE_HEIGHT, - "Delete"); - DeleteButton->retval=((UIFC_Button *)w)->retval|MSK_DEL; - DeleteButton->mode=0; - DeleteButton->box(FL_NO_BOX); - curry++; - } - if(mode&WIN_GET) { - UIFC_Button *GetButton=new UIFC_Button( - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*curry+UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*width, - UIFC_LINE_HEIGHT, - "Get"); - GetButton->retval=((UIFC_Button *)w)->retval|MSK_GET; - GetButton->mode=0; - GetButton->box(FL_NO_BOX); - curry++; - } - if(mode&WIN_PUT) { - UIFC_Button *PutButton=new UIFC_Button( - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*curry+UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*width, - UIFC_LINE_HEIGHT, - "Put"); - PutButton->retval=((UIFC_Button *)w)->retval|MSK_PUT; - PutButton->mode=0; - PutButton->box(FL_NO_BOX); - curry++; - } - PopUp->end(); - PopUp->show(); - PopUp->show(); - if(w->type()==FL_NORMAL_BUTTON) { - if(!(api->mode&UIFC_MONO)) - w->color(UIFC_BUTTON_SELECTED_COLOR); - w->redraw(); - } - Fl::grab(PopUp); - while(GUI_RetVal==UIFC_RCLICK) { - Fl::wait(); - } - Fl::grab(0); - delete PopUp; - } - return; -} - -/************************/ -/* List button Callback */ -/************************/ -static void LBCallback(Fl_Widget *w, void *data) { - ((Fl_Button *)w)->value(1); - if(uifc_cur != NULL) - *uifc_cur=((UIFC_Button *)w)->retval&MSK_OFF; - if(Fl::event_key()==FL_Button+3) { - Fl::focus(w); - w->handle(FL_FOCUS); - GUI_RetVal=UIFC_RCLICK; - return; - } - GUI_RetVal=((UIFC_Button *)w)->retval; -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, int left, int top, int width, int *cur, int *bar - , char *title, char **option) -{ - int opts,i; - int len; - int scrolloffset=0; - - // Find WinID - for(i=CurrWin;(i>=0)&&(Windows[i]==NULL || Windows[i]->uifc_id!=cur);i--) {} - if(i>=0) { - for(;CurrWin>=i;CurrWin--) - delwin(CurrWin); - - } - CurrWin++; - delwin(CurrWin); - - len=strlen(title)+6; - if(width<len) - width=len; - for(opts=0;option[opts][0];opts++) { - len=strlen(option[opts])+4; - if(width<len) - width=len; - } - if(mode&WIN_XTR) - opts+=1; - if(*cur>=opts) - *cur=opts-1; - if(*cur<0) - *cur=0; - - if(opts>20) - scrolloffset=UIFC_SCROLL_WIDTH; - - GUI_RetVal=UIFC_MENU; - if(top==0) - top=SCRN_TOP; - if(left==0) - left=SCRN_LEFT; - if(mode&WIN_RHT) - left=SCRN_RIGHT-width; - while(left+width>79) - left--; - if(left<=0 || (mode&WIN_L2R)) - left=(80-width)/2; - if(mode&WIN_BOT) - top=23; - while (top+((opts<20)?opts:20)>22) - top--; - if (mode&WIN_T2B) - top=0; - if(top<=0) - top=(23-((opts<20)?opts:20))/2; - - Windows[CurrWin] = new UIFC_Menu( - UIFC_CHAR_WIDTH*left-UIFC_BORDER_WIDTH-(scrolloffset/2), - UIFC_LINE_HEIGHT*top-UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*width+(UIFC_BORDER_WIDTH*2)+scrolloffset, - UIFC_LINE_HEIGHT*(((opts<20)?opts:20)+1)+(UIFC_BORDER_WIDTH*6), - title, - mode, - opts, - cur, - option); - MainWin->add(Windows[CurrWin]); - Windows[CurrWin]->end(); - Windows[CurrWin]->show(); - Windows[CurrWin]->show(); - /* This is kind of kludgy... it doesn't allow for adding of buttons to - the UIFC_Window before the Scroll Group */ - Fl::focus(((UIFC_Menu *)Windows[CurrWin]->child(2))->child(*cur)); - if(!(api->mode&UIFC_MONO)) - ((UIFC_Menu *)Windows[CurrWin]->child(2))->child(*cur)->color(UIFC_BUTTON_SELECTED_COLOR); - - uifc_cur=cur; - while(GUI_RetVal==UIFC_MENU) { - Fl::wait(); - if(GUI_RetVal==UIFC_HELP) { - help(); - GUI_RetVal=UIFC_MENU; - } - else if(GUI_RetVal==UIFC_RCLICK) { - doPopUp(mode); - if(GUI_RetVal==UIFC_CANCEL) - GUI_RetVal=UIFC_MENU; - } - } - uifc_cur=NULL; - - Windows[CurrWin]->deactivate(); - return GUI_RetVal; -} - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, int left, int top, char *prompt, char *outstr, - int max, int kmode) -{ - int width; - int wwidth; - int len; - - width=max; - len=strlen(prompt); - if(width>(76-len)) - width=76-len; - wwidth=width+len+1; - if(wwidth<18) { - len+=(18-wwidth)/2; - wwidth=18; - } - - GUI_RetVal=UIFC_INPUT; - if(top==0) - top=SCRN_TOP; - if(left==0) - left=SCRN_LEFT; - if(mode&WIN_RHT) - left=SCRN_RIGHT-width; - while(left+wwidth>79) - left--; - if(left<=0 || (mode&WIN_L2R)) - left=(80-wwidth)/2; - if(mode&WIN_BOT) - top=23; - while (top+5>22) - top--; - if (mode&WIN_T2B) - top=0; - if(top<=0) - top=(23-5)/2; - - UIFC_Input *InputWin = new UIFC_Input( - UIFC_CHAR_WIDTH*left, - UIFC_LINE_HEIGHT*top, - UIFC_CHAR_WIDTH*(wwidth+4), - UIFC_LINE_HEIGHT*5, - prompt, - kmode, - max, - len, - width, - outstr); - - MainWin->add(InputWin); - InputWin->end(); - InputWin->show(); - InputWin->show(); - /* This is kind of kludgy... it doesn't allow for adding of buttons to - the UIFC_Window before the UIFC_Input_Box */ - Fl::focus((UIFC_Menu *)InputWin->child(2)); - while(GUI_RetVal==UIFC_INPUT) { - Fl::wait(); - if(GUI_RetVal==UIFC_HELP) { - help(); - GUI_RetVal=UIFC_INPUT; - } - else if(GUI_RetVal==UIFC_RCLICK) - GUI_RetVal=UIFC_INPUT; - } - if(GUI_RetVal==0) { - if(kmode&K_EDIT) { - if(strcmp(outstr,InputWin->invalue)) { - api->changes=TRUE; - } - } - else { - if(strlen(InputWin->invalue)) { - api->changes=TRUE; - } - } - snprintf(outstr,max,"%s",InputWin->invalue); - } - MainWin->remove(InputWin); - delete InputWin; - - if(GUI_RetVal==UIFC_CANCEL) - return(-1); - - return(strlen(outstr)); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - fl_message(str); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - static Fl_Double_Window *PopUp[MAX_POPUPS]; - static int CurrPop=0; - int width=0; - int height=1; - - if(str == NULL) { - for(;CurrPop>0;CurrPop--) { - delete PopUp[CurrPop-1]; - } - return; - } - - width=strlen(str); - while(width>78) { - height+=1; - width-=78; - } - PopUp[CurrPop]=new Fl_Double_Window((width+4)*UIFC_CHAR_WIDTH,(height+2)*UIFC_LINE_HEIGHT,NULL); - PopUp[CurrPop]->border(FALSE); - Fl_Box *box = new Fl_Box( - UIFC_CHAR_WIDTH,UIFC_LINE_HEIGHT, - UIFC_CHAR_WIDTH*width,UIFC_LINE_HEIGHT*height,"str"); - box->align(FL_ALIGN_CENTER|FL_ALIGN_WRAP|FL_ALIGN_INSIDE); - PopUp[CurrPop]->set_modal(); - PopUp[CurrPop]->end(); - PopUp[CurrPop]->show(); - PopUp[CurrPop]->show(); - CurrPop++; -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/****************************************************************************/ -/* Help function. */ -/****************************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char ch[2]={0,0}; - char *p; - unsigned short line; - size_t len,j; - int i=0; - long l; - FILE *fp; - int inverse=0; - int high=0; - - // Read help buffer - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - sprintf(hbuf," ERROR Cannot open help index:\n %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line != helpline) { - fseek(fp,4,SEEK_CUR); - continue; - } - fread(&l,4,1,fp); - break; - } - fclose(fp); - if(l==-1L) - sprintf(hbuf," ERROR Cannot locate help key (%s:%u) in:\n" - " %s",p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - sprintf(hbuf," ERROR Cannot open help file:\n %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); - } - } - } - } - else - strcpy(hbuf,api->helpbuf); - - len=strlen(hbuf); - - - UIFC_Window *HelpWin = new UIFC_Window( - UIFC_CHAR_WIDTH*2-UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT*1-UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*76+(UIFC_BORDER_WIDTH*2), - UIFC_LINE_HEIGHT*22+(UIFC_BORDER_WIDTH*2), - "Help Window"); - Fl_Text_Display *TextBox = new Fl_Text_Display( - UIFC_BORDER_WIDTH, - UIFC_LINE_HEIGHT+UIFC_BORDER_WIDTH, - UIFC_CHAR_WIDTH*76, - UIFC_LINE_HEIGHT*20+(UIFC_BORDER_WIDTH*6), - "Help Window"); - TextBox->labelfont(FL_COURIER_BOLD); - TextBox->labelsize(UIFC_CHAR_HEIGHT); - if(!(api->mode&UIFC_MONO)) { - TextBox->labelcolor(UIFC_WINDOW_TITLE_COLOR); - TextBox->color(UIFC_HELP_WIN_BG_COLOR); - } - TextBox->textfont(FL_COURIER); - TextBox->textsize(UIFC_CHAR_HEIGHT); - TextBox->buffer(new Fl_Text_Buffer(HELPBUF_SIZE)); - Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table - { UIFC_HELP_PLAIN_COLOR, FL_COURIER, UIFC_CHAR_HEIGHT }, // A - Plain - { UIFC_HELP_HIGH_COLOR, FL_COURIER_ITALIC, UIFC_CHAR_HEIGHT }, // B - Bold - { UIFC_HELP_INVERSE_COLOR, FL_COURIER_ITALIC, UIFC_CHAR_HEIGHT }, // C - Inverse - { UIFC_HELP_BOTH_COLOR, FL_COURIER_ITALIC, UIFC_CHAR_HEIGHT }, // D - Both - }; - Fl_Text_Buffer *StyleBuf=new Fl_Text_Buffer(HELPBUF_SIZE); - TextBox->highlight_data(StyleBuf, styletable, - (int)(sizeof(styletable) / sizeof(styletable[0])), - 'A',NULLCallback,(void *)NULL); - MainWin->add(HelpWin); - HelpWin->end(); - HelpWin->show(); - HelpWin->show(); - - for(j=0;j<len;j++) { - if(hbuf[j]=='\r') /* don't display <cr> */ - continue; - if(hbuf[j]==2 || hbuf[j]=='~') { /* Ctrl-b toggles inverse */ - if(inverse) - inverse=0; - else - inverse=1; - } - else if(hbuf[j]==1 || hbuf[j]=='`') { /* Ctrl-a toggles high intensity */ - if(high) - high=0; - else - high=1; - } - else { - ch[0]=hbuf[j]; - TextBox->insert(ch); - ch[0]='A'+(high|(inverse<<1)); - StyleBuf->insert(i,ch); - i++; - } - } - while(GUI_RetVal==UIFC_HELP) { - Fl::wait(); - if(GUI_RetVal==UIFC_RCLICK) - GUI_RetVal=UIFC_HELP; - } - delete StyleBuf; - MainWin->remove(HelpWin); - delete HelpWin; -}