/* * Gem shell for ghostscript. */ #include #include #include #include #include #include #include #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; iob_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; }