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