|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_NewIconify_c = "$Header: NewIconify.c,v 10.5 86/11/19 16:24:13 jg Rel $";
3: #endif lint
4:
5: /*
6: * COPYRIGHT 1985, 1986
7: * DIGITAL EQUIPMENT CORPORATION
8: * MAYNARD, MASSACHUSETTS
9: * ALL RIGHTS RESERVED.
10: *
11: * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
12: * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
13: * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITIBILITY OF THIS SOFTWARE FOR
14: * ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
15: *
16: * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
17: * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
18: * SET FORTH ABOVE.
19: *
20: *
21: * Permission to use, copy, modify, and distribute this software and its
22: * documentation for any purpose and without fee is hereby granted, provided
23: * that the above copyright notice appear in all copies and that both that
24: * copyright notice and this permission notice appear in supporting documentation,
25: * and that the name of Digital Equipment Corporation not be used in advertising
26: * or publicity pertaining to distribution of the software without specific,
27: * written prior permission.
28: *
29: */
30:
31:
32: /*
33: * MODIFICATION HISTORY
34: *
35: * 000 -- M. Gancarz, DEC Ultrix Engineering Group
36: */
37:
38: #ifndef lint
39: static char *sccsid = "@(#)NewIconify.c 3.8 1/24/86";
40: #endif
41:
42: #include "uwm.h"
43:
44: Bool NewIconify(window, mask, button, x, y)
45: Window window; /* Event window. */
46: int mask; /* Button/key mask. */
47: short button; /* Button event detail. */
48: int x, y; /* Event mouse position. */
49: {
50: register WindowInfo window_info; /* Event window info. */
51: register WindowInfo icon_info; /* Icon window info. */
52: char *name; /* Event window name. */
53: int mse_x, mse_y; /* Mouse X and Y coordinates. */
54: int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */
55: int icon_w, icon_h; /* Icon width and height. */
56: int icon_bdr; /* Icon border width. */
57: int prev_x; /* Previous event window X location. */
58: int prev_y; /* Previous event window Y location. */
59: int cur_x; /* Current event window X location. */
60: int cur_y; /* Current event window Y location. */
61: int ulx, uly; /* Event window upper left X and Y. */
62: int lrx, lry; /* Event window lower right X and Y. */
63: int init_ulx, init_uly; /* Init window upper left X and Y. */
64: int init_lrx, init_lry; /* Init window lower right X and Y. */
65: int num_vectors; /* Number of vectors in box. */
66: int status; /* Routine call return status. */
67: Window icon; /* Icon window. */
68: Window sub_win; /* Mouse position sub-window. */
69: XButtonEvent button_event; /* Button event packet. */
70: Vertex box[MAX_BOX_VECTORS]; /* Box vertex buffer. */
71: Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */
72: Bool iconifying; /* Are we iconifying? */
73:
74: /*
75: * Do not lower or iconify the root window.
76: */
77: if (window == RootWindow)
78: return(FALSE);
79:
80: /*
81: * Change the cursor to the icon cursor.
82: */
83: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
84: if (status == FAILURE)
85: Error("NewIconify -> Unable to grab button and change cursor.");
86:
87: /*
88: * Clear the vector buffers.
89: */
90: bzero(box, sizeof(box));
91: if (Zap) bzero(zap, sizeof(zap));
92:
93: /*
94: * Get info on the event window.
95: */
96: status = XQueryWindow(window, &window_info);
97: if (status == FAILURE) return(FALSE);
98:
99: /*
100: * Are we iconifying or de-iconifying?
101: */
102: if (window_info.type != IsIcon) {
103:
104: /*
105: * Window => Icon (Iconifying).
106: */
107: /*
108: * If an icon window doesn't exist for the event window, then
109: * make one.
110: */
111: if (window_info.assoc_wind == 0) {
112:
113: /*
114: * Set the icon border width.
115: */
116: icon_bdr = IBorderWidth;
117:
118: /*
119: * Determine the size of the icon window.
120: */
121: status = XFetchName(window, &name);
122: if (status == FAILURE) return(FALSE);
123: icon_h = IFontInfo.height + (VIconPad << 1);
124: icon_w = XQueryWidth(name, IFont);
125: if (icon_w == 0) icon_w = icon_h;
126: else icon_w += (HIconPad << 1);
127:
128:
129: /*
130: * Create the icon window.
131: */
132: icon = XCreateWindow(RootWindow, x + (icon_w >> 1),
133: y + (icon_h >> 1), icon_w, icon_h,
134: icon_bdr, IBorder, IBackground);
135: if (icon == FAILURE) return(FALSE);
136:
137: /*
138: * Use the text cursor whenever the mouse is in the icon window.
139: */
140: XDefineCursor(icon, TextCursor);
141:
142: /*
143: * Select "key pressed", "window exposure" and "unmap window"
144: * events for the icon window.
145: */
146: XSelectInput(icon, (KeyPressed | ExposeWindow | UnmapWindow));
147:
148: /*
149: * Set the event window's icon window to be the new icon window.
150: */
151: XSetIconWindow(window, icon);
152: }
153: else {
154: /*
155: * If we already have an icon window all we have to do is
156: * retrieve the info on it and move it into place.
157: */
158: icon = window_info.assoc_wind;
159:
160: /*
161: * Get info on the icon window.
162: */
163: status = XQueryWindow(icon, &icon_info);
164: if (status == FAILURE) return(FALSE);
165:
166: /*
167: * Determine the height, width, and borderwidth of the icon.
168: */
169: icon_h = icon_info.height;
170: icon_w = icon_info.width;
171: icon_bdr = icon_info.bdrwidth;
172: }
173:
174: iconifying = TRUE;
175: }
176: else {
177:
178: /*
179: * Icon => Window (DeIconifying).
180: */
181: /*
182: * If the window is gone, destroy the icon and return.
183: */
184: if (window_info.assoc_wind == 0) {
185: XDestroyWindow(window);
186: Grab(mask);
187: return(FALSE);
188: }
189:
190: /*
191: * We call the normal window the "icon" window only to simplify
192: * the code later on in the function.
193: */
194: icon = window_info.assoc_wind;
195:
196: /*
197: * Get info on the icon window.
198: */
199: status = XQueryWindow(icon, &icon_info);
200: if (status == FAILURE) return(FALSE);
201:
202: /*
203: * Determine the height, width, and borderwidth of the icon.
204: */
205: icon_h = icon_info.height;
206: icon_w = icon_info.width;
207: icon_bdr = icon_info.bdrwidth;
208:
209: iconifying = FALSE;
210: }
211:
212: /*
213: * Initialize the movement variables.
214: */
215: init_ulx = ulx = x - (icon_w >> 1) - icon_bdr;
216: init_uly = uly = y - (icon_h >> 1) - icon_bdr;
217: init_lrx = lrx = x + (icon_w >> 1) + icon_bdr - 1;
218: init_lry = lry = y + (icon_h >> 1) + icon_bdr - 1;
219: prev_x = x;
220: prev_y = y;
221:
222:
223: /*
224: * Store the box.
225: */
226: if (Grid)
227: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
228: else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
229:
230: /*
231: * Freeze the server, if requested by the user.
232: * This results in a solid box instead of a flickering one.
233: */
234: if (Freeze)
235: XGrabServer();
236:
237: /*
238: * Process any outstanding events before drawing the box.
239: */
240: while (QLength() > 0) {
241: XPeekEvent(&button_event);
242: if (button_event.window == RootWindow)
243: break;
244: GetButton(&button_event);
245: }
246:
247: /*
248: * Draw the box.
249: */
250: DrawBox();
251: if (Freeze)
252: Frozen = window;
253:
254: /*
255: * We spin our wheels here looking for mouse movement or a change
256: * in the status of the buttons.
257: */
258: while (TRUE) {
259:
260: /*
261: * Check to see if we have a change in mouse button status.
262: * This is how we get out of this "while" loop.
263: */
264: if (XPending() && GetButton(&button_event)) {
265: /*
266: * Process the pending events, this sequence is the only
267: * way out of the loop and the routine.
268: */
269:
270: /*
271: * If we froze the server, then erase the last lines drawn.
272: */
273: if (Freeze) {
274: DrawBox();
275: Frozen = (Window)0;
276: XUngrabServer();
277: }
278:
279: /*
280: * Save the mouse cursor location.
281: */
282: mse_x = button_event.x;
283: mse_y = button_event.y;
284: break;
285: }
286: else {
287: /*
288: * Continue to track the mouse until we get a change
289: * in button status.
290: */
291: XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_win);
292:
293: /*
294: * If the mouse has moved, then make sure the box follows it.
295: */
296: if ((cur_x != prev_x) || (cur_y != prev_y)) {
297:
298: /*
299: * If we've frozen the server, then erase the old box first!
300: */
301: if (Freeze)
302: DrawBox();
303:
304: /*
305: * Set the new box position.
306: */
307: ulx += cur_x - prev_x;
308: uly += cur_y - prev_y;
309: lrx += cur_x - prev_x;
310: lry += cur_y - prev_y;
311:
312: /*
313: * Calculate the vectors for the new box.
314: */
315: if (Grid)
316: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
317: else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
318:
319: /*
320: * Draw the new box.
321: */
322: if (Freeze)
323: DrawBox();
324: }
325:
326: /*
327: * Save the old box position.
328: */
329: prev_x = cur_x;
330: prev_y = cur_y;
331:
332: /*
333: * If server is not frozen, then draw the "flicker" box.
334: */
335: if (!Freeze) {
336: DrawBox();
337: DrawBox();
338: }
339: }
340: }
341:
342: /*
343: * Restore the main cursor.
344: */
345: Grab(mask);
346:
347: /*
348: * If the button is not a button release of the same button pressed,
349: * then abort the operation.
350: */
351: if ((button_event.type != ButtonReleased) ||
352: ((button_event.detail & ValueMask) != button)) {
353: return(TRUE);
354: }
355:
356: /*
357: * If we are here we have committed to iconifying/deiconifying.
358: */
359:
360: /*
361: * Determine the coordinates of the icon or window;
362: * normalize the window or icon coordinates if the user so desires.
363: */
364: icon_x = mse_x - (icon_w >> 1) - icon_bdr;
365: icon_y = mse_y - (icon_h >> 1) - icon_bdr;
366: if ((NIcon && iconifying) || (NWindow && !iconifying)) {
367: if (icon_x < 0) icon_x = 0;
368: if (icon_y < 0) icon_y = 0;
369: if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) {
370: icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1;
371: }
372: if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) {
373: icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1;
374: }
375: }
376:
377: /*
378: * Move the window into place.
379: */
380: XMoveWindow(icon, icon_x, icon_y);
381:
382: /*
383: * Map the icon window.
384: */
385: XMapWindow(icon);
386:
387: if (Zap) {
388: num_vectors = StoreZap(zap, window_info.x, window_info.y,
389: window_info.x + window_info.width +
390: (window_info.bdrwidth << 1),
391: window_info.y + window_info.height +
392: (window_info.bdrwidth << 1),
393: ulx, uly, lrx, lry);
394: DrawZap();
395: DrawZap();
396: }
397:
398: /*
399: * Unmap the event window.
400: */
401: XUnmapWindow(window);
402: return(TRUE);
403: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.