|
|
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.