home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR8 / TDE32.ZIP / CFGKEYS.C < prev    next >
C/C++ Source or Header  |  1993-11-13  |  14KB  |  425 lines

  1. /*
  2.  * This module contains all the routines needed to redefine the keys.
  3.  *
  4.  * Program Name:  tdecfg
  5.  * Author:        Frank Davis
  6.  * Date:          October 5, 1991
  7.  */
  8.  
  9.  
  10. #include <conio.h>
  11. #include <io.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "tdecfg.h"
  17. #include "cfgkeys.h"
  18.  
  19. extern struct vcfg cfg;
  20. extern FILE *tde_exe;                  /* FILE pointer to tde.exe */
  21. extern long keys_offset;
  22.  
  23. static WINDOW *w_ptr;
  24.  
  25.  
  26.  
  27. /*
  28.  * Name:    tdekeys
  29.  * Date:    October 1, 1991
  30.  * Notes:   Set up most of the window global variables.
  31.  */
  32. void tdekeys( void )
  33. {
  34. HELP_WINDOW hw;
  35. char t[80];
  36. int  ch;
  37. int  i;
  38.  
  39.    w_ptr = NULL;
  40.    hw.dply_col = 2;
  41.    hw.dply_row = 3;
  42.    hw.line_length = 69;
  43.    hw.avail_lines = 12;
  44.    hw.v_row = 0;
  45.    hw.select = 0;
  46.    hw.num_entries = AVAIL_KEYS;
  47.    hw.ulft_col = 3;
  48.    hw.ulft_row = 2;
  49.    hw.total_col = 73;
  50.    hw.total_row = 21;
  51.  
  52.    initialize_keys( );
  53.    master_help( &hw, key_defs, key_head, t, &ch );
  54.    if (ch == F10) {
  55.       for (i=0; i<hw.num_entries; i++)
  56.          key_func.key[key_defs[i].key_index]  = key_defs[i].func_index;
  57.       fseek( tde_exe, keys_offset, SEEK_SET );
  58.       fwrite( (void *)&key_func, sizeof(KEY_FUNC), 1, tde_exe );
  59.    }
  60.    cls( );
  61. }
  62.  
  63.  
  64. /*
  65.  * Name:    initialize_keys
  66.  * Date:    October 1, 1991
  67.  * Notes:   Get the current key definitions from the tde executable file.
  68.  */
  69. void initialize_keys( void )
  70. {
  71. int i;
  72.  
  73.    fseek( tde_exe, keys_offset, SEEK_SET );
  74.    fread( (void *)&key_func, sizeof(KEY_FUNC), 1, tde_exe );
  75.    for (i=0; i<AVAIL_KEYS; i++)
  76.       key_defs[i].func_index = key_func.key[key_defs[i].key_index];
  77. }
  78.  
  79.  
  80. /*
  81.  * Name:    show_key_def_list
  82.  * Date:    October 1, 1991
  83.  * Notes:   Show the key name and current function in a window.
  84.  */
  85. void show_key_def_list( HELP_WINDOW *hw, KEY_DEFS *keys )
  86. {
  87. int row, col, i, j;
  88.  
  89.    col = hw->ulft_col + hw->dply_col;
  90.    row = hw->ulft_row + hw->dply_row;
  91.    scroll_window( 0, row, col, row+hw->avail_lines-1, col+hw->line_length,
  92.                   NORMAL );
  93.    i = 0;
  94.    j = hw->select - hw->v_row;
  95.    for (; i < hw->avail_lines && j<hw->num_entries; ++i, j++, row++) {
  96.       s_output( keys[j].key, row, col, NORMAL );
  97.       s_output( avail_func[keys[j].func_index], row, col+31, NORMAL );
  98.    }
  99. }
  100.  
  101.  
  102. /*
  103.  * Name:    show_func_list
  104.  * Date:    October 1, 1991
  105.  * Notes:   Show the available functions in the small pop-up window.
  106.  */
  107. void show_func_list( HELP_WINDOW *hw, char *func[] )
  108. {
  109. int row, col, i, j;
  110.  
  111.    col = hw->ulft_col + hw->dply_col;
  112.    row = hw->ulft_row + hw->dply_row;
  113.    scroll_window( 0, row, col, row+hw->avail_lines-1, col+hw->line_length,
  114.                   NORMAL );
  115.    i = 0;
  116.    j = hw->select - hw->v_row;
  117.    for (; i < hw->avail_lines && j<hw->num_entries; ++i, j++, row++)
  118.       s_output( func[j], row, col, NORMAL );
  119. }
  120.  
  121.  
  122. /*
  123.  * Name:    position_cursor
  124.  * Date:    October 1, 1991
  125.  * Notes:   Given a key from the user, find out what action to do.
  126.  */
  127. void position_cursor( HELP_WINDOW *hw, int len, int *un, int *cc, int *ch )
  128. {
  129. int col, row, y, yy;
  130.  
  131.    col = hw->ulft_col + hw->dply_col;
  132.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  133.    y  = hw->ulft_row + hw->dply_row;
  134.    yy = hw->ulft_row + hw->dply_row + hw->avail_lines - 1;
  135.    *un = FALSE;
  136.    switch (*ch) {
  137.       case UP    :
  138.          if (hw->v_row > 0 && hw->select > 0) {
  139.             hlight_line( col, row, len, NORMAL );
  140.             --hw->v_row;
  141.             --hw->select;
  142.             *cc = TRUE;
  143.          } else if (hw->v_row == 0 && hw->select > 0) {
  144.             hlight_line( col, row, len, NORMAL );
  145.             --hw->select;
  146.             scroll_window( -1, y, col, yy+1, col+hw->line_length, NORMAL );
  147.             *un = TRUE;
  148.             *cc = TRUE;
  149.          }
  150.          break;
  151.       case DOWN :
  152.          if (hw->v_row < hw->avail_lines-1 &&
  153.                                       hw->select < hw->num_entries-1) {
  154.             hlight_line( col, row, len, NORMAL );
  155.             ++hw->v_row;
  156.             ++hw->select;
  157.             *cc = TRUE;
  158.          } else if (hw->v_row == hw->avail_lines-1 &&
  159.                                       hw->select < hw->num_entries-1) {
  160.             hlight_line( col, row, len, NORMAL );
  161.             ++hw->select;
  162.             scroll_window( 1, y, col, yy, col+hw->line_length, NORMAL );
  163.             *un = TRUE;
  164.             *cc = TRUE;
  165.          } else if (hw->select == hw->num_entries - 1 && hw->v_row > 0) {
  166.             --hw->v_row;
  167.             scroll_window(1, y, col, yy, col+hw->line_length, NORMAL );
  168.          }
  169.          break;
  170.    }
  171. }
  172.  
  173.  
  174. /*
  175.  * Name:    master_help
  176.  * Date:    October 1, 1991
  177.  * Notes:   master routine for setting up a help window.
  178.  */
  179. void master_help( HELP_WINDOW *hw, KEY_DEFS *help, struct screen *help_heading,
  180.                   char *t, int *ch )
  181. {
  182. FILE *fp;               /* file pointer for PRN device */
  183. int col, row, i, j;
  184. int update_name, change_color, draw_page;
  185. char str[80];
  186. char *blank = "                                                 ";
  187. char temp[20];
  188. HELP_WINDOW hw_k;
  189.  
  190.    xygoto( -1, -1 );
  191.    save_and_draw( hw, help_heading, &w_ptr );
  192.    show_key_def_list( hw, help );
  193.  
  194.    col = hw->ulft_col + hw->dply_col;
  195.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  196.    change_color = TRUE;
  197.    *ch = 0;
  198.    while (*ch!=F3 && *ch != F10 && *ch!=ESC) {
  199.       draw_page = FALSE;
  200.       position_cursor( hw, hw->line_length, &update_name, &change_color, ch );
  201.       switch (*ch) {
  202.          case PGUP :
  203.             if (hw->select > hw->avail_lines-1) {
  204.                hw->select = hw->select - hw->avail_lines;
  205.                if (hw->v_row > hw->select)
  206.                   hw->select = hw->v_row;
  207.                draw_page = TRUE;
  208.             } else if (hw->select - hw->v_row > 0) {
  209.                hw->select = hw->v_row;
  210.                draw_page = TRUE;
  211.             }
  212.             break;
  213.          case PGDN :
  214.             if (hw->select + hw->avail_lines < hw->num_entries) {
  215.                hw->select = hw->select + hw->avail_lines;
  216.                draw_page = TRUE;
  217.             } else if (hw->select + hw->avail_lines - hw->v_row <
  218.                                                          hw->num_entries) {
  219.                hw->select = hw->num_entries - 1;
  220.                draw_page = TRUE;
  221.             }
  222.             if ((hw->num_entries - 1) - hw->select <
  223.                                               hw->avail_lines && draw_page) {
  224.                i = row - hw->v_row;
  225.                scroll_window( 0, i, col, i+hw->avail_lines-1,
  226.                               col+hw->line_length, NORMAL );
  227.             }
  228.             break;
  229.          case F5 :
  230.             hw_k.dply_col = 2;
  231.             hw_k.dply_row = 3;
  232.             hw_k.line_length = 33;
  233.             hw_k.avail_lines = 6;
  234.             hw_k.v_row = 0;
  235.             hw_k.select = 0;
  236.             hw_k.num_entries = NUM_FUNC;
  237.             hw_k.ulft_col = 20;
  238.             hw_k.ulft_row = row + 1;
  239.             if (hw_k.ulft_row > 12)
  240.                hw_k.ulft_row = row - 12;
  241.             hw_k.total_col = 37;
  242.             hw_k.total_row = 12;
  243.             new_assignment_help( &hw_k, avail_func, func_head, ch );
  244.             if (*ch == RTURN) {
  245.                help[hw->select].key[0] = '*';
  246.                help[hw->select].func_index = (unsigned char)hw_k.select;
  247.                s_output( help[hw->select].key, row, col, cfg.attr );
  248.                s_output( "                     ", row, col+31, cfg.attr );
  249.                s_output( avail_func[help[hw->select].func_index],
  250.                          row, col+31, cfg.attr );
  251.                *ch = 0;
  252.             }
  253.             break;
  254.          case F7 :
  255.             hw_k.ulft_col = 14;
  256.             hw_k.ulft_row = 10;
  257.             hw_k.total_col = 52;
  258.             hw_k.total_row = 5;
  259.             save_and_draw( &hw_k, file_head, &w_ptr );
  260.             xygoto( hw_k.ulft_col+28, hw_k.ulft_row+2 );
  261.             gets( str );
  262.             j = TRUE;
  263.             if ((i = access( str, EXIST )) == 0) {
  264.                s_output( blank, hw_k.ulft_row+2, hw_k.ulft_col+1, NORMAL );
  265.                s_output( "OK to overwrite exiting file (y/n)?",
  266.                           hw_k.ulft_row+2, hw_k.ulft_col+1, NORMAL );
  267.                xygoto( hw_k.ulft_col+38, hw_k.ulft_row+2 );
  268.                i = getkey( );
  269.                while (i != 'Y' && i != 'y' && i != 'N' && i != 'n')
  270.                   i = getkey( );
  271.                if (i == 'n' || i == 'N')
  272.                   j = FALSE;
  273.             }
  274.             xygoto( -1, -1 );
  275.             if (j == TRUE && (fp = fopen( str, "w" )) != NULL) {
  276.                for (i=0; i<hw->num_entries && j; i++) {
  277.                   fprintf( fp, " %22s  = ", help[i].key+3 );
  278.                   fprintf( fp, "  %s\n",  avail_func[help[i].func_index] );
  279.                }
  280.                fclose( fp );
  281.             } else {
  282.                s_output( blank, hw_k.ulft_row+2, hw_k.ulft_col+1, NORMAL );
  283.                s_output( "Cannot open file.  Press any key to contine.",
  284.                           hw_k.ulft_row+2, hw_k.ulft_col+1, NORMAL );
  285.                j = getkey( );
  286.             }
  287.             window_control( &w_ptr, RESTORE, hw_k.ulft_col, hw_k.ulft_row,
  288.                             hw_k.total_col, hw_k.total_row );
  289.             break;
  290.          case F8 :
  291.             if ((fp = fopen( "PRN", "a" )) != NULL) {
  292.                hw_k.ulft_col = 20;
  293.                hw_k.ulft_row = 10;
  294.                hw_k.total_col = 42;
  295.                hw_k.total_row = 5;
  296.                save_and_draw( &hw_k, print_head, &w_ptr );
  297.                j = TRUE;
  298.                for (i=0; i<hw->num_entries && j; i++) {
  299.                   itoa( i+1, temp, 10 );
  300.                   s_output( temp, hw_k.ulft_row+2, hw_k.ulft_col+16, NORMAL );
  301.                   fprintf( fp, " %22s  = ", help[i].key+3 );
  302.                   fprintf( fp, "  %s\n",  avail_func[help[i].func_index] );
  303.                   if (kbhit()) {
  304.                      j = getkey( );
  305.                      if (j == ESC)
  306.                         j = FALSE;
  307.                      else
  308.                         j = TRUE;
  309.                   }
  310.                }
  311.                fprintf( fp, "\f" );
  312.                fclose( fp );
  313.                window_control( &w_ptr, RESTORE, hw_k.ulft_col, hw_k.ulft_row,
  314.                                hw_k.total_col, hw_k.total_row );
  315.             }
  316.             break;
  317.       }
  318.       if (draw_page == TRUE) {
  319.          show_key_def_list( hw, help );
  320.          update_name = TRUE;
  321.          change_color = TRUE;
  322.       }
  323.       row = hw->ulft_row + hw->dply_row + hw->v_row;
  324.       if (update_name) {
  325.          s_output( help[hw->select].key, row, col, NORMAL );
  326.          s_output( avail_func[help[hw->select].func_index], row, col+31,
  327.                       NORMAL );
  328.       }
  329.       if (change_color)
  330.          hlight_line( col, row, hw->line_length, cfg.attr );
  331.       *ch = getkey( );
  332.       change_color = FALSE;
  333.    }
  334.    window_control( &w_ptr, RESTORE, hw->ulft_col, hw->ulft_row,
  335.                    hw->total_col, hw->total_row );
  336. }
  337.  
  338.  
  339. /*
  340.  * Name:    new_assignment_help
  341.  * Date:    October 1, 1991
  342.  * Notes:   customized the master_help routine for the available functions.
  343.  */
  344. void new_assignment_help( HELP_WINDOW *hw, char *help[],
  345.                           struct screen *help_heading, int *ch )
  346. {
  347. int col, row, i;
  348. int update_name, change_color, draw_page;
  349.  
  350.    save_and_draw( hw, help_heading, &w_ptr );
  351.    show_func_list( hw, help );
  352.  
  353.    col = hw->ulft_col + hw->dply_col;
  354.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  355.    change_color = TRUE;
  356.    *ch = 0;
  357.    while (*ch!=RTURN && *ch!=ESC) {
  358.       draw_page = FALSE;
  359.       position_cursor( hw, hw->line_length, &update_name, &change_color, ch );
  360.       switch (*ch) {
  361.          case PGUP :
  362.             if (hw->select > hw->avail_lines-1) {
  363.                hw->select = hw->select - hw->avail_lines;
  364.                if (hw->v_row > hw->select)
  365.                   hw->select = hw->v_row;
  366.                draw_page = TRUE;
  367.             } else if (hw->select - hw->v_row > 0) {
  368.                hw->select = hw->v_row;
  369.                draw_page = TRUE;
  370.             }
  371.             break;
  372.          case PGDN :
  373.             if (hw->select + hw->avail_lines < hw->num_entries) {
  374.                hw->select = hw->select + hw->avail_lines;
  375.                draw_page = TRUE;
  376.             } else if (hw->select + hw->avail_lines - hw->v_row <
  377.                                                          hw->num_entries) {
  378.                hw->select = hw->num_entries - 1;
  379.                draw_page = TRUE;
  380.             }
  381.             if ((hw->num_entries - 1) - hw->select <
  382.                                               hw->avail_lines && draw_page) {
  383.                i = row - hw->v_row;
  384.                scroll_window( 0, i, col, i+hw->avail_lines-1,
  385.                               col+hw->line_length, NORMAL );
  386.             }
  387.             break;
  388.       }
  389.       if (draw_page == TRUE) {
  390.          show_func_list( hw, help );
  391.          update_name = TRUE;
  392.          change_color = TRUE;
  393.       }
  394.       row = hw->ulft_row + hw->dply_row + hw->v_row;
  395.       if (update_name)
  396.          s_output( help[hw->select], row, col, NORMAL );
  397.       if (change_color)
  398.          hlight_line( col, row, hw->line_length, cfg.attr );
  399.       *ch = getkey( );
  400.       change_color = FALSE;
  401.    }
  402.    window_control( &w_ptr, RESTORE, hw->ulft_col, hw->ulft_row,
  403.                    hw->total_col, hw->total_row );
  404.    if (*ch != RTURN)
  405.       *ch = 0;
  406. }
  407.  
  408.  
  409. /*
  410.  * Name:    save_and_draw
  411.  * Date:    October 1, 1991
  412.  * Notes:   save the contents of the screen where the pop-up or pull-down
  413.  *          window is to be displayed.  then draw the outline of the window
  414.  *          and show the help.
  415.  */
  416. void save_and_draw( HELP_WINDOW *hw, struct screen *help_heading,
  417.                     WINDOW **w_ptr )
  418. {
  419.    window_control( w_ptr, SAVE, hw->ulft_col, hw->ulft_row,
  420.                    hw->total_col, hw->total_row );
  421.    make_window( hw->ulft_col, hw->ulft_row, hw->total_col, hw->total_row,
  422.                 NORMAL );
  423.    show_box( hw->ulft_col, hw->ulft_row, help_heading, NORMAL );
  424. }
  425.