📄 windos2.c
字号:
case CTL_HOME:
current = -1;
increment = rev_increment = 1;
break;
case CTL_END:
current = numchoices;
increment = rev_increment = -1;
break;
default:
if (checkkey) {
if ((ret = (*checkkey)(curkey,current)) < -1 || ret > 0)
goto fs_choice_end;
if (ret == -1)
redisplay = -1;
}
ret = -1;
if (speedstring) {
i = strlen(speedstring);
if (curkey == 8 && i > 0) /* backspace */
speedstring[--i] = 0;
if (33 <= curkey && curkey <= 126 && i < 30) {
curkey = tolower(curkey);
speedstring[i] = curkey;
speedstring[++i] = 0;
}
if (i > 0) { /* locate matching type */
current = 0;
while (current < numchoices
&& (speed_match = strncasecmp(speedstring,choices[current],i)) > 0)
++current;
if (speed_match < 0 && current > 0) /* oops - overshot */
--current;
if (current >= numchoices) /* bumped end of list */
current = numchoices - 1;
}
}
break;
}
if (increment) { /* apply cursor movement */
current += increment;
if (speedstring) /* zap speedstring */
speedstring[0] = 0;
}
while (1) { /* adjust to a non-comment choice */
if (current < 0 || current >= numchoices)
increment = rev_increment;
else if ((attributes[current] & 256) == 0)
break;
current += increment;
}
if (topleftchoice > numchoices - boxitems)
topleftchoice = ((numchoices+boxwidth-1)/boxwidth)*boxwidth - boxitems;
if (topleftchoice < 0)
topleftchoice = 0;
while (current < topleftchoice) {
topleftchoice -= boxwidth;
redisplay = 1;
}
while (current >= topleftchoice + boxitems) {
topleftchoice += boxwidth;
redisplay = 1;
}
}
fs_choice_end:
lookatmouse = savelookatmouse;
return(ret);
}
int input_field(
int options, /* &1 numeric, &2 integer, &4 double */
int attr, /* display attribute */
char *fld, /* the field itself */
int len, /* field length (declare as 1 larger for \0) */
int row, /* display row */
int col, /* display column */
int (*checkkey)(int) /* routine to check non data keys, or NULL */
)
{
char savefld[81];
char buf[81];
int insert, started, offset, curkey, display;
int i, j;
int ret,savelookatmouse;
savelookatmouse = lookatmouse;
lookatmouse = 0;
ret = -1;
strcpy(savefld,fld);
insert = started = offset = 0;
display = 1;
while (1) {
strcpy(buf,fld);
i = strlen(buf);
while (i < len)
buf[i++] = ' ';
buf[len] = 0;
if (display) { /* display current value */
putstring(row,col,attr,buf);
display = 0;
}
curkey = keycursor(row+insert,col+offset); /* get a keystroke */
switch (curkey) {
case ENTER:
case ENTER_2:
ret = 0;
goto inpfld_end;
case ESC:
goto inpfld_end;
case RIGHT_ARROW:
case RIGHT_ARROW_2:
if (offset < len) ++offset;
started = 1;
break;
case LEFT_ARROW:
case LEFT_ARROW_2:
if (offset > 0) --offset;
started = 1;
break;
case HOME:
offset = 0;
started = 1;
break;
case END:
offset = strlen(fld);
started = 1;
break;
case 8:
case 127: /* backspace */
if (offset > 0) {
j = strlen(fld);
for (i = offset-1; i < j; ++i)
fld[i] = fld[i+1];
--offset;
}
started = display = 1;
break;
case DELETE: /* delete */
j = strlen(fld);
for (i = offset; i < j; ++i)
fld[i] = fld[i+1];
started = display = 1;
break;
case 1082: /* insert */
insert ^= 0x8000;
started = 1;
break;
case F5:
strcpy(fld,savefld);
insert = started = offset = 0;
display = 1;
break;
default:
if (curkey < 32 || curkey >= 127) {
if (checkkey && (ret = (*checkkey)(curkey)))
goto inpfld_end;
break; /* non alphanum char */
}
if (offset >= len) break; /* at end of field */
if (insert && started && strlen(fld) >= len)
break; /* insert & full */
if ((options & 1)
&& (curkey < '0' || curkey > '9')
&& curkey != '+' && curkey != '-') {
if ((options & 2))
break;
/* allow scientific notation, and specials "e" and "p" */
if ( ((curkey != 'e' && curkey != 'E') || offset >= 18)
&& ((curkey != 'p' && curkey != 'P') || offset != 0 )
&& curkey != '.')
break;
}
if (started == 0) /* first char is data, zap field */
fld[0] = 0;
if (insert) {
j = strlen(fld);
while (j >= offset) {
fld[j+1] = fld[j];
--j;
}
}
if (offset >= strlen(fld))
fld[offset+1] = 0;
fld[offset++] = curkey;
/* if "e" or "p" in first col make number e or pi */
if ((options & 3) == 1) { /* floating point */
double tmpd;
int specialv;
char tmpfld[30];
specialv = 0;
if (*fld == 'e' || *fld == 'E') {
tmpd = exp(1.0);
specialv = 1;
}
if (*fld == 'p' || *fld == 'P') {
tmpd = atan(1.0) * 4;
specialv = 1;
}
if (specialv) {
if ((options & 4) == 0)
roundfloatd(&tmpd);
sprintf(tmpfld,"%.15g",tmpd);
tmpfld[len-1] = 0; /* safety, field should be long enough */
strcpy(fld,tmpfld);
offset = 0;
}
}
started = display = 1;
}
}
inpfld_end:
lookatmouse = savelookatmouse;
return(ret);
}
int field_prompt(
int options, /* &1 numeric value, &2 integer */
char *hdg, /* heading, \n delimited lines */
char *instr, /* additional instructions or NULL */
char *fld, /* the field itself */
int len, /* field length (declare as 1 larger for \0) */
int (*checkkey)(int) /* routine to check non data keys, or NULL */
)
{
char *charptr;
int boxwidth,titlelines,titlecol,titlerow;
int promptcol;
int i,j;
char buf[81];
helptitle(); /* clear screen, display title */
setattr(1,0,C_PROMPT_BKGRD,24*80); /* init rest to background */
charptr = hdg; /* count title lines, find widest */
i = boxwidth = 0;
titlelines = 1;
while (*charptr) {
if (*(charptr++) == '\n') {
++titlelines;
i = -1;
}
if (++i > boxwidth)
boxwidth = i;
}
if (len > boxwidth)
boxwidth = len;
i = titlelines + 4; /* total rows in box */
titlerow = (25 - i) / 2; /* top row of it all when centered */
titlerow -= titlerow / 4; /* higher is better if lots extra */
titlecol = (80 - boxwidth) / 2; /* center the box */
titlecol -= (90 - boxwidth) / 20;
promptcol = titlecol - (boxwidth-len)/2;
j = titlecol; /* add margin at each side of box */
if ((i = (82-boxwidth)/4) > 3)
i = 3;
j -= i;
boxwidth += i * 2;
for (i = -1; i < titlelines+3; ++i) /* draw empty box */
setattr(titlerow+i,j,C_PROMPT_LO,boxwidth);
textcbase = titlecol; /* set left margin for putstring */
putstring(titlerow,0,C_PROMPT_HI,hdg); /* display heading */
textcbase = 0;
i = titlerow + titlelines + 4;
if (instr) { /* display caller's instructions */
charptr = instr;
j = -1;
while ((buf[++j] = *(charptr++)))
if (buf[j] == '\n') {
buf[j] = 0;
putstringcenter(i++,0,80,C_PROMPT_BKGRD,buf);
j = -1;
}
putstringcenter(i,0,80,C_PROMPT_BKGRD,buf);
}
else /* default instructions */
putstringcenter(i,0,80,C_PROMPT_BKGRD,
"Press ENTER when finished (or ESCAPE to back out)");
return(input_field(options,C_PROMPT_INPUT,fld,len,
titlerow+titlelines+1,promptcol,checkkey));
}
void helptitle()
{
char msg[80],buf[10];
setclear(); /* clear the screen */
sprintf(msg,"WINFRACT Version %d.%01d",win_release/100,
(win_release%100)/10);
if (win_release%10) {
sprintf(buf,"%01d",win_release%10);
strcat(msg,buf);
}
putstringcenter(0,0,80,C_TITLE,msg);
/* uncomment next for production executable: */
/* return; */
putstring(0,2,C_TITLE_DEV,"Development Version");
/* putstring(0,2,C_TITLE_DEV,"'Public-Beta' Release"); */
/* replace above by next after creating production release, for release source */
/* putstring(0,3,C_TITLE_DEV, "Customized Version"); */
putstring(0,53,C_TITLE_DEV,"Not for Public Release");
}
static int screenctr=-1;
#define MAXSCREENS 3
static unsigned char far *savescreen[MAXSCREENS];
static int saverc[MAXSCREENS+1];
static FILE *savescf=NULL;
static char scsvfile[]="fractscr.tmp";
void stackscreen()
{
extern unsigned char far wintext_chars[25][80];
extern unsigned char far wintext_attrs[25][80];
int savebytes;
int i;
unsigned char far *ptr;
char buf[100];
saverc[screenctr+1] = textrow*80 + textcol;
if (++screenctr) { /* already have some stacked */
static char far msg[]={"stackscreen overflow"};
if ((i = screenctr - 1) >= MAXSCREENS) { /* bug, missing unstack? */
stopmsg(1,msg);
exit(1);
}
savebytes = 25*80;
if ((ptr = savescreen[i] = farmemalloc((long)(2*savebytes)))) {
far_memcpy(ptr,wintext_chars,savebytes);
far_memcpy(ptr+savebytes,wintext_attrs,savebytes);
}
else {
static char far msg[]={"insufficient memory, aborting"};
fileproblem: stopmsg(1,msg);
exit(1);
}
setclear();
}
else
setfortext();
}
void unstackscreen()
{
extern unsigned char far wintext_chars[25][80];
extern unsigned char far wintext_attrs[25][80];
int savebytes;
unsigned char far *ptr;
textrow = saverc[screenctr] / 80;
textcol = saverc[screenctr] % 80;
if (--screenctr >= 0) { /* unstack */
savebytes = 25*80;
if ((ptr = savescreen[screenctr])) {
far_memcpy(wintext_chars,ptr,savebytes);
far_memcpy(wintext_attrs,ptr+savebytes,savebytes);
wintext_paintscreen(0,80,0,25);
farmemfree(ptr);
}
}
else
setforgraphics();
movecursor(-1,-1);
}
void discardscreen()
{
if (--screenctr >= 0) { /* unstack */
if (savescreen[screenctr])
farmemfree(savescreen[screenctr]);
}
else
discardgraphics();
}
int discardgraphics()
{
}
setfortext()
{
wintext_texton();
}
setforgraphics()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -