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 >
Text File  |  1998-07-23  |  35KB  |  1,279 lines

  1. #include "part.h"
  2.  
  3. #define FsX 12
  4. #define FsY 6
  5. #define FsW 66
  6. #define FsH 17
  7.  
  8. #define BmX 21
  9. #define BmY 5
  10. #define BmW 58
  11. #define BmH 20
  12.  
  13. #define BoX 29
  14. #define BoY 14
  15. #define BoW 48
  16. #define BoH 10
  17. #define BoX2 (BoX+22)
  18.  
  19. #define SiX 40
  20. #define SiY 18
  21. #define SiW 32
  22. #define SiH 6
  23.  
  24. #define FmX 4
  25. #define FmY 14
  26. #define FmW 74
  27. #define FmH 5
  28.  
  29. void select_system_type(struct part_long *p)
  30. {
  31.  struct event ev;
  32.  int i, k, n, top, act, N, barpos;
  33.  
  34.  border_window( Yellow+BakWhite, FsX, FsY, FsW, FsH, Border22f );
  35.  write_string( Black+BakWhite, FsX+2, FsY+1, HEADER_SYSTYPE );
  36.  for( i=0 ; i<FsW-4 ; i++ ) tmp[i]='─';
  37.  tmp[i]=0;
  38.  write_string( Yellow+BakWhite, FsX+2, FsY+2, tmp );
  39.  write_string( Yellow+BakWhite, FsX+28, FsY+FsH-1, " F1 - Help ");
  40.  write_string( Yellow+BakWhite, FsX+42, FsY+FsH-1, " INS - Custom code ");
  41.  
  42.  for( N=0 ; os_desc[N].os_id!=OS_ADV /* valid ids */ ; N++ );
  43.  
  44.  /* N - number of records in table  */
  45.  /* n - number of records on screen */
  46.  
  47.  top=0;
  48.  act = ( os_desc[p->os_num].os_id==OS_UNKN ) ? 0 : p->os_num;
  49.  n = ( N<FsH-4 ) ? N : FsH-4;
  50.  
  51. #define BARX (FsX+FsW-3)
  52. #define BARY (FsY+3)
  53. #define BARLEN (n)  /* (n-2) */
  54.  
  55.  while(1)
  56.     {
  57.      if( act<top ) top=act;
  58.      if( act>=top+n ) top=act-n+1;
  59.      
  60.      for( i=0 ; i<n ; i++ )
  61.         {
  62.          sprintf_systype(tmp,top+i);
  63.          write_string( ((os_desc[top+i].flags&1)==1) ?
  64.                        ((top+i==act)?(BrWhite+BakBlack):(Black+BakWhite)):
  65.                        ((top+i==act)?(  White+BakBlack):(BrBlue+BakWhite)),
  66.                       FsX+2, FsY+3+i, tmp );
  67.         }
  68. /*
  69.      if( top>0 ) write_char( Yellow+BakWhite, BARX, BARY, '');
  70.             else write_char( Yellow+BakWhite, BARX, BARY, ' ');
  71.  
  72.      if( top+n<N ) write_char( Yellow+BakWhite, BARX, BARY+BARLEN, '');
  73.               else write_char( Yellow+BakWhite, BARX, BARY+BARLEN, ' ');
  74. */
  75.      if( N!=n )
  76.        {
  77.         barpos=(top*(BARLEN-1))/(N-n);
  78.  
  79.         for( i=0 ; i<BARLEN ; i++ )
  80.           write_char( Yellow+BakWhite, BARX, BARY+i, (i!=barpos)?'░':'▓');
  81.        }
  82.  
  83.      move_cursor(1,26);
  84.  
  85.      get_event(&ev,EV_KEY);
  86.      
  87.      if( ev.key==27 ) /* ESC */
  88.        {
  89.         break;
  90.        }
  91.      
  92.      if( ev.key==13 ) /* Enter */
  93.        {
  94.         p->os_num=act;
  95.         p->os_id=os_desc[act].os_id;
  96.         break;
  97.        }
  98.      else if( ev.scan==0x3B00 )  /* F1 - Help */
  99.        {
  100.         sprintf(tmp,"#0x%04X",os_desc[act].os_id);
  101.         html_view(tmp);
  102.        }
  103.      else if( ev.scan==0x52E0 || ev.scan==0x5200 )     /* Insert */
  104.        {
  105.         if( enter_string(4,16,PROMPT_FSTYPE, FsW, tmp, 0) )
  106.           {
  107.            i=0;
  108.            sscanf(tmp,"%X",&i);
  109.            if( i!=0 && i<256 )
  110.              {
  111.               p->os_id=i<<8;
  112.               for( i=0 ; os_desc[i].os_id!=p->os_id &&
  113.                          os_desc[i].os_id!=OS_UNKN ; i++ );
  114.               p->os_num=i;
  115.               break;
  116.              }
  117.           }
  118.        }
  119.      else if( ev.scan==0x47E0 || ev.scan==0x4700 )     /* Home */
  120.        {
  121.         act=0;
  122.        }
  123.      else if( ev.scan==0x4FE0 || ev.scan==0x4F00 )    /* End */
  124.        {
  125.         act=N-1;
  126.        }
  127.      else if( ev.scan==0x50E0 || ev.scan==0x5000 )    /* down */
  128.        {
  129.         if( act<N-1 ) act++;
  130.        }
  131.      else if( ev.scan==0x48E0 || ev.scan==0x4800 )    /* up */
  132.        {
  133.         if( act>0 ) act--;
  134.        }
  135.      else if( ev.scan==0x49E0 || ev.scan==0x4900 )    /* PgUp */
  136.        {
  137.         act-=n;
  138.         if( act<0 ) act=0;
  139.        }
  140.      else if( ev.scan==0x51E0 || ev.scan==0x5100 )    /* PgDn */
  141.        {
  142.         act+=n;
  143.         if( act>=N ) act=N-1;
  144.        }
  145.      else if( ev.key>='A' && ev.key<='Z' || ev.key>='a' && ev.key<='z' )
  146.        {
  147.         char ch = ( ev.key>='A' && ev.key<='Z' ) ? ev.key : ev.key - 32;
  148.         
  149.         for( i=act+1 ; i<N ; i++ )
  150.          if( (os_desc[i].flags&1) &&
  151.              (os_desc[i].name[0]==ch || os_desc[i].name[0]==ch+32) )
  152.            {
  153.             act=i;
  154.             break;
  155.            }
  156.         
  157.         if( i==N )
  158.         for( i=act+1 ; i<N ; i++ )
  159.          if( os_desc[i].name[0]==ch || os_desc[i].name[0]==ch+32 ) 
  160.            {
  161.             act=i;
  162.             break;
  163.            }
  164.         
  165.        }
  166.     }/* while(1) */
  167.  
  168. }/* select_system_type */
  169.  
  170.  
  171.  
  172. void edit_str_field(struct event *ev, int ev_mask,
  173.                     int attr, int x, int y, int maxlen, char *str, int *pos)
  174. {
  175.  int i;
  176.  
  177.  while(1)
  178.     {
  179.      i=strlen(str);
  180.      if( *pos>i ) *pos=i;
  181.      if( *pos==maxlen-1 ) (*pos)--;
  182.      clear_window(attr,x+i,y,maxlen-i-1,1);
  183.      write_string(attr,x,y,str);
  184.      move_cursor(x+*pos,y);
  185.  
  186.      get_event(ev,ev_mask|EV_KEY);
  187.      
  188.      if( !(ev->ev_type & EV_KEY) ) break;
  189.      
  190.      if( ev->scan==0x47E0 || ev->scan==0x4700 )             /* Home */
  191.        {
  192.         *pos=0;
  193.        }
  194.      else if( ev->scan==0x4FE0 || ev->scan==0x4F00 )        /* End */
  195.        {
  196.         *pos=strlen(str);
  197.        }
  198.      else if( *pos>0 && (ev->scan==0x4BE0 || ev->scan==0x4B00) ) /* left */
  199.        {
  200.         (*pos)--;
  201.        }
  202.      else if( *pos<strlen(str) &&
  203.               (ev->scan==0x4DE0 || ev->scan==0x4D00) )        /* right */
  204.        {
  205.         (*pos)++;
  206.        }
  207.      else if( ev->key==8 && *pos>0 )                /* BkSp */
  208.        {
  209.         for( i=*pos ; i<maxlen && str[i]!=0 ; i++ )
  210.           str[i-1]=str[i];
  211.         str[i-1]=0;
  212.         (*pos)--;
  213.        }
  214.      else if( ev->scan==0x5300 || ev->scan==0x53E0 )        /* Del */
  215.        {
  216.         for( i=*pos ; i<maxlen && str[i]!=0 ; i++ )
  217.           str[i]=str[i+1];
  218.         str[i]=0;
  219.        }
  220.      else if( ev->key>=' ' )
  221.        {
  222.         if( strlen(str)<maxlen-1 )
  223.           {
  224.            for( i=maxlen-1 ; i>*pos ; i-- )
  225.               str[i]=str[i-1];
  226.            str[i]=ev->key;
  227.            (*pos)++;
  228.           }
  229.        }
  230.      else break;
  231.  
  232.     }/* while */
  233.  
  234. }/* edit_str_field */
  235.  
  236.  
  237.  
  238. void edit_int_field(struct event *ev, int ev_mask,
  239.                     int attr, int x, int y, int field_len,
  240.                     unsigned long *n, unsigned long limit )
  241. {
  242.  int i;
  243.  
  244.  while(1)
  245.     {
  246.      if( field_len>0 )
  247.        {
  248.         sprintf(tmp,"%*lu",field_len,*n);
  249.         move_cursor(x+field_len-1,y);
  250.        }
  251.      else
  252.        {
  253.         sprintf(tmp,"%-*lu",-field_len,*n);
  254.         for( i=0 ; tmp[i]!=' ' && tmp[i]!=0 ; i++ );
  255.         move_cursor(x+i,y);
  256.        }
  257.  
  258.      write_string(attr,x,y,tmp);
  259.  
  260.      get_event(ev,ev_mask|EV_KEY);
  261.      
  262.      if( !(ev->ev_type & EV_KEY) ) break;
  263.      
  264.      if( ev->key==8 || ev->scan==0x5300 || ev->scan==0x53E0 ) /* BkSp || Del */
  265.        {
  266.         (*n)/=10;
  267.        }
  268.      else if( ev->key=='+' )
  269.        {
  270.         if( (*n) < limit ) (*n)++;
  271.        }
  272.      else if( ev->key=='-' )
  273.        {
  274.         if( (*n) > 0 ) (*n)--;
  275.        }
  276.      else if( ev->key>='0' && ev->key<='9' )
  277.        {
  278.         i=ev->key-'0';
  279.         
  280.         if( limit>=i && (*n)<=(limit-i)/10 ) (*n)=(*n)*10+i;
  281.        }
  282.      else break;
  283.  
  284.     }/* while */
  285.  
  286. }/* edit_int_field */
  287.  
  288.  
  289.  
  290.  
  291. int get_part_num(struct adv_part_rec *part, int tag)
  292. {
  293.  int i;
  294.  if( tag==0 ) return 0;
  295.  for( i=0 ; i<MAX_PART_ROWS ; i++ )
  296.   if( part[i].tag==tag ) return i+1;
  297.  return 0;
  298. }
  299.  
  300.  
  301. int get_free_tag(struct adv_part_rec *part)
  302. {
  303.  int i, tag;
  304.  
  305.  for( tag=1 ; tag<=MAX_PART_ROWS ; tag++ )
  306.     {
  307.      for( i=0 ; i<MAX_PART_ROWS ; i++ )
  308.       if( part[i].tag==tag ) break;
  309.      if( i==MAX_PART_ROWS ) break;
  310.     }
  311.  
  312.  return tag;
  313. }
  314.  
  315.  
  316. int get_keys(unsigned short *keys, int num_keys)
  317. {
  318.  struct event ev;
  319.  int i, x, y, w, h, q;
  320.  
  321.  x=1; w=80;
  322.  y=23; h=3;
  323.  
  324.  save_window(x,y,w,h,buf);
  325.  border_window( Yellow+BakWhite, x, y, w, h, Border22f );
  326.  write_string( Yellow+BakWhite, x+53, y+h-1," Esc, BkSp, \\ - quote ");
  327.  
  328.  q=0;
  329.  while(1)
  330.     {
  331.      clear_window( BrWhite+BakBlack, x+2, y+1, w-4, 1 );
  332.      for( i=0 ; i<num_keys ; i++ )
  333.         {
  334.          sprintf(tmp,"%04X",keys[i]);
  335.          write_string(BrWhite+BakBlack,x+2+5*i,y+1,tmp);
  336.         }
  337.      move_cursor(x+2+5*i,y+1);
  338.  
  339.      get_event(&ev,EV_KEY);
  340.  
  341.           if( q==0 && ev.key==27 ) break;
  342.      else if( q==0 && ev.key==8  ) { if( num_keys>0 ) num_keys--; }
  343.      else if( q==0 && ev.key=='\\' ) { if( num_keys<15 ) q=1; }
  344.      else if( num_keys<15 ) { keys[num_keys++]=ev.scan; q=0; }
  345.     }
  346.  
  347.  for( i=num_keys ; i<15 ; i++ ) keys[i]=0;
  348.  
  349.  load_window(x,y,w,h,buf);
  350.  return num_keys;
  351. }/* get_keys */
  352.  
  353.  
  354. void boot_menu_options(struct adv *adv)
  355. {
  356.  struct event ev;
  357.  int i, act, pos;
  358.  char password[9];
  359.  unsigned long timeout, def_menu;
  360.  
  361.  border_window( Yellow+BakWhite, BoX, BoY, BoW, BoH, Border22f );
  362.  
  363.  timeout=adv->timeout;
  364.  def_menu=adv->def_menu+1;
  365.  if( !(adv->options & ADV_OPT_DEF_MENU) ) def_menu=0;
  366.  
  367.  write_string( Black+BakWhite, BoX+2, BoY+1, MENU_ADV_OPT_TITLE    );
  368.  write_string( Black+BakWhite, BoX+2, BoY+3, MENU_ADV_OPT_VIRCHECK );
  369.  write_string( Black+BakWhite, BoX+2, BoY+4, MENU_ADV_OPT_CLEARSCR );
  370.  write_string( Black+BakWhite, BoX+2, BoY+5, MENU_ADV_OPT_TIMEOUT  );
  371.  write_string( Black+BakWhite, BoX+2, BoY+6, MENU_ADV_OPT_DEFAULT  );
  372.  write_string( Black+BakWhite, BoX+2, BoY+7, MENU_ADV_OPT_PASSWORD );
  373.  write_string( Black+BakWhite, BoX+2, BoY+8, MENU_ADV_OPT_IGN_UNUSED );
  374.  
  375.  act=0;
  376.  pos=0;
  377.  
  378.  while(1)
  379.     {
  380.      sprintf(tmp,"%-31s",adv->adv_title);
  381.      write_string( act==0?(BrWhite+BakBlack):(Black+BakWhite),
  382.                                BoX+14, BoY+1, tmp );
  383.  
  384.      sprintf(tmp,"%s",(adv->options&ADV_OPT_VIR_CHECK)?"Yes":"No ");
  385.      write_string( act==1?(BrWhite+BakBlack):(Black+BakWhite),
  386.                                BoX2, BoY+3, tmp );
  387.      if( act==1 ) move_cursor( BoX2, BoY+3 );
  388.  
  389.  
  390.  
  391.      sprintf(tmp,"%s",(adv->options&ADV_OPT_CLEAR_SCR)?"Yes":"No ");
  392.      write_string( act==2?(BrWhite+BakBlack):(Black+BakWhite),
  393.                                BoX2, BoY+4, tmp );
  394.      if( act==2 ) move_cursor( BoX2, BoY+4 );
  395.  
  396.      if( act!=3 )
  397.        {
  398.         sprintf(tmp,"%-3ld",timeout);
  399.         write_string( Black+BakWhite, BoX2, BoY+5, tmp );
  400.        }
  401.  
  402.      if( act!=4 )
  403.        {
  404.         if( adv->options & ADV_OPT_DEF_MENU ) 
  405.           sprintf(tmp,"%-3ld     ",def_menu);
  406.         else
  407.           sprintf(tmp,"Not set");
  408.         write_string( Black+BakWhite, BoX2, BoY+6, tmp );
  409.        }
  410.  
  411.      sprintf(tmp,"%s",(adv->password==0)?"Not set ":"******* ");
  412.      write_string( act==5?(BrWhite+BakBlack):(Black+BakWhite),
  413.                                BoX2, BoY+7, tmp );
  414.      if( act==5 ) move_cursor( BoX2, BoY+7 );
  415.  
  416.  
  417.      sprintf(tmp,"%s",(adv->options&ADV_OPT_IGN_UNUSED)?"Yes":"No ");
  418.      write_string( act==6?(BrWhite+BakBlack):(Black+BakWhite),
  419.                                BoX2, BoY+8, tmp );
  420.      if( act==6 ) move_cursor( BoX2, BoY+8 );
  421.  
  422.      if( act==0 ) 
  423.         edit_str_field(&ev,0,BrWhite+BakBlack,BoX+14,BoY+1,
  424.                        sizeof(adv->adv_title),adv->adv_title,&pos);
  425.      else if( act==3 )
  426.        edit_int_field(&ev,0,BrWhite+BakBlack, BoX2, BoY+5, -3, &timeout, 99);
  427.      else if( act==4 )
  428.        {
  429.         write_string( Black+BakWhite, BoX2, BoY+6, "       ");
  430.         edit_int_field(&ev,0,BrWhite+BakBlack, BoX2, BoY+6, -3, &def_menu, MAX_MENU_ROWS);
  431.         if( def_menu!=0 ) 
  432.            adv->options |= ADV_OPT_DEF_MENU;
  433.         else
  434.            adv->options &= ~ADV_OPT_DEF_MENU;
  435.        }
  436.      else if( act==5 ) 
  437.        {
  438.         int ppos=0;
  439.         password[0]=0;
  440.         edit_str_field(&ev,0,BrWhite+BakBlack,BoX2,BoY+7,9,password,&ppos);
  441.         if( ev.key==13 )
  442.           { 
  443.            adv->password=encrypt_password(password);
  444.            act=0;
  445.            continue;
  446.           }
  447.         memset(password,0,9);
  448.        }
  449.      else
  450.        get_event(&ev,EV_KEY);
  451.  
  452.      if( ev.key==27 )                 /* ESC */
  453.        {
  454.         break;
  455.        }
  456.      else if( ev.scan==0x3B00 )         /* F1 - Help */
  457.        {
  458.         sprintf(tmp,"#setup_adv_opt");
  459.         html_view(tmp);
  460.        }
  461.      else if( ev.key==13 )        /* Enter */
  462.        {
  463.         if( act<6 ) act++;
  464.         else act=0;
  465.        }
  466.      else if( act==1 && (ev.key=='Y' || ev.key=='y') )
  467.        {
  468.         adv->options |= ADV_OPT_VIR_CHECK;
  469.        }
  470.      else if( act==1 && (ev.key=='N' || ev.key=='n') )
  471.        {
  472.         adv->options &= ~ADV_OPT_VIR_CHECK;
  473.        }
  474.      else if( act==1 && ev.key==' ' )
  475.        {
  476.         adv->options ^= ADV_OPT_VIR_CHECK;
  477.        }
  478.      else if( act==2 && (ev.key=='Y' || ev.key=='y') )
  479.        {
  480.         adv->options |= ADV_OPT_CLEAR_SCR;
  481.        }
  482.      else if( act==2 && (ev.key=='N' || ev.key=='n') )
  483.        {
  484.         adv->options &= ~ADV_OPT_CLEAR_SCR;
  485.        }
  486.      else if( act==2 && ev.key==' ' )
  487.        {
  488.         adv->options ^= ADV_OPT_CLEAR_SCR;
  489.        }
  490.      else if( act==6 && (ev.key=='Y' || ev.key=='y') )
  491.        {
  492.         adv->options |= ADV_OPT_IGN_UNUSED;
  493.        }
  494.      else if( act==6 && (ev.key=='N' || ev.key=='n') )
  495.        {
  496.         adv->options &= ~ADV_OPT_IGN_UNUSED;
  497.        }
  498.      else if( act==6 && ev.key==' ' )
  499.        {
  500.         adv->options ^= ADV_OPT_IGN_UNUSED;
  501.        }
  502.      else if( ev.scan==0x50E0 || ev.scan==0x5000 )    /* down */
  503.        {
  504.         if( act<6 ) act++;
  505.        }
  506.      else if( ev.scan==0x48E0 || ev.scan==0x4800 )    /* up */
  507.        {
  508.         if( act>0 ) act--;
  509.        }
  510.      
  511.     }/* while(1) */
  512.  
  513.  adv->timeout=timeout;
  514.  if( adv->options & ADV_OPT_DEF_MENU )
  515.    {
  516.     adv->def_menu=def_menu-1;
  517.    }
  518. }/* boot_menu_options */
  519.  
  520.  
  521. void edit_boot_menu(struct adv *adv, int p, int flag)
  522. {
  523.  struct event ev;
  524.  unsigned long l;
  525.  int old_col, old_act, redraw;
  526.  int i, k, act, col, pos, n=MAX_MENU_ROWS;
  527.  
  528.  static char *show[5]={ " ---- ", " Last ", " Next ", " Prev ", " Last3" };
  529.  static char *part_row[5]={ "/*", "/1", "/2", "/3", "/4" };
  530.  static char *boot_type[5]={ "-", "C", "D", "A", "?" };
  531.  
  532.  border_window( Yellow+BakWhite, BmX, BmY, BmW, BmH, Border22f );
  533.  
  534.  
  535.  write_string( Black+BakWhite, BmX+2, BmY+1, HEADER_BOOT_MENU );
  536.  for( i=0 ; i<BmW-4 ; i++ ) tmp[i]='─';
  537.  tmp[i]=0;
  538.  write_string( Yellow+BakWhite, BmX+2, BmY+2, tmp );
  539.  write_string( Yellow+BakWhite, BmX+2, BmY+BmH-1," F1 - Help ");
  540.  write_string( Yellow+BakWhite, BmX+18, BmY+BmH-1," Space, Ins, Del, Alt-O, Alt-K ");
  541.  
  542.  act=0;
  543.  col=1;
  544.  pos=0;
  545.  redraw=1;
  546.  
  547.  if( adv->part[p].tag!=0 )
  548.    {
  549.     for( i=0 ; i<n ; i++ )
  550.      if( adv->menu[i].boot_type!=MENU_BOOT_EMPTY &&
  551.          adv->menu[i].x.part.tag==adv->part[p].tag )
  552.        {
  553.         act=i;
  554.         break;
  555.        }
  556.    }
  557.  else if( adv->part[p].os_id!=0 && adv->part[p].os_id!=OS_ADV )
  558.    {
  559.     for( i=0 ; i<n ; i++ )
  560.      if( adv->menu[i].boot_type==MENU_BOOT_EMPTY )
  561.        {
  562.         adv->menu[i].boot_type=MENU_BOOT_PART;
  563.         adv->part[p].tag=get_free_tag(adv->part);
  564.         adv->menu[i].x.part.tag = adv->part[p].tag;
  565.         act=i;
  566.         break;
  567.        }
  568.    }
  569.  
  570.  while(1)
  571.     {
  572.      if( old_col!=col || old_act!=act || redraw )
  573.        {
  574.         for( i=0 ; i<n ; i++ )
  575.            {
  576.             k=get_part_num(adv->part,adv->menu[i].x.part.tag);
  577.             sprintf(tmp," %2d  %s %2d%s %s %s  %-29s %s ",
  578.                           i+1,
  579.                           boot_type[adv->menu[i].boot_type],
  580.                           k,
  581.                           k==0?"  ":part_row[adv->part[k-1].orig_row],
  582.                           show[adv->menu[i].x.part.show],
  583.                           adv->menu[i].options&MENU_OPT_PASSW?"Y":"-",
  584.                           adv->menu[i].name,
  585.                           adv->menu[i].x.part.num_keys!=0?"Y":"-" );
  586.             write_string( Black+BakWhite, BmX+2, BmY+3+i, tmp );
  587.            }
  588.         old_col=col;
  589.         old_act=act;
  590.         redraw=0;
  591.        }
  592.  
  593.      if( col==0 )
  594.        {
  595.         write_string(BrWhite+BakBlack,BmX+7,BmY+3+act,
  596.                         boot_type[adv->menu[act].boot_type] );
  597.         move_cursor(BmX+7,BmY+3+act);
  598.        }
  599.      else if( col==1 )
  600.        {
  601.         i=get_part_num(adv->part,adv->menu[act].x.part.tag);
  602.         write_int(BrWhite+BakBlack,BmX+9,BmY+3+act,2,i);
  603.         move_cursor(BmX+10,BmY+3+act);
  604.        }
  605.      else if( col==2 )
  606.        {
  607.         k=get_part_num(adv->part,adv->menu[act].x.part.tag);
  608.         if( k==0 ) tmp[1]=0;
  609.         else if( adv->part[k-1].orig_row==0 ) tmp[0]='*';
  610.         else tmp[0]=adv->part[k-1].orig_row+'0';
  611.         tmp[1]=0;
  612.         write_string(BrWhite+BakBlack,BmX+12,BmY+3+act,tmp);
  613.         move_cursor(BmX+12,BmY+3+act);
  614.        }
  615.      else if( col==3 )
  616.        {
  617.         write_string(BrWhite+BakBlack,BmX+14,BmY+3+act, show[adv->menu[act].x.part.show] );
  618.         move_cursor(BmX+15,BmY+3+act);
  619.        }
  620.      else if( col==4 )
  621.        {
  622.         write_string(BrWhite+BakBlack,BmX+21,BmY+3+act, 
  623.                      adv->menu[act].options&MENU_OPT_PASSW?"Y":"-" );
  624.         move_cursor(BmX+21,BmY+3+act);
  625.        }
  626.  
  627.      if( flag==1 )
  628.        {
  629.         boot_menu_options(adv);
  630.         flag=0;
  631.         redraw=1;
  632.         continue;
  633.        }
  634.  
  635.  
  636.      if( col==5 )
  637.        {
  638.         edit_str_field(&ev,0,BrWhite+BakBlack,BmX+24,BmY+3+act,
  639.                        sizeof(adv->menu[act].name),adv->menu[act].name,&pos);
  640.        }
  641.      else get_event(&ev,EV_KEY);
  642.  
  643.  
  644.      if( ev.key==27 ) /* ESC */
  645.        {
  646.         break;
  647.        }
  648.      if( ev.key==13 )            /* Enter */
  649.        {
  650.         if( col==1 ) break;
  651.         col=1;
  652.         redraw=1;
  653.        }
  654.      else if( ev.key==9 )         /* Tab */
  655.        {
  656.         col=(col+1)%6;
  657.        }
  658.      else if( ev.scan==0x3B00 )         /* F1 - Help */
  659.        {
  660.         sprintf(tmp,"#setup_adv");
  661.         html_view(tmp);
  662.        }
  663.      else if( ev.scan==0x1800 )        /* Alt-O = Options */
  664.        {
  665.         boot_menu_options(adv);
  666.         redraw=1;
  667.        }
  668.      else if( ev.scan==0x2500 )        /* Alt-K = Keys */
  669.        {
  670.         adv->menu[act].x.part.num_keys = get_keys(adv->menu[act].x.part.keys,
  671.                                            adv->menu[act].x.part.num_keys );
  672.         redraw=1;
  673.        }
  674.      else if( col==0 && (ev.key=='+' || ev.key==' ') )
  675.        {
  676.         adv->menu[act].boot_type++;
  677.         if( adv->menu[act].boot_type>3 ) adv->menu[act].boot_type=1;
  678.        }
  679.      else if( col==0 && ev.key=='-' )
  680.        {
  681.         if( adv->menu[act].boot_type==1 ) adv->menu[act].boot_type=3;
  682.         else adv->menu[act].boot_type--;
  683.        }
  684.      else if( col==1 && (ev.key=='+' || ev.key==' ') )
  685.        {
  686.         int m=MAX_PART_ROWS;
  687.         k=get_part_num(adv->part,adv->menu[act].x.part.tag);
  688.         for( i=k ; i<m ; i++ )
  689.            {
  690.             if( adv->part[i].os_id!=0 && adv->part[i].os_id!=OS_ADV )
  691.               {
  692.                if( adv->part[i].tag==0 ) adv->part[i].tag=get_free_tag(adv->part);
  693.                adv->menu[act].x.part.tag = adv->part[i].tag;
  694.                break;
  695.               }
  696.             if( i==m-1 && m==MAX_PART_ROWS ) { m=k-1; i=-1; }
  697.            }
  698.         if( adv->menu[act].boot_type==0 && adv->menu[act].x.part.tag!=0 )
  699.             adv->menu[act].boot_type=MENU_BOOT_PART;
  700.         redraw=1;
  701.        }
  702.      else if( col==1 && ev.key=='-' )
  703.        {
  704.         int m=0;
  705.         k=get_part_num(adv->part,adv->menu[act].x.part.tag);
  706.         
  707.         for( i=k-2 ; i>=m ; i-- )
  708.            {
  709.             if( adv->part[i].os_id!=0 && adv->part[i].os_id!=OS_ADV )
  710.               {
  711.                if( adv->part[i].tag==0 ) adv->part[i].tag=get_free_tag(adv->part);
  712.                adv->menu[act].x.part.tag = adv->part[i].tag;
  713.                break;
  714.               }
  715.             if( i==m && m==0 ) { m=k; i=MAX_PART_ROWS; }
  716.            }
  717.         if( adv->menu[act].boot_type==0 && adv->menu[act].x.part.tag!=0 )
  718.             adv->menu[act].boot_type=MENU_BOOT_PART;
  719.         redraw=1;
  720.        }
  721.      else if( col==2 && (ev.key=='+' || ev.key==' ') )
  722.        {
  723.         k=get_part_num(adv->part,adv->menu[act].x.part.tag);
  724.         if( k==0 ) continue;
  725.                    else k--;
  726.         adv->part[k].orig_row = (adv->part[k].orig_row+1)%5;
  727.         redraw=1;
  728.        }
  729.      else if( col==1 && ev.key=='-' )
  730.        {
  731.         k=get_part_num(adv->part,adv->menu[act].x.part.tag);
  732.         if( k==0 ) continue;
  733.                    else k--;
  734.         adv->part[k].orig_row = (adv->part[k].orig_row+4)%5;
  735.         redraw=1;
  736.        }
  737.      else if( col==3 && (ev.key=='+' || ev.key==' ') )
  738.        {
  739.         adv->menu[act].x.part.show = (adv->menu[act].x.part.show+1)%5;
  740.        }
  741.      else if( col==3 && ev.key=='-' )
  742.        {
  743.         adv->menu[act].x.part.show = (adv->menu[act].x.part.show+4)%5;
  744.        }
  745.      else if( col==4 && ev.key==' ' )
  746.        {
  747.         adv->menu[act].options ^= MENU_OPT_PASSW;
  748.         redraw=1;
  749.        }
  750.      else if( ev.scan==0x5200 || ev.scan==0x52E0 ) /* Insert */
  751.        {
  752.         for( i=MAX_MENU_ROWS-1 ; i>act ; i-- )
  753.           adv->menu[i]=adv->menu[i-1];
  754.         memset(&adv->menu[i],0,sizeof(struct adv_menu_rec));
  755.         redraw=1;
  756.        }
  757.      else if( ev.scan==0x5300 || ev.scan==0x53E0 ) /* Del */
  758.        {
  759.         for( i=act ; i<MAX_MENU_ROWS-1 ; i++ )
  760.           adv->menu[i]=adv->menu[i+1];
  761.         memset(&adv->menu[i],0,sizeof(struct adv_menu_rec));
  762.         redraw=1;
  763.        }
  764.      else if( ev.scan==0x47E0 || ev.scan==0x4700 )     /* Home */
  765.        {
  766.         act=0;
  767.        }
  768.      else if( ev.scan==0x4FE0 || ev.scan==0x4F00 )    /* End */
  769.        {
  770.         act=n-1;
  771.        }
  772.      else if( ev.scan==0x50E0 || ev.scan==0x5000 )    /* down */
  773.        {
  774.         if( act<n-1 ) act++;
  775.        }
  776.      else if( ev.scan==0x48E0 || ev.scan==0x4800 )    /* up */
  777.        {
  778.         if( act>0 ) act--;
  779.        }
  780.      else if( ev.scan==0x49E0 || ev.scan==0x4900 )    /* PgUp */
  781.        {
  782.         act=0;
  783.        }
  784.      else if( ev.scan==0x51E0 || ev.scan==0x5100 )    /* PgDn */
  785.        {
  786.         act=n-1;
  787.        }
  788.      else if( ev.scan==0x4BE0 || ev.scan==0x4B00 )    /* left */
  789.        {
  790.         if( col>0 ) col--;
  791.        }
  792.      else if( ev.scan==0x4DE0 || ev.scan==0x4D00 )    /* right */
  793.        {
  794.         if( col<5 ) col++;
  795.        }
  796.      
  797.     }/* while(1) */
  798.  
  799.  for( i=0 ; i<MAX_PART_ROWS ; i++ )
  800.   if( adv->part[i].tag!=0 )
  801.     {
  802.      for( k=0 ; k<MAX_MENU_ROWS ; k++ )
  803.       if( adv->part[i].tag==adv->menu[k].x.part.tag ) break;
  804.      if( k==MAX_MENU_ROWS ) adv->part[i].tag=0;
  805.     }
  806.  
  807. }/* edit_boot_menu */
  808.  
  809.  
  810.  
  811. void setup_ipl(struct mbr *mbr)
  812. {
  813.  struct event ev;
  814.  unsigned long n;
  815.  int i, b, v, d, act;
  816.  
  817.  border_window( Yellow+BakWhite, SiX, SiY, SiW, SiH, Border22f );
  818.  
  819.  n=mbr->x.ipl.dot_len;
  820.  v=mbr->x.ipl.vir_chk;
  821.  d=mbr->x.ipl.def_part;
  822.  b=mbr->x.ipl.fd_params[0];
  823.  
  824.  write_string( Black+BakWhite, SiX+2, SiY+1, IPL_VIRUS   );
  825.  write_string( Black+BakWhite, SiX+2, SiY+2, IPL_DOTS    );
  826.  write_string( Black+BakWhite, SiX+2, SiY+3, IPL_DEFAULT );
  827.  write_string( Black+BakWhite, SiX+2, SiY+4, IPL_NOACTV  );
  828.  
  829.  act=0;
  830.  
  831.  while(1)
  832.     {
  833.      sprintf(tmp,"%s",v!=0?"Yes":"No ");
  834.      write_string( act==0?(BrWhite+BakBlack):(Black+BakWhite),
  835.                                SiX+27, SiY+1, tmp );
  836.      if( act==0 ) move_cursor( SiX+27, SiY+1 );
  837.  
  838.      sprintf(tmp,"%-3ld",n);
  839.      write_string( Black+BakWhite, SiX+27, SiY+2, tmp );
  840.      
  841.           if( d==' ' )  sprintf(tmp,"Sp ");
  842.      else if( d=='\t' ) sprintf(tmp,"Tab");
  843.                    else sprintf(tmp,"%c  ",d==0?' ':d);
  844.      write_string(  act==2?(BrWhite+BakBlack):(Black+BakWhite),
  845.                                SiX+27, SiY+3, tmp );
  846.      if( act==2 ) move_cursor( SiX+27, SiY+3 );
  847.  
  848.      sprintf(tmp,"%s",b==0?"A":"D");
  849.      write_string(  act==3?(BrWhite+BakBlack):(Black+BakWhite),
  850.                                SiX+27, SiY+4, tmp );
  851.      if( act==3 ) move_cursor( SiX+27, SiY+4 );
  852.  
  853.      if( act==1 ) 
  854.        edit_int_field(&ev,0,BrWhite+BakBlack, SiX+27, SiY+2, -3, &n, 64);
  855.      else 
  856.        get_event(&ev,EV_KEY);
  857.  
  858.      if( n==0 )
  859.        {
  860.         n=1;
  861.         continue;
  862.        }
  863.      
  864.      if( ev.key==27 )                 /* ESC */
  865.        {
  866.         break;
  867.        }
  868.      if( ev.key==13 )        /* Enter */
  869.        {
  870.         if( act<3 ) act++;
  871.         else break;
  872.        }
  873.      else if( ev.scan==0x3B00 )         /* F1 - Help */
  874.        {
  875.         sprintf(tmp,"#setup_ipl");
  876.         html_view(tmp);
  877.        }
  878.      else if( act==0 && (ev.key=='Y' || ev.key=='y') )
  879.        {
  880.         v=1;
  881.        }
  882.      else if( act==0 && (ev.key=='N' || ev.key=='n') )
  883.        {
  884.         v=0;
  885.        }
  886.      else if( act==0 && ev.key==' ' )
  887.        {
  888.         if( v==0 ) v=1;
  889.           else     v=0;
  890.        }
  891.      else if( act==2 && ev.key==' ' )
  892.        {
  893.         if( d==0 ) d='1';
  894.         else if( d>='1' && d<'4' ) d++;
  895.         else if( d=='4' ) d='A';
  896.         else if( d=='A' ) d='\t';
  897.         else if( d=='\t' ) d=' ';
  898.         else d=0; 
  899.        }
  900.      else if( act==2 && (ev.key=='\t' || ev.key>='1' && ev.key<='4' ||
  901.                           ev.key=='A' || ev.key=='a' ) )
  902.        {
  903.         d=ev.key;
  904.         if( d=='a' ) d='A';
  905.        }
  906.      else if( act==2 && (ev.scan==0x5300 || ev.scan==0x53E0) ) /* Del */
  907.        {
  908.         d=0;
  909.        }
  910.      else if( act==3 && (ev.key=='A' || ev.key=='a') )
  911.        {
  912.         b=0;
  913.        }
  914.      else if( act==3 && (ev.key=='D' || ev.key=='d') )
  915.        {
  916.         b=dinfo.disk+1;
  917.        }
  918.      else if( act==3 && ev.key==' ' )
  919.        {
  920.         if( b==0 ) b=dinfo.disk+1;
  921.            else    b=0;
  922.        }
  923.      else if( ev.scan==0x50E0 || ev.scan==0x5000 )    /* down */
  924.        {
  925.         if( act<3 ) act++;
  926.        }
  927.      else if( ev.scan==0x48E0 || ev.scan==0x4800 )    /* up */
  928.        {
  929.         if( act>0 ) act--;
  930.        }
  931.      
  932.     }/* while(1) */
  933.  
  934.  mbr->x.ipl.dot_len=n;
  935.  mbr->x.ipl.vir_chk=v;
  936.  mbr->x.ipl.def_part=d;
  937.  mbr->x.ipl.fd_params[0]=b;
  938.  
  939. }/* setup_ipl */
  940.  
  941.  
  942.  
  943.  
  944. int enter_string(int x, int y, char *prompt, int maxlen, char *str, char *help)
  945. {
  946.  struct event ev;
  947.  int i, w, x2, w2;
  948.  
  949.  w2=73-x-strlen(prompt);
  950.  if( w2>maxlen ) w2=maxlen;
  951.  w=strlen(prompt)+5+w2;
  952.  x2=x+strlen(prompt)+3;
  953.  
  954.  save_window(x,y,w,3,buf);
  955.  border_window(Yellow+BakWhite,x,y,w,3, Border22f );
  956.  write_string(Black+BakWhite,x+2,y+1,prompt);
  957.  
  958.  if( help!=0 ) write_string( Yellow+BakWhite, x+w-14, y+2, " F1 - Help ");
  959.  
  960.  if( str==file_name )
  961.    {
  962.     i=strlen(str);
  963.    }
  964.  else
  965.    {
  966.     i=0;
  967.     str[0]=0;
  968.    }
  969.  
  970.  while(1)
  971.     {
  972.      edit_str_field( &ev, 0, BrWhite+BakBlack, x2, y+1, w2, str, &i );
  973.      
  974.      if( ev.key==27 ) { i=0; break; }
  975.      if( ev.key==13 ) { i=1; break; }
  976.  
  977.      if( ev.scan==0x3B00 && help!=0 )        /* F1 - Help */
  978.        {
  979.         html_view(help);
  980.        }
  981.     }/* while(1) */
  982.  
  983.  load_window(x,y,w,3,buf);
  984.  return i;
  985. }/* enter_string */
  986.  
  987.  
  988. void show_error(char *msg)
  989. {
  990.  int x, y=12, w, h=4, pressed;
  991.  struct event ev;
  992.  static char buf[4*80*2];
  993.  
  994.  w = strlen(msg)+6;
  995.  if( w%2==1 ) w++;
  996.  if( w>78 ) w=78;
  997.  x = (80-w)/2+1;
  998.  
  999.  save_window(x,y,w,h,buf);
  1000.  border_window(Yellow+BakRed,x,y,w,h, Border22f );
  1001.  
  1002.  write_string( BrWhite+BakRed, x+3, y+1, msg );
  1003.  write_string( Black+BakWhite, x+w/2-2, y+2," OK "  );
  1004.  
  1005.  pressed=0;
  1006.  
  1007.  while(1)
  1008.     {
  1009.      get_event( &ev, EV_KEY | EV_MOUSE );
  1010.  
  1011.      if( (ev.ev_type & EV_KEY) &&
  1012.          (ev.key==27 || ev.key==13) ) break;
  1013.  
  1014.      if( ev.ev_type & EV_MOUSE ) 
  1015.        if( ev.x>=x+w/2-2 && ev.x<x+w/2+2 && ev.y==y+2 )
  1016.          {
  1017.           if( ev.left==1 ) pressed=1;
  1018.           if( ev.left==0 && pressed==1 ) break;
  1019.          }
  1020.        else pressed=0;
  1021.     }
  1022.  
  1023.  load_window(x,y,w,h,buf);
  1024. }/* show_error */
  1025.  
  1026.  
  1027. void redraw_menu(int view)
  1028. {
  1029.  if( view==VIEW_ADV ) border_window( BORDER_COLOR, 1, 13, 80, 12, VERT_BORDER );
  1030.  if( view!=VIEW_ADV ) border_window( BORDER_COLOR, 1, 13, 80, 12, VERT_BORDER );
  1031.  
  1032.  if( view==VIEW_MBR )
  1033.    {
  1034.     write_string( HINT_COLOR, 11, 16,"I)");
  1035.     write_string( MENU_COLOR, 13, 16, MENU_INSTALL );
  1036.     write_string( HINT_COLOR, 49, 16,"A");
  1037.     write_string( HINT_COLOR, 11, 17,"U)");
  1038.     write_string( MENU_COLOR, 13, 17, MENU_UNINSTALL );
  1039.  
  1040.     write_string( HINT_COLOR, 11, 19,"H)");
  1041.     write_string( MENU_COLOR, 13, 19, MENU_HIDE );
  1042.     write_string( HINT_COLOR, 42, 19,"C)");
  1043.     write_string( MENU_COLOR, 44, 19, MENU_INST_IPL );
  1044.    }
  1045.  else if( view==VIEW_ADV )
  1046.    {
  1047.     write_string( HINT_COLOR, 11, 22,"P)");
  1048.     write_string( MENU_COLOR, 13, 22, MENU_PREVIEW );
  1049.  
  1050.     write_string( HINT_COLOR, 42, 22,"U)");
  1051.     write_string( MENU_COLOR, 44, 22, MENU_ADV_UNINST );
  1052.  
  1053.    }
  1054.  else if( view==VIEW_EMBR )
  1055.    {
  1056.     write_string( HINT_COLOR, 11, 16,"I)");
  1057.     write_string( MENU_COLOR, 13, 16, MENU_INST_EXT );
  1058.     write_string( HINT_COLOR, 11, 17,"R)");
  1059.     write_string( MENU_COLOR, 13, 17, MENU_MAKE_PRI );
  1060.  
  1061.     write_string( HINT_COLOR, 11, 19,"H)");
  1062.     write_string( MENU_COLOR, 13, 19, MENU_HIDE );
  1063.     write_string( HINT_COLOR, 42, 19,"C)");
  1064.     write_string( MENU_COLOR, 44, 19, MENU_INST_IPL );
  1065.    }
  1066.  
  1067.     write_string( HINT_COLOR, 11, 20,"F)");
  1068.     write_string( MENU_COLOR, 13, 20, MENU_FORMAT );
  1069.     write_string( HINT_COLOR, 11, 21,"V)");
  1070.     write_string( MENU_COLOR, 13, 21, MENU_VERIFY );
  1071.  
  1072.     write_string( HINT_COLOR, 42, 20,"S)");
  1073.     write_string( MENU_COLOR, 44, 20, MENU_SAVE_MBR );
  1074.     write_string( HINT_COLOR, 42, 21,"L)");
  1075.     write_string( MENU_COLOR, 44, 21, MENU_LOAD_MBR );
  1076.  
  1077.  write_string( HINT_COLOR, 4, 24,"F1");
  1078.  write_string( MENU_COLOR, 6, 24," - Help ");
  1079.  
  1080.  write_string( HINT_COLOR, 15, 24,"F2");
  1081.  write_string( MENU_COLOR, 17, 24," - Save Changes ");
  1082.  
  1083.  write_string( HINT_COLOR, 34, 24,"F3");
  1084.  write_string( MENU_COLOR, 36, 24," - Undo ");
  1085.  
  1086.  write_string( HINT_COLOR, 45, 24,"F4");
  1087.  write_string( MENU_COLOR, 47, 24," - Mode ");
  1088.  
  1089.  write_string( HINT_COLOR&((view==VIEW_EMBR)?0x77:0xFF), 56, 24,"F5");
  1090.  write_string( MENU_COLOR&((view==VIEW_EMBR)?0x77:0xFF), 58, 24," - Disk ");
  1091.  
  1092.  write_string( HINT_COLOR, 68, 24,"ESC");
  1093.  write_string( MENU_COLOR, 71, 24," - Quit ");
  1094.  
  1095.  
  1096. }/* redraw_menu */
  1097.  
  1098.  
  1099. void redraw_header(int view, int mode, struct part_long *p)
  1100. {
  1101.  border_window( BORDER_COLOR, 1, 4, 80, 5, VERT_BORDER );
  1102.         
  1103.  if( view==VIEW_EMBR )
  1104.    {
  1105.     write_string(HEADER_COLOR,4,5, HEADER_EMBR );
  1106.     write_int(TABLE_COLOR,14,5,2, p->level );
  1107.     write_int(TABLE_COLOR,18,5,5, QUICK_SIZE(p)/2048 );
  1108.    }
  1109.  
  1110.  if( mode==MODE_CHS )
  1111.    {
  1112.     write_string(HEADER_COLOR,4,4,HEADER_CHS );
  1113.     write_int(TABLE_COLOR,14,4,2,dinfo.disk-0x80+1 );
  1114.     write_int(TABLE_COLOR,18,4,5,dinfo.total_sects/2048);
  1115.     write_int(TABLE_COLOR,33,4,5,dinfo.num_cyls);
  1116.     write_int(TABLE_COLOR,52,4,3,dinfo.num_heads);
  1117.     write_int(TABLE_COLOR,65,4,3,dinfo.num_sects);
  1118.     write_string(HEADER_COLOR,4,6, HEADER_CHS2 );
  1119.     write_string(HEADER_COLOR,4,7, HEADER_CHS3 );
  1120.    }
  1121.  else /* mode==MODE_LBA */
  1122.    {
  1123.     write_string(HEADER_COLOR,4,4,HEADER_LBA );
  1124.     write_int(TABLE_COLOR,14,4,2,dinfo.disk-0x80+1 );
  1125.     write_int(TABLE_COLOR,18,4,5,dinfo.total_sects/2048);
  1126.     sprintf(tmp,"%10s",sprintf_long(tmp+100,QUICK_BASE(p)));
  1127.     write_string(TABLE_COLOR,39,4,tmp);
  1128.     sprintf(tmp,"%10s",sprintf_long(tmp+100,QUICK_SIZE(p)));
  1129.     write_string(TABLE_COLOR,57,4,tmp);
  1130.     write_string(HEADER_COLOR,4,6, HEADER_LBA2 );
  1131.     write_string(HEADER_COLOR,4,7, HEADER_LBA3 );
  1132.    }
  1133. }/* redraw_header */ 
  1134.  
  1135.  
  1136.  
  1137. void progress_bar(char *bar, int percent)
  1138. {
  1139.  int i;
  1140.  
  1141.  if( percent<0 ) percent=0;
  1142.  if( percent>100 ) percent=100;
  1143.  
  1144.  for( i=0 ; i<percent/2 ; i++ )
  1145.         bar[i]=0xB2;
  1146.  while( i!=50 ) bar[i++]=0xB0;
  1147.  bar[i]=0;
  1148. }
  1149.  
  1150.  
  1151. int progress(char *msg)
  1152. {
  1153.  int i, t=0;
  1154.  struct event ev;
  1155.  static int prev_bar;
  1156.  static char prev_msg[21];
  1157.  
  1158.  if( msg!=0 && interactive==1 )
  1159.    {
  1160.     move_cursor(1,26);
  1161.     if( *msg=='^' )
  1162.       {
  1163.        border_window( Yellow+BakWhite, FmX, FmY, FmW, FmH, Border22f );
  1164.        write_string( Black+BakWhite, FmX+2, FmY+1, msg+1);
  1165.        prev_bar=0;
  1166.       }
  1167.     else if( *msg=='%' )
  1168.       {
  1169.        if( prev_bar==0 || strcmp(prev_msg,msg+1)!=0 )
  1170.          {
  1171.           progress_bar( tmp, atoi(msg+1) );
  1172.           write_string( Black+BakWhite, FmX+2,    FmY+3, tmp  );
  1173.           clear_window( Black+BakWhite, FmX+2+50, FmY+3, 20, 1);
  1174.           write_string( Black+BakWhite, FmX+2+50, FmY+3, msg+1);
  1175.           prev_bar=1;
  1176.           strncpy(prev_msg,msg+1,20);
  1177.          }
  1178.       }
  1179.     else
  1180.       {
  1181.        while( *msg=='~' ) { msg++; t+=20; }
  1182.        clear_window( Black+BakWhite, FmX+2, FmY+3, 70,1);
  1183.        write_string( Black+BakWhite, FmX+2, FmY+3, msg );
  1184.        prev_bar=0;
  1185.       }
  1186.    }/* interactive */
  1187.  else if( *msg!=0 && interactive==0 )
  1188.    {
  1189.     if( *msg=='^' )
  1190.       {
  1191.        if( prev_bar==1 ) printf("\n");
  1192.        printf("%s\n",msg+1);
  1193.        prev_bar=0;
  1194.       }
  1195.     else if( *msg=='%' )
  1196.       {
  1197.        if( prev_bar==0 || strcmp(prev_msg,msg+1)!=0 )
  1198.          {
  1199.           progress_bar( tmp, atoi(msg+1) );
  1200.           printf("\r%s%-20s", tmp, msg+1 );
  1201.           prev_bar=1;
  1202.           strncpy(prev_msg,msg+1,20);
  1203.          }
  1204.       }
  1205.     else
  1206.       {
  1207.        while( *msg=='~' ) { msg++; t+=12; }
  1208.        if( prev_bar==1 ) printf("\n");
  1209.        printf("%s\n",msg);
  1210.        prev_bar=0;
  1211.       }
  1212.    }
  1213.  
  1214.  if( t==0 )
  1215.    {
  1216.     get_event(&ev,EV_KEY|EV_NONBLOCK);
  1217.    }
  1218.  else
  1219.   {
  1220.    ev.timer=t;
  1221.    get_event(&ev,EV_KEY|EV_TIMER);
  1222.   }
  1223.  
  1224.  if( ev.ev_type==EV_KEY && ev.key==27 )     /* ESC */
  1225.    {
  1226.     return CANCEL;
  1227.    }
  1228.  
  1229.  return OK;
  1230. }/* progress */
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237. void print_adv_menu(struct adv *adv)
  1238. {
  1239.  int i, k;
  1240.  
  1241.  static char *show[5]={ " ---- ", " Last ", " Next ", " Prev ", " Last3" };
  1242.  static char *part_row[5]={ "/*", "/1", "/2", "/3", "/4" };
  1243.  static char *boot_type[5]={ "-", "C", "D", "A", "?" };
  1244.  
  1245.  printf("Advanced Boot Manager    Signature: %s    Advanced Data Version: %d\n\n",
  1246.                                     adv->signature, adv->version );
  1247.  
  1248.  printf("Title: %s\n\n", adv->adv_title );
  1249.  
  1250.  printf("Check boot viruses:  %s\n", adv->options&ADV_OPT_VIR_CHECK?"Yes":"No");
  1251.  printf("Clear screen:        %s\n", adv->options&ADV_OPT_CLEAR_SCR?"Yes":"No");
  1252.  printf("Boot menu timeout:   %d\n", adv->timeout );
  1253.  printf("Default boot menu:   ");
  1254.  if( adv->options&ADV_OPT_DEF_MENU ) printf("%d\n");
  1255.                                 else printf("Not set\n");
  1256.  printf("Boot menu password:  %s\n", adv->password==0?"Not set":"*******");
  1257.  printf("Ignore unused part:  %s\n", adv->options&ADV_OPT_IGN_UNUSED?"Yes":"No");
  1258.  
  1259.  
  1260.  printf("\n"
  1261.    "  #  Device  Part/Row  Show  Passw   Name                        Keys\n"
  1262.    "----------------------------------------------------------------------\n");
  1263.  
  1264.  for( i=0 ; i<MAX_MENU_ROWS ; i++ )
  1265.     {
  1266.      k=get_part_num(adv->part,adv->menu[i].x.part.tag);
  1267.      printf(" %2d    %s       %2d%s   %s   %s     %-29s %s\n",
  1268.                           i+1,
  1269.                           boot_type[adv->menu[i].boot_type],
  1270.                           k,
  1271.                           k==0?"  ":part_row[adv->part[k-1].orig_row],
  1272.                           show[adv->menu[i].x.part.show],
  1273.                           adv->menu[i].options&MENU_OPT_PASSW?"Y":"-",
  1274.                           adv->menu[i].name,
  1275.                           adv->menu[i].x.part.num_keys!=0?"Y":"-" );
  1276.     }
  1277.  
  1278. }/* print_adv_menu */
  1279.