home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 45
/
Amiga_Dream_45.iso
/
Atari
/
Graphics
/
gemgs13.zoo
/
gemgs.c
next >
Wrap
C/C++ Source or Header
|
1992-11-22
|
34KB
|
1,429 lines
/*
* Gem shell for ghostscript.
*/
#include <stdio.h>
#include <string.h>
#include <osbind.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include <dirent.h>
#include "objects.h"
#include "keys.h"
#include "ps.h"
#define MAXLEN 80
#define MAXSTR 30
#define CONFIGFILE "gemgs.rc"
#define PAGEFILE "pspage.ps"
char command[2*MAXLEN]=""; /* command line for programs to be executed */
char device[MAXLEN]=""; /* name of current device */
char res[MAXLEN]=""; /* string containing current resolution */
char geometry[MAXLEN]=""; /* geometry string */
char tempgeom[MAXLEN]; /* temporary geometry string */
char clist[MAXLEN]=""; /* clist string */
char tempclist[MAXLEN]=""; /* temporary clist string */
char pages[MAXLEN]; /* string holding page selections */
char configfile[MAXLEN]; /* name of configuration file */
char devmenu[9][MAXLEN]; /* entries in the device menu */
char resmenu[9][MAXLEN]; /* entries in the resolution menu */
char toolmenu[10][MAXLEN]; /* entries in the tool menu */
char toolexec[MAXLEN]; /* name of tool to be executed */
char temptool[2*MAXLEN]; /* string for tool dialog */
char toolcom[10][MAXLEN]; /* commands for toolmenu selections */
char envvar[MAXSTR][MAXLEN]; /* storage for environment variables */
char line[2*MAXLEN]; /* general use string buffer */
char *commtitle[2] = {"Ghostscript Command Line", /* title strings for */
" Tool Parameters "}; /* command param. dialogs */
char *othertitle[4] = {" Device: ", /* title strings for a */
"Resolution:", /* generic dialog */
" Geometry: ",
"Clist Size:"};
char *sptr; /* general use pointer */
char home_dir[MAXLEN]=""; /* dir gemgs run from */
char current_dir[MAXLEN]=""; /* current directory */
char infile[MAXLEN]=""; /* input file */
char outfile[MAXLEN]=""; /* output file */
char toolfile[MAXLEN]=""; /* file selected for tool */
char papersize[MAXLEN]=""; /* papersize */
int dev_checked=FIRSTDEV+1; /* select first device by default */
int res_checked=FIRSTRES+1; /* select first resolution by default */
int size_checked=FIRSTSIZE+1; /* select first pagesize by default */
int i, j, ret, tool, exit_obj, win_dev=0; /* general variables */
GRECT full; /* GEM related variables */
int x_res, y_res, color_bits;
int cx, cy, cw, ch;
int gem_handle, vdi_handle;
int wchar, hchar, wbox, hbox;
int work_in[11], work_out[57], pxy[4];
int confirm=1, quiet=1, nopause=1; /* default options */
int autoquit=1, pageselect=0, windows=0;
int autorun=0;
FILE *pagein, *pageout; /* variables used in page selection */
int numpages, up_count, up_max;
int lastbut, page_flag[10], inchanged=0;
struct document *docinfo=NULL, *psscan();
main(int argc, char **argv, char **envp)
{
OBJECT *object; /* general object pointer */
char dir_spec[MAXLEN], file_sel[MAXLEN]; /* used for file selector */
char *toolptr, *presub(), *pathfind();
int quit, len, pause, gemtool, changed=1;
int msgbuff[8], exit_but; /* GEM related variables */
int mx, my, mb, mk, key, clicks;
int wait_event, event, button_state, menuitem=0;
/* Append all the command line files together. */
if (argc >= 2) {
strcpy(infile, argv[1]);
}
for(i=2; i<argc; i++) {
strcat(infile, " ");
strcat(infile, argv[i]);
}
/* GEM initialization */
init();
if (autorun) { /* fake menu events for hot keys */
menuitem = RUN;
}
wait_event = MU_MESAG | MU_KEYBD;
button_state = 1;
/* Main event loop */
for (quit=0; !quit;) {
if (menuitem) { /* fake menu events for hot keys */
event = MU_MESAG;
msgbuff[0] = MN_SELECTED;
msgbuff[4] = menuitem;
menuitem = 0;
}
else {
event = evnt_multi(wait_event, 2, 2, button_state,
1, mx, my, 1, 1, 0, 0, 0, 0, 0,
msgbuff, 0L, &mx, &my, &mb, &mk,
&key, &clicks);
}
if (event & MU_KEYBD) { /* hot keys for menus */
if (key == ALT_R) {
menuitem = RUN;
}
else if (key == ALT_I) {
menuitem = INPUT;
}
else if (key == ALT_O) {
menuitem = OUTPUT;
}
else if (key == ALT_Q) {
menuitem = QUIT;
}
else if (key == ALT_G) {
menuitem = GEOMETRY;
}
else if (key == ALT_C) {
menuitem = CLIST;
}
else if (key == ALT_P) {
menuitem = PAGE;
}
}
if (event & MU_MESAG) {
switch (msgbuff[0]) {
case MN_SELECTED:
if (msgbuff[3] != -1) {
menu_tnormal(menubar, msgbuff[3], 1);
}
switch (msgbuff[4]) {
case ABOUT: /* display "about" dialog */
exit_obj = dialog(about);
break;
case RUN: /* build command line and execute GS */
if (changed) {
strcpy(command, "gs.ttp ");
if (quiet || (windows && win_dev)) {
strcat(command, "-q ");
}
if (nopause || (windows && win_dev)) {
strcat(command, "-dNOPAUSE ");
}
if (strlen(clist) && !win_dev) {
strcat(command, "-dBufferSize=");
strcat(command, clist);
strcat(command, " ");
}
if (strlen(device) && strcmp(device, "stvdi")) {
strcat(command, "-sDEVICE=");
strcat(command, device);
strcat(command, " ");
}
if (strlen(papersize) && strcmp(papersize, "Default")) {
strcat(command, "-sPAPERSIZE=");
strcat(command, papersize);
strcat(command, " ");
}
if (strlen(res) && strcmp(res, "Default")) {
strcat(command, "-r");
strcat(command, res);
strcat(command, " ");
}
if (strlen(geometry)) {
strcat(command, "-g");
strcat(command, geometry);
strcat(command, " ");
}
if (strlen(outfile)) {
strcat(command, "-sOUTPUTFILE=");
strcat(command, outfile);
strcat(command, " ");
}
if (pageselect) {
strcat(command, PAGEFILE);
strcat(command, " ");
}
else if (strlen(infile)) {
strcat(command, infile);
strcat(command, " ");
}
if (autoquit || (windows && win_dev)) {
strcat(command, "quit.ps");
}
changed = 0;
}
if (confirm && !autorun) {
commtedinf.te_ptext = command;
commline[1].ob_spec = UL commtitle[0];
if ((exit_obj = dialog(commline)) == RUN_CANCEL) {
changed = 1;
break;
}
}
if (!windows) { /* clear screen if using windows */
v_enter_cur(vdi_handle);
}
else { /* turn menu off and busy bee on */
menu_bar(menubar, 0);
graf_mouse(BUSY_BEE, 0L);
}
/* Execute GS */
ret = system(command);
/* Turn off the cursor, restore the desktop
* background, and then restore the menu bar.
*/
restore_bg();
menu_bar(menubar, 1);
if (ret < 0) {
sprintf(line, "[1][Could not execute %s!][OK]", "gs.ttp");
form_alert(1, line);
}
if (autorun) autorun = 0; /* turn off autorun */
break;
case INPUT:
sprintf(dir_spec, "%s%s", current_dir, "*.PS");
/* If a single input file has been specified,
* make it the default selection. If more than
* one input file exists, or no input is selected,
* use no default.
*/
if (strlen(infile) &&
((sptr = strchr(infile, ' ')) == NULL)) {
if ((sptr = strrchr(infile, '\\')) == NULL)
strcpy(file_sel, infile);
else {
strcpy(file_sel, ++sptr);
}
}
else {
strcpy(file_sel, "");
}
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(infile, dir_spec);
strcat(infile, file_sel);
}
else {
strcpy(infile, "");
}
changed = 1;
inchanged = 1;
}
break;
case OUTPUT:
exit_obj = dialog(output);
switch (exit_obj) {
case CEN_BUT: /* directly to centronics port */
strcpy(outfile, "CEN:");
break;
case PRN_BUT: /* centronics port via gemdos */
strcpy(outfile, "PRN:");
break;
case FILE_BUT: /* output to 'outfile' */
if (!strlen(home_dir)) {
strcpy(home_dir, current_dir);
}
sprintf(dir_spec, "%s%s", home_dir, "*.*");
len = strlen(outfile);
/* Use any selected output file as the default */
if (len != 0 && outfile[len-1] != ':') {
if ((sptr = strrchr(outfile, '\\')) == NULL)
strcpy(file_sel, outfile);
else {
strcpy(file_sel, ++sptr);
}
}
else {
strcpy(file_sel, "");
}
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(outfile, dir_spec);
strcat(outfile, file_sel);
}
else {
strcpy(outfile, "");
}
}
break;
}
changed = 1;
break;
case QUIT:
if (access(PAGEFILE, 0) == 0) {
unlink(PAGEFILE);
}
v_clsvwk(vdi_handle);
appl_exit();
quit = 1;
break;
case FIRSTDEV+1: case FIRSTDEV+2: case FIRSTDEV+3:
case FIRSTDEV+4: case FIRSTDEV+5: case FIRSTDEV+6:
case FIRSTDEV+7: case FIRSTDEV+8: case FIRSTDEV+9:
/* Set the selected device and check/enable the
* appropriate menu items.
*/
menu_icheck(menubar, dev_checked, 0);
dev_checked = msgbuff[4];
menu_icheck(menubar, dev_checked, 1);
object = &menubar[dev_checked];
strcpy(device, (char *)(object->ob_spec + 2));
if (!strcmp(device, "stvdi")) {
win_dev = 1;
menu_ienable(menubar, WINDOWS, 1);
menu_ienable(menubar, CLIST, 0);
}
else {
win_dev = 0;
menu_ienable(menubar, WINDOWS, 0);
menu_ienable(menubar, CLIST, 1);
}
changed = 1;
break;
case LASTDEV:
/* Display a dialog to let the user enter the
* device by hand
*/
othertedinf.te_ptext = devmenu[8];
other[1].ob_spec = UL othertitle[0];
if ((exit_obj = dialog(other)) == OTHER_OK) {
strcpy(device, devmenu[8]);
if (strlen(device)) {
menu_icheck(menubar, dev_checked, 0);
dev_checked = msgbuff[4];
menu_icheck(menubar, dev_checked, 1);
if (!strcmp(device, "stvdi")) {
win_dev = 1;
menu_ienable(menubar, WINDOWS, 1);
menu_ienable(menubar, CLIST, 0);
}
else {
win_dev = 0;
menu_ienable(menubar, WINDOWS, 0);
menu_ienable(menubar, CLIST, 1);
}
}
else { /* use default */
menu_icheck(menubar, dev_checked, 0);
dev_checked = FIRSTDEV+1;
menu_icheck(menubar, dev_checked, 1);
win_dev = 1;
menu_ienable(menubar, WINDOWS, 1);
menu_ienable(menubar, CLIST, 0);
}
changed = 1;
}
break;
case FIRSTRES+1: case FIRSTRES+2: case FIRSTRES+3:
case FIRSTRES+4: case FIRSTRES+5: case FIRSTRES+6:
case FIRSTRES+7: case FIRSTRES+8: case FIRSTRES+9:
/* Set the selected resolution and check/enable
* the appropriate menu items
*/
menu_icheck(menubar, res_checked, 0);
res_checked = msgbuff[4];
menu_icheck(menubar, res_checked, 1);
object = &menubar[msgbuff[4]];
strcpy(res, (char *)(object->ob_spec + 2));
changed = 1;
break;
case LASTRES:
/* Display a dialog to let the user enter the
* resolution by hand
*/
othertedinf.te_ptext = resmenu[8];
other[1].ob_spec = UL othertitle[1];
if ((exit_obj = dialog(other)) == OTHER_OK) {
strcpy(res, resmenu[8]);
if (strlen(res)) {
menu_icheck(menubar, res_checked, 0);
res_checked = msgbuff[4];
menu_icheck(menubar, res_checked, 1);
}
else {
menu_icheck(menubar, res_checked, 0);
res_checked = FIRSTRES+1;
menu_icheck(menubar, res_checked, 1);
}
changed = 1;
}
break;
case FIRSTSIZE+1: case FIRSTSIZE+2: case FIRSTSIZE+3:
case FIRSTSIZE+4: case FIRSTSIZE+5: case FIRSTSIZE+6:
case FIRSTSIZE+7: case FIRSTSIZE+8: case FIRSTSIZE+9:
case FIRSTSIZE+10: case FIRSTSIZE+11: case FIRSTSIZE+12:
case FIRSTSIZE+13: case FIRSTSIZE+14:
/* Set the selected page size and check/enable
* the appropriate menu item
*/
menu_icheck(menubar, size_checked, 0);
size_checked = msgbuff[4];
menu_icheck(menubar, size_checked, 1);
object = &menubar[msgbuff[4]];
strcpy(papersize, (char *)(object->ob_spec + 2));
changed = 1;
break;
case CONFIRM:
menu_icheck(menubar, msgbuff[4], !confirm);
confirm = !confirm;
changed = 1;
break;
case QUIET:
menu_icheck(menubar, msgbuff[4], !quiet);
quiet = !quiet;
changed = 1;
break;
case NOPAUSE:
menu_icheck(menubar, msgbuff[4], !nopause);
nopause = !nopause;
changed = 1;
break;
case AUTOQUIT:
menu_icheck(menubar, msgbuff[4], !autoquit);
autoquit = !autoquit;
changed = 1;
break;
case WINDOWS:
menu_icheck(menubar, msgbuff[4], !windows);
windows = !windows;
/* If windows are selected, set the GS_WIN environment
* variable that instructs ghostscript to use windows.
*/
if (windows) {
ret = putenv("GS_WIN=batch");
}
else {
ret = putenv("GS_WIN=off");
}
changed = 1;
break;
case GEOMETRY:
/* Display a dialog that allows the gemometry to
* be entered by hand.
*/
othertedinf.te_ptext = tempgeom;
other[1].ob_spec = UL othertitle[2];
if ((exit_obj = dialog(other)) == OTHER_OK) {
strcpy(geometry, tempgeom);
if (strlen(geometry)) {
menu_icheck(menubar, msgbuff[4], 1);
}
else {
menu_icheck(menubar, msgbuff[4], 0);
}
changed = 1;
}
break;
case CLIST:
/* Display a dialog that allows the size of the
* clist buffer to be entered by hand.
*/
othertedinf.te_ptext = tempclist;
other[1].ob_spec = UL othertitle[3];
if ((exit_obj = dialog(other)) == OTHER_OK) {
strcpy(clist, tempclist);
if (strlen(clist)) {
menu_icheck(menubar, msgbuff[4], 1);
}
else {
menu_icheck(menubar, msgbuff[4], 0);
}
changed = 1;
}
break;
case PAGE:
/* Display a dialog that allows specific pages
* in a document to be rendered individually.
*/
pagetedinf.te_ptext = pages;
/* If no input file is selected, open a file selector. */
if (!strlen(infile)) {
sprintf(dir_spec, "%s%s", current_dir, "*.PS");
strcpy(file_sel, "");
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(infile, dir_spec);
strcat(infile, file_sel);
}
else {
break;
}
}
}
if ((sptr = pathfind("GS_LIB", infile, ",")) == NULL) {
sprintf(line, "[1][Could not find %s!][OK]", infile);
form_alert(1, line);
break;
}
else if ((pagein = fopen(sptr, "r")) == NULL) {
sprintf(line, "[1][Could not open %s!][OK]", sptr);
form_alert(1, line);
break;
}
graf_mouse(BUSY_BEE, 0L);
/* If the input file has not been scanned, search it
* for page information.
*/
if (docinfo == NULL || inchanged) {
docinfo = psscan(pagein);
}
if (docinfo == NULL || docinfo->numpages == 0
|| docinfo->pageorder == SPECIAL) {
sprintf(line, "[1][%s|%s|%s|%s][OK]",
"Page information cannot be",
"extracted from this file.",
"It probably does not conform",
"to Adobe structuring conventions.");
graf_mouse(ARROW, 0L);
form_alert(1, line);
pageselect = 0;
menu_icheck(menubar, msgbuff[4], 0);
break;
}
fclose(pagein);
graf_mouse(ARROW, 0L);
numpages = docinfo->numpages;
/* If page information has been successfully
* extracted, display a dialog to allow page
* selection.
*/
if ((exit_obj = page_dialog()) == PAGE_OK) {
if (strlen(pages)) {
pageselect = 1;
menu_icheck(menubar, msgbuff[4], 1);
graf_mouse(BUSY_BEE, 0L);
ret = page_filter(infile, pages, PAGEFILE);
graf_mouse(ARROW, 0L);
}
else {
pageselect = 0;
menu_icheck(menubar, msgbuff[4], 0);
}
}
changed = 1;
break;
case FIRSTOOL+1: case FIRSTOOL+2:
case FIRSTOOL+3: case FIRSTOOL+4:
case FIRSTOOL+5: case FIRSTOOL+6:
case FIRSTOOL+7: case FIRSTOOL+8:
case FIRSTOOL+9: case FIRSTOOL+10:
/* Process the command line for the selected
* tool program and then execute it.
*/
tool = msgbuff[4] - FIRSTOOL - 1;
toolptr = presub(toolcom[tool], " ");
strcpy(toolexec, toolptr);
strcpy(command, toolptr);
strcat(command, " ");
pause = 0;
gemtool = 0;
while ((toolptr = presub(NULL, " ")) != NULL) {
if (!strcmp(toolptr, "infile")) {
/* If the command line contains "infile",
* use/get the input file.
*/
if (!strlen(infile) || strchr(infile, ' ')) {
sprintf(dir_spec, "%s%s", current_dir, "*.*");
strcpy(file_sel, "");
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(infile, dir_spec);
strcat(infile, file_sel);
}
else {
strcpy(infile, "");
}
}
}
strcat(command, infile);
strcat(command, " ");
}
else if (!strcmp(toolptr, "outfile")) {
/* If the command line contains "outfile",
* use/get the output file.
*/
if (!strlen(outfile) || strchr(outfile, ' ')) {
if (!strlen(home_dir)) {
strcpy(home_dir, current_dir);
}
sprintf(dir_spec, "%s%s", home_dir, "*.*");
strcpy(file_sel, "");
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(outfile, dir_spec);
strcat(outfile, file_sel);
}
else {
strcpy(outfile, "");
}
}
}
strcat(command, outfile);
strcat(command, " ");
}
else if (!strcmp(toolptr, "fsel")) {
/* If the command line contains "fsel",
* display a file selector.
*/
if (!strlen(home_dir)) {
strcpy(home_dir, current_dir);
}
sprintf(dir_spec, "%s%s", home_dir, "*.*");
strcpy(file_sel, "");
ret = fsel_input(dir_spec, file_sel, &exit_but);
if (exit_but) {
if (strlen(file_sel)) {
sptr = strrchr(dir_spec, '\\');
*++sptr = '\0';
strcpy(current_dir, dir_spec);
strcpy(toolfile, dir_spec);
strcat(toolfile, file_sel);
}
else {
strcpy(toolfile, "");
}
}
strcat(command, toolfile);
strcat(command, " ");
}
else if (!strcmp(toolptr, "dialog")) {
/* If the command line contains "dialog",
* display a dialog for entry of command
* line parameters.
*/
commtedinf.te_ptext = temptool;
commline[1].ob_spec = UL commtitle[1];
if ((exit_obj = dialog(commline)) != RUN_CANCEL) {
strcat(command, temptool);
strcat(command, " ");
}
strcpy(temptool, "");
}
else if (!strcmp(toolptr, "pause")) {
/* If the command line contains "pause",
* set a flag to pause after program
* execution.
*/
pause = 1;
}
else if (!strcmp(toolptr, "gem")) {
/* If the command line contains "gem",
* set a flag to initialize the screen
* and mouse before execution.
*/
gemtool = 1;
}
else {
/* Put all other command line arguments
* in the command line for the tool.
*/
strcat(command, toolptr);
strcat(command, " ");
}
}
/* Fake a dialog that covers the screen, so that
* the background can be restored when GS exits.
* Then clear the screen.
*/
/* form_dial(FMD_START, 0, 0, wchar, hchar, 0, 0, x_res, y_res);
*/
menu_bar(menubar, 0);
if (!gemtool) {
v_enter_cur(vdi_handle);
}
/* Execute tool */
ret = system(command);
if (pause) {
puts("\nPress RETURN to continue.");
getchar();
}
/* Turn off the cursor, restore the desktop
* background, and then restore the menu bar.
*/
#if 0
v_exit_cur(vdi_handle);
form_dial(FMD_FINISH, 0, 0, wchar, hchar, 0, 0, x_res, y_res);
#endif
restore_bg();
menu_bar(menubar, 1);
if (ret < 0) {
sprintf(line, "[1][Could not execute %s!][OK]",
toolexec);
form_alert(1, line);
}
pause = 0;
changed = 1;
break;
}
break;
}
} /* end if (event & MU_MESAG) */
} /* end for(;;) */
exit(0);
}
/* Init takes care of GEM and other initializations. */
int init()
{
DIR *dfp; /* Pointer to directory structure. */
int ii;
/* Standard GEM initialization. */
if (appl_init() == -1) return 0;
for (ii=0; ii<10; ii++) work_in[ii] = 1;
work_in[10] = 2;
gem_handle = graf_handle(&wchar, &hchar, &wbox, &hbox);
vdi_handle = gem_handle;
v_opnvwk(work_in, &vdi_handle, work_out);
if (vdi_handle == 0) return 0;
/* Save the screen resolution and number of color planes. */
x_res = work_out[0];
y_res = work_out[1];
vq_extnd(vdi_handle, 1, work_out);
color_bits = work_out[4];
wind_get(0, WF_WORKXYWH, &full.g_x, &full.g_y, &full.g_w, &full.g_h);
/* Adjust the sizes of all objects for the current
* screen resolution.
*/
objc_fix(menubar);
objc_fix(about);
objc_fix(commline);
objc_fix(output);
objc_fix(other);
objc_fix(pagedial);
restore_bg(); /* restore the desktop background */
menu_bar(menubar, 1);
/* Find the current directory. */
getcwd(home_dir, MAXLEN);
while ((sptr = strchr(home_dir, '/')) != NULL) {
*sptr = '\\'; /* change forward to backward slashes */
}
strcat(home_dir, "\\");
strcpy(current_dir, home_dir);
read_config(); /* read the configuration file */
}
/* Process a generic dialog. */
int dialog(OBJECT *object)
{
int exit_but;
form_center(object, &cx, &cy, &cw, &ch);
form_dial(FMD_START, 0, 0, wchar, hchar, cx, cy, cw, ch);
objc_draw(object, 0, 5, cx, cy, cw, ch);
exit_but = form_do(object, 0);
form_dial(FMD_FINISH, 0, 0, wchar, hchar, cx, cy, cw, ch);
objc_change(&object[exit_but], 0, 0, cx, cy, cw, ch, NORMAL, 0);
return exit_but;
}
/* Read the configuration file. */
int read_config()
{
FILE *config;
OBJECT *object;
char *pathfind();
int newdev=0, newres=0, newtool=0, newenv=0;
unsigned long len;
/* Look for the configuration file in the current and HOME directories. */
if ((sptr = pathfind("HOME", CONFIGFILE, ",")) != NULL) {
strcpy(configfile, sptr);
}
else {
sprintf(line, "[1][Could not find %s!][OK]", CONFIGFILE);
form_alert(1, line);
goto menu;
}
if ((config = fopen(configfile, "r")) == NULL) {
sprintf(line, "[1][Could not open %s!][OK]", CONFIGFILE);
form_alert(1, line);
goto menu;
}
/* Process the information in the config file. */
while (fgets(line, 2*MAXLEN-1, config) != NULL) {
#if 0
if (strlen(line) > 3) {
printf("%x\n", line[strlen(line)+1]);
printf("%x\n", line[strlen(line)]);
printf("%x\n", line[strlen(line)-1]);
printf("%x\n", line[strlen(line)-2]);
getchar();
}
#endif
line[strlen(line)-1] = '\0';
if (!strncmp(line, "device ", 7)) {
strcpy(device, line+7);
}
if (!strncmp(line, "resolution ", 11)) {
strcpy(res, line+11);
}
if (!strncmp(line, "geometry ", 9)) {
strcpy(geometry, line+9);
strcpy(tempgeom, line+9);
}
if (!strncmp(line, "clist ", 6)) {
strcpy(clist, line+6);
strcpy(tempclist, line+6);
}
if (!strncmp(line, "confirm ", 8)) {
confirm = atoi(line+8);
}
if (!strncmp(line, "quiet ", 6)) {
quiet = atoi(line+6);
}
if (!strncmp(line, "nopause ", 8)) {
nopause = atoi(line+8);
}
if (!strncmp(line, "autoquit ", 9)) {
autoquit = atoi(line+9);
}
if (!strncmp(line, "autorun ", 8)) {
if (strlen(infile)) {
autorun = atoi(line+8);
}
}
if (!strncmp(line, "papersize ", 10)) {
strcpy(papersize, line+10);
}
if (!strncmp(line, "windows ", 8)) {
windows = atoi(line+8);
if (windows) {
ret = putenv("GS_WIN=batch");
}
}
if (!strncmp(line, "setenv ", 7)) {
strcpy(envvar[newenv], line+7);
ret = putenv(envvar[newenv++]);
}
if (!strncmp(line, "devmenu ", 8)) {
strcpy(devmenu[newdev], " ");
strcat(devmenu[newdev], line+8);
object = &menubar[FIRSTDEV];
object->ob_height += hchar;
object = &menubar[FIRSTDEV + newdev + 1];
object->ob_next = FIRSTDEV + newdev + 2;
++object;
object->ob_next = LASTDEV;
object->ob_state = 0;
object->ob_spec = UL devmenu[newdev];
object = &menubar[LASTDEV];
object->ob_y += hchar;
++newdev;
}
if (!strncmp(line, "resmenu ", 8)) {
strcpy(resmenu[newres], " ");
strcat(resmenu[newres], line+8);
object = &menubar[FIRSTRES];
object->ob_height += hchar;
object = &menubar[FIRSTRES + newres + 1];
object->ob_next = FIRSTRES + newres + 2;
++object;
object->ob_next = LASTRES;
object->ob_state = 0;
object->ob_spec = UL resmenu[newres];
object = &menubar[LASTRES];
object->ob_y += hchar;
++newres;
}
if (!strncmp(line, "toolmenu ", 9)) {
sptr = strchr(line+9, ' ');
if (sptr == NULL) continue;
len = sptr - (line+9);
strcpy(toolmenu[newtool], " ");
strncat(toolmenu[newtool], line+9, len);
strcpy(toolcom[newtool], sptr+1);
object = &menubar[FIRSTOOL];
if (newtool == 0) {
++object;
object->ob_state = 0;
object->ob_spec = UL toolmenu[newtool];
}
else {
object->ob_tail = FIRSTOOL + newtool + 1;
object->ob_height += hchar;
object = &menubar[FIRSTOOL + newtool];
object->ob_next = FIRSTOOL + newtool + 1;
object = &menubar[FIRSTOOL + newtool + 1];
object->ob_next = FIRSTOOL;
object->ob_state = 0;
object->ob_spec = UL toolmenu[newtool];
}
++newtool;
}
}
menu: /* Check and enable all the appropriate menu entries. */
if (!windows && (sptr = getenv("GS_WIN")) != NULL) {
if (!strcmp(sptr, "batch")) {
windows = 1;
}
}
menu_icheck(menubar, CONFIRM, confirm);
menu_icheck(menubar, QUIET, quiet);
menu_icheck(menubar, NOPAUSE, nopause);
menu_icheck(menubar, AUTOQUIT, autoquit);
menu_icheck(menubar, WINDOWS, windows);
menu_icheck(menubar, GEOMETRY, strlen(geometry) ? 1 : 0);
menu_icheck(menubar, CLIST, strlen(clist) ? 1 : 0);
/* If the device was not set in the config file, check the GS_DEVICE
* environment variable.
*/
if (!strlen(device) && ((sptr = getenv("GS_DEVICE")) != NULL)) {
strcpy(device, sptr);
}
if (strlen(device) && strcmp(device, "stvdi")) {
menu_icheck(menubar, FIRSTDEV+1, 0);
menu_ienable(menubar, WINDOWS, 0);
for (i=0; strcmp(device, devmenu[i]+2) && i<8; i++);
dev_checked = FIRSTDEV+2+i;
menu_icheck(menubar, dev_checked, 1);
if (i == 8) strcpy(devmenu[8], device);
}
else {
win_dev = 1;
menu_ienable(menubar, CLIST, 0);
}
if (strlen(res)) {
menu_icheck(menubar, FIRSTRES+1, 0);
for (i=0; strcmp(res, resmenu[i]+2) && i<8; i++);
res_checked = FIRSTRES+2+i;
menu_icheck(menubar, res_checked, 1);
if (i == 8) strcpy(resmenu[8], res);
}
if (strlen(papersize)) {
menu_icheck(menubar, FIRSTSIZE+1, 0);
for (i=FIRSTSIZE+1;
strcmp(papersize, (char *)(menubar[i].ob_spec+2))
&& i<=LASTSIZE; i++);
size_checked = i;
menu_icheck(menubar, size_checked, 1);
}
fclose(config);
}
/* Restore the usual desktop background. */
int restore_bg()
{
puts("\033f");
v_hide_c(vdi_handle);
form_dial(FMD_FINISH, 0, 0, 8, 16, 0, 0, x_res, y_res);
graf_mouse(ARROW, 0L);
v_show_c(vdi_handle, 0);
}
/* Adjust the size of an object for the current screen resolution. */
int objc_fix(OBJECT *object)
{
int i=-1;
do {
i++;
if (object[i].ob_x == 769) object[i].ob_x = full.g_y;
else if (object[i].ob_x == 513) object[i].ob_x = full.g_y;
else object[i].ob_x *= wchar;
if (object[i].ob_y == 769) object[i].ob_y = full.g_y;
else if (object[i].ob_y == 513) object[i].ob_y = full.g_y;
else object[i].ob_y *= hchar;
if (object[i].ob_width == 769) object[i].ob_width = full.g_y;
else if (object[i].ob_width == 513) object[i].ob_width = full.g_y;
else if (object[i].ob_width == 80) object[i].ob_width = full.g_w;
else object[i].ob_width *= wchar;
if (object[i].ob_height == 769) object[i].ob_height = full.g_y;
else if (object[i].ob_height == 513) object[i].ob_height = full.g_y;
else object[i].ob_height *= hchar;
}
while (!(object[i].ob_flags & LASTOB));
}
/* Update the objects found in the page selection dialog. */
int update_objects()
{
if (up_count == up_max) {
lastbut = FIRSTBUT + (int)(fmod(numpages, 10) - .9);
}
else {
lastbut = LASTBUT;
}
for (i=FIRSTBUT, j=0; i<=LASTBUT; i++, j++) {
if (i<=lastbut) {
pagedial[i].ob_flags = 1; /* selectable */
pagedial[i].ob_state = 0; /* enabled */
if (page_flag[up_count] & (int)ldexp(1,j)) {
pagedial[i].ob_state = SELECTED;
}
}
else {
pagedial[i].ob_flags = 0; /* not selectable */
pagedial[i].ob_state = 0x08; /* disabled */
}
}
if (up_count == 0) {
pagedial[LASTBUT+1].ob_flags = 0; /* not selectable */
pagedial[LASTBUT+1].ob_state = 0x08; /* disabled */
}
else {
pagedial[LASTBUT+1].ob_flags = 0x41; /* selectable */
pagedial[LASTBUT+1].ob_state = 0; /* enabled */
}
if (up_count == up_max) {
pagedial[LASTBUT+2].ob_flags = 0; /* not selectable */
pagedial[LASTBUT+2].ob_state = 0x08; /* disabled */
}
else {
pagedial[LASTBUT+2].ob_flags = 0x41; /* selectable */
pagedial[LASTBUT+2].ob_state = 0; /* enabled */
}
}
/* Unselect all the objects in the page selection dialog. */
int clear_objects()
{
char *itoa();
for (i=FIRSTBUT; i<=lastbut; i++) {
pagedial[i].ob_state = 0;
}
for (i=0; i<=up_max; i++) {
page_flag[i] = 0;
}
strcpy(pages, "");
for (i=FIRSTBUT; i<=LASTBUT; i++) {
itoa((char *)pagedial[i].ob_spec,
atoi((char *)pagedial[i].ob_spec)-10*up_count);
}
up_count = 0;
objc_change(&pagedial[exit_obj], 0, 0, cx, cy, cw, ch, NORMAL, 0);
}
/* Handle the user interaction with the page dialog. */
int page_dialog()
{
char *itoa();
int pagequit=0;
if (inchanged) {
clear_objects();
inchanged = 0;
}
up_max = (numpages - 1)/10;
sprintf((char *)pagedial[1].ob_spec, "There are %d pages.", numpages);
/* Set the initial state of the objects. */
update_objects();
/* Handle dialog interaction. */
while (!pagequit && (exit_obj = dialog(pagedial))) {
page_flag[up_count] = 0;
/* Save selections and clear objects. */
for (i=FIRSTBUT, j=0; i<=lastbut; i++, j++) {
if (pagedial[i].ob_state & SELECTED) {
page_flag[up_count] |= (int)ldexp(1,j);
pagedial[i].ob_state = 0;
}
}
switch (exit_obj) {
case PAGE_UP:
up_count++;
for (i=FIRSTBUT; i<=LASTBUT; i++) {
itoa((char *)pagedial[i].ob_spec,
atoi((char *)pagedial[i].ob_spec)+10);
}
break;
case PAGE_DN:
up_count--;
for (i=FIRSTBUT; i<=LASTBUT; i++) {
itoa((char *)pagedial[i].ob_spec,
atoi((char *)pagedial[i].ob_spec)-10);
}
break;
case PAGE_CLEAR:
clear_objects();
break;
case PAGE_CANCEL:
pagequit = 1;
break;
case PAGE_OK:
if (!strlen(pages)) {
for (i=0; i<=up_max; i++) {
for (j=0; j<=(LASTBUT-FIRSTBUT); j++) {
if (page_flag[i] & (int)ldexp(1,j)) {
int pagenum;
pagenum = (j+1) + 10*i;
if (!strlen(pages)) {
strcpy(pages, itoa(line, pagenum));
}
else {
strcat(pages, ",");
strcat(pages, itoa(line, pagenum));
}
}
}
}
}
pagequit = 1;
break;
}
/* Set object states for this value of up_count. */
update_objects();
}
return exit_obj;
}