Annotation of 43BSDTahoe/new/X/ximpv/impv.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 University of Alberta *
                      3:  *
                      4:  * 'impv' impress (i.e. canon) previewer for a SUN workstation.
                      5:  *     impv [-p##] [-s] [job# | -n name]
                      6:  * where job# is the job number of the troff/dimp processed output suitable
                      7:  * for the canon imagen printer. This can be found by executing 'ipq'. The 
                      8:  * -p## argument sets the number of pages the user will be allowed to
                      9:  * backup.  The -n name option will cause the users most recent job to
                     10:  * be displayed.The human interface for this proram leaves something to be
                     11:  * desired ( skip pages, print page number 'n', etc.).
                     12:  * The algorithm for crunching glyphs could be improved from the straight 
                     13:  * forward method used.
                     14: #ifdef COLOR
                     15:  * The -s option will cause the output to be sent to the color monitor. Troff
                     16:  * Macros .CC and .BG set the background and current color. This option is
                     17:  * intended for slide production.
                     18: #endif COLOR
                     19:  * 
                     20:  *     This program requires that a 'file server' (used very loosely)
                     21:  * exist on the remote host UNIX system. See the code for impvserv. 
                     22:  *
                     23:  * history:
                     24:  *
                     25:  * The program was written in desparation by:
                     26:  *             Steven Sutphen
                     27:  *             University of Alberta
                     28:  *             Department of Computing Science
                     29:  *             Edmonton, Alberta T6G 2H1
                     30:  *             ihnp4!alberta!steve
                     31:  *             November 20, 1982
                     32:  *
                     33:  *             Revised for Sun Work Station:
                     34:  *                     January 1, 1984 Ted Bentley
                     35:  *             Revised for Color SUN displays:
                     36:  *                     January 1985 Martin Dubetz
                     37:  */
                     38: #ifndef lint
                     39: static char *rcsid_impv_c = "$Header: impv.c,v 10.7 86/11/19 19:27:39 jg Rel $";
                     40: #endif
                     41: 
                     42: #ifdef XWIND
                     43: #include <X/Xlib.h>
                     44: #include <X/Xkeyboard.h>
                     45: #include <sys/types.h>
                     46: #include <strings.h>
                     47: #define min(a,b) ((a) < (b) ? (a) : (b))
                     48: #define CHUNKSIZE 2048
                     49: #else XWIND
                     50: #include <pixrect/pixrect_hs.h>
                     51: /* pixrect_hs.h includes sys/types.h */
                     52: #include <sys/socket.h>
                     53: #endif XWIND
                     54: #include <sys/stat.h>
                     55: #include <sys/file.h>
                     56: #include <stdio.h>
                     57: #include <signal.h>
                     58: #include <netdb.h>
                     59: #include <netinet/in.h>
                     60: #include <sgtty.h>
                     61: 
                     62: #include       "site.h"
                     63: #include       "imPdefs.h"
                     64: #include       "imPcodes.h"
                     65: #include       "impv.h"
                     66: 
                     67: 
                     68: char map8_4[256] = {   /* map 8 bits to 4bits for pixel compression */
                     69:        00, 01, 01, 01, 02, 03, 03, 03, 02, 03, 03, 03, 02, 03, 03, 03,
                     70:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
                     71:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
                     72:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
                     73:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
                     74:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     75:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     76:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     77:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
                     78:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     79:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     80:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     81:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
                     82:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     83:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
                     84:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017, 
                     85: };
                     86: 
                     87: #ifdef XWIND
                     88: int Select_mask, maxplus1;
                     89: int forepix, backpix;
                     90: OpaqueFrame win;
                     91: Window Win;            /* our window */
                     92: #define impv_width 15
                     93: #define impv_height 15
                     94: static short impv_bits[] = {
                     95:    0x0080, 0x01c0, 0x03e0, 0x06b0,
                     96:    0x0c98, 0x188c, 0x3086, 0x7fff,
                     97:    0x3086, 0x188c, 0x0c98, 0x06b0,
                     98:    0x03e0, 0x01c0, 0x0080};
                     99: #else XWIND
                    100: struct pixrect *picon, *ptube, *side;
                    101: #endif XWIND
                    102: 
                    103: int diameter = 1;
                    104: short pages = SAVE_PAGES;
                    105: char screen_file[32];
                    106: unsigned char in_buf[512], *in_bufp;
                    107: int ptubew, ptubeh;    /* screen window dimensions */
                    108: struct sgttyb cbreak;  /* tty mode bits */
                    109: int s = 0;                     /* socket or input file descriptor */
                    110: int tty;               /* tty file descriptor */
                    111: int screens;           /* screen store file descriptor */
                    112: 
                    113: main(argc, argv)
                    114: char **argv;
                    115: {
                    116:        struct sockaddr_in sin;
                    117: #ifdef XWIND
                    118:        char *display = NULL;
                    119:        char *option;
                    120:        int reverse = 0;
                    121:        int bwidth = 2;
                    122:        char *fore_color;
                    123:        char *back_color;
                    124:        char *brdr_color;
                    125:        char *mous_color;
                    126:        char *geometry = NULL, def[32];
                    127:        int backmap, bdrmap, mouspix;
                    128:        Color cdef;
                    129: #else XWIND
                    130: #ifdef COLOR
                    131:        unsigned char r[216],b[216],g[216],tmp[6];
                    132:        register short i,j,k;
                    133:        int l;
                    134:        register unsigned char *z;
                    135:        unsigned char setcolor();
                    136: #endif COLOR
                    137:        extern struct pixrect *pr_open();
                    138: #endif XWIND
                    139:        int pipes[2], id_num = 0, rq;
                    140:        char string[100], buf[28];
                    141:        struct hostent *hp;
                    142:        struct servent *sp;
                    143:        struct stat stat1;
                    144:        char *prog = argv[0];
                    145: 
                    146:        extern get_out();
                    147: 
                    148: #ifdef XWIND
                    149:        if ((option = XGetDefault(argv[0], "ReverseVideo")) &&
                    150:            strcmp(option, "on") == 0)
                    151:                reverse = 1;
                    152:        if (option = XGetDefault(argv[0], "BorderWidth"))
                    153:                bwidth = atoi(option);
                    154:        fore_color = XGetDefault(argv[0], "ForeGround");
                    155:        back_color = XGetDefault(argv[0], "BackGround");
                    156:        brdr_color = XGetDefault(argv[0], "Border");
                    157:        mous_color = XGetDefault(argv[0], "Mouse");
                    158: #else XWIND
                    159:        /* set up the keyboard input */
                    160:        (void)gtty(0, &cbreak);
                    161:        cbreak.sg_flags &= ~ECHO;
                    162:        cbreak.sg_flags |= CBREAK;
                    163:        (void)stty(0, &cbreak);
                    164:        cbreak.sg_flags &= ~CBREAK;
                    165:        cbreak.sg_flags |= ECHO;
                    166: #endif XWIND
                    167:        signal(SIGINT, get_out);
                    168:        signal(SIGQUIT, get_out);
                    169:        signal(SIGHUP, get_out);
                    170:        signal(SIGIOT, get_out);
                    171: 
                    172:        scr_x = MAXx / 2;               /* number of dots on a screen page */
                    173:        wide =  (7 + MAXx/2) / 8;       /* rounded up to byte for pixrect */
                    174:        scr_y = MAXy / 2;
                    175:        scr_d = 1;
                    176:        /* calculate the screen size in bytes 2::1 compression */
                    177:        scr_size = (((scr_x + 7) / 8) * scr_y);
                    178: 
                    179:        for (argv++; --argc; argv++) {
                    180:                if (**argv == '-'){
                    181:                        switch (argv[0][1]){
                    182: #ifndef NOSPOOL
                    183:                        case 'n': 
                    184:                                if (pipe(pipes)) {
                    185:                                        fprintf(stderr, "pipe mistake\n");
                    186:                                        get_out();
                    187:                                }
                    188:                                if (fork() == 0){
                    189:                                        /*child*/
                    190:                                        (void)close(1);
                    191:                                        (void)dup(pipes[1]);
                    192:                                        (void)sprintf(string, "echo `ipq | grep %s | awk ' {print $3}'| sort -rn | head -1 `", *++argv);
                    193:                                        (void)system(string);
                    194:                                        exit(0);
                    195:                                }
                    196:                                /* parent */
                    197:                                while (read(pipes[0], buf, 20) <= 0);
                    198:                                id_num = atoi(buf);
                    199:                                argv++; 
                    200:                                argc--;
                    201:                                break;
                    202:                        case 'r': 
                    203:                                rq = 1;
                    204:                                break;
                    205: #endif NOSPOOL
                    206:                        case 'p': 
                    207:                                pages = atoi( &argv[0][2] );
                    208:                                if (pages < 0) pages = 0;
                    209:                                break;
                    210: #ifdef COLOR
                    211:                        case 's':
                    212:                                slide = 1;
                    213:                                scr_x = MAXx / 3;
                    214:                                scr_y = MAXy / 3;
                    215:                                scr_d = 8;
                    216:                                scr_size = scr_x * scr_y;
                    217:                                bc.red = 0;
                    218:                                bc.blue = 255;
                    219:                                bc.green = 0;
                    220:                                cc.red = 255;
                    221:                                cc.blue = 255;
                    222:                                cc.green = 255;
                    223:                                break;
                    224: #endif COLOR
                    225:                        default:
                    226: #ifdef XWIND
                    227:                                if (strcmp(*argv, "-rv") == 0) {
                    228:                                        reverse = 1;
                    229:                                        break;
                    230:                                } else if (strcmp(*argv, "-fg") == 0 && argc) {
                    231:                                        argv++;
                    232:                                        argc--;
                    233:                                        fore_color = *argv;
                    234:                                        break;
                    235:                                } else if (strcmp(*argv, "-bg") == 0 && argc) {
                    236:                                        argv++;
                    237:                                        argc--;
                    238:                                        back_color = *argv;
                    239:                                        break;
                    240:                                } else if (strcmp(*argv, "-bd") == 0 && argc) {
                    241:                                        argv++;
                    242:                                        argc--;
                    243:                                        brdr_color = *argv;
                    244:                                        break;
                    245:                                } else if (strcmp(*argv, "-ms") == 0 && argc) {
                    246:                                        argv++;
                    247:                                        argc--;
                    248:                                        mous_color = *argv;
                    249:                                        break;
                    250:                                } 
                    251: #endif XWIND
                    252:                                (void)usage();
                    253:                                get_out();
                    254:                        }
                    255:                } 
                    256:                else {
                    257: #ifdef XWIND
                    258:                        if (index(*argv, ':') != NULL)
                    259:                                display = *argv;
                    260:                        else if (argv[0][0] == '=') {
                    261:                                        geometry = argv[0];
                    262:                        }
                    263: 
                    264:                        else
                    265: #endif XWIND
                    266: #ifdef NOSPOOL
                    267:                                if((s = open(*argv, O_RDONLY)) <= 0){
                    268:                                        fprintf(stderr,"can't open file\n");
                    269:                                        exit(0);
                    270:                                }
                    271: #else NOSPOOL
                    272:                                id_num = atoi(*argv);
                    273: #endif NOSPOOL
                    274:                }
                    275:        }
                    276: #ifdef NOSPOOL
                    277:        /* set up tty for piped input situation*/
                    278:        if(s == 0) {
                    279:                s = dup(0);
                    280:                close(0);
                    281:                tty = open("/dev/tty",O_RDONLY);
                    282:                fstat(s, &stat1);
                    283:                if( (stat1.st_mode>>12) == 02 )
                    284:                        (void)usage();
                    285:        }
                    286: #else NOSPOOL
                    287:        if(id_num == 0) (void)usage();
                    288: #endif NOSPOOL
                    289: 
                    290:        /* get the file for screen pages */
                    291:        if (pages) {
                    292:                strcpy(screen_file, SCREEN_FILE);
                    293:                mktemp(screen_file);
                    294:                if ((screens = creat(screen_file, 0666)) <= 0){
                    295:                        fprintf(stderr, "couldn't create: %s\n", screen_file);
                    296:                        get_out();
                    297:                }
                    298:                (void)close(screens);
                    299:                if ((screens = open(screen_file, 2)) <= 0){
                    300:                        fprintf(stderr, "couldn't reopen: %s\n", screen_file);
                    301:                        get_out();
                    302:                }
                    303:        }
                    304: 
                    305: #ifndef NOSPOOL
                    306:        /*open up the network to get file from remote host */
                    307:        sp = getservbyname(P_SERV, "tcp");
                    308:        hp = gethostbyname(REMOTE_HOST);
                    309:        if (hp == NULL) {
                    310:                fprintf(stderr, "impv: nohost - %s\n", REMOTE_HOST);
                    311:                get_out();
                    312:        }
                    313:        bzero((char *)&sin, sizeof (sin));
                    314:        bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
                    315:        sin.sin_family = hp->h_addrtype;
                    316:        sin.sin_port = sp->s_port;
                    317:        s = socket(AF_INET, SOCK_STREAM, 0);
                    318:        if (s < 0) {
                    319:                perror("impv: socket");
                    320:                get_out();
                    321:        }
                    322:        (void)setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
                    323:        if (connect(s, (char *)&sin, sizeof (sin)) < 0) {
                    324:                perror("impv: connect");
                    325:                get_out();
                    326:        }
                    327:        /* write the ipd file name to remote_host */
                    328:        (void)sprintf(string, "P%c%03d", rq ? 'r' : 'n', id_num);
                    329:        (void)write(s, string, strlen(string));
                    330: #endif NOSPOOL
                    331: 
                    332:        in_bufp = in_buf;
                    333:        family[0] = font0;
                    334:        inicodes();
                    335: 
                    336: #ifdef XWIND
                    337:        if (!XOpenDisplay(display)) {
                    338:            fprintf(stderr, "%s: Can't open display '%s'\n",
                    339:                 prog, XDisplayName(display));
                    340:            exit(1);
                    341:        }
                    342:        if (reverse) {
                    343:                forepix = WhitePixel;
                    344:                backpix = BlackPixel;
                    345:                backmap = BlackPixmap;
                    346:                bdrmap = WhitePixmap;
                    347:                mouspix = WhitePixel;
                    348:        } else {
                    349:                forepix = BlackPixel;
                    350:                backpix = WhitePixel;
                    351:                backmap = WhitePixmap;
                    352:                bdrmap = BlackPixmap;
                    353:                mouspix = BlackPixel;
                    354:        }
                    355:        if (DisplayCells() > 2) {
                    356:                if (fore_color && XParseColor(fore_color, &cdef) &&
                    357:                        XGetHardwareColor(&cdef))
                    358:                        forepix = cdef.pixel;
                    359:                if (back_color && XParseColor(back_color, &cdef) &&
                    360:                        XGetHardwareColor(&cdef)) {
                    361:                        backpix = cdef.pixel;
                    362:                        backmap = XMakeTile(backpix);
                    363:                }
                    364:                if (brdr_color && XParseColor(brdr_color, &cdef) &&
                    365:                        XGetHardwareColor(&cdef))
                    366:                        bdrmap = XMakeTile(cdef.pixel);
                    367:                if (mous_color && XParseColor(mous_color, &cdef) &&
                    368:                        XGetHardwareColor(&cdef))
                    369:                        mouspix = cdef.pixel;
                    370:        }
                    371:        win.bdrwidth = bwidth;
                    372:        win.border = bdrmap;
                    373:        win.background = backmap;
                    374: 
                    375:        sprintf(def, "=%dx%d+0+0", DisplayWidth() - (bwidth << 1),
                    376:                DisplayHeight() - (bwidth << 1));
                    377:        Win = XCreate (
                    378:                "Imagen Previewer", argv[0], geometry, def, &win, 200, 200);
                    379:        XSetResizeHint(Win, 100, 100, 1, 1);
                    380:        XMapWindow (Win);
                    381:        ptubew = win.width;
                    382:        /* crock around crock */
                    383:        if ((DisplayType() == XDEV_QDSS) && (bwidth < 4))
                    384:                ptubew &= ~7;
                    385:        if (ptubew > scr_x)
                    386:                ptubew = scr_x;
                    387:        ptubeh = win.height;
                    388:        if (ptubeh > scr_y)
                    389:                ptubeh = scr_y;
                    390: 
                    391:        XSelectInput (Win, KeyPressed|ButtonPressed|ExposeRegion|ExposeCopy);
                    392:        XDefineCursor(Win,
                    393:                XCreateCursor(impv_width, impv_height, impv_bits, impv_bits,
                    394:                                7, 7, mouspix, backpix, GXcopy));
                    395:        XSync(0);
                    396:        Select_mask = 1 << dpyno();
                    397:        maxplus1 = 1 + dpyno();
                    398: #else XWIND
                    399:        /* set up the raster pixrect functions */
                    400:        if( slide ) {
                    401: #ifdef COLOR
                    402:                ptube = pr_open("/dev/cgone0");
                    403:                tmp[0] = 0;
                    404:                tmp[1] = 130;
                    405:                tmp[2] = 180;
                    406:                tmp[3] = 210;
                    407:                tmp[4] = 235;
                    408:                tmp[5] = 255;
                    409:                l = 0;
                    410:                for( i = 0; i < 6; i++ )
                    411:                        for( j = 0; j < 6; j++ )
                    412:                                for( k = 0; k < 6; k++ ) {
                    413:                                        r[l] = tmp[i];
                    414:                                        g[l] = tmp[j];
                    415:                                        b[l++] = tmp[k];
                    416:                                }
                    417: 
                    418:                pr_putcolormap(ptube,0,216,r,g,b);
                    419: #endif COLOR
                    420:        } 
                    421:        else
                    422:                ptube = pr_open("/dev/fb");
                    423:        pscreen = mem_create(scr_x, scr_y, scr_d);
                    424: #ifdef COLOR
                    425:        if( slide ) {
                    426:                backcolor = setcolor(0);
                    427:                z = (unsigned char *)(mpr_d(pscreen)->md_image);
                    428:                for (l = scr_size; l--; ) *z++ = backcolor;
                    429:        } 
                    430: #endif COLOR
                    431:        picon = mem_create(46, 53, scr_d);
                    432:        side = mem_create(ptubew-scr_x, ptubeh, scr_d);
                    433:        ptubew = ptube->pr_size.x;
                    434:        ptubeh = ptube->pr_size.y;
                    435: #endif XWIND
                    436: 
                    437:        dofile();
                    438:        (void)write(s, string, strlen(string));
                    439:        get_out();
                    440: }
                    441: 
                    442: #ifdef XWIND
                    443: unsigned char rot8[] = {
                    444:        0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 
                    445:        0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 
                    446:        0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 
                    447:        0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 
                    448:        0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 
                    449:        0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 
                    450:        0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 
                    451:        0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 
                    452:        0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 
                    453:        0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 
                    454:        0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 
                    455:        0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 
                    456:        0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 
                    457:        0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 
                    458:        0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 
                    459:        0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 
                    460:        0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 
                    461:        0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 
                    462:        0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 
                    463:        0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 
                    464:        0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 
                    465:        0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 
                    466:        0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 
                    467:        0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 
                    468:        0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 
                    469:        0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 
                    470:        0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 
                    471:        0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 
                    472:        0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 
                    473:        0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 
                    474:        0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 
                    475:        0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
                    476: };
                    477: 
                    478: static short current_page = -1;
                    479: static short current_x = -1;
                    480: #endif XWIND
                    481: 
                    482: ppause()
                    483: {
                    484:        short  y = 0;
                    485:        short  x;
                    486:        register int c, i;
                    487:        register unsigned char *z, *scptr;
                    488: #ifdef COLOR
                    489:        unsigned char setcolor();
                    490: #endif COLOR
                    491: 
                    492: #ifdef XWIND
                    493:        short current_y = 0;
                    494:        int select_mask;
                    495:        XEvent event;
                    496:        scptr = pscreen;
                    497:        for (i = sizeof pscreen; i--; scptr++) *scptr = rot8[*scptr];
                    498:        winker();
                    499:        scptr = pscreen;
                    500:        winker();
                    501: #else XWIND
                    502:        scptr = (unsigned char *)(mpr_d(pscreen)->md_image);
                    503: #endif XWIND
                    504:        if (current_x < 0)
                    505:                if((current_x = (scr_x - ptubew)/2) < 0) current_x = 0;
                    506:        x = current_x;
                    507:        /*write the screen */
                    508:        while(1) {
                    509: #ifdef XWIND
                    510:                if (page == current_page && x == current_x &&
                    511:                    y < current_y && y + ptubeh > current_y) {
                    512:                        int delta = current_y - y;
                    513:                        XMoveArea(Win, 0, 0, 0, delta, ptubew, ptubeh - delta);
                    514:                        BitsPut(x, y, 0, 0, ptubew, delta);
                    515:                } else if (page == current_page && x == current_x &&
                    516:                           y > current_y && current_y + ptubeh > y) {
                    517:                        int delta = y - current_y;
                    518:                        XMoveArea(Win, 0, delta, 0, 0, ptubew, ptubeh - delta);
                    519:                        BitsPut(x, y + ptubeh - delta, 0, ptubeh - delta,
                    520:                                ptubew, delta);
                    521:                } else if (page == current_page && y == current_y &&
                    522:                    x < current_x && x + ptubew > current_x) {
                    523:                        int delta = current_x - x;
                    524:                        XMoveArea(Win, 0, 0, delta, 0, ptubew - delta, ptubeh);
                    525:                        BitsPut(x, y, 0, 0, delta, ptubeh);
                    526:                } else if (page == current_page && y == current_y &&
                    527:                           x > current_x && current_x + ptubew > x) {
                    528:                        int delta = x - current_x;
                    529:                        XMoveArea(Win, delta, 0, 0, 0, ptubew - delta, ptubeh);
                    530:                        BitsPut(x + ptubew - delta, y, ptubew - delta, 0,
                    531:                                delta, ptubeh);
                    532:                } else if (y != current_y || x != current_x ||
                    533:                           page != current_page)
                    534:                        BitsPut(x, y, 0, 0, min(scr_x - x, ptubew),
                    535:                                min(scr_y - y, ptubeh));
                    536:                current_y = y;
                    537:                current_x = x;
                    538:                current_page = page;
                    539:                XFlush();
                    540:                select_mask = Select_mask;
                    541:                if (select(maxplus1, &select_mask, NULL, NULL, 0) < 0) exit(1);
                    542:                if (!(select_mask & Select_mask)) continue;
                    543:                XPending();
                    544:                do {
                    545:                        XNextEvent (&event);
                    546:                        switch (event.type) {
                    547:                        case ExposeWindow:
                    548:                                ptubeh = ((XExposeEvent *)(&event))->height;
                    549:                                ptubew = ((XExposeEvent *)(&event))->width;
                    550:                        case ExposeRegion: {
                    551:                                short ex = ((XExposeEvent *)(&event))->x;
                    552:                                short ew = ((XExposeEvent *)(&event))->width;
                    553:                                short ey = ((XExposeEvent *)(&event))->y;
                    554:                                short eh = ((XExposeEvent *)(&event))->height;
                    555:                                BitsPut(x + ex, y + ey, ex, ey,
                    556:                                        min(scr_x - (x + ex), ew),
                    557:                                        min(scr_y - (y + ey), eh));
                    558:                                continue;
                    559:                        }
                    560:                        case ExposeCopy:
                    561:                                continue;
                    562:                        case ButtonPressed:
                    563:                        {
                    564:                        short detail = ((XButtonPressedEvent *) (&event))->detail;
                    565:                        switch (detail & ValueMask) {
                    566:                        case LeftButton: if (detail & ShiftMask)
                    567:                                                c = 'l';
                    568:                                         else
                    569:                                                c = 'u';
                    570:                                         break;
                    571:                        case MiddleButton: if (detail & ShiftMask) {
                    572:                                           if (x < scr_x - (x + ptubew))
                    573:                                                c = '6';
                    574:                                           else
                    575:                                                c = '4';
                    576:                                           } else {
                    577:                                           if (y < scr_y - (y + ptubeh))
                    578:                                                c = '3';
                    579:                                           else
                    580:                                                c = '9';
                    581:                                           }
                    582:                                           break;
                    583:                        case RightButton: if (detail & ShiftMask)
                    584:                                                c = 'r';
                    585:                                          else
                    586:                                                c = 'd';
                    587:                                          break;
                    588:                        }
                    589:                                break;
                    590:                        }
                    591:                        case KeyPressed:
                    592:                        switch ((((XKeyPressedEvent *) (&event))->detail) & ValueMask) {
                    593:                        case KC_E5: c = '-'; break; /* prev screen */
                    594:                        case KC_E6: c = '+'; break; /* next screen */
                    595:                        case KC_CURSOR_UP: c = 'u'; break; /* prev screen */
                    596:                        case KC_CURSOR_DOWN: c = 'd'; break; /* next screen */
                    597:                        case KC_CURSOR_LEFT: c = '<'; break; /* left screen */
                    598:                        case KC_CURSOR_RIGHT: c = '>'; break; /* right screen */
                    599:                        case KC_KEYPAD_0: c = '0'; break; /* R0 */
                    600:                        case KC_KEYPAD_PERIOD: c = '.'; break; /* R. */
                    601:                        case KC_KEYPAD_COMMA: c = ','; break; /* R, */
                    602:                        case KC_KEYPAD_1: c = '1'; break; /* R1 */
                    603:                        case KC_KEYPAD_2: c = '2'; break; /* R2 */
                    604:                        case KC_KEYPAD_3: c = '3'; break; /* R3 */
                    605:                        case KC_KEYPAD_4: c = '4'; break; /* R4 */
                    606:                        case KC_KEYPAD_5: c = '5'; break; /* R5 */
                    607:                        case KC_KEYPAD_6: c = '6'; break; /* R6 */
                    608:                        case KC_KEYPAD_7: c = '7'; break; /* R7 */
                    609:                        case KC_KEYPAD_8: c = '8'; break; /* R8 */
                    610:                        case KC_KEYPAD_9: c = '9'; break; /* R9 */
                    611:                        case KC_KEYPAD_MINUS: c = '-'; break; /* R- */
                    612: 
                    613:                        default:
                    614:                                {
                    615:                                char *string;
                    616:                                int nbytes;
                    617:                                string = XLookupMapping (&event, &nbytes);
                    618:                                if (nbytes == 1)
                    619:                                        c = *string;
                    620:                                else
                    621:                                        continue;
                    622:                                }
                    623:                        }
                    624:                        }
                    625: #else XWIND
                    626:                /* adjust place of page on screen so it is centered */
                    627:                /* will clip the edges of imagen300 pages  */
                    628:                pr_rop(ptube, 0, 0, ptubew, ptubeh, PIX_SRC, pscreen, x, y);
                    629:                if( !slide ) {
                    630:                        pr_rop(ptube, scr_x, 0, 4, ptubeh, PIX_NOT(PIX_SRC),
                    631:                                side, 0, 0);
                    632:                        page_icon(y);
                    633:                }
                    634:                /* have a look */
                    635:                c = getchar();
                    636:                if( c == 033 ){ /* fixup for SUN 120 keypad */
                    637:                        c = getchar();
                    638:                        if(c == '[') c = getchar();
                    639:                        if(c == '2') c = getchar();
                    640:                        if(c == '2'){
                    641:                                c = getchar() + 1;
                    642:                                (void) getchar();
                    643:                        }
                    644:                        else if(c == '1'){
                    645:                                c = getchar() + 3;
                    646:                                (void) getchar();
                    647:                        }
                    648:                }
                    649: #endif XWIND
                    650:                switch(c){
                    651:                case 04: 
                    652:                case 03:
                    653:                        return(-1);     /* quit on EOF or ^C */
                    654:                case '1': 
                    655:                        y++; 
                    656:                        break;
                    657:                case '7': 
                    658:                        y--; 
                    659:                        break;
                    660:                case 0102: 
                    661:                case '2': 
                    662:                        y += 65; 
                    663:                        break;
                    664:                case 0101: 
                    665:                case '8': 
                    666:                        y -= 65; 
                    667:                        break;
                    668:                case '3': 
                    669:                        y = scr_y - ptubeh -1; 
                    670:                        break;
                    671:                case '9': 
                    672:                        y = 0; 
                    673:                        break;
                    674:                case '4': 
                    675:                        x = 0;
                    676:                        break;
                    677:                case '5': 
                    678:                        if((x = (scr_x - ptubew)/2) < 0) x = 0;
                    679:                        break;
                    680:                case '6': 
                    681:                        if((x = scr_x - ptubew) < 0) x = 0;
                    682:                        break;
                    683:                case '<':
                    684:                        x -= 65;
                    685:                        break;
                    686:                case '>':
                    687:                        x += 65;
                    688:                        break;
                    689:                case 'l':
                    690:                        x -= ptubew;
                    691:                        break;
                    692:                case 'r':
                    693:                        x += ptubew;
                    694:                        break;
                    695:                case 'd':
                    696:                        if (y < scr_y - 1 - ptubeh) {
                    697:                                y += ptubeh;
                    698:                                break;
                    699:                        }
                    700:                        /* falls into */
                    701:                case '.':
                    702:                        if (pages && page != finish) {
                    703:                                page = (page +1)%pages;
                    704:                                (void)lseek(screens, scr_size * page, 0);
                    705:                                (void)read(screens, scptr, scr_size);
                    706:                                y = 0;
                    707:                                break;
                    708:                        }
                    709:                        /* falls into */
                    710:                case '+':
                    711:                case ',':
                    712:                        if (pages && page == finish) {
                    713:                                (void)lseek(screens, scr_size * page, 0);
                    714:                                (void)write(screens, scptr, scr_size);
                    715:                        }
                    716:                        if (pages){
                    717:                                page = finish = (finish +1)%pages;
                    718:                                if(start == finish) start = (start + 1)%pages;
                    719:                        }
                    720:                        /*blank the memory where screen image is built*/
                    721:                        z=scptr;
                    722:                        for (i=scr_size;i--;) *z++ = backcolor;
                    723:                        return(0);
                    724:                case 'u':
                    725:                        if (y > 0) {
                    726:                                y -= ptubeh;
                    727:                                break;
                    728:                        }
                    729:                        /* falls into */
                    730:                case '-':
                    731:                        if (pages == 0 || page == start) {
                    732: #ifndef XWIND
                    733:                            if (y == 0)
                    734:                            fprintf(stderr, "can not back up more\n");
                    735: #endif XWIND
                    736:                            y = 0;
                    737:                        }else{
                    738:                                if(page == finish) {
                    739:                                        (void)lseek(screens, scr_size * page, 0);
                    740:                                        (void)write(screens, scptr, scr_size);
                    741:                                }
                    742:                                page = (page==0? (pages-1):(page -1))%pages;
                    743:                                (void)lseek(screens, scr_size * page, 0);
                    744:                                (void)read(screens, scptr, scr_size);
                    745:                                if (c == '-')
                    746:                                        y = 0;
                    747:                                else
                    748:                                        y = scr_y - 1 - ptubeh;
                    749:                        }
                    750:                        break;
                    751:                default: 
                    752:                        break;
                    753:                }
                    754:                if (x < 0) x = 0;
                    755:                else if (x >= scr_x - ptubew) x = scr_x - 1 - ptubew;
                    756:                if (y < 0) y = 0;
                    757:                else if (y >= scr_y - ptubeh) y = scr_y - 1 - ptubeh;
                    758: #ifdef XWIND
                    759:                } while (QLength() > 0);
                    760: #endif
                    761:        }
                    762: }
                    763: 
                    764: /* get a character from the input file */
                    765: gc()
                    766: {
                    767:        static int len = 0;
                    768: 
                    769:        if(macro_on == TRUE) {
                    770:                /* macro in effect read from its code*/
                    771:                if(macro_length == macro_count+1) macro_on = FALSE;
                    772:                return(mp[macro_count++]);
                    773:        }
                    774:        else {
                    775:                /*read from the input file */
                    776:                if(in_bufp <= &in_buf[len-1]) {
                    777:                        return(*in_bufp++);
                    778:                }
                    779:                len = read(s, in_buf, 512);
                    780:                if(len == 0) {
                    781:                        fprintf(stderr,"No such job\n");
                    782:                        (void)fflush(stderr);
                    783:                        get_out();
                    784:                }
                    785:                else if(len < 0) {
                    786:                        perror("impv: read failed");
                    787:                        get_out();
                    788:                }
                    789: 
                    790:                in_bufp = in_buf;
                    791:                winker();
                    792:                return(*in_bufp++);
                    793:        }
                    794: }
                    795: 
                    796: get_out()
                    797: {
                    798:        /*reset keyboard*/
                    799: #ifdef XWIND
                    800:        XDestroyWindow (Win);
                    801: #else XWIND
                    802:        (void)stty(0, &cbreak);
                    803:        if(pscreen != NULL) pr_close(pscreen);
                    804:        if(ptube != NULL) pr_close(ptube);
                    805:        printf("\n");
                    806: #endif XWIND
                    807:        if(big || little)
                    808:            printf("%d pixels/glyphs/lines would be off the page\n",
                    809:        big + little);
                    810:        if (screens && unlink(screen_file) < 0)
                    811:            printf("%s not removed\n", screen_file);
                    812:        exit(0);
                    813: }
                    814: 
                    815: winker()
                    816: {
                    817: #ifdef XWIND
                    818:        XPixFill(Win, ptubew / 2 - 8, ptubeh - 50, 16, 16, 0, NULL, GXinvert, 1);
                    819:        XFlush();
                    820: #else XWIND
                    821:        pr_rop(ptube, 450, 780, 16, 16, PIX_NOT(PIX_SRC), NULL, 0, 0);
                    822: #endif XWIND
                    823: }
                    824: 
                    825: #ifdef XWIND
                    826: unsigned char outbuf[CHUNKSIZE];
                    827: 
                    828: BitsPut (srcx, srcy, dstx, dsty, width, height)
                    829:        int srcx, srcy, dstx, dsty, width, height;
                    830: {
                    831:        register unsigned char *data, *ptr;
                    832:        register int i, per, delta;
                    833:        int linesize;
                    834: 
                    835:        linesize = (scr_x + 7) >> 3;
                    836:        dstx -= (srcx & 7);
                    837:        width += (srcx & 7);
                    838:        srcx &= ~7;
                    839:        data = &pscreen[(srcy*linesize) + (srcx>>3)];
                    840: 
                    841:        per = BitmapSize(width, 1);
                    842:        delta = CHUNKSIZE / per;
                    843: 
                    844:        while (height) {
                    845:                if (height < delta)
                    846:                        delta = height;
                    847:                for (ptr = outbuf, i = delta;
                    848:                     --i >= 0;
                    849:                     data += linesize, ptr += per)
                    850:                        bcopy(data, ptr, per);
                    851:                XBitmapBitsPut(Win, dstx, dsty, width, delta, outbuf,
                    852:                                forepix, backpix, NULL, GXcopy, AllPlanes);
                    853:                dsty += delta;
                    854:                height -= delta;
                    855:        }
                    856: }
                    857: #endif XWIND
                    858: 
                    859: #ifndef XWIND
                    860: page_icon(y)
                    861: int y;
                    862: {
                    863:        int h, i;
                    864: 
                    865:        i = 43 * ptubeh / scr_y;
                    866:        pr_rop(picon, 0 , 0, 46, 53, PIX_NOT(PIX_SRC), NULL, 0, 0);
                    867:        pr_rop(picon, 2 , 2, 42, 49, PIX_CLR, NULL, 0, 0);
                    868:        pr_rop(picon, 6 , 4, 34, 45, PIX_NOT(PIX_SRC), NULL, 0, 0);
                    869:        h = 44 * y / scr_y;
                    870:        pr_rop(picon, 5, 5+h, 36, i, PIX_NOT(PIX_SRC), picon, 5, 5+h);
                    871:        pr_rop(ptube, ptubew-46, ptubeh/2, 46, 53, PIX_SRC, picon, 0, 0);
                    872: }
                    873: #endif
                    874: 
                    875: #ifdef COLOR
                    876: /*
                    877:        set color
                    878: */
                    879: unsigned char
                    880: setcolor(code)
                    881: register short int code;
                    882: {
                    883:        register unsigned char color;
                    884:        register float c1,c2;
                    885:        
                    886:        c1 = (float)(5 - code) / 255.;
                    887:        c2 = (float)code / 255.;
                    888:        color = 36 * ((int)(bc.red * c1 + .5) + (int)(cc.red * c2 + .5))
                    889:                + 6 * ((int)(bc.green * c1 + .5) + (int)(cc.green * c2 + .5))
                    890:                + ((int)(bc.blue * c1 + .5) + (int)(cc.blue * c2 + .5));
                    891:        return(color);
                    892: }
                    893: #endif COLOR
                    894: 
                    895: usage()
                    896: {
                    897: #ifdef NOSPOOL
                    898: #ifdef COLOR
                    899:                printf("usage: impv [-p#] [-s] [file]\n");
                    900: #else COLOR
                    901: #ifdef XWIND
                    902:                printf("usage: ximpv [=<geometry>] [-p#] [-rv] [-fg <color>] [-bg <color>] [-bd <color>] [-ms <color>] [host:display] [file]\n");
                    903: #else XWIND
                    904:                printf("usage: impv [-p#] [file]\n");
                    905: #endif XWIND
                    906: #endif COLOR
                    907:                (void)fflush(stdout);
                    908:                exit(0);
                    909: #else NOSPOOL
                    910: #ifdef COLOR
                    911:                printf("usage: impv [-p#] [-s] [-r] [idnumber | -n name]\n");
                    912: #else COLOR
                    913:                printf("usage: impv [-p#] [-r] [idnumber | -n name]\n");
                    914: #endif COLOR
                    915:                (void)fflush(stdout);
                    916:                get_out();
                    917: #endif NOSPOOL
                    918: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.