|
|
1.1 root 1: #include <X/mit-copyright.h>
2:
3: /* $Header: XCreate.c,v 10.8 86/02/01 15:30:58 tony Rel $ */
4: /* Copyright 1985, Massachusetts Institute of Technology */
5: /* stolen from CLU routine x_cons, redone by J. Gettys */
6:
7: #include "XlibInternal.h"
8: #include <stdio.h>
9: #define TRUE 1
10: #define FALSE 0
11: #define max(a,b) ( (a) > (b) ? (a) : (b) )
12: #define min(a,b) ( (a) > (b) ? (b) : (a) )
13: #define abs(a) ( (a) > 0 ? (a) : -(a))
14:
15: #define DCOUNT 2
16: #define VCOUNT 1 + (4 * 2 * DCOUNT)
17: #define FCOUNT 1 + 4
18:
19: #include "../cursors/cross.cursor"
20: #include "../cursors/cross_mask.cursor"
21:
22: Window XCreate(prompt, name, geometry, def, frame, minwidth, minheight)
23: char *prompt, *name;
24: register OpaqueFrame *frame;
25: int minwidth, minheight;
26: char *geometry, *def;
27: {
28: char *fn = "8x13"; /* default default font */
29: FontInfo *pfninfo; /* font info on prompt */
30: Window pop; /* pop up window */
31: char *opt;
32: int pfore, pback; /* prompt window colors */
33: int bpix; /* border color */
34: int mfore, mback; /* mouse colors */
35: int pbw = 1; /* prompt window border width */
36: int ibw = 1; /* internal border width */
37: int freeze = 0; /* should we freeze the server */
38: Color cdef; /* color structure for lookup */
39: Cursor cr; /* cursor for the prompt window */
40: int events; /* event mask */
41: int popw, poph; /* prompt window height and width */
42: int count = VCOUNT; /* vertex count */
43: Pixmap save = 0; /* saved pixmap */
44: Pixmap backmap, bdrmap; /* background and border pixmaps */
45: Vertex box[VCOUNT]; /* vertex list for box */
46: int x1, y1; /* location of mouse */
47: int x2, y2; /* other corner of box */
48: Window subw; /* subwindow it is in */
49: int mindim; /* minimum dimension */
50: int width, height; /* width and height of box */
51: int left, stop;
52: int mouse;
53: int force; /* force default window to track */
54: int xa, ya, xb, yb;
55: int doit;
56: XButtonEvent event; /* someplace to put the event */
57: register int i; /* ye olde indexe variabel */
58: int fx, fy, fw, fh; /* frame from parse... */
59: int pr; /* parse geometry result */
60:
61: pr = XGeometry (geometry, def, frame->bdrwidth, 1, 1, 0, 0,
62: &fx, &fy, &fw, &fh);
63: /*
64: * none of this nonsense would be necessary if I hadn't blown
65: * the frame structure definition.
66: */
67: frame->x = fx;
68: frame->y = fy;
69: frame->width = fw;
70: frame->height = fh;
71: if (geometry != NULL) {
72: /*
73: * if x or y offsets are specified, then we should autoplace
74: */
75: if ( (pr & XValue ) || (pr & YValue) ) {
76: if (frame->width < minwidth) frame->width = minwidth;
77: if (frame->height < minheight) frame->height = minheight;
78: goto makeit;
79: }
80: }
81:
82: if ((opt = XGetDefault(name, "MakeWindow.BodyFont")) != NULL) fn = opt;
83:
84: if ((pfninfo = XOpenFont(fn)) == NULL) {
85: fprintf(stderr, "Can't open font %s!\n", fn);
86: return(0);
87: }
88:
89: pfore = mback = WhitePixel;
90: pback = bpix = mfore = BlackPixel;
91: if ((opt = XGetDefault(name, "MakeWindow.ReverseVideo")) != NULL)
92: if (strcmp (opt, "on") == 0) {
93: pfore = BlackPixel;
94: pback = WhitePixel;
95: }
96:
97: if ((opt = XGetDefault(name, "MakeWindow.BorderWidth")) != NULL)
98: pbw = atoi (opt);
99:
100: if ((opt = XGetDefault(name, "MakeWindow.InternalBorder")) != NULL)
101: ibw = atoi (opt);
102:
103: if ((opt = XGetDefault(name, "MakeWindow.Freeze")) != NULL)
104: if (strcmp (opt, "on") == 0) freeze = 1;
105:
106: if (DisplayPlanes() > 2) { /* on color display, do color stuff */
107:
108: if ((opt = XGetDefault(name,"MakeWindow.Foreground")) != NULL)
109: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
110: pfore = cdef.pixel;
111:
112: if ((opt = XGetDefault(name,"MakeWindow.Background")) != NULL)
113: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
114: pback = cdef.pixel;
115:
116: if ((opt = XGetDefault(name,"MakeWindow.Border")) != NULL)
117: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
118: bpix = cdef.pixel;
119:
120: if ((opt = XGetDefault(name,"MakeWindow.Mouse")) != NULL)
121: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
122: mfore = cdef.pixel;
123:
124: if ((opt = XGetDefault(name,"MakeWindow.MouseMask")) != NULL)
125: if (XParseColor(opt, &cdef) && XGetHardwareColor(&cdef))
126: mback = cdef.pixel;
127:
128: }
129:
130: cr = XCreateCursor (cross_width, cross_height, cross_bits,
131: cross_mask_bits, cross_x_hot, cross_y_hot,
132: mfore, mback, GXcopy);
133:
134: events = ButtonPressed | ButtonReleased;
135:
136: if (freeze) events |= MouseMoved;
137:
138: /*
139: * go get the mouse as soon as you can
140: */
141:
142: while (1) {
143: if (XGrabMouse ( RootWindow, cr, events ) != 0) break;
144: sleep (1);
145: }
146: popw = XStringWidth (prompt, pfninfo, 0, 0) + 2 * ibw;
147: poph = pfninfo->height + 2 * ibw;
148:
149: if (freeze) {
150: XGrabServer();
151: count = FCOUNT;
152: save = XPixmapSave (RootWindow, 0, 0,
153: popw + 2 * pbw, poph +2 * pbw);
154: }
155:
156: backmap = XMakeTile (pback);
157: bdrmap = XMakeTile (bpix);
158:
159: pop = XCreateWindow (RootWindow,
160: 0, 0, popw, poph, pbw, bdrmap, backmap);
161: XMapWindow( pop);
162: XText (pop, ibw, ibw, prompt, strlen(prompt),
163: pfninfo->id, pfore, pback);
164:
165: XQueryMouse (RootWindow, &x1, &y1, &subw);
166:
167: mindim = 2 * frame->bdrwidth - 1;
168: minwidth = minwidth + mindim;
169: minheight = minheight + mindim;
170:
171: x2 = x1 + minwidth;
172: y2 = y1 + minheight;
173:
174: width = minwidth;
175: height = minheight;
176:
177: left = TRUE;
178: force = FALSE;
179: stop = FALSE;
180: mouse = TRUE;
181:
182: xa = ya = xb = yb = -1;
183:
184: doit = TRUE;
185:
186: while (stop == FALSE) {
187: if ( (xb != max (x1, x2)) || (yb != max(y1, y2))
188: ||(xa != min (x1, x2)) || (ya != min(y1, y2))) {
189: if (freeze && (doit == FALSE)) {
190: XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
191: }
192: xa = min (x1, x2);
193: ya = min (y1, y2);
194: xb = max (x1, x2);
195: yb = max (y1, y2);
196: for ( i = 0; i < count; i += 4) {
197: box[i].x = xa; box[i].y = ya; box[i].flags = 0;
198: if (i+1 == count) break;
199: box[i+1].x = xb; box[i+1].y = ya, box[i+1].flags = 0;
200: box[i+2].x = xb; box[i+2].y = yb, box[i+2].flags = 0;
201: box[i+3].x = xa; box[i+3].y = yb, box[i+3].flags = 0;
202: }
203: doit = TRUE;
204: }
205: if (doit) {
206: XDraw(RootWindow, box, count, 1, 1, 0, GXinvert, 1);
207: doit = !freeze;
208: }
209: if (freeze || XPending() ) {
210: register int button;
211: XNextEvent(&event);
212: button = event.detail & ValueMask;
213: if (mouse) {
214: x2 = event.x;
215: y2 = event.y;
216: }
217: if ( (left == TRUE) && ( event.type == ButtonPressed ) &&
218: ( button == MiddleButton ) ) {
219: x1 = x2;
220: y1 = y2;
221: left = FALSE;
222: }
223: else if ( (left == FALSE) && (event.type == ButtonReleased) &&
224: ( button == MiddleButton))
225: stop = TRUE;
226: else if ( (left == TRUE) && (event.type == ButtonPressed) &&
227: ( button == LeftButton)) {
228: x1 = frame->x;
229: y1 = frame->y;
230: x2 = x1 + frame->width + mindim;
231: y2 = y1 + frame->height + mindim;
232: mouse = FALSE;
233: left = FALSE;
234: }
235: else if ( (left == FALSE) && (event.type == ButtonReleased) &&
236: ( button == LeftButton)) {
237: x1 = frame->x;
238: y1 = frame->y;
239: x2 = x1 + frame->width + mindim;
240: y2 = y1 + frame->height + mindim;
241: stop = TRUE;
242: }
243: else if ( (left == TRUE) && (event.type == ButtonPressed) &&
244: ( button == RightButton)) {
245: force = TRUE;
246: left = FALSE;
247: }
248: else if ( (left == FALSE) && (event.type == ButtonReleased) &&
249: ( button == RightButton)) {
250: stop = TRUE;
251: }
252: else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
253: }
254: else if (mouse) XQueryMouse (RootWindow, &x2, &y2, &subw);
255:
256: if (force) { /* we force the default box */
257: x1 = x2;
258: y1 = y2;
259: x2 = x1 + frame->width + mindim;
260: y2 = y1 + frame->height + mindim;
261: }
262:
263: if (left) {
264: x1 = x2;
265: y1 = y2;
266: }
267: width = max (abs (x2 - x1), minwidth);
268:
269: if (x2 < x1) x2 = x1 - width;
270: else x2 = x1 + width;
271:
272: height = max (abs (y2 - y1), minheight);
273: if (y2 < y1) y2 = y1 - height;
274: else y2 = y1 + height;
275: }
276: if (freeze) XDraw (RootWindow, box, count, 1, 1, 0, GXinvert, 1);
277: XUngrabMouse();
278:
279: if (save != 0) {
280: XUnmapTransparent (pop);
281: XPixmapPut (RootWindow, 0, 0, 0, 0,
282: popw + 2 * pbw, poph + 2 * pbw,
283: save, GXcopy, AllPlanes);
284: XFreePixmap (save);
285: }
286: XDestroyWindow (pop);
287: if (freeze) XUngrabServer();
288: XCloseFont (pfninfo);
289: XFreeCursor (cr);
290: XFreePixmap (backmap);
291: XFreePixmap (bdrmap);
292: frame->x = min(x1, x2);
293: frame->y = min(y1, y2);
294: frame->width = width - mindim;
295: frame->height = height - mindim;
296: makeit: XCreateWindows(RootWindow, frame, 1);
297: /* store default name of the window and set the resize hint */
298: XStoreName(frame->self, prompt);
299: XSetResizeHint(frame->self, minwidth, minheight, 1, 1);
300: XSync(1); /* get rid of any extraneous events */
301: return (frame->self);
302: }
303:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.