richb@sunaus.sun.oz.AU (Rich Burridge) (12/13/89)
Posting-number: Volume 9, Issue 51 Submitted-by: Rich Burridge <richb@sunaus.sun.oz.AU> Archive-name: popi/part05 ---- Cut Here and unpack ---- #!/bin/sh # this is part 5 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file special.c continued # CurArch=5 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file special.c" sed 's/^X//' << 'Funky_Stuff' >> special.c X { "write", writeimg }, X { "genps", genps }, X { "genepson", genepson }, X { "list", list }, X { "display", displayimg }, X { "debug", debug }, X { "version", version }, X { "verbose", verbose }, X { "truncate", trunc }, X { "undo", undo }, X { "help", help }, X { "free", freeimg }, X { "logfile", dolog }, X { (char *) 0, (void (*) P((void)) ) 0 } X}; X Xvoid Xspecial() X{ X struct SpecialOp *sp; X X DEBUG((Debug, "special\n")); X lex(); X if (! (lat == NAME || isalpha(lat))) X { X SPRINTF(ErrBuf, "Expected name of special operation"); X error(ERR_PARSE); X return; X } X X sp = SpecialOps; X for (sp = SpecialOps; sp->name && strcmp(text, sp->name) != 0; ++sp) X ; X X if (! sp->name) X { X SPRINTF(ErrBuf, X "Special operation '%s' unrecognised", X text); X error(ERR_PARSE); X return; X } X X DEBUG((Debug, "calling func '%s'\n", sp->name)); X (*(sp->func))(); X X if (lat != '\n') X lex(); X X if (lat != '\n') X { X SPRINTF(ErrBuf, "Tokens after special command ignored"); X error(ERR_WARN); X } X X assert(lat == '\n'); X} Funky_Stuff echo "File special.c is complete" chmod 0444 special.c || echo "restore of special.c fails" set `wc -c special.c`;Sum=$1 if test "$Sum" != "18870" then echo original size 18870, current size $Sum;fi echo "x - extracting graphics.c (Text)" sed 's/^X//' << 'Funky_Stuff' > graphics.c && X X/* @(#)graphics.c 1.10 89/12/11 X * X * Independent graphics routines associated with the popi program. X * X * Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs. X * This version is based on the code in his Prentice Hall book, X * "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7, X * which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. X * X * Permission is given to distribute these extensions, as long as these X * introductory messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if reported X * (see README file) then an attempt will be made to fix them. X */ X X#include "popi.h" X#include "graphics.h" X X#define RES 8 X Xchar nextline[MAXLINE] ; /* Next input line to be parsed. */ X Xunsigned char *mptr ; /* Pointer to scanline data. */ X Xint errpos = -1 ; /* Character position error occured at. */ Xint iscolor ; /* Set if this is a color screen. */ Xint ix = 0 ; /* Initial X position of the icon. */ Xint iy = 0 ; /* Initial Y position of the icon. */ Xint nfont_width ; /* Width of normal font characters. */ Xint ops[MAXOPS] ; /* Rasterop functions. */ Xint posspec = 0 ; /* Set if -g option is present (for X11) */ Xint started = 0 ; /* Set if we've drawn the percent dialog box. */ Xint tptr = 0 ; /* Input buffer pointer. */ Xint wx = 0 ; /* Initial X position of the open window. */ Xint wy = 0 ; /* Initial Y position of the open window. */ X Xint thresh[RES][RES] = { /* Array containing threshold values. */ X { 0, 128, 32, 160, 8, 136, 40, 168, }, X { 192, 64, 224, 96, 200, 72, 232, 104, }, X { 48, 176, 16, 144, 56, 184, 24, 152, }, X { 240, 112, 208, 80, 248, 120, 216, 88, }, X { 12, 140, 44, 172, 4, 132, 36, 164, }, X { 204, 76, 236, 108, 196, 68, 228, 100, }, X { 60, 188, 28, 156, 52, 180, 20, 148, }, X { 252, 124, 220, 92, 244, 116, 212, 84, }, X} ; X Xextern int errno ; Xextern char *sys_errlist[] ; X X X/* There are ten exportable routines used by the popi program. X * X * These are: X * X * disp_init(argc, argv) - called from main at the start. X * disp_finish() - called from main prior to exit. X * disp_imgstart() - called prior to drawing an image. X * disp_imgend() - called after drawing an image. X * disp_putline(line, y) - to draw an image scanline. X * disp_getchar() - to get the next character typed. X * disp_ungetc(c) - put back the last character typed. X * disp_prompt() - display popi prompt and clear input buffer. X * disp_error(errtype, pos) - display error message. X * disp_percentdone(n) - display percentage value of conversion. X */ X X Xvoid Xdisp_init(argc, argv) /* Called from main at the start. */ Xint argc ; Xchar *argv[] ; X{ X if (init_ws_type()) /* Determine window system type. */ X { X FPRINTF(stderr, "Error initialising window system.\n") ; X exit(1) ; X } X init_fonts() ; /* Open required fonts. */ X make_items(argc, argv) ; /* Create icon, frame, canvas etc.. */ X paint_canvas() ; /* Draw dialog boxes. */ X start_tool() ; X} X X Xvoid Xdisp_finish() /* Called from main prior to exit. */ X{ X cleanup() ; X} X X Xvoid Xdisp_imgstart() /* Called prior to drawing an image. */ X{ X} X X Xvoid Xdisp_imgend() /* Called after drawing an image. */ X{ X} X X Xvoid Xdisp_putline(line, y) /* Draw an image scanline. */ Xunsigned char *line ; Xint y ; X{ X draw_scanline(line, y) ; X} X X Xdisp_getchar() /* Get next user typed character. */ X{ X char c ; X int finished = 0 ; X X if (tptr >= strlen(nextline)) X { X while (!finished) X { X get_next_char(&c) ; /* Get next character typed. */ X if (c == '\0') continue ; X if (errpos != -1) X { X drawarea(BOXX+100+errpos*nfont_width, BOXY+BOXH-9, X nfont_width, 4, GCLR) ; X drawarea(BOXX+91, BOXY+51, BOXW-102, BOXH-22, GCLR) ; X errpos = -1 ; X } X if (c == BACKSPACE || c == DEL) X nextline[strlen(nextline)-1] = '\0' ; X else if (c == RETURN || c == LINEFEED) X { X set_cursor(BUSY_CUR) ; /* We will now get busy! */ X c = '\n' ; X STRNCAT(nextline, &c, 1) ; X finished = 1 ; X } X else if (c >= 32) STRNCAT(nextline, &c, 1) ; X drawarea(BOXX+91, BOXY+11, BOXW-102, BOXH-22, GCLR) ; X put_text(BOXX, BOXY, BOXW, BOXH, nextline, 1) ; X } X tptr = 0 ; X } X return(nextline[tptr++]) ; X} X X X/*ARGSUSED*/ Xvoid Xdisp_ungetc(c) /* Put back the last character typed. */ Xchar c ; X{ X tptr-- ; X} X X Xdisp_prompt() /* Display popi prompt and clear input line. */ X{ X set_cursor(NORMAL_CUR) ; X if (errpos == -1) drawarea(BOXX+91, BOXY+11, BOXW-102, BOXH-22, GCLR) ; X STRCPY(nextline, "") ; X tptr = 0 ; X return 0 ; X} X X Xvoid Xdisp_error(errtype, pos) /* Display error message. */ Xint errtype ; Xint pos ; X{ X errpos = pos ; X if (errtype & ERR_PARSE) X drawarea(BOXX+100+errpos*nfont_width, BOXY+BOXH-9, X nfont_width, 4, GSET) ; X X put_text(BOXX, BOXY+40, BOXW, BOXH, ErrBuf, 0) ; X X/* We assume errno hasn't been reset by the preceding output */ X X if (errtype & ERR_SYS) X { X sleep(2) ; X SPRINTF(ErrBuf, "\t(%s)\n", sys_errlist[errno]) ; X drawarea(BOXX+91, BOXY+51, BOXW-102, BOXH-22, GCLR) ; X put_text(BOXX, BOXY+40, BOXW, BOXH, ErrBuf, 0) ; X } X} X X/* These are other independent graphics routines used by popi. */ X Xdraw_frame(x, y, width, height) Xint x, y, width, height ; X{ X drawarea(x, y, width, height, GSET) ; X drawarea(x+1, y+1, width-2, height-2, GCLR) ; X drawarea(x+3, y+3, width-6, height-6, GSET) ; X drawarea(x+5, y+5, width-10, height-10, GCLR) ; X} X X X/* Display a text box of given width and height with top left corner at X * the given x,y location, displaying a title and the given text value. X */ X Xdraw_textbox(x, y, w, h, title, str, showcur) Xint x, y, w, h, showcur ; Xchar *title, *str ; X{ X draw_frame(x, y, w, h) ; X drawtext(x+10, y+h-15, BFONT, title) ; X draw_rect(x+90, y+10, x+w-10, y+h-10) ; X put_text(x, y, w, h, str, showcur) ; X} X X Xdraw_rect(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X drawline(x1, y1, x2, y1) ; X drawline(x1, y1, x1, y2) ; X drawline(x2, y1, x2, y2) ; X drawline(x1, y2, x2, y2) ; X} X X Xhalftone(line, y) /* Halftone 8bit scanline image. */ Xunsigned char *line ; Xint y ; X{ X int x ; X X for (x = 0; x < Xsize; x++) X if (line[x] < thresh[y % RES][x % RES]) X mptr[x / 8] |= (1 << (7 - (x % 8))) ; /* Set pixel black. */ X else mptr[x / 8] &= ~(1 << (7 - (x % 8))) ; /* Set pixel white. */ X} X X X/* Paint the contents of the popi canvas. This consists of first clearing X * the whole canvas, then drawing a line to distinguish between the image X * drawing area and the command feedback area. Two text boxes are then X * drawn, one for user input and the other to shown any error messages. X */ X Xpaint_canvas() X{ X drawarea(0, 0, TWIDTH, THEIGHT, GCLR) ; X drawline(0, 99, TWIDTH, 99) ; X draw_textbox(BOXX, BOXY, BOXW, BOXH, "Command:", nextline, 1) ; X draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "Error:", "", 0) ; X} X X X/* With the screen based window systems, display the character string X * str at the given x,y location. The width of the dialog box is given, X * so that if the text exceeds the displayable area, it is scrolled to X * the left. A soft cursor in the form of a vertical line is shown if X * so requested. X */ X Xput_text(x, y, w, h, str, showcur) Xint x, y, w, h ; Xchar *str ; X{ X char dummy[MAXLINE] ; X int limit, nochars ; X X limit = ((w - 100) / nfont_width) - 1 ; X nochars = (strlen(str) <= limit) ? strlen(str) : limit ; X STRNCPY(dummy, &str[strlen(str) - nochars], nochars) ; X X dummy[nochars] = '\0' ; X drawtext(x+100, y+h-17, NFONT, dummy) ; X if (showcur) X drawline(x+100+strlen(dummy)*nfont_width, y+15, X x+100+strlen(dummy)*nfont_width, y+h-15) ; X} X X X/* Show the percentage of the image converted as a graphical slider using X * the error dialog box. If the percentage is zero, then we are just starting, X * so the box is relabeled (to % done:). If the percentage is 100, then we X * are just finishing, and the box is relabel back (to Error:), and cleared. X * Otherwise we show an intermediate percentage value. X */ X Xvoid Xdisp_percentdone(percent) Xint percent ; X{ X if (!percent) X { X if (!started) X draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "% done:", "", 0) ; X started = 1 ; X } X else if (percent == 100) X { X if (started) X draw_textbox(BOXX, BOXY+40, BOXW, BOXH, "Error:", "", 0) ; X started = 0 ; X } X else X drawarea(BOXX+91, BOXY+51, X (int) ((double) (BOXW-102) / 100 * percent), BOXH-20, GSET) ; X} Funky_Stuff chmod 0444 graphics.c || echo "restore of graphics.c fails" set `wc -c graphics.c`;Sum=$1 if test "$Sum" != "9099" then echo original size 9099, current size $Sum;fi echo "x - extracting lex.c (Text)" sed 's/^X//' << 'Funky_Stuff' > lex.c && X/* @(#)lex.c 1.9 89/12/11 X * X * Lexical routines used by the popi program. X * X * Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs. X * This version is based on the code in his Prentice Hall book, X * "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7, X * which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. X * X * Permission is given to distribute these extensions, as long as these X * introductory messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if reported X * (see README file) then an attempt will be made to fix them. X */ X X#include <stdio.h> X#include <ctype.h> X#include <math.h> X#include "popi.h" X X/* prototypes for local functions */ Xint Getch P((void)); Xint getnumber P((int)); Xint getstring P((int)); Xint follow P((int, int, int)); X Xint CharPos = 0, /* Current character pos on input line */ X OldPos = 0, /* previous character pos on input line */ X TokPos = 0; /* position of the beginning of the current token */ Xchar ErrBuf[256]; Xdouble lexfract; Xdouble hypot(); X Xstatic int XGetch() X{ X int c; X X c = disp_getchar(); X X OldPos = CharPos; X X if (c == '\t') X CharPos = (CharPos - 1) % 8 + 8; X else if (c == '\n') X CharPos = 0; X else X ++CharPos; X X DEBUG((Debug, "Getch() => '%c'\n", c)); X X if (LogStr) X PUTC(c, LogStr); X X return c; X} X X/* Skip to the end of the line */ Xvoid XSkip() X{ X while (lat != '\n' && lat != EOF) X lat = Getch(); X lat = '\n'; X} X Xvoid Xerror(errtype) Xint errtype; X{ X DEBUG((Debug, "error: type %d, pos %d msg '%s'\n", errtype, TokPos, ErrBuf)); X if (!noerr) /* Already printed a message */ X return; X disp_error(errtype, TokPos); X Skip(); X noerr = FALSE; /* an error has occurred */ X X if (LogStr) X FPRINTF(LogStr, "Error: %s\n", ErrBuf); X} X Xstatic int Xgetnumber(first) Xint first; X{ X int c; X X lexval = first - '0'; X lexfract = 0.0; X while (isdigit(c = Getch())) X lexval = 10 * lexval + c - '0'; X X /* Some of the special routines use floating values */ X if (c == '.') X { X double div = 10.0; X X while (isdigit(c = Getch())) X { X lexfract += (c - '0') / div; X div *= 10.0; X } X } X pushback(c); X return VALUE; X} X Xstatic int Xgetstring(first) Xint first; X{ X int c = first; X char *str = text; X X do X { X *str++ = (char) c; X c = Getch(); X } X while (isalpha(c) || c == '_' || isdigit(c)); X *str = '\0'; X pushback(c); X X if (strcmp(text, "new") == 0) return NEW; X else if (strcmp(text, "sin") == 0) return SIN; X else if (strcmp(text, "cos") == 0) return COS; X else if (strcmp(text, "atan") == 0) return ATAN; X else if (strcmp(text, "hypot") == 0) return HYPOT; X else if (strcmp(text, "abs") == 0) return ABS; X else if (strcmp(text, "log") == 0) return LOG; X else if (strcmp(text, "sqrt") == 0) return SQRT; X else if (strcmp(text, "rand") == 0) return RAND; X X for (c = 0; c < nsrc; c++) X if (src[c].str && strcmp(src[c].str, text) == 0) X { X lexval = c - 1; X return INAME; X } X X if (strlen(text) > 1) X return NAME; X return first; X} X Xstatic int Xfollow(tok, ifyes, ifno) Xint tok, ifyes, ifno; X{ X int c; X X if ((c = Getch()) == tok) X return ifyes; X pushback(c); X return ifno; X} X X/* X * Set the global lookahead token "lat". X */ Xvoid Xlex() X{ X DEBUG((Debug, "lex():\n")); X X do /* ignore white space */ X lat = Getch(); X while (lat == ' ' || lat == '\t'); X X TokPos = CharPos; X X if (isdigit(lat)) X lat = getnumber(lat); X else if (isalpha(lat) || lat == '_') X lat = getstring(lat); X X switch (lat) X { X case EOF: X lat = 'q'; X break; X X case '*': X lat = follow('*', POW, lat); X break; X X case '>': X lat = follow('=', GE, lat); X lat = follow('>', RSHIFT, lat); X break; X X case '<': X lat = follow('=', LE, lat); X lat = follow('<', LSHIFT, lat); X break; X X case '!': X lat = follow('=', NE, lat); X break; X X case '=': X lat = follow('=', EQ, lat); X break; X X case '|': X lat = follow('|', OR, lat); X break; X X case '&': X lat = follow('&', AND, lat); X break; X X case 'Z': X lat = VALUE; X lexval = Zmax; X break; X X case 'Y': X lat = VALUE; X lexval = Ysize - 1; X break; X X case 'X': X lat = VALUE; X lexval = Xsize - 1; X break; X X case 'R': X lat = VALUE; X lexval = (int) hypot(Xsize / 2.0, Ysize / 2.0); X break; X X case 'A': X lat = VALUE; X lexval = 360; X break; X X case '"': X { X char *str; X X str = text; X while ((lat = Getch()) != EOF && lat != '\n' && lat != '"') X *str++ = (char) lat; X *str = '\0'; X if (lat != '"') X { X SPRINTF(ErrBuf, "Expected matching '\"'"); X error(ERR_PARSE); X return; X } X } X lat = FNAME; X break; X X case ';': /* comment to end of line */ X Skip(); X lat = '\n'; X break; X X default: X break; X } X X if (Debug) X { X if (lat < 127 && isprint(lat)) X DEBUG((Debug, "lex() => '%c' (%d)\n", lat, lat)); X else X DEBUG((Debug, "lex() => (%d)\n", lat)); X } X} X Xvoid Xpushback(c) Xint c; X{ X DEBUG((Debug, "pushback('%c')\n", c)); X disp_ungetc(c); X CharPos = OldPos; X} Funky_Stuff chmod 0444 lex.c || echo "restore of lex.c fails" set `wc -c lex.c`;Sum=$1 if test "$Sum" != "5493" then echo original size 5493, current size $Sum;fi echo "x - extracting sunview.c (Text)" sed 's/^X//' << 'Funky_Stuff' > sunview.c && X/*LINTLIBRARY*/ X X/* @(#)sunview.c 1.10 89/12/11 X * X * SunView dependent graphics routines used by popi. X * written by Rich Burridge - Sun Microsystems. X * X * Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs. X * This version is based on the code in his Prentice Hall book, X * "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7, X * which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. X * X * Permission is given to distribute these extensions, as long as these X * introductory messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if reported X * (see README file) then an attempt will be made to fix them. X */ X X#include "popi.h" X#include "graphics.h" X#include <suntool/sunview.h> X#include <suntool/canvas.h> X X#define ICON_SET (void) icon_set X#define NOTIFY_DISPATCH (void) notify_dispatch X#define NOTIFY_DO_DISPATCH (void) notify_do_dispatch X#define NOTIFY_INTERPOSE_DESTROY_FUNC (void) notify_interpose_destroy_func X#define PR_GETCOLORMAP (void) pr_getcolormap X#define PW_PUTCOLORMAP (void) pw_putcolormap X#define PW_ROP (void) pw_rop X#define PW_SETCMSNAME (void) pw_setcmsname X#define PW_TEXT (void) pw_text X#define PW_VECTOR (void) pw_vector X#define PW_WRITEBACKGROUND (void) pw_writebackground X#define WINDOW_DONE (void) window_done X#define WINDOW_SET (void) window_set X X#define BOLD_FONT "/usr/lib/fonts/fixedwidthfonts/screen.b.14" X#define NORMAL_FONT "/usr/lib/fonts/fixedwidthfonts/screen.r.14" X XCanvas canvas ; XCursor busy_cursor, main_cursor ; XEvent event ; XFrame frame ; XIcon popi_icon ; XNotify_value destroy_proc() ; XPixfont *font, *nfont, *bfont ; XPixrect *pr ; /* Offscreen image area. */ XPixwin *cpw ; X Xshort busy_cursor_array[] = { X#include <images/hglass.cursor> X} ; Xmpr_static(busy_cursor_pr, 16, 16, 1, busy_cursor_array) ; X Xunsigned short icon_image[] = { X#include "popi.icon" X} ; Xmpr_static(icon_pr, 64, 64, 1, icon_image) ; X Xint blocking ; /* Set if in event blocking mode. */ Xint gotevent ; /* Set if we have an event to handle. */ Xint nonblocking ; /* Set if in event non-blocking mode. */ Xint oktoshow ; /* Set just before window is displayed. */ X X X/*ARGSUSED*/ Xvoid Xcanvas_proc(canvas, e) XCanvas canvas ; XEvent *e ; X{ X if (!oktoshow) return ; X event = *e ; X gotevent = 1 ; X if (blocking) notify_stop() ; X} X X Xcleanup() /* Null routine for the SunView version. */ X{ X} X X X/*ARGSUSED*/ XNotify_value Xdestroy_proc(client, status) XNotify_client client ; XDestroy_status status ; X{ X exit(0) ; X} X X Xdraw_scanline(line, y) /* Display image scanline on the screen. */ Xunsigned char *line ; Xint y ; X{ X int i ; X X mptr = (unsigned char *) ((struct mpr_data *) pr->pr_data)->md_image ; X if (iscolor) X for (i = 0; i < Xsize; i++) mptr[i] = 255 - line[i] ; X else halftone(line, y) ; X PW_ROP(cpw, 0, y+100, Xsize, 1, PIX_SRC, pr, 0, 0) ; X} X X Xdrawarea(x, y, width, height, op) Xint x, y, width, height ; Xenum op_type op ; X{ X PW_WRITEBACKGROUND(cpw, x, y, width, height, ops[(int) op]) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X PW_VECTOR(cpw, x1, y1, x2, y2, PIX_SET, 0) ; X} X X Xdrawtext(x, y, fontno, str) Xenum font_type fontno ; Xint x, y ; Xchar *str ; X{ X if (fontno == NFONT) font = nfont ; X else if (fontno == BFONT) font = bfont ; X PW_TEXT(cpw, x, y, PIX_SRC, font, str) ; X} X X XPixfont * Xget_font(name) Xchar *name ; X{ X Pixfont *font ; X X font = pf_open(name) ; X if (font == NULL) font = pf_default() ; X if (font == NULL) X { X perror("couldn't get the default font.") ; X exit(1) ; X } X return font ; X} X X Xget_event() /* Get the next SunView event. */ X{ X if (!gotevent) notify_start() ; /* This blocks until notify_stop. */ X gotevent = 0 ; X} X X Xget_next_char(c) /* Process events, and return when character typed. */ Xchar *c ; X{ X for (;;) X { X get_event() ; X if (event_is_ascii(&event)) /* Keyboard character? */ X { X *c = event_id(&event) ; X return ; X } X else window_default_event_proc(canvas, &event, (char *) 0) ; X } X} X X Xinit_fonts() X{ X bfont = get_font(BOLD_FONT) ; X nfont = get_font(NORMAL_FONT) ; X nfont_width = nfont->pf_defaultsize.x ; X} X X Xinit_ws_type() X{ X if (getenv("WINDOW_PARENT") == NULL) X { X FPRINTF(stderr,"%s: Not a native SunView window\n", ProgName) ; X return -1 ; X } X ops[(int) GCLR] = PIX_CLR ; X ops[(int) GSET] = PIX_SET ; X oktoshow = 0 ; /* Kludge to correctly handle repaints. */ X blocking = 1 ; X return 0 ; X} X X Xload_colors() /* Create and load popi color map. */ X{ X int i ; X char cmsname[MAXLINE] ; X u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ; X X iscolor = (cpw->pw_pixrect->pr_depth == 8) ? 1 : 0 ; X X if (iscolor) X { X for (i = 0; i < CMAPLEN; i++) X red[i] = green[i] = blue[i] = 255 - i ; X X SPRINTF(cmsname, "popi%10ld", getpid()) ; X PW_SETCMSNAME(cpw, cmsname) ; X PW_PUTCOLORMAP(cpw, 0, CMAPLEN, red, green, blue) ; X X pr = mem_create(Xsize, 1, 8) ; X } X else pr = mem_create(Xsize, 1, 1) ; X} X X Xmake_items(argc, argv) /* Create icon, frame, canvas etc.. */ Xint argc ; Xchar *argv[] ; X{ X popi_icon = icon_create(ICON_IMAGE, &icon_pr, 0) ; X frame = window_create((Window) 0, FRAME, X FRAME_ICON, popi_icon, X FRAME_SHOW_LABEL, FALSE, X FRAME_NO_CONFIRM, TRUE, X FRAME_ARGS, argc, argv, X 0) ; X canvas = window_create(frame, CANVAS, X WIN_WIDTH, TWIDTH, X WIN_HEIGHT, THEIGHT, X WIN_EVENT_PROC, canvas_proc, X 0) ; X X WINDOW_SET(canvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS, X WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, X WIN_UP_EVENTS, 0, 0) ; X WINDOW_SET(canvas, WIN_IGNORE_PICK_EVENT, LOC_MOVE, 0) ; X cpw = canvas_pixwin(canvas) ; X X main_cursor = window_get(canvas, WIN_CURSOR) ; X busy_cursor = cursor_create(CURSOR_IMAGE, &busy_cursor_pr, 0) ; X load_colors() ; /* Load the popi grayscale colormap. */ X} X X Xset_cursor(type) Xenum cur_type type ; X{ X switch (type) X { X case BUSY_CUR : WINDOW_SET(canvas, WIN_CURSOR, busy_cursor, 0) ; X break ; X case NORMAL_CUR : WINDOW_SET(canvas, WIN_CURSOR, main_cursor, 0) ; X } X} X X Xstart_tool() X{ X window_fit(frame) ; X NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ; X oktoshow = 1 ; X WINDOW_SET(frame, WIN_SHOW, TRUE, 0) ; X NOTIFY_DISPATCH() ; /* Make the window appear. */ X NOTIFY_DO_DISPATCH() ; X} Funky_Stuff chmod 0444 sunview.c || echo "restore of sunview.c fails" set `wc -c sunview.c`;Sum=$1 if test "$Sum" != "7006" then echo original size 7006, current size $Sum;fi echo "x - extracting x11.c (Text)" sed 's/^X//' << 'Funky_Stuff' > x11.c && X/*LINTLIBRARY*/ X X/* @(#)x11.c 1.9 89/12/11 X * X * X11 dependent graphics routines used by popi. X * written by Rich Burridge - Sun Microsystems. X * X * Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs. X * This version is based on the code in his Prentice Hall book, X * "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7, X * which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. X * X * Permission is given to distribute these extensions, as long as these X * introductory messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if reported X * (see README file) then an attempt will be made to fix them. X */ X X#include "popi.h" X#include "graphics.h" X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/cursorfont.h> X#include <X11/keysym.h> X X#define BOLD_FONT "helvetica-bold-14" X#define DEFFONT "fixed" X#define NORMAL_FONT "8x13" X X#define POPI_BORDER_WIDTH 2 X X#define FRAME_MASK (KeyPressMask | KeyReleaseMask | ExposureMask) X Xshort icon_image[] = { X#include "popi.icon" X} ; X XAtom protocol_atom, kill_atom ; XCursor busy_cursor, main_cursor ; XDisplay *dpy ; XGC gc, pix_gc ; XPixmap mpr, popi_icon, load_icon() ; XVisual *visual ; XWindow frame, frame_icon ; XXColor current_col ; XXEvent event ; XXFontStruct *bfont, *font, *nfont ; XXGCValues gc_val ; XXSetWindowAttributes attributes ; XXSizeHints size ; XXVisualInfo vinfo ; XXWMHints wm_hints ; X Xunsigned long gc_mask ; Xint screen ; Xunsigned int scr_depth ; Xunsigned long backgnd, foregnd ; Xunsigned long palette[CMAPLEN] ; X X/* 256-byte table for quickly reversing the bits in an unsigned 8-bit char, X * used to convert between MSBFirst and LSBFirst image formats. X */ X Xchar revtable[256] = { X 0, -128, 64, -64, 32, -96, 96, -32, X 16, -112, 80, -48, 48, -80, 112, -16, X 8, -120, 72, -56, 40, -88, 104, -24, X 24, -104, 88, -40, 56, -72, 120, -8, X 4, -124, 68, -60, 36, -92, 100, -28, X 20, -108, 84, -44, 52, -76, 116, -12, X 12, -116, 76, -52, 44, -84, 108, -20, X 28, -100, 92, -36, 60, -68, 124, -4, X 2, -126, 66, -62, 34, -94, 98, -30, X 18, -110, 82, -46, 50, -78, 114, -14, X 10, -118, 74, -54, 42, -86, 106, -22, X 26, -102, 90, -38, 58, -70, 122, -6, X 6, -122, 70, -58, 38, -90, 102, -26, X 22, -106, 86, -42, 54, -74, 118, -10, X 14, -114, 78, -50, 46, -82, 110, -18, X 30, -98, 94, -34, 62, -66, 126, -2, X 1, -127, 65, -63, 33, -95, 97, -31, X 17, -111, 81, -47, 49, -79, 113, -15, X 9, -119, 73, -55, 41, -87, 105, -23, X 25, -103, 89, -39, 57, -71, 121, -7, X 5, -123, 69, -59, 37, -91, 101, -27, X 21, -107, 85, -43, 53, -75, 117, -11, X 13, -115, 77, -51, 45, -83, 109, -19, X 29, -99, 93, -35, 61, -67, 125, -3, X 3, -125, 67, -61, 35, -93, 99, -29, X 19, -109, 83, -45, 51, -77, 115, -13, X 11, -117, 75, -53, 43, -85, 107, -21, X 27, -101, 91, -37, 59, -69, 123, -5, X 7, -121, 71, -57, 39, -89, 103, -25, X 23, -105, 87, -41, 55, -73, 119, -9, X 15, -113, 79, -49, 47, -81, 111, -17, X 31, -97, 95, -33, 63, -65, 127, -1, X} ; X Xcleanup() /* Null routine for the X11 version. */ X{ X} X X X/* This routine needs to be dramatically improved. It should be possible X * to avoid copying the data to a separate buffer and creating a pixmap, X * and send it direct to the popi frame. X */ X Xdraw_scanline(line, y) /* Display image scanline on the screen. */ Xunsigned char *line ; Xint y ; X{ X XImage *image ; X int i ; X X if (iscolor) X { X mptr = (unsigned char *) Emalloc(Xsize) ; X for (i = 0; i < Xsize; i++) mptr[i] = palette[255 - line[i]] ; X image = XCreateImage(dpy, DefaultVisual(dpy, screen), X scr_depth, ZPixmap, 0, mptr, Xsize, 1, 8, Xsize) ; X mpr = XCreatePixmap(dpy, RootWindow(dpy, screen), X (unsigned) image->width, X (unsigned) image->height, scr_depth) ; X XPutImage(dpy, mpr, pix_gc, image, 0, 0, 0, 0, X (unsigned) image->width, (unsigned) image->height) ; X XDestroyImage(image) ; X } X else X { X mptr = (unsigned char *) Emalloc((Xsize / 8) + 1) ; X halftone(line, y) ; X for (i = 0; i < (Xsize / 8) + 1; i++) mptr[i] = revtable[mptr[i]] ; X mpr = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), mptr, X Xsize, 1, foregnd, backgnd, scr_depth) ; free(mptr) ; X } X XCopyArea(dpy, mpr, frame, gc, 0, 0, Xsize, 1, 0, y+100) ; X XFreePixmap(dpy, mpr) ; X} X X Xdrawarea(x, y, width, height, op) Xint x, y, width, height ; Xenum op_type op ; X{ X gc_val.function = ops[(int) op] ; X XChangeGC(dpy, gc, GCFunction, &gc_val) ; X XFillRectangle(dpy, frame, gc, x, y, X (unsigned int) width, (unsigned int) height) ; X XSync(dpy, 0) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X gc_val.foreground = foregnd ; X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ; X XDrawLine(dpy, frame, gc, x1, y1, x2, y2) ; X} X X Xdrawtext(x, y, fontno, str) Xenum font_type fontno ; Xint x, y ; Xchar *str ; X{ X if (fontno == NFONT) font = nfont ; X else if (fontno == BFONT) font = bfont ; X gc_val.font = font->fid ; X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCFont | GCFunction, &gc_val) ; X XDrawString(dpy, frame, gc, x, y, str, strlen(str)) ; X} X X XXFontStruct * Xget_font(name) Xchar *name ; X{ X XFontStruct *font ; X X if (!(font = XLoadQueryFont(dpy, name))) X if (!(font = XLoadQueryFont(dpy, DEFFONT))) X { X perror("couldn't get the default font.") ; X exit(1) ; X } X return(font) ; X} X X Xget_next_char(c) Xchar *c ; X{ X XClientMessageEvent *ev ; X XKeyPressedEvent *key_event ; X KeySym keysym ; X char chs[2] ; X X for (;;) X { X if (!XCheckMaskEvent(dpy, ExposureMask, &event)) X XNextEvent(dpy, &event) ; X X switch (event.type) X { X case ClientMessage : /* Catch ICCCM kill from WM. */ X X ev = (XClientMessageEvent *) &event ; X if (ev->message_type == protocol_atom && X ev->data.l[0] == kill_atom) X exit(0) ; X break ; X X case Expose : process_expose(&event) ; X break ; X X case KeyPress : key_event = (XKeyPressedEvent *) &event ; X (void) XLookupString(key_event, chs, 1, X &keysym, X (XComposeStatus *) NULL) ; X if (keysym == XK_Shift_L || X keysym == XK_Shift_R) break ; X *c = chs[0] ; X return ; X } X } X/*NOTREACHED*/ X} X X Xinit_fonts() X{ X bfont = get_font(BOLD_FONT) ; X nfont = get_font(NORMAL_FONT) ; X nfont_width = 8 ; X} X X Xinit_ws_type() X{ X if ((dpy = XOpenDisplay(x11_display)) == NULL) X { X FPRINTF(stderr,"%s: Couldn't open display %s\n", ProgName, X (getenv ("DISPLAY") ? getenv("DISPLAY") : x11_display)) ; X exit(1) ; X } X X screen = DefaultScreen(dpy) ; X X if (!geometry) X STRCPY(geometry, XGetDefault(dpy, ProgName, "Geometry")) ; X X foregnd = BlackPixel(dpy, screen) ; X backgnd = WhitePixel(dpy, screen) ; X scr_depth = DefaultDepth(dpy, screen) ; X X ops[(int) GCLR] = GXclear ; X ops[(int) GSET] = GXset ; X return 0 ; X} X X X/*ARGSUSED*/ Xstatic Bool Xis_exposed(dpy, ev, window) /* Return True if window is being exposed */ XDisplay *dpy ; XXEvent *ev ; Xchar *window ; X{ X if (ev->type == Expose && *((Window *) window) == ev->xkey.window) X return True ; X return False ; X} X X Xload_colors() /* Create and load popi color map. */ X{ X u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ; X int i, numcolors ; X X iscolor = 0 ; X if (DisplayCells(dpy, screen) > 2) X { X iscolor = 1 ; X numcolors = 0 ; X for (i = 0; i < CMAPLEN; i++) X { X current_col.flags = DoRed | DoGreen | DoBlue ; X current_col.red = current_col.green = X current_col.blue = (unsigned short) ((255 - i) << 8) ; X if (XAllocColor(dpy, DefaultColormap(dpy, screen), ¤t_col) == True) X palette[numcolors++] = current_col.pixel ; X } X if (numcolors < 2) X { X FPRINTF(stderr, "%s: cannot allocate colors.\n", ProgName) ; X exit(1) ; X } X } X} X X XPixmap Xload_icon(sbuf) Xshort sbuf[] ; X{ X char cbuf[512] ; X int i ; X X for (i = 0; i < 256; i++) X { X cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ; X cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ; X } X return(XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf, X 64, 64, foregnd, backgnd, scr_depth)) ; X} X X Xmake_items(argc, argv) /* Create icon, frame, canvas etc.. */ Xint argc ; Xchar *argv[] ; X{ X unsigned int h, w ; /* Window dimensions. */ X int flags ; X int x, y ; /* Window position. */ X X load_colors() ; X popi_icon = load_icon(icon_image) ; X X size.flags = PMinSize | PMaxSize | PPosition | PSize ; X size.x = 0 ; X size.y = 0 ; X size.max_width = size.min_width = size.width = TWIDTH ; X size.max_height = size.min_height = size.height = THEIGHT ; X X if (strlen(geometry)) X { X flags = XParseGeometry(geometry, &x, &y, &w, &h) ; X if (XValue & flags) X { X if (XNegative & flags) X x = DisplayWidth(dpy, screen) + x - size.width ; X size.flags |= USPosition ; X size.x = x ; X } X if (YValue & flags) X { X if (YNegative & flags) X y = DisplayHeight(dpy, screen) + y - size.height ; X size.flags |= USPosition ; X size.y = y ; X } X } X X frame = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), X size.x, size.y, size.width, size.height, X POPI_BORDER_WIDTH, foregnd, backgnd) ; X X protocol_atom = XInternAtom(dpy, "WM_PROTOCOLS", False) ; X kill_atom = XInternAtom(dpy, "WM_DELETE_WINDOW", False) ; X X XSetStandardProperties(dpy, frame, "popi", NULL, popi_icon, X argv, argc, &size) ; X X wm_hints.icon_x = ix ; X wm_hints.icon_y = iy ; X wm_hints.input = True ; X wm_hints.icon_pixmap = popi_icon ; X wm_hints.flags = IconPositionHint | InputHint | IconPixmapHint ; X if (iconic) X { X wm_hints.initial_state = IconicState ; X wm_hints.flags |= StateHint ; X } X XSetWMHints(dpy, frame, &wm_hints) ; X X gc_mask = GCFont | GCForeground | GCBackground | GCGraphicsExposures ; X gc_val.font = nfont->fid ; X gc_val.foreground = foregnd ; X gc_val.background = backgnd ; X gc_val.graphics_exposures = False ; X gc = XCreateGC(dpy, RootWindow(dpy, screen), gc_mask, &gc_val) ; X XSetFunction(dpy, gc, GXcopy) ; X pix_gc = DefaultGC(dpy, screen) ; X X main_cursor = XCreateFontCursor(dpy, XC_top_left_arrow) ; X busy_cursor = XCreateFontCursor(dpy, XC_coffee_mug) ; X} X X Xprocess_expose(event) XXExposeEvent *event ; X{ X int doframe ; X X doframe = 0 ; X do X { X if (event->count == 0) X if (event->window == frame) doframe++ ; X } X while (XCheckMaskEvent(dpy, ExposureMask, event)) ; X X if (doframe) paint_canvas() ; X} X X Xset_cursor(type) Xenum cur_type type ; X{ X switch (type) X { X case BUSY_CUR : XDefineCursor(dpy, frame, busy_cursor) ; X break ; X case NORMAL_CUR : XDefineCursor(dpy, frame, main_cursor) ; X } X} X X Xstart_tool() X{ X XSelectInput(dpy, frame, FRAME_MASK) ; X XMapWindow(dpy, frame) ; X} Funky_Stuff chmod 0444 x11.c || echo "restore of x11.c fails" set `wc -c x11.c`;Sum=$1 if test "$Sum" != "12178" then echo original size 12178, current size $Sum;fi echo "x - extracting xview.c (Text)" sed 's/^X//' << 'Funky_Stuff' > xview.c && X/*LINTLIBRARY*/ X X/* @(#)xview.c 1.8 89/12/11 X * X * XView dependent graphics routines used by popi. X * written by Rich Burridge - Sun Microsystems. X * X * Popi was originally written by Gerard J. Holzmann - AT&T Bell Labs. X * This version is based on the code in his Prentice Hall book, X * "Beyond Photography - the digital darkroom," ISBN 0-13-074410-7, X * which is copyright (c) 1988 by Bell Telephone Laboratories, Inc. X * X * Permission is given to distribute these extensions, as long as these X * introductory messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if reported X * (see README file) then an attempt will be made to fix them. X */ X X#include "popi.h" X#include "graphics.h" X#include <xview/xview.h> X#include <xview/canvas.h> X#include <xview/cms.h> X#include <xview/cursor.h> X#include <X11/Xlib.h> X X#define NOTIFY_DISPATCH (void) notify_dispatch X#define NOTIFY_INTERPOSE_DESTROY_FUNC (void) notify_interpose_destroy_func X#define PW_WRITEBACKGROUND (void) pw_writebackground X#define WINDOW_DONE (void) window_done X#define XV_SET (void) xv_set X X#define BOLD_FONT "/usr/lib/fonts/fixedwidthfonts/screen.b.14" X#define NORMAL_FONT "/usr/lib/fonts/fixedwidthfonts/screen.r.14" X Xvoid repaint_canvas() ; X XCanvas canvas ; XCanvas_paint_window cpw ; XDisplay *dpy ; XEvent event ; XFrame frame ; XIcon popi_icon ; XNotify_value destroy_proc() ; XPixfont *bfont, *font, *nfont, *xv_pf_default(), *xv_pf_open() ; XPixrect *pr, *xv_mem_create() ; /* Offscreen image area. */ XXv_cmsdata cms_data ; XXv_Cursor busy_cursor, main_cursor ; X Xunsigned short busy_cursor_array[] = { X#include <images/hglass.cursor> X} ; Xmpr_static(busy_cursor_pr, 16, 16, 1, busy_cursor_array) ; X Xunsigned short icon_image[] = { X#include "popi.icon" X} ; Xmpr_static(icon_pr, 64, 64, 1, icon_image) ; X Xint blocking ; /* Set if in event blocking mode. */ Xint gotevent ; /* Set if we have an event to handle. */ Xint nonblocking ; /* Set if in event non-blocking mode. */ Xint oktoshow ; /* Set just before window is displayed. */ Xint win_depth ; /* Depth in pixels of this display. */ X X X/*ARGSUSED*/ Xvoid Xcanvas_proc(canvas, e, arg) XCanvas canvas ; XEvent *e ; Xcaddr_t arg ; X{ X if (!oktoshow) return ; X event = *e ; X gotevent = 1 ; X if (blocking) (void) notify_stop() ; X} X X Xcleanup() /* Null routine for the XView version. */ X{ X} X X X/*ARGSUSED*/ XNotify_value Xdestroy_proc(client, status) XNotify_client client ; XDestroy_status status ; X{ X exit(0) ; X} X X Xdraw_scanline(line, y) /* Display image scanline on the screen. */ Xunsigned char *line ; Xint y ; X{ X int i ; X X mptr = (unsigned char *) ((struct mpr_data *) pr->pr_data)->md_image ; X if (iscolor) X for (i = 0; i < Xsize; i++) mptr[i] = 255 - line[i] ; X else halftone(line, y) ; X (void) pw_rop(cpw, 0, y+100, Xsize, 1, PIX_SRC, pr, 0, 0) ; X} X X Xdrawarea(x, y, width, height, op) Xint x, y, width, height ; Xenum op_type op ; X{ X PW_WRITEBACKGROUND(cpw, x, y, width, height, ops[(int) op]) ; X XSync(dpy, 0) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X (void) pw_vector(cpw, x1, y1, x2, y2, PIX_SET, 0) ; X} X X Xdrawtext(x, y, fontno, str) Xenum font_type fontno ; Xint x, y ; Xchar *str ; X{ X if (fontno == NFONT) font = nfont ; X else if (fontno == BFONT) font = bfont ; X (void) pw_text(cpw, x, y, PIX_SRC, font, str) ; X} X X XPixfont * Xget_font(name) Xchar *name ; X{ X Pixfont *font ; X X font = xv_pf_open(name) ; X if (font == NULL) font = xv_pf_default() ; X if (font == NULL) X { X perror("couldn't get the default font.") ; X exit(1) ; X } X return font ; X} X X Xget_event() /* Get the next XView event. */ X{ X if (!gotevent) X { X XSync(dpy, 0) ; X notify_start() ; /* This blocks until notify_stop. */ X } X gotevent = 0 ; X} X X Xget_next_char(c) /* Process events, and return when character typed. */ Xchar *c ; X{ X for (;;) X { X get_event() ; X if (event_is_ascii(&event) && event_is_up(&event)) /* Keyboard char? */ X { X *c = event_id(&event) ; X return ; X } X else if (event_id(&event) == WIN_REPAINT) paint_canvas() ; X } X} X X Xinit_fonts() X{ X bfont = get_font(BOLD_FONT) ; X nfont = get_font(NORMAL_FONT) ; X nfont_width = nfont->pf_defaultsize.x ; X} X X Xinit_ws_type() X{ X ops[(int) GCLR] = PIX_CLR ; X ops[(int) GSET] = PIX_SET ; X oktoshow = 0 ; /* Kludge to correctly handle repaints. */ X blocking = 1 ; X return 0 ; X} X X Xmake_items(argc, argv) /* Create icon, frame, canvas etc.. */ Xint argc ; Xchar *argv[] ; X{ X int i ; X char cmsname[MAXLINE] ; X u_char red[CMAPLEN], green[CMAPLEN], blue[CMAPLEN] ; X X xv_init(XV_INIT_ARGS, argc, argv, 0); X popi_icon = xv_create(0, ICON, X ICON_IMAGE, &icon_pr, X 0) ; X frame = xv_create(0, FRAME, X FRAME_ICON, popi_icon, X FRAME_SHOW_LABEL, FALSE, X FRAME_NO_CONFIRM, TRUE, X XV_HEIGHT, THEIGHT, X XV_WIDTH, TWIDTH, X 0) ; X iscolor = ((win_depth = (int) xv_get(frame, WIN_DEPTH)) > 1) ? 1 : 0 ; X X pr = xv_mem_create(Xsize, 1, win_depth) ; X X SPRINTF(cmsname, "popi%10ld", getpid()) ; X for (i = 0; i < CMAPLEN; i++) X red[i] = green[i] = blue[i] = 255 - i ; X X cms_data.type = XV_DYNAMIC_CMS ; X cms_data.size = 256 ; X cms_data.rgb_count = 256 ; X cms_data.index = 0 ; X cms_data.red = red ; X cms_data.green = green ; X cms_data.blue = blue ; X X canvas = xv_create(frame, CANVAS, X OPENWIN_AUTO_CLEAR, FALSE, X CANVAS_RETAINED, TRUE, X XV_WIDTH, TWIDTH, X XV_HEIGHT, THEIGHT, X CANVAS_PAINTWINDOW_ATTRS, X WIN_DYNAMIC_VISUAL, TRUE, X WIN_CONSUME_EVENTS, X WIN_ASCII_EVENTS, X WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, X 0, X WIN_IGNORE_EVENTS, X LOC_MOVE, LOC_DRAG, X 0, X WIN_EVENT_PROC, canvas_proc, X 0, X 0) ; X X cpw = canvas_paint_window(canvas) ; X XV_SET(/**canvas_pixwin(canvas),**/cpw, X WIN_CMS_NAME, cmsname, X WIN_CMS_DATA, &cms_data, X 0) ; X dpy = (Display *) xv_get(cpw, XV_DISPLAY) ; X X main_cursor = xv_get(canvas, WIN_CURSOR) ; X busy_cursor = xv_create(NULL, CURSOR, X CURSOR_IMAGE, &busy_cursor_pr, X 0) ; X} X X Xset_cursor(type) Xenum cur_type type ; X{ X switch (type) X { X case BUSY_CUR : XV_SET(canvas, WIN_CURSOR, busy_cursor, 0) ; X break ; X case NORMAL_CUR : XV_SET(canvas, WIN_CURSOR, main_cursor, 0) ; X } X XSync(dpy, 0) ; X} X X Xstart_tool() X{ X window_fit(frame) ; X NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ; X XV_SET(frame, WIN_SHOW, TRUE, 0) ; X oktoshow = 1 ; X (void) xv_set(xv_default_server, SERVER_SYNC_AND_PROCESS_EVENTS) ; X NOTIFY_DISPATCH() ; X} Funky_Stuff chmod 0444 xview.c || echo "restore of xview.c fails" set `wc -c xview.c`;Sum=$1 if test "$Sum" != "7343" then echo original size 7343, current size $Sum;fi echo "x - extracting popi.msc (Text)" sed 's/^X//' << 'Funky_Stuff' > popi.msc && X# X# Program: Popi X# X# Make file for Microsoft braindamaged make. X# In the Quick C environment, select X# File/Set Program List X# and set to the name of this file (popi.qcl). X# From the command line, use "make popi.qcl" X# Quick C has fought hard against generating correct code, X# but I believe the current version doesn't trigger any of X# its many bugs. Do not enable run-time pointer checking or X# it will wrongly complain about some valid pointer assignments. X# Also, do not enable optimisation as incorrect code will be X# generated in a loop inside run.c. X# X XCC = qcl X X.c.obj: X $(CC) -c -W3 -AS $*.c X Xmain.obj : main.c X Xexpr.obj : expr.c X Xio.obj : io.c X Xlex.obj : lex.c X Xpolar.obj : polar.c X Xrun.obj : run.c X Xspecial.obj : special.c X Xibmpc.obj : ibmpc.c X XPopi.exe : expr.obj ibmpc.obj io.obj lex.obj main.obj polar.obj run.obj \ X special.obj X del Popi.lnk X echo expr.obj+ >>Popi.lnk X echo ibmpc.obj+ >>Popi.lnk X echo io.obj+ >>Popi.lnk X echo lex.obj+ >>Popi.lnk X echo main.obj+ >>Popi.lnk X echo polar.obj+ >>Popi.lnk X echo run.obj+ >>Popi.lnk X echo special.obj >>Popi.lnk X echo Popi.exe >>Popi.lnk X echo Popi.map >>Popi.lnk X link @Popi.lnk /NOI $(LDFLAGS); Funky_Stuff chmod 0444 popi.msc || echo "restore of popi.msc fails" set `wc -c popi.msc`;Sum=$1 if test "$Sum" != "1163" then echo original size 1163, current size $Sum;fi echo "x - extracting dmr.Z (Binary)" sed 's/^X//' << 'Funky_Stuff' > s2_temp_.tmp && Xbegin 600 dmr.Z Funky_Stuff echo "End of part 5" echo "File dmr.Z is continued in part 6" echo "6" > s2_seq_.tmp exit 0