home *** CD-ROM | disk | FTP | other *** search
/ swCHIP 1991 January / swCHIP_95-1.bin / utility / gsview13 / src / gvccmd.c < prev    next >
C/C++ Source or Header  |  1995-12-09  |  16KB  |  659 lines

  1. /* Copyright (C) 1993, 1994, 1995, Russell Lang.  All rights reserved.
  2.   
  3.   This file is part of GSview.
  4.   
  5.   This program is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the GSview Free Public Licence 
  9.   (the "Licence") for full details.
  10.   
  11.   Every copy of GSview must include a copy of the Licence, normally in a 
  12.   plain ASCII text file named LICENCE.  The Licence grants you the right 
  13.   to copy, modify and redistribute GSview, but only under certain conditions 
  14.   described in the Licence.  Among other things, the Licence requires that 
  15.   the copyright notice and this notice be preserved on all copies.
  16. */
  17.  
  18. /* gvccmd.c */
  19. /* Menu command module of PM and Windows GSview */
  20.  
  21. #ifdef _Windows
  22. #include "gvwin.h"
  23. #else
  24. #include "gvpm.h"
  25. #endif
  26.  
  27. void gsview_depth(int new_depth);
  28. void gsview_gsversion(int new_version);
  29. BOOL gsview_usersize(void);
  30. void gsview_unzoom(void);
  31.  
  32. /* gsview menu commands */
  33. int
  34. gsview_command(int command)
  35. {
  36. char prompt[MAXSTR];        /* input dialog box prompt and message box string */
  37. char answer[MAXSTR];        /* input dialog box answer string */
  38.     switch (command) {
  39.     case IDM_OPEN:
  40.         dfreopen();
  41.         gsview_display();
  42.         dfclose();
  43.         return 0;
  44.     case IDM_CLOSE:
  45.         dfreopen();
  46.             if (gsprog.valid)
  47.             gsview_endfile();
  48.         gsview_unzoom();
  49.         psfile.name[0] = '\0';
  50.         dfclose();
  51.         if (page_list.select)
  52.             free(page_list.select);
  53.         page_list.select = NULL;
  54.         if (doc)
  55.             psfree(doc);
  56.         doc = (PSDOC *)NULL;
  57.         return 0;
  58.     case IDM_NEXT:
  59.         if (not_open())
  60.             return 0;
  61.         if (doc==(PSDOC *)NULL) {
  62.             if (!gs_open())
  63.                 return 0;
  64.             if (is_pipe_done()) {
  65.             play_sound(SOUND_NOPAGE);
  66.             }
  67.             else {
  68.             psfile.pagenum++;
  69.             next_page();
  70.             }
  71.             return 0;
  72.         }
  73.         dfreopen();
  74.         gsview_unzoom();
  75.         dsc_skip(1+page_extra);
  76.         page_extra = 0;
  77.         dfclose();
  78.         return 0;
  79.     case IDM_NEXTSKIP:
  80.         if (not_dsc())
  81.             return 0;
  82.         dfreopen();
  83.         gsview_unzoom();
  84.         dsc_skip(page_skip+page_extra);
  85.         page_extra = 0;
  86.         dfclose();
  87.         return 0;
  88.     case IDM_REDISPLAY:
  89.         if (not_open())
  90.             return 0;
  91.         if (doc==(PSDOC *)NULL) {
  92.             /* don't know where we are so close and reopen */
  93.             if (!is_pipe_done())
  94.             gs_close();
  95.         }
  96.         if (!gs_open())
  97.             return 0;
  98.         dfreopen();
  99.         gsview_unzoom();
  100.         if (display.page)
  101.             next_page(); 
  102.         if ((doc==(PSDOC *)NULL) || (doc->pages==0)) {
  103.             gsview_displayfile(psfile.name);
  104.             dfclose();
  105.             return 0;
  106.         }
  107.         dsc_dopage();
  108.         dfclose();
  109.         return 0;
  110.     case IDM_PREV:
  111.         if (not_dsc())
  112.             return 0;
  113.         dfreopen();
  114.         gsview_unzoom();
  115.         dsc_skip(-1+page_extra);
  116.         page_extra = 0;
  117.         dfclose();
  118.         return 0;
  119.     case IDM_PREVSKIP:
  120.         if (not_dsc())
  121.             return 0;
  122.         dfreopen();
  123.         gsview_unzoom();
  124.         dsc_skip(-page_skip+page_extra);
  125.         page_extra = 0;
  126.         dfclose();
  127.         return 0;
  128.     case IDM_GOTO:
  129.         if (not_dsc())
  130.             return 0;
  131.         dfreopen();
  132.         gsview_unzoom();
  133.         load_string(IDS_TOPICGOTO, szHelpTopic, sizeof(szHelpTopic));
  134.         if (doc->numpages == 0) {
  135.             gserror(IDS_NOPAGE, NULL, MB_ICONEXCLAMATION, SOUND_NONUMBER);
  136.         }
  137.         else if (get_page(&psfile.pagenum, FALSE)) {
  138.             if (psfile.pagenum > doc->numpages) {
  139.             psfile.pagenum = doc->numpages;
  140.             play_sound(SOUND_NOPAGE);
  141.             }
  142.             else if (psfile.pagenum < 1) {
  143.             psfile.pagenum = 1;
  144.             play_sound(SOUND_NOPAGE);
  145.             }
  146.             else {
  147.             if (gs_open()) {
  148.                 if (display.page)
  149.                     next_page();
  150.                 dsc_dopage();
  151.             }
  152.             }
  153.         }
  154.         dfclose();
  155.         return 0;
  156.     case IDM_INFO:
  157.         show_info();
  158.         return 0;
  159.     case IDM_SELECT:
  160.         gsview_select();
  161.         dfclose();
  162.         return 0;
  163.     case IDM_PRINT:
  164.         if (psfile.name[0] == '\0')
  165.             gsview_select();
  166.         dfreopen();
  167.         if (psfile.name[0] != '\0')
  168.             gsview_print(FALSE);
  169.         dfclose();
  170.         return 0;
  171.     case IDM_PRINTTOFILE:
  172.         if (psfile.name[0] == '\0')
  173.             gsview_select();
  174.         dfreopen();
  175.         if (psfile.name[0] != '\0')
  176.             gsview_print(TRUE);
  177.         dfclose();
  178.         return 0;
  179.     case IDM_SPOOL:
  180.         gsview_spool((char *)NULL, (char *)NULL);
  181.         return 0;
  182.     case IDM_SAVEAS:
  183.         if (psfile.name[0] == '\0')
  184.             gsview_select();
  185.         dfreopen();
  186.         if (psfile.name[0] != '\0')
  187.             gsview_saveas();
  188.         dfclose();
  189.         return 0;
  190.     case IDM_EXTRACT:
  191.         if (psfile.name[0] == '\0')
  192.             gsview_select();
  193.         dfreopen();
  194.         if (psfile.name[0] != '\0')
  195.             gsview_extract();
  196.         dfclose();
  197.         return 0;
  198.     case IDM_TEXTEXTRACT:
  199.         if (psfile.name[0] == '\0')
  200.             gsview_select();
  201.         dfreopen();
  202.         if (psfile.name[0] != '\0')
  203.             gsview_text_extract();
  204.         dfclose();
  205.         return 0;
  206.     case IDM_TEXTFIND:
  207.         gsview_text_find();
  208.         return 0;
  209.     case IDM_TEXTFINDNEXT:
  210.         gsview_text_findnext();
  211.         return 0;
  212.     case IDM_EXIT:
  213.         post_close();
  214.         return 0;
  215.     case IDM_COPYCLIP:
  216.         copy_clipboard();
  217.         return 0;
  218.     case IDM_PASTETO:
  219.         paste_to_file();
  220.         return 0;
  221.     case IDM_CONVERT:
  222.         clip_convert();
  223.         return 0;
  224.     case IDM_GSCOMMAND:
  225.         load_string(IDS_GSCOMMAND, prompt, sizeof(prompt));
  226.         strcpy(answer, option.gscommand);
  227.         load_string(IDS_TOPICGSCMD, szHelpTopic, sizeof(szHelpTopic));
  228.         if (get_string(prompt,answer))
  229.             strcpy(option.gscommand, answer);
  230.         if (option.gscommand[0]=='\0')
  231.             strcpy(option.gscommand, DEFAULT_GSCOMMAND);
  232.         return 0;
  233.     case IDM_GS3:
  234.     case IDM_GS261:
  235.         gsview_gsversion(command);
  236.         return 0;
  237.     case IDM_UNITPT:
  238.     case IDM_UNITMM:
  239.     case IDM_UNITINCH:
  240.         gsview_unit(command);
  241.         return 0;
  242.     case IDM_SAFER:
  243.         option.safer = !option.safer;
  244.         check_menu_item(IDM_OPTIONMENU, IDM_SAFER, option.safer);
  245.         return 0;
  246.     case IDM_SAVEDIR:
  247.         option.save_dir = !option.save_dir;
  248.         check_menu_item(IDM_OPTIONMENU, IDM_SAVEDIR, option.save_dir);
  249.         return 0;
  250.     case IDM_BUTTONSHOW:
  251.         option.button_show = !option.button_show;
  252.         check_menu_item(IDM_OPTIONMENU, IDM_BUTTONSHOW, option.button_show);
  253.         show_buttons();
  254.         return 0;
  255.     case IDM_FITPAGE:
  256.         option.fit_page = !option.fit_page;
  257.         check_menu_item(IDM_OPTIONMENU, IDM_FITPAGE, option.fit_page);
  258.         /* should cause WM_SIZE message to be sent */
  259.         return 0;
  260.     case IDM_QUICK:
  261.         option.quick = !option.quick;
  262.         check_menu_item(IDM_OPTIONMENU, IDM_QUICK, option.quick);
  263.         return 0;
  264.     case IDM_AUTOREDISPLAY:
  265.         option.redisplay = !option.redisplay;
  266.         check_menu_item(IDM_OPTIONMENU, IDM_AUTOREDISPLAY, option.redisplay);
  267.         return 0;
  268.     case IDM_EPSFCLIP:
  269.         option.epsf_clip = !option.epsf_clip;
  270.         check_menu_item(IDM_OPTIONMENU, IDM_EPSFCLIP, option.epsf_clip);
  271.         gs_resize();
  272.         return 0;
  273.     case IDM_EPSFWARN:
  274.         option.epsf_warn = !option.epsf_warn;
  275.         check_menu_item(IDM_OPTIONMENU, IDM_EPSFWARN, option.epsf_warn);
  276.         return 0;
  277.     case IDM_IGNOREDSC:
  278.         option.ignore_dsc = !option.ignore_dsc;
  279.         check_menu_item(IDM_OPTIONMENU, IDM_IGNOREDSC, option.ignore_dsc);
  280.         if (psfile.name[0]) {
  281.             if (option.redisplay)
  282.                 gsview_displayfile(psfile.name);
  283.             else
  284.                 gsview_selectfile(psfile.name);
  285.         }
  286.         return 0;
  287.     case IDM_SHOWBBOX:
  288.         option.show_bbox = !option.show_bbox;
  289.         check_menu_item(IDM_OPTIONMENU, IDM_SHOWBBOX, option.show_bbox);
  290. #ifdef _Windows
  291.         PostMessage(hwndimg, WM_GSVIEW, SYNC_OUTPUT, 0L);
  292. #else
  293.         if (!WinInvalidateRect(hwnd_bmp, (PRECTL)NULL, TRUE))
  294.             error_message("error invalidating rect");
  295.           if (!WinUpdateWindow(hwnd_bmp))
  296.             error_message("error updating window");
  297. #endif
  298.         return 0;
  299.     case IDM_PSTOEPS:
  300.         if (psfile.name[0] == '\0')
  301.             gsview_display();
  302.         if (psfile.name[0] != '\0') {
  303.             dfreopen();
  304.             ps_to_eps();
  305.             dfclose();
  306.         }
  307.         return 0;
  308.     case IDM_MAKEEPSI:
  309.         dfreopen();
  310.         make_eps_interchange(FALSE);
  311.         dfclose();
  312.         return 0;
  313.     case IDM_MAKEEPST4:
  314.     case IDM_MAKEEPST:
  315.         dfreopen();
  316.         make_eps_tiff(command);
  317.         dfclose();
  318.         return 0;
  319.     case IDM_MAKEEPSW:
  320.         dfreopen();
  321.         make_eps_metafile();
  322.         dfclose();
  323.         return 0;
  324.     case IDM_EXTRACTPS:
  325.     case IDM_EXTRACTPRE:
  326.         dfreopen();
  327.         extract_doseps(command);
  328.         dfclose();
  329.         return 0;
  330.     case IDM_SETTINGS:
  331.         write_profile();
  332.         return 0;
  333.     case IDM_SAVESETTINGS:
  334.         option.settings = !option.settings;
  335.         check_menu_item(IDM_OPTIONMENU, IDM_SAVESETTINGS, option.settings);
  336.         sprintf(prompt, "%d", option.settings);
  337.         { PROFILE *prf = profile_open(szIniFile);
  338.           profile_write_string(prf, INISECTION, "SaveSettings", prompt);
  339.           profile_close(prf);
  340.         }
  341.         return 0;
  342.     case IDM_SOUNDS:
  343.         change_sounds();
  344.         return 0;
  345.     case IDM_PORTRAIT:
  346.     case IDM_LANDSCAPE:
  347.     case IDM_UPSIDEDOWN:
  348.     case IDM_SEASCAPE:
  349.     case IDM_SWAPLANDSCAPE:
  350.         dfreopen();
  351.         gsview_orientation(command);
  352.         dfclose();
  353.         return 0;
  354.     case IDM_RESOLUTION:
  355.         load_string(IDS_RES, prompt, sizeof(prompt));
  356.         if (option.xdpi == option.ydpi)
  357.             sprintf(answer,"%g", option.xdpi);
  358.         else 
  359.             sprintf(answer,"%g %g", option.xdpi, option.ydpi);
  360.         load_string(IDS_TOPICMEDIA, szHelpTopic, sizeof(szHelpTopic));
  361.         if (get_string(prompt,answer)) {
  362.             switch (sscanf(answer,"%f %f", &option.xdpi, &option.ydpi)) {
  363.               case EOF:
  364.               case 0:
  365.             return 0;
  366.               case 1:
  367.             option.ydpi = option.xdpi;
  368.               case 2:
  369.             if (option.xdpi==0.0)
  370.                 option.xdpi = DEFAULT_RESOLUTION;
  371.             if (option.ydpi==0.0)
  372.                 option.ydpi = DEFAULT_RESOLUTION;
  373.             dfreopen();
  374.             gs_resize();
  375.             gsview_unzoom();
  376.             dfclose();
  377.             }
  378.         }
  379.         return 0;
  380.     case IDM_ZOOMRES:
  381.         load_string(IDS_ZOOMRES, prompt, sizeof(prompt));
  382.         if (option.zoom_xdpi == option.zoom_ydpi)
  383.             sprintf(answer,"%g", option.zoom_xdpi);
  384.         else 
  385.             sprintf(answer,"%g %g", option.zoom_xdpi, option.zoom_ydpi);
  386.         load_string(IDS_TOPICMEDIA, szHelpTopic, sizeof(szHelpTopic));
  387.         if (get_string(prompt,answer)) {
  388.             switch (sscanf(answer,"%f %f", &option.zoom_xdpi, &option.zoom_ydpi)) {
  389.               case EOF:
  390.               case 0:
  391.             return 0;
  392.               case 1:
  393.             option.zoom_ydpi = option.zoom_xdpi;
  394.               case 2:
  395.             if (option.zoom_xdpi==0.0)
  396.                 option.zoom_xdpi = DEFAULT_RESOLUTION;
  397.             if (option.zoom_ydpi==0.0)
  398.                 option.zoom_ydpi = DEFAULT_RESOLUTION;
  399.             dfreopen();
  400.             gsview_unzoom();
  401.             dfclose();
  402.             }
  403.         }
  404.         return 0;
  405.     case IDM_ZOOM:        /* called indirectly from Right Mouse Button */
  406.         if (not_dsc()) {
  407.             zoom = FALSE;
  408.             return 0;
  409.         }
  410.         if (!(display.page || display.sync)) {
  411.             zoom = FALSE;
  412.                 gserror(IDS_NOZOOM, NULL, MB_ICONEXCLAMATION, SOUND_ERROR);
  413.                 return 0;
  414.         }
  415.         dfreopen();
  416.         if (display.page)
  417.             next_page(); 
  418.         gs_resize();
  419.         if ((doc==(PSDOC *)NULL) || (doc->pages==0)) {
  420.             gsview_displayfile(psfile.name);
  421.             dfclose();
  422.             return 0;
  423.         }
  424.         dsc_dopage();
  425.         dfclose();
  426.         return 0;
  427.     case IDM_MAGPLUS:
  428.         gs_magnify(1.2);
  429.         return 0;
  430.     case IDM_MAGMINUS:
  431.         gs_magnify(0.8333);
  432.         return 0;
  433.     case IDM_DEPTHDEF:
  434.     case IDM_DEPTH1:
  435.     case IDM_DEPTH4:
  436.     case IDM_DEPTH8:
  437.     case IDM_DEPTH16:
  438.     case IDM_DEPTH24:
  439.         gsview_depth(command);
  440.         return 0;
  441.     case IDM_LETTER:
  442.     case IDM_LETTERSMALL:
  443.     case IDM_TABLOID:
  444.     case IDM_LEDGER:
  445.     case IDM_LEGAL:
  446.     case IDM_STATEMENT:
  447.     case IDM_EXECUTIVE:
  448.     case IDM_A3:
  449.     case IDM_A4:
  450.     case IDM_A4SMALL:
  451.     case IDM_A5:
  452.     case IDM_B4:
  453.     case IDM_B5:
  454.     case IDM_FOLIO:
  455.     case IDM_QUARTO:
  456.     case IDM_10X14:
  457.     case IDM_USERSIZE:
  458.         if (command == IDM_USERSIZE)
  459.             if (!gsview_usersize())
  460.             return 0;
  461.         dfreopen();
  462.         gsview_media(command);
  463.         dfclose();
  464.         return 0;
  465.     case IDM_HELPCONTENT:
  466. #ifdef _Windows
  467.         WinHelp(hwndimg,szHelpName,HELP_CONTENTS,(DWORD)NULL);
  468. #else
  469.         WinSendMsg(hwnd_help, HM_HELP_CONTENTS, 0L, 0L);
  470. #endif
  471.         return 0;
  472.     case IDM_HELPSEARCH:
  473. #ifdef _Windows
  474.         WinHelp(hwndimg,szHelpName,HELP_PARTIALKEY,(DWORD)"");
  475. #else
  476.         WinSendMsg(hwnd_help, HM_HELP_INDEX, 0L, 0L);
  477. #endif
  478.         return 0;
  479.     case IDM_HELPKEYS:
  480.         load_string(IDS_TOPICKEYS, szHelpTopic, sizeof(szHelpTopic));
  481.         get_help();
  482.         return 0;
  483.     case IDM_ABOUT:
  484.         show_about();
  485.         return 0;
  486.     }
  487.     return 0;
  488. }
  489.  
  490. /* if no document open, display error message and return true */
  491. BOOL
  492. not_open()
  493. {
  494.     if (psfile.name[0] != '\0')
  495.         return FALSE;
  496.     gserror(IDS_NOTOPEN, NULL, MB_ICONEXCLAMATION, SOUND_NOTOPEN);
  497.     return TRUE;
  498. }
  499.  
  500. /* if not DSC document or not open, display error message and return true */
  501. BOOL
  502. not_dsc()
  503. {
  504.     if (not_open())
  505.         return TRUE;
  506.     if (doc!=(PSDOC *)NULL)
  507.         return FALSE;
  508.     gserror(IDS_NOPAGE, NULL, MB_ICONEXCLAMATION, SOUND_NONUMBER);
  509.     return TRUE;
  510. }
  511.  
  512. void
  513. gserror(UINT id, char *str, UINT icon, int sound)
  514. {
  515. int i;
  516. char mess[300];
  517.     info_wait(FALSE);
  518.     if (sound >= 0)
  519.         play_sound(sound);
  520.     i = 0;
  521.     if (id)
  522.         i = load_string(id, mess, sizeof(mess)-1);
  523.     mess[i] = '\0';
  524.     if (str)
  525.         strncpy(mess+i, str, sizeof(mess)-i-1);
  526.     message_box(mess, icon);
  527. }
  528.  
  529. /* for ps.c errors instead of fprintf(stderr,...)! */
  530. void
  531. pserror(char *str)
  532. {
  533.     message_box(str, MB_ICONHAND);
  534. }
  535.  
  536.  
  537. int
  538. not_implemented()
  539. {
  540.     message_box("Not implemented",0);
  541.     return 0;
  542. }
  543.  
  544. /* get user defined size */
  545. BOOL
  546. gsview_usersize()
  547. {
  548. char prompt[MAXSTR];
  549. char answer[MAXSTR];
  550.     load_string(IDS_TOPICMEDIA, szHelpTopic, sizeof(szHelpTopic));
  551.     load_string(IDS_USERWIDTH, prompt, sizeof(prompt));
  552.     sprintf(answer,"%d", option.user_width);
  553.     if (!get_string(prompt,answer) || atoi(answer)==0)
  554.         return FALSE;
  555.     option.user_width = atoi(answer);
  556.         gsview_check_usersize();
  557.     load_string(IDS_USERHEIGHT, prompt, sizeof(prompt));
  558.     sprintf(answer,"%d", option.user_height);
  559.     if (!get_string(prompt,answer) || atoi(answer)==0)
  560.         return FALSE;
  561.     option.user_height = atoi(answer);
  562.     if ((option.user_width==0) || (option.user_height == 0)) {
  563.         option.user_width = 640;
  564.         option.user_width = 480;
  565.     }
  566.         gsview_check_usersize();
  567.     return TRUE;
  568. }
  569.  
  570. void
  571. gsview_check_usersize()
  572. {
  573.     if ( (option.user_width > 2880) || (option.user_height > 4100) ) {
  574.         play_sound(SOUND_ERROR);
  575.         message_box("Warning: media size is wider than 1 metre or higher than 1 metre.  Please check 'Media | User Defined'", 0);
  576.     }
  577. }
  578.  
  579. int
  580. gsview_depth_to_menu(int depth)
  581. {
  582.     switch(depth) {
  583.         case 1:
  584.         return IDM_DEPTH1;
  585.         case 4:
  586.         return IDM_DEPTH4;
  587.         case 8:
  588.         return IDM_DEPTH8;
  589.         case 16:
  590.         return IDM_DEPTH16;
  591.         case 24:
  592.         return IDM_DEPTH24;
  593.     }
  594.     return IDM_DEPTHDEF;
  595. }
  596.  
  597. int imenu[] = {0, 1, 4, 8, 16, 24, 0};
  598. void
  599. gsview_depth(int new_depth)
  600. {
  601. int old_depth;
  602. BOOL redisplay = FALSE;
  603.     switch(option.depth) {
  604.         case 1:
  605.         old_depth = IDM_DEPTH1;
  606.         break;
  607.         case 4:
  608.         old_depth = IDM_DEPTH4;
  609.         break;
  610.         case 8:
  611.         old_depth = IDM_DEPTH8;
  612.         break;
  613.         case 16:
  614.         old_depth = IDM_DEPTH16;
  615.         break;
  616.         case 24:
  617.         old_depth = IDM_DEPTH24;
  618.         break;
  619.         default:
  620.         old_depth = IDM_DEPTHDEF;
  621.     }
  622.     if (new_depth == old_depth)
  623.         return;
  624.     check_menu_item(IDM_DEPTHMENU, old_depth, FALSE);
  625.     option.depth = imenu[new_depth - IDM_DEPTHDEF];
  626.     check_menu_item(IDM_DEPTHMENU, new_depth, TRUE);
  627.     if (gsprog.valid) {
  628.         if (option.redisplay && display.page && (doc != (PSDOC *)NULL))
  629.            redisplay = TRUE;
  630.         /* can't change depth with a postscript command so must close gs */
  631.         gs_close();
  632.         if (redisplay)
  633.         display.do_display = TRUE;
  634.     }
  635.     return;
  636. }
  637.  
  638. /* unzoom when redisplaying or changing page */ 
  639. void
  640. gsview_unzoom(void)
  641. {
  642.     if (zoom) {
  643.         gs_resize();
  644.         zoom = FALSE;
  645.     }
  646. }
  647.  
  648. /* allow GS 2.6.1 to be used with 16-bit GSview */
  649. void
  650. gsview_gsversion(int new_version)
  651. {
  652.     check_menu_item(IDM_GSVERMENU, option.gsversion, FALSE);
  653.     option.gsversion = new_version;
  654.     check_menu_item(IDM_GSVERMENU, option.gsversion, TRUE);
  655.     info_wait(FALSE);
  656.     return;
  657. }
  658.  
  659.