|
|
1.1 ! root 1: #include <jerq.h> ! 2: ! 3: #define UP 0 ! 4: #define DOWN 1 ! 5: #define NCHFIL 40 ! 6: ! 7: #define drstore(r) rectf(&display, r, F_STORE) ! 8: #define drflip(r) rectf(&display, r, F_XOR) ! 9: #define drclr(r) rectf(&display, r, F_CLR) ! 10: #define drstring(s,p) string(&defont, s, &display, p, F_XOR) ! 11: ! 12: extern Cursor menu3, deadmouse; ! 13: ! 14: char filnam[NCHFIL]="BLITBLT", ppgm[NCHFIL]="| bcan"; ! 15: ! 16: char *top_menu[]={ ! 17: "choose window", ! 18: "window interior", ! 19: "reverse video", ! 20: "sweep rectangle", ! 21: "whole screen (!)", ! 22: "write file", ! 23: ppgm, ! 24: "exit", ! 25: NULL ! 26: }; ! 27: Menu topmenu={ top_menu }; ! 28: ! 29: Rectangle kbdrect(); Point kbdp; int fail; ! 30: ! 31: Bitmap *bp; ! 32: Rectangle rect, findproc(); ! 33: ! 34: main(argc, argv) ! 35: char **argv; ! 36: { ! 37: register m; ! 38: int i; ! 39: Rectangle r; ! 40: ! 41: for(i = 1; i < argc; i++) { ! 42: if (argv[i][0] == '-' && argv[i][1] == 'p' && ++i < argc) { ! 43: strncpy(ppgm+2, argv[i], 30); ! 44: ppgm[30+2] = 0; ! 45: } ! 46: } ! 47: request(KBD|MOUSE); ! 48: initdisplay(argc, argv); ! 49: initobjs(); ! 50: cursswitch(&menu3); ! 51: checkshape(1); ! 52: ! 53: for (;; wait(MOUSE)) { ! 54: if (lbuttons(DOWN) != 3) continue; ! 55: ! 56: cursswitch(NULL); ! 57: m = menuhit(&topmenu,3); ! 58: switch (m) { ! 59: case 0: ! 60: case 1: ! 61: r = findproc(m); ! 62: flash(r); ! 63: break; ! 64: case 2: ! 65: if (bp) { ! 66: Jscreengrab(); ! 67: rectf(bp, rect, F_XOR); ! 68: Jscreenrelease(); ! 69: } ! 70: break; ! 71: case 3: ! 72: flash(getrect3()); ! 73: break; ! 74: case 4: ! 75: flash(Jfscreen.rect); ! 76: break; ! 77: case 5: ! 78: getfilnam(); ! 79: sendrect(filnam); ! 80: break; ! 81: case 6: ! 82: sendrect(ppgm); ! 83: break; ! 84: case 7: ! 85: if (!lexit3()) break; ! 86: exit(0); ! 87: } ! 88: cursswitch(&menu3); ! 89: } ! 90: } ! 91: ! 92: sendrect(fp) ! 93: char *fp; ! 94: { ! 95: fail = -1; ! 96: cursswitch(&deadmouse); ! 97: drstore(kbdrect()); ! 98: visible(0); ! 99: if (bp) { ! 100: Jscreengrab(); ! 101: fail = sendbitmap(bp, rect, fp); ! 102: Jscreenrelease(); ! 103: } ! 104: visible(1); ! 105: drstore(kbdrect()); ! 106: switch (fail) { ! 107: case -1: ! 108: drstring("No selection", kbdp); break; ! 109: case 0: ! 110: drstring(fp, drstring("Wrote ", kbdp)); break; ! 111: default: ! 112: drstring("Write failed", kbdp); break; ! 113: } ! 114: } ! 115: ! 116: getfilnam() ! 117: { ! 118: Point p; char str[NCHFIL]; ! 119: drstore(kbdrect()); ! 120: p=drstring("File (",kbdp); p=drstring(filnam,p); p=drstring("): ",p); ! 121: ! 122: if (kbdstring(str,NCHFIL,p) > 0) strcpy(filnam,str); ! 123: } ! 124: ! 125: #ifdef SUNTOOLS ! 126: /* ! 127: * Determine the window mpos is in ! 128: * and return its rectangle. If flag is ! 129: * set don't return the border. ! 130: */ ! 131: Rectangle windowrect(mpos, flag) ! 132: Point mpos; ! 133: int flag; ! 134: { ! 135: int wfd, next; ! 136: Rectangle r; ! 137: char name[WIN_NAMESIZE]; ! 138: struct rect srect; ! 139: char *getenv(); ! 140: Point porigin; ! 141: ! 142: porigin = Jfscreen.rect.origin; ! 143: if ((wfd = open(getenv("WINDOW_PARENT"), 0)) < 0) ! 144: goto out; ! 145: again: ! 146: next = win_getlink(wfd, WL_TOPCHILD); ! 147: close(wfd); ! 148: while (next != WIN_NULLLINK) { ! 149: win_numbertoname(next, name); ! 150: if ((wfd = open(name, 0)) < 0) ! 151: goto out; ! 152: win_getrect(wfd, &srect); ! 153: r.origin.x = srect.r_left; ! 154: r.origin.y = srect.r_top; ! 155: r.corner.x = r.origin.x + srect.r_width; ! 156: r.corner.y = r.origin.y + srect.r_height; ! 157: r = raddp(r, porigin); ! 158: if (ptinrect(mpos, r)) { ! 159: if (flag) { ! 160: porigin = r.origin; ! 161: flag = 0; ! 162: goto again; ! 163: } ! 164: close(wfd); ! 165: return r; ! 166: } ! 167: next = win_getlink(wfd, WL_COVERED); ! 168: close(wfd); ! 169: } ! 170: out: ! 171: r.origin.x = r.origin.y = 0; ! 172: r.corner.x = r.corner.y = 0; ! 173: return r; ! 174: } ! 175: ! 176: getrast(bm,to) ! 177: Bitmap *bm; ! 178: register unsigned short *to; ! 179: { ! 180: register unsigned short *from; ! 181: register nshorts; ! 182: int remainder; ! 183: ! 184: from = (unsigned short *)( ! 185: ((struct mpr_data *)( ! 186: ((Pixrect *)bm->dr)->pr_data))->md_image); ! 187: nshorts = (bm->rect.corner.x - bm->rect.origin.x + 15) / 16; ! 188: remainder = (bm->rect.corner.x - bm->rect.origin.x) % 16; ! 189: while(nshorts--) ! 190: *to++ = *from++; ! 191: if (remainder) { ! 192: to--; ! 193: *to &= (0xffff << (16 - remainder)); ! 194: } ! 195: } ! 196: #endif SUNTOOLS ! 197: ! 198: #ifdef X11 ! 199: /* ! 200: * Determine the window mpos is in ! 201: * and return its rectangle. If flag is ! 202: * set don't return the border. ! 203: */ ! 204: Rectangle windowrect(mpos, flag) ! 205: Point mpos; ! 206: int flag; ! 207: { ! 208: Rectangle r; ! 209: int nchildren = 0; ! 210: Window rt, parent, *children; ! 211: int x, y; ! 212: unsigned w, h, bw, d; ! 213: ! 214: XQueryTree(dpy, RootWindow(dpy, DefaultScreen(dpy)), &rt, &parent, ! 215: &children, &nchildren); ! 216: while (nchildren-- >= 0) { ! 217: XGetGeometry(dpy, children[nchildren], &rt, ! 218: &x, &y, &w, &h, &bw, &d); ! 219: r.origin.x = x + bw; ! 220: r.origin.y = y + bw; ! 221: r.corner.x = r.origin.x + w; ! 222: r.corner.y = r.origin.y + h; ! 223: if (ptinrect(mpos, r)) { ! 224: if (!flag) ! 225: r = inset(r, -bw); ! 226: break; ! 227: } ! 228: } ! 229: if (nchildren < 0) { ! 230: r.origin.x = r.origin.y = 0; ! 231: r.corner.x = r.corner.y = 0; ! 232: } ! 233: out: ! 234: XFree(children); ! 235: return r; ! 236: } ! 237: ! 238: getrast(bm,to) ! 239: Bitmap *bm; ! 240: register unsigned short *to; ! 241: { ! 242: register unsigned short *from; ! 243: register nshorts; ! 244: int remainder; ! 245: XImage *im; ! 246: ! 247: im = XGetImage(dpy, bm->dr, 0, 0, bm->rect.corner.x - bm->rect.origin.x, ! 248: 1, 1, XYPixmap); ! 249: from = (unsigned short *)im->data; ! 250: nshorts = (bm->rect.corner.x - bm->rect.origin.x + 15) / 16; ! 251: remainder = (bm->rect.corner.x - bm->rect.origin.x) % 16; ! 252: while(nshorts--) ! 253: *to++ = *from++; ! 254: if (remainder) { ! 255: to--; ! 256: *to &= (0xffff << (16 - remainder)); ! 257: } ! 258: XDestroyImage(im); ! 259: } ! 260: #endif X11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.