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