home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2002 February
/
PCWorld_2002-02_cd.bin
/
Software
/
Vyzkuste
/
ranish
/
SOURCES.ZIP
/
PART_GUI.C
< prev
next >
Wrap
Text File
|
1998-07-23
|
35KB
|
1,279 lines
#include "part.h"
#define FsX 12
#define FsY 6
#define FsW 66
#define FsH 17
#define BmX 21
#define BmY 5
#define BmW 58
#define BmH 20
#define BoX 29
#define BoY 14
#define BoW 48
#define BoH 10
#define BoX2 (BoX+22)
#define SiX 40
#define SiY 18
#define SiW 32
#define SiH 6
#define FmX 4
#define FmY 14
#define FmW 74
#define FmH 5
void select_system_type(struct part_long *p)
{
struct event ev;
int i, k, n, top, act, N, barpos;
border_window( Yellow+BakWhite, FsX, FsY, FsW, FsH, Border22f );
write_string( Black+BakWhite, FsX+2, FsY+1, HEADER_SYSTYPE );
for( i=0 ; i<FsW-4 ; i++ ) tmp[i]='─';
tmp[i]=0;
write_string( Yellow+BakWhite, FsX+2, FsY+2, tmp );
write_string( Yellow+BakWhite, FsX+28, FsY+FsH-1, " F1 - Help ");
write_string( Yellow+BakWhite, FsX+42, FsY+FsH-1, " INS - Custom code ");
for( N=0 ; os_desc[N].os_id!=OS_ADV /* valid ids */ ; N++ );
/* N - number of records in table */
/* n - number of records on screen */
top=0;
act = ( os_desc[p->os_num].os_id==OS_UNKN ) ? 0 : p->os_num;
n = ( N<FsH-4 ) ? N : FsH-4;
#define BARX (FsX+FsW-3)
#define BARY (FsY+3)
#define BARLEN (n) /* (n-2) */
while(1)
{
if( act<top ) top=act;
if( act>=top+n ) top=act-n+1;
for( i=0 ; i<n ; i++ )
{
sprintf_systype(tmp,top+i);
write_string( ((os_desc[top+i].flags&1)==1) ?
((top+i==act)?(BrWhite+BakBlack):(Black+BakWhite)):
((top+i==act)?( White+BakBlack):(BrBlue+BakWhite)),
FsX+2, FsY+3+i, tmp );
}
/*
if( top>0 ) write_char( Yellow+BakWhite, BARX, BARY, '');
else write_char( Yellow+BakWhite, BARX, BARY, ' ');
if( top+n<N ) write_char( Yellow+BakWhite, BARX, BARY+BARLEN, '');
else write_char( Yellow+BakWhite, BARX, BARY+BARLEN, ' ');
*/
if( N!=n )
{
barpos=(top*(BARLEN-1))/(N-n);
for( i=0 ; i<BARLEN ; i++ )
write_char( Yellow+BakWhite, BARX, BARY+i, (i!=barpos)?'░':'▓');
}
move_cursor(1,26);
get_event(&ev,EV_KEY);
if( ev.key==27 ) /* ESC */
{
break;
}
if( ev.key==13 ) /* Enter */
{
p->os_num=act;
p->os_id=os_desc[act].os_id;
break;
}
else if( ev.scan==0x3B00 ) /* F1 - Help */
{
sprintf(tmp,"#0x%04X",os_desc[act].os_id);
html_view(tmp);
}
else if( ev.scan==0x52E0 || ev.scan==0x5200 ) /* Insert */
{
if( enter_string(4,16,PROMPT_FSTYPE, FsW, tmp, 0) )
{
i=0;
sscanf(tmp,"%X",&i);
if( i!=0 && i<256 )
{
p->os_id=i<<8;
for( i=0 ; os_desc[i].os_id!=p->os_id &&
os_desc[i].os_id!=OS_UNKN ; i++ );
p->os_num=i;
break;
}
}
}
else if( ev.scan==0x47E0 || ev.scan==0x4700 ) /* Home */
{
act=0;
}
else if( ev.scan==0x4FE0 || ev.scan==0x4F00 ) /* End */
{
act=N-1;
}
else if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
{
if( act<N-1 ) act++;
}
else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
{
if( act>0 ) act--;
}
else if( ev.scan==0x49E0 || ev.scan==0x4900 ) /* PgUp */
{
act-=n;
if( act<0 ) act=0;
}
else if( ev.scan==0x51E0 || ev.scan==0x5100 ) /* PgDn */
{
act+=n;
if( act>=N ) act=N-1;
}
else if( ev.key>='A' && ev.key<='Z' || ev.key>='a' && ev.key<='z' )
{
char ch = ( ev.key>='A' && ev.key<='Z' ) ? ev.key : ev.key - 32;
for( i=act+1 ; i<N ; i++ )
if( (os_desc[i].flags&1) &&
(os_desc[i].name[0]==ch || os_desc[i].name[0]==ch+32) )
{
act=i;
break;
}
if( i==N )
for( i=act+1 ; i<N ; i++ )
if( os_desc[i].name[0]==ch || os_desc[i].name[0]==ch+32 )
{
act=i;
break;
}
}
}/* while(1) */
}/* select_system_type */
void edit_str_field(struct event *ev, int ev_mask,
int attr, int x, int y, int maxlen, char *str, int *pos)
{
int i;
while(1)
{
i=strlen(str);
if( *pos>i ) *pos=i;
if( *pos==maxlen-1 ) (*pos)--;
clear_window(attr,x+i,y,maxlen-i-1,1);
write_string(attr,x,y,str);
move_cursor(x+*pos,y);
get_event(ev,ev_mask|EV_KEY);
if( !(ev->ev_type & EV_KEY) ) break;
if( ev->scan==0x47E0 || ev->scan==0x4700 ) /* Home */
{
*pos=0;
}
else if( ev->scan==0x4FE0 || ev->scan==0x4F00 ) /* End */
{
*pos=strlen(str);
}
else if( *pos>0 && (ev->scan==0x4BE0 || ev->scan==0x4B00) ) /* left */
{
(*pos)--;
}
else if( *pos<strlen(str) &&
(ev->scan==0x4DE0 || ev->scan==0x4D00) ) /* right */
{
(*pos)++;
}
else if( ev->key==8 && *pos>0 ) /* BkSp */
{
for( i=*pos ; i<maxlen && str[i]!=0 ; i++ )
str[i-1]=str[i];
str[i-1]=0;
(*pos)--;
}
else if( ev->scan==0x5300 || ev->scan==0x53E0 ) /* Del */
{
for( i=*pos ; i<maxlen && str[i]!=0 ; i++ )
str[i]=str[i+1];
str[i]=0;
}
else if( ev->key>=' ' )
{
if( strlen(str)<maxlen-1 )
{
for( i=maxlen-1 ; i>*pos ; i-- )
str[i]=str[i-1];
str[i]=ev->key;
(*pos)++;
}
}
else break;
}/* while */
}/* edit_str_field */
void edit_int_field(struct event *ev, int ev_mask,
int attr, int x, int y, int field_len,
unsigned long *n, unsigned long limit )
{
int i;
while(1)
{
if( field_len>0 )
{
sprintf(tmp,"%*lu",field_len,*n);
move_cursor(x+field_len-1,y);
}
else
{
sprintf(tmp,"%-*lu",-field_len,*n);
for( i=0 ; tmp[i]!=' ' && tmp[i]!=0 ; i++ );
move_cursor(x+i,y);
}
write_string(attr,x,y,tmp);
get_event(ev,ev_mask|EV_KEY);
if( !(ev->ev_type & EV_KEY) ) break;
if( ev->key==8 || ev->scan==0x5300 || ev->scan==0x53E0 ) /* BkSp || Del */
{
(*n)/=10;
}
else if( ev->key=='+' )
{
if( (*n) < limit ) (*n)++;
}
else if( ev->key=='-' )
{
if( (*n) > 0 ) (*n)--;
}
else if( ev->key>='0' && ev->key<='9' )
{
i=ev->key-'0';
if( limit>=i && (*n)<=(limit-i)/10 ) (*n)=(*n)*10+i;
}
else break;
}/* while */
}/* edit_int_field */
int get_part_num(struct adv_part_rec *part, int tag)
{
int i;
if( tag==0 ) return 0;
for( i=0 ; i<MAX_PART_ROWS ; i++ )
if( part[i].tag==tag ) return i+1;
return 0;
}
int get_free_tag(struct adv_part_rec *part)
{
int i, tag;
for( tag=1 ; tag<=MAX_PART_ROWS ; tag++ )
{
for( i=0 ; i<MAX_PART_ROWS ; i++ )
if( part[i].tag==tag ) break;
if( i==MAX_PART_ROWS ) break;
}
return tag;
}
int get_keys(unsigned short *keys, int num_keys)
{
struct event ev;
int i, x, y, w, h, q;
x=1; w=80;
y=23; h=3;
save_window(x,y,w,h,buf);
border_window( Yellow+BakWhite, x, y, w, h, Border22f );
write_string( Yellow+BakWhite, x+53, y+h-1," Esc, BkSp, \\ - quote ");
q=0;
while(1)
{
clear_window( BrWhite+BakBlack, x+2, y+1, w-4, 1 );
for( i=0 ; i<num_keys ; i++ )
{
sprintf(tmp,"%04X",keys[i]);
write_string(BrWhite+BakBlack,x+2+5*i,y+1,tmp);
}
move_cursor(x+2+5*i,y+1);
get_event(&ev,EV_KEY);
if( q==0 && ev.key==27 ) break;
else if( q==0 && ev.key==8 ) { if( num_keys>0 ) num_keys--; }
else if( q==0 && ev.key=='\\' ) { if( num_keys<15 ) q=1; }
else if( num_keys<15 ) { keys[num_keys++]=ev.scan; q=0; }
}
for( i=num_keys ; i<15 ; i++ ) keys[i]=0;
load_window(x,y,w,h,buf);
return num_keys;
}/* get_keys */
void boot_menu_options(struct adv *adv)
{
struct event ev;
int i, act, pos;
char password[9];
unsigned long timeout, def_menu;
border_window( Yellow+BakWhite, BoX, BoY, BoW, BoH, Border22f );
timeout=adv->timeout;
def_menu=adv->def_menu+1;
if( !(adv->options & ADV_OPT_DEF_MENU) ) def_menu=0;
write_string( Black+BakWhite, BoX+2, BoY+1, MENU_ADV_OPT_TITLE );
write_string( Black+BakWhite, BoX+2, BoY+3, MENU_ADV_OPT_VIRCHECK );
write_string( Black+BakWhite, BoX+2, BoY+4, MENU_ADV_OPT_CLEARSCR );
write_string( Black+BakWhite, BoX+2, BoY+5, MENU_ADV_OPT_TIMEOUT );
write_string( Black+BakWhite, BoX+2, BoY+6, MENU_ADV_OPT_DEFAULT );
write_string( Black+BakWhite, BoX+2, BoY+7, MENU_ADV_OPT_PASSWORD );
write_string( Black+BakWhite, BoX+2, BoY+8, MENU_ADV_OPT_IGN_UNUSED );
act=0;
pos=0;
while(1)
{
sprintf(tmp,"%-31s",adv->adv_title);
write_string( act==0?(BrWhite+BakBlack):(Black+BakWhite),
BoX+14, BoY+1, tmp );
sprintf(tmp,"%s",(adv->options&ADV_OPT_VIR_CHECK)?"Yes":"No ");
write_string( act==1?(BrWhite+BakBlack):(Black+BakWhite),
BoX2, BoY+3, tmp );
if( act==1 ) move_cursor( BoX2, BoY+3 );
sprintf(tmp,"%s",(adv->options&ADV_OPT_CLEAR_SCR)?"Yes":"No ");
write_string( act==2?(BrWhite+BakBlack):(Black+BakWhite),
BoX2, BoY+4, tmp );
if( act==2 ) move_cursor( BoX2, BoY+4 );
if( act!=3 )
{
sprintf(tmp,"%-3ld",timeout);
write_string( Black+BakWhite, BoX2, BoY+5, tmp );
}
if( act!=4 )
{
if( adv->options & ADV_OPT_DEF_MENU )
sprintf(tmp,"%-3ld ",def_menu);
else
sprintf(tmp,"Not set");
write_string( Black+BakWhite, BoX2, BoY+6, tmp );
}
sprintf(tmp,"%s",(adv->password==0)?"Not set ":"******* ");
write_string( act==5?(BrWhite+BakBlack):(Black+BakWhite),
BoX2, BoY+7, tmp );
if( act==5 ) move_cursor( BoX2, BoY+7 );
sprintf(tmp,"%s",(adv->options&ADV_OPT_IGN_UNUSED)?"Yes":"No ");
write_string( act==6?(BrWhite+BakBlack):(Black+BakWhite),
BoX2, BoY+8, tmp );
if( act==6 ) move_cursor( BoX2, BoY+8 );
if( act==0 )
edit_str_field(&ev,0,BrWhite+BakBlack,BoX+14,BoY+1,
sizeof(adv->adv_title),adv->adv_title,&pos);
else if( act==3 )
edit_int_field(&ev,0,BrWhite+BakBlack, BoX2, BoY+5, -3, &timeout, 99);
else if( act==4 )
{
write_string( Black+BakWhite, BoX2, BoY+6, " ");
edit_int_field(&ev,0,BrWhite+BakBlack, BoX2, BoY+6, -3, &def_menu, MAX_MENU_ROWS);
if( def_menu!=0 )
adv->options |= ADV_OPT_DEF_MENU;
else
adv->options &= ~ADV_OPT_DEF_MENU;
}
else if( act==5 )
{
int ppos=0;
password[0]=0;
edit_str_field(&ev,0,BrWhite+BakBlack,BoX2,BoY+7,9,password,&ppos);
if( ev.key==13 )
{
adv->password=encrypt_password(password);
act=0;
continue;
}
memset(password,0,9);
}
else
get_event(&ev,EV_KEY);
if( ev.key==27 ) /* ESC */
{
break;
}
else if( ev.scan==0x3B00 ) /* F1 - Help */
{
sprintf(tmp,"#setup_adv_opt");
html_view(tmp);
}
else if( ev.key==13 ) /* Enter */
{
if( act<6 ) act++;
else act=0;
}
else if( act==1 && (ev.key=='Y' || ev.key=='y') )
{
adv->options |= ADV_OPT_VIR_CHECK;
}
else if( act==1 && (ev.key=='N' || ev.key=='n') )
{
adv->options &= ~ADV_OPT_VIR_CHECK;
}
else if( act==1 && ev.key==' ' )
{
adv->options ^= ADV_OPT_VIR_CHECK;
}
else if( act==2 && (ev.key=='Y' || ev.key=='y') )
{
adv->options |= ADV_OPT_CLEAR_SCR;
}
else if( act==2 && (ev.key=='N' || ev.key=='n') )
{
adv->options &= ~ADV_OPT_CLEAR_SCR;
}
else if( act==2 && ev.key==' ' )
{
adv->options ^= ADV_OPT_CLEAR_SCR;
}
else if( act==6 && (ev.key=='Y' || ev.key=='y') )
{
adv->options |= ADV_OPT_IGN_UNUSED;
}
else if( act==6 && (ev.key=='N' || ev.key=='n') )
{
adv->options &= ~ADV_OPT_IGN_UNUSED;
}
else if( act==6 && ev.key==' ' )
{
adv->options ^= ADV_OPT_IGN_UNUSED;
}
else if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
{
if( act<6 ) act++;
}
else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
{
if( act>0 ) act--;
}
}/* while(1) */
adv->timeout=timeout;
if( adv->options & ADV_OPT_DEF_MENU )
{
adv->def_menu=def_menu-1;
}
}/* boot_menu_options */
void edit_boot_menu(struct adv *adv, int p, int flag)
{
struct event ev;
unsigned long l;
int old_col, old_act, redraw;
int i, k, act, col, pos, n=MAX_MENU_ROWS;
static char *show[5]={ " ---- ", " Last ", " Next ", " Prev ", " Last3" };
static char *part_row[5]={ "/*", "/1", "/2", "/3", "/4" };
static char *boot_type[5]={ "-", "C", "D", "A", "?" };
border_window( Yellow+BakWhite, BmX, BmY, BmW, BmH, Border22f );
write_string( Black+BakWhite, BmX+2, BmY+1, HEADER_BOOT_MENU );
for( i=0 ; i<BmW-4 ; i++ ) tmp[i]='─';
tmp[i]=0;
write_string( Yellow+BakWhite, BmX+2, BmY+2, tmp );
write_string( Yellow+BakWhite, BmX+2, BmY+BmH-1," F1 - Help ");
write_string( Yellow+BakWhite, BmX+18, BmY+BmH-1," Space, Ins, Del, Alt-O, Alt-K ");
act=0;
col=1;
pos=0;
redraw=1;
if( adv->part[p].tag!=0 )
{
for( i=0 ; i<n ; i++ )
if( adv->menu[i].boot_type!=MENU_BOOT_EMPTY &&
adv->menu[i].x.part.tag==adv->part[p].tag )
{
act=i;
break;
}
}
else if( adv->part[p].os_id!=0 && adv->part[p].os_id!=OS_ADV )
{
for( i=0 ; i<n ; i++ )
if( adv->menu[i].boot_type==MENU_BOOT_EMPTY )
{
adv->menu[i].boot_type=MENU_BOOT_PART;
adv->part[p].tag=get_free_tag(adv->part);
adv->menu[i].x.part.tag = adv->part[p].tag;
act=i;
break;
}
}
while(1)
{
if( old_col!=col || old_act!=act || redraw )
{
for( i=0 ; i<n ; i++ )
{
k=get_part_num(adv->part,adv->menu[i].x.part.tag);
sprintf(tmp," %2d %s %2d%s %s %s %-29s %s ",
i+1,
boot_type[adv->menu[i].boot_type],
k,
k==0?" ":part_row[adv->part[k-1].orig_row],
show[adv->menu[i].x.part.show],
adv->menu[i].options&MENU_OPT_PASSW?"Y":"-",
adv->menu[i].name,
adv->menu[i].x.part.num_keys!=0?"Y":"-" );
write_string( Black+BakWhite, BmX+2, BmY+3+i, tmp );
}
old_col=col;
old_act=act;
redraw=0;
}
if( col==0 )
{
write_string(BrWhite+BakBlack,BmX+7,BmY+3+act,
boot_type[adv->menu[act].boot_type] );
move_cursor(BmX+7,BmY+3+act);
}
else if( col==1 )
{
i=get_part_num(adv->part,adv->menu[act].x.part.tag);
write_int(BrWhite+BakBlack,BmX+9,BmY+3+act,2,i);
move_cursor(BmX+10,BmY+3+act);
}
else if( col==2 )
{
k=get_part_num(adv->part,adv->menu[act].x.part.tag);
if( k==0 ) tmp[1]=0;
else if( adv->part[k-1].orig_row==0 ) tmp[0]='*';
else tmp[0]=adv->part[k-1].orig_row+'0';
tmp[1]=0;
write_string(BrWhite+BakBlack,BmX+12,BmY+3+act,tmp);
move_cursor(BmX+12,BmY+3+act);
}
else if( col==3 )
{
write_string(BrWhite+BakBlack,BmX+14,BmY+3+act, show[adv->menu[act].x.part.show] );
move_cursor(BmX+15,BmY+3+act);
}
else if( col==4 )
{
write_string(BrWhite+BakBlack,BmX+21,BmY+3+act,
adv->menu[act].options&MENU_OPT_PASSW?"Y":"-" );
move_cursor(BmX+21,BmY+3+act);
}
if( flag==1 )
{
boot_menu_options(adv);
flag=0;
redraw=1;
continue;
}
if( col==5 )
{
edit_str_field(&ev,0,BrWhite+BakBlack,BmX+24,BmY+3+act,
sizeof(adv->menu[act].name),adv->menu[act].name,&pos);
}
else get_event(&ev,EV_KEY);
if( ev.key==27 ) /* ESC */
{
break;
}
if( ev.key==13 ) /* Enter */
{
if( col==1 ) break;
col=1;
redraw=1;
}
else if( ev.key==9 ) /* Tab */
{
col=(col+1)%6;
}
else if( ev.scan==0x3B00 ) /* F1 - Help */
{
sprintf(tmp,"#setup_adv");
html_view(tmp);
}
else if( ev.scan==0x1800 ) /* Alt-O = Options */
{
boot_menu_options(adv);
redraw=1;
}
else if( ev.scan==0x2500 ) /* Alt-K = Keys */
{
adv->menu[act].x.part.num_keys = get_keys(adv->menu[act].x.part.keys,
adv->menu[act].x.part.num_keys );
redraw=1;
}
else if( col==0 && (ev.key=='+' || ev.key==' ') )
{
adv->menu[act].boot_type++;
if( adv->menu[act].boot_type>3 ) adv->menu[act].boot_type=1;
}
else if( col==0 && ev.key=='-' )
{
if( adv->menu[act].boot_type==1 ) adv->menu[act].boot_type=3;
else adv->menu[act].boot_type--;
}
else if( col==1 && (ev.key=='+' || ev.key==' ') )
{
int m=MAX_PART_ROWS;
k=get_part_num(adv->part,adv->menu[act].x.part.tag);
for( i=k ; i<m ; i++ )
{
if( adv->part[i].os_id!=0 && adv->part[i].os_id!=OS_ADV )
{
if( adv->part[i].tag==0 ) adv->part[i].tag=get_free_tag(adv->part);
adv->menu[act].x.part.tag = adv->part[i].tag;
break;
}
if( i==m-1 && m==MAX_PART_ROWS ) { m=k-1; i=-1; }
}
if( adv->menu[act].boot_type==0 && adv->menu[act].x.part.tag!=0 )
adv->menu[act].boot_type=MENU_BOOT_PART;
redraw=1;
}
else if( col==1 && ev.key=='-' )
{
int m=0;
k=get_part_num(adv->part,adv->menu[act].x.part.tag);
for( i=k-2 ; i>=m ; i-- )
{
if( adv->part[i].os_id!=0 && adv->part[i].os_id!=OS_ADV )
{
if( adv->part[i].tag==0 ) adv->part[i].tag=get_free_tag(adv->part);
adv->menu[act].x.part.tag = adv->part[i].tag;
break;
}
if( i==m && m==0 ) { m=k; i=MAX_PART_ROWS; }
}
if( adv->menu[act].boot_type==0 && adv->menu[act].x.part.tag!=0 )
adv->menu[act].boot_type=MENU_BOOT_PART;
redraw=1;
}
else if( col==2 && (ev.key=='+' || ev.key==' ') )
{
k=get_part_num(adv->part,adv->menu[act].x.part.tag);
if( k==0 ) continue;
else k--;
adv->part[k].orig_row = (adv->part[k].orig_row+1)%5;
redraw=1;
}
else if( col==1 && ev.key=='-' )
{
k=get_part_num(adv->part,adv->menu[act].x.part.tag);
if( k==0 ) continue;
else k--;
adv->part[k].orig_row = (adv->part[k].orig_row+4)%5;
redraw=1;
}
else if( col==3 && (ev.key=='+' || ev.key==' ') )
{
adv->menu[act].x.part.show = (adv->menu[act].x.part.show+1)%5;
}
else if( col==3 && ev.key=='-' )
{
adv->menu[act].x.part.show = (adv->menu[act].x.part.show+4)%5;
}
else if( col==4 && ev.key==' ' )
{
adv->menu[act].options ^= MENU_OPT_PASSW;
redraw=1;
}
else if( ev.scan==0x5200 || ev.scan==0x52E0 ) /* Insert */
{
for( i=MAX_MENU_ROWS-1 ; i>act ; i-- )
adv->menu[i]=adv->menu[i-1];
memset(&adv->menu[i],0,sizeof(struct adv_menu_rec));
redraw=1;
}
else if( ev.scan==0x5300 || ev.scan==0x53E0 ) /* Del */
{
for( i=act ; i<MAX_MENU_ROWS-1 ; i++ )
adv->menu[i]=adv->menu[i+1];
memset(&adv->menu[i],0,sizeof(struct adv_menu_rec));
redraw=1;
}
else if( ev.scan==0x47E0 || ev.scan==0x4700 ) /* Home */
{
act=0;
}
else if( ev.scan==0x4FE0 || ev.scan==0x4F00 ) /* End */
{
act=n-1;
}
else if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
{
if( act<n-1 ) act++;
}
else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
{
if( act>0 ) act--;
}
else if( ev.scan==0x49E0 || ev.scan==0x4900 ) /* PgUp */
{
act=0;
}
else if( ev.scan==0x51E0 || ev.scan==0x5100 ) /* PgDn */
{
act=n-1;
}
else if( ev.scan==0x4BE0 || ev.scan==0x4B00 ) /* left */
{
if( col>0 ) col--;
}
else if( ev.scan==0x4DE0 || ev.scan==0x4D00 ) /* right */
{
if( col<5 ) col++;
}
}/* while(1) */
for( i=0 ; i<MAX_PART_ROWS ; i++ )
if( adv->part[i].tag!=0 )
{
for( k=0 ; k<MAX_MENU_ROWS ; k++ )
if( adv->part[i].tag==adv->menu[k].x.part.tag ) break;
if( k==MAX_MENU_ROWS ) adv->part[i].tag=0;
}
}/* edit_boot_menu */
void setup_ipl(struct mbr *mbr)
{
struct event ev;
unsigned long n;
int i, b, v, d, act;
border_window( Yellow+BakWhite, SiX, SiY, SiW, SiH, Border22f );
n=mbr->x.ipl.dot_len;
v=mbr->x.ipl.vir_chk;
d=mbr->x.ipl.def_part;
b=mbr->x.ipl.fd_params[0];
write_string( Black+BakWhite, SiX+2, SiY+1, IPL_VIRUS );
write_string( Black+BakWhite, SiX+2, SiY+2, IPL_DOTS );
write_string( Black+BakWhite, SiX+2, SiY+3, IPL_DEFAULT );
write_string( Black+BakWhite, SiX+2, SiY+4, IPL_NOACTV );
act=0;
while(1)
{
sprintf(tmp,"%s",v!=0?"Yes":"No ");
write_string( act==0?(BrWhite+BakBlack):(Black+BakWhite),
SiX+27, SiY+1, tmp );
if( act==0 ) move_cursor( SiX+27, SiY+1 );
sprintf(tmp,"%-3ld",n);
write_string( Black+BakWhite, SiX+27, SiY+2, tmp );
if( d==' ' ) sprintf(tmp,"Sp ");
else if( d=='\t' ) sprintf(tmp,"Tab");
else sprintf(tmp,"%c ",d==0?' ':d);
write_string( act==2?(BrWhite+BakBlack):(Black+BakWhite),
SiX+27, SiY+3, tmp );
if( act==2 ) move_cursor( SiX+27, SiY+3 );
sprintf(tmp,"%s",b==0?"A":"D");
write_string( act==3?(BrWhite+BakBlack):(Black+BakWhite),
SiX+27, SiY+4, tmp );
if( act==3 ) move_cursor( SiX+27, SiY+4 );
if( act==1 )
edit_int_field(&ev,0,BrWhite+BakBlack, SiX+27, SiY+2, -3, &n, 64);
else
get_event(&ev,EV_KEY);
if( n==0 )
{
n=1;
continue;
}
if( ev.key==27 ) /* ESC */
{
break;
}
if( ev.key==13 ) /* Enter */
{
if( act<3 ) act++;
else break;
}
else if( ev.scan==0x3B00 ) /* F1 - Help */
{
sprintf(tmp,"#setup_ipl");
html_view(tmp);
}
else if( act==0 && (ev.key=='Y' || ev.key=='y') )
{
v=1;
}
else if( act==0 && (ev.key=='N' || ev.key=='n') )
{
v=0;
}
else if( act==0 && ev.key==' ' )
{
if( v==0 ) v=1;
else v=0;
}
else if( act==2 && ev.key==' ' )
{
if( d==0 ) d='1';
else if( d>='1' && d<'4' ) d++;
else if( d=='4' ) d='A';
else if( d=='A' ) d='\t';
else if( d=='\t' ) d=' ';
else d=0;
}
else if( act==2 && (ev.key=='\t' || ev.key>='1' && ev.key<='4' ||
ev.key=='A' || ev.key=='a' ) )
{
d=ev.key;
if( d=='a' ) d='A';
}
else if( act==2 && (ev.scan==0x5300 || ev.scan==0x53E0) ) /* Del */
{
d=0;
}
else if( act==3 && (ev.key=='A' || ev.key=='a') )
{
b=0;
}
else if( act==3 && (ev.key=='D' || ev.key=='d') )
{
b=dinfo.disk+1;
}
else if( act==3 && ev.key==' ' )
{
if( b==0 ) b=dinfo.disk+1;
else b=0;
}
else if( ev.scan==0x50E0 || ev.scan==0x5000 ) /* down */
{
if( act<3 ) act++;
}
else if( ev.scan==0x48E0 || ev.scan==0x4800 ) /* up */
{
if( act>0 ) act--;
}
}/* while(1) */
mbr->x.ipl.dot_len=n;
mbr->x.ipl.vir_chk=v;
mbr->x.ipl.def_part=d;
mbr->x.ipl.fd_params[0]=b;
}/* setup_ipl */
int enter_string(int x, int y, char *prompt, int maxlen, char *str, char *help)
{
struct event ev;
int i, w, x2, w2;
w2=73-x-strlen(prompt);
if( w2>maxlen ) w2=maxlen;
w=strlen(prompt)+5+w2;
x2=x+strlen(prompt)+3;
save_window(x,y,w,3,buf);
border_window(Yellow+BakWhite,x,y,w,3, Border22f );
write_string(Black+BakWhite,x+2,y+1,prompt);
if( help!=0 ) write_string( Yellow+BakWhite, x+w-14, y+2, " F1 - Help ");
if( str==file_name )
{
i=strlen(str);
}
else
{
i=0;
str[0]=0;
}
while(1)
{
edit_str_field( &ev, 0, BrWhite+BakBlack, x2, y+1, w2, str, &i );
if( ev.key==27 ) { i=0; break; }
if( ev.key==13 ) { i=1; break; }
if( ev.scan==0x3B00 && help!=0 ) /* F1 - Help */
{
html_view(help);
}
}/* while(1) */
load_window(x,y,w,3,buf);
return i;
}/* enter_string */
void show_error(char *msg)
{
int x, y=12, w, h=4, pressed;
struct event ev;
static char buf[4*80*2];
w = strlen(msg)+6;
if( w%2==1 ) w++;
if( w>78 ) w=78;
x = (80-w)/2+1;
save_window(x,y,w,h,buf);
border_window(Yellow+BakRed,x,y,w,h, Border22f );
write_string( BrWhite+BakRed, x+3, y+1, msg );
write_string( Black+BakWhite, x+w/2-2, y+2," OK " );
pressed=0;
while(1)
{
get_event( &ev, EV_KEY | EV_MOUSE );
if( (ev.ev_type & EV_KEY) &&
(ev.key==27 || ev.key==13) ) break;
if( ev.ev_type & EV_MOUSE )
if( ev.x>=x+w/2-2 && ev.x<x+w/2+2 && ev.y==y+2 )
{
if( ev.left==1 ) pressed=1;
if( ev.left==0 && pressed==1 ) break;
}
else pressed=0;
}
load_window(x,y,w,h,buf);
}/* show_error */
void redraw_menu(int view)
{
if( view==VIEW_ADV ) border_window( BORDER_COLOR, 1, 13, 80, 12, VERT_BORDER );
if( view!=VIEW_ADV ) border_window( BORDER_COLOR, 1, 13, 80, 12, VERT_BORDER );
if( view==VIEW_MBR )
{
write_string( HINT_COLOR, 11, 16,"I)");
write_string( MENU_COLOR, 13, 16, MENU_INSTALL );
write_string( HINT_COLOR, 49, 16,"A");
write_string( HINT_COLOR, 11, 17,"U)");
write_string( MENU_COLOR, 13, 17, MENU_UNINSTALL );
write_string( HINT_COLOR, 11, 19,"H)");
write_string( MENU_COLOR, 13, 19, MENU_HIDE );
write_string( HINT_COLOR, 42, 19,"C)");
write_string( MENU_COLOR, 44, 19, MENU_INST_IPL );
}
else if( view==VIEW_ADV )
{
write_string( HINT_COLOR, 11, 22,"P)");
write_string( MENU_COLOR, 13, 22, MENU_PREVIEW );
write_string( HINT_COLOR, 42, 22,"U)");
write_string( MENU_COLOR, 44, 22, MENU_ADV_UNINST );
}
else if( view==VIEW_EMBR )
{
write_string( HINT_COLOR, 11, 16,"I)");
write_string( MENU_COLOR, 13, 16, MENU_INST_EXT );
write_string( HINT_COLOR, 11, 17,"R)");
write_string( MENU_COLOR, 13, 17, MENU_MAKE_PRI );
write_string( HINT_COLOR, 11, 19,"H)");
write_string( MENU_COLOR, 13, 19, MENU_HIDE );
write_string( HINT_COLOR, 42, 19,"C)");
write_string( MENU_COLOR, 44, 19, MENU_INST_IPL );
}
write_string( HINT_COLOR, 11, 20,"F)");
write_string( MENU_COLOR, 13, 20, MENU_FORMAT );
write_string( HINT_COLOR, 11, 21,"V)");
write_string( MENU_COLOR, 13, 21, MENU_VERIFY );
write_string( HINT_COLOR, 42, 20,"S)");
write_string( MENU_COLOR, 44, 20, MENU_SAVE_MBR );
write_string( HINT_COLOR, 42, 21,"L)");
write_string( MENU_COLOR, 44, 21, MENU_LOAD_MBR );
write_string( HINT_COLOR, 4, 24,"F1");
write_string( MENU_COLOR, 6, 24," - Help ");
write_string( HINT_COLOR, 15, 24,"F2");
write_string( MENU_COLOR, 17, 24," - Save Changes ");
write_string( HINT_COLOR, 34, 24,"F3");
write_string( MENU_COLOR, 36, 24," - Undo ");
write_string( HINT_COLOR, 45, 24,"F4");
write_string( MENU_COLOR, 47, 24," - Mode ");
write_string( HINT_COLOR&((view==VIEW_EMBR)?0x77:0xFF), 56, 24,"F5");
write_string( MENU_COLOR&((view==VIEW_EMBR)?0x77:0xFF), 58, 24," - Disk ");
write_string( HINT_COLOR, 68, 24,"ESC");
write_string( MENU_COLOR, 71, 24," - Quit ");
}/* redraw_menu */
void redraw_header(int view, int mode, struct part_long *p)
{
border_window( BORDER_COLOR, 1, 4, 80, 5, VERT_BORDER );
if( view==VIEW_EMBR )
{
write_string(HEADER_COLOR,4,5, HEADER_EMBR );
write_int(TABLE_COLOR,14,5,2, p->level );
write_int(TABLE_COLOR,18,5,5, QUICK_SIZE(p)/2048 );
}
if( mode==MODE_CHS )
{
write_string(HEADER_COLOR,4,4,HEADER_CHS );
write_int(TABLE_COLOR,14,4,2,dinfo.disk-0x80+1 );
write_int(TABLE_COLOR,18,4,5,dinfo.total_sects/2048);
write_int(TABLE_COLOR,33,4,5,dinfo.num_cyls);
write_int(TABLE_COLOR,52,4,3,dinfo.num_heads);
write_int(TABLE_COLOR,65,4,3,dinfo.num_sects);
write_string(HEADER_COLOR,4,6, HEADER_CHS2 );
write_string(HEADER_COLOR,4,7, HEADER_CHS3 );
}
else /* mode==MODE_LBA */
{
write_string(HEADER_COLOR,4,4,HEADER_LBA );
write_int(TABLE_COLOR,14,4,2,dinfo.disk-0x80+1 );
write_int(TABLE_COLOR,18,4,5,dinfo.total_sects/2048);
sprintf(tmp,"%10s",sprintf_long(tmp+100,QUICK_BASE(p)));
write_string(TABLE_COLOR,39,4,tmp);
sprintf(tmp,"%10s",sprintf_long(tmp+100,QUICK_SIZE(p)));
write_string(TABLE_COLOR,57,4,tmp);
write_string(HEADER_COLOR,4,6, HEADER_LBA2 );
write_string(HEADER_COLOR,4,7, HEADER_LBA3 );
}
}/* redraw_header */
void progress_bar(char *bar, int percent)
{
int i;
if( percent<0 ) percent=0;
if( percent>100 ) percent=100;
for( i=0 ; i<percent/2 ; i++ )
bar[i]=0xB2;
while( i!=50 ) bar[i++]=0xB0;
bar[i]=0;
}
int progress(char *msg)
{
int i, t=0;
struct event ev;
static int prev_bar;
static char prev_msg[21];
if( msg!=0 && interactive==1 )
{
move_cursor(1,26);
if( *msg=='^' )
{
border_window( Yellow+BakWhite, FmX, FmY, FmW, FmH, Border22f );
write_string( Black+BakWhite, FmX+2, FmY+1, msg+1);
prev_bar=0;
}
else if( *msg=='%' )
{
if( prev_bar==0 || strcmp(prev_msg,msg+1)!=0 )
{
progress_bar( tmp, atoi(msg+1) );
write_string( Black+BakWhite, FmX+2, FmY+3, tmp );
clear_window( Black+BakWhite, FmX+2+50, FmY+3, 20, 1);
write_string( Black+BakWhite, FmX+2+50, FmY+3, msg+1);
prev_bar=1;
strncpy(prev_msg,msg+1,20);
}
}
else
{
while( *msg=='~' ) { msg++; t+=20; }
clear_window( Black+BakWhite, FmX+2, FmY+3, 70,1);
write_string( Black+BakWhite, FmX+2, FmY+3, msg );
prev_bar=0;
}
}/* interactive */
else if( *msg!=0 && interactive==0 )
{
if( *msg=='^' )
{
if( prev_bar==1 ) printf("\n");
printf("%s\n",msg+1);
prev_bar=0;
}
else if( *msg=='%' )
{
if( prev_bar==0 || strcmp(prev_msg,msg+1)!=0 )
{
progress_bar( tmp, atoi(msg+1) );
printf("\r%s%-20s", tmp, msg+1 );
prev_bar=1;
strncpy(prev_msg,msg+1,20);
}
}
else
{
while( *msg=='~' ) { msg++; t+=12; }
if( prev_bar==1 ) printf("\n");
printf("%s\n",msg);
prev_bar=0;
}
}
if( t==0 )
{
get_event(&ev,EV_KEY|EV_NONBLOCK);
}
else
{
ev.timer=t;
get_event(&ev,EV_KEY|EV_TIMER);
}
if( ev.ev_type==EV_KEY && ev.key==27 ) /* ESC */
{
return CANCEL;
}
return OK;
}/* progress */
void print_adv_menu(struct adv *adv)
{
int i, k;
static char *show[5]={ " ---- ", " Last ", " Next ", " Prev ", " Last3" };
static char *part_row[5]={ "/*", "/1", "/2", "/3", "/4" };
static char *boot_type[5]={ "-", "C", "D", "A", "?" };
printf("Advanced Boot Manager Signature: %s Advanced Data Version: %d\n\n",
adv->signature, adv->version );
printf("Title: %s\n\n", adv->adv_title );
printf("Check boot viruses: %s\n", adv->options&ADV_OPT_VIR_CHECK?"Yes":"No");
printf("Clear screen: %s\n", adv->options&ADV_OPT_CLEAR_SCR?"Yes":"No");
printf("Boot menu timeout: %d\n", adv->timeout );
printf("Default boot menu: ");
if( adv->options&ADV_OPT_DEF_MENU ) printf("%d\n");
else printf("Not set\n");
printf("Boot menu password: %s\n", adv->password==0?"Not set":"*******");
printf("Ignore unused part: %s\n", adv->options&ADV_OPT_IGN_UNUSED?"Yes":"No");
printf("\n"
" # Device Part/Row Show Passw Name Keys\n"
"----------------------------------------------------------------------\n");
for( i=0 ; i<MAX_MENU_ROWS ; i++ )
{
k=get_part_num(adv->part,adv->menu[i].x.part.tag);
printf(" %2d %s %2d%s %s %s %-29s %s\n",
i+1,
boot_type[adv->menu[i].boot_type],
k,
k==0?" ":part_row[adv->part[k-1].orig_row],
show[adv->menu[i].x.part.show],
adv->menu[i].options&MENU_OPT_PASSW?"Y":"-",
adv->menu[i].name,
adv->menu[i].x.part.num_keys!=0?"Y":"-" );
}
}/* print_adv_menu */