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