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