|
|
1.1 root 1: /* $Header: Iconify.c,v 1.1 87/09/11 08:21:28 toddb Exp $ */
2: #include <X11/copyright.h>
3:
4: /*
5: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
6: *
7: * All Rights Reserved
8: *
9: * Permission to use, copy, modify, and distribute this software and its
10: * documentation for any purpose and without fee is hereby granted,
11: * provided that the above copyright notice appear in all copies and that
12: * both that copyright notice and this permission notice appear in
13: * supporting documentation, and that the name of Digital Equipment
14: * Corporation not be used in advertising or publicity pertaining to
15: * distribution of the software without specific, written prior permission.
16: *
17: *
18: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
19: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
20: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
21: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
23: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
24: * SOFTWARE.
25: */
26:
27:
28:
29: /*
30: * MODIFICATION HISTORY
31: *
32: * 000 -- M. Gancarz, DEC Ultrix Engineering Group
33: * 001 -- R. Kittell, DEC Storage A/D May 20, 1986
34: * Add optional warp of mouse to the upper right corner on de-iconify,
35: * and to the icon center on iconify.
36: * 002 -- Loretta Guarino Reid, DEC Ultrix Engineering Group,
37: * Western Software Lab. Port to X11.
38: */
39:
40: #ifndef lint
41: static char *sccsid = "%W% %G%";
42: #endif
43:
44: #include "uwm.h"
45:
46: Bool Iconify(window, mask, button, x, y)
47: Window window; /* Event window. */
48: int mask; /* Button/key mask. */
49: int button; /* Button event detail. */
50: int x, y; /* Event mouse position. */
51: {
52: XWindowAttributes window_info; /* Event window info. */
53: XWindowAttributes assoc_info; /* Associated window info. */
54: int mse_x, mse_y; /* Mouse X and Y coordinates. */
55: int sub_win_x, sub_win_y; /* relative Mouse coordinates. */
56: int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */
57: int icon_w, icon_h; /* Icon width and height. */
58: int icon_bdr; /* Icon border width. */
59: int num_vectors; /* Number of vectors in zap buffer. */
60: int mmask; /* Mouse state */
61: Window root; /* Mouse root window. */
62: Window assoc; /* Associated window. */
63: Window sub_win; /* Mouse position sub-window. */
64: XSegment zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */
65: Bool iconifying; /* Are we iconifying? */
66:
67: /*
68: * Do not try to iconify the root window.
69: */
70: if (window == RootWindow(dpy, scr))
71: return(FALSE);
72:
73: /*
74: * Clear the vector buffer.
75: */
76: if (Zap) bzero(zap, sizeof(zap));
77:
78: /*
79: * Get the mouse cursor position in case we must put a new
80: * icon there.
81: */
82: XQueryPointer(dpy, RootWindow(dpy, scr), &root, &sub_win,
83: &mse_x, &mse_y, &sub_win_x, &sub_win_y, &mmask);
84:
85: /*
86: * Gather info about the window.
87: */
88: status = XGetWindowAttributes(dpy, window, &window_info);
89: if (status == FAILURE) return(FALSE);
90:
91: /*
92: * If the event window is an icon, de-iconify it and return.
93: */
94: if (IsIcon(window, mse_x, mse_y, TRUE, &assoc)) {
95:
96:
97: /*
98: * Gather info about the assoc window.
99: */
100: status = XGetWindowAttributes(dpy, assoc, &assoc_info);
101: if (status == FAILURE) return(FALSE);
102:
103: /*
104: * Store the zap vector buffer.
105: */
106: if (Zap) {
107: num_vectors = StoreZap(
108: zap,
109: assoc_info.x - 1,
110: assoc_info.y - 1,
111: assoc_info.x + assoc_info.width +
112: (assoc_info.border_width << 1),
113: assoc_info.y + assoc_info.height +
114: (assoc_info.border_width << 1),
115: window_info.x - 1,
116: window_info.y - 1,
117: window_info.x + window_info.width +
118: (window_info.border_width << 1),
119: window_info.y + window_info.height +
120: (window_info.border_width << 1));
121: }
122:
123: /*
124: * Map the window and synchronize.
125: */
126: XMapRaised(dpy, assoc);
127: XRemoveFromSaveSet(dpy, assoc);
128:
129: if (Zap) {
130: /*
131: * Draw the zap lines.
132: */
133: DrawZap();
134: }
135:
136: /*
137: * Unmap the icon window.
138: */
139: XUnmapWindow(dpy, window);
140:
141: /*
142: * Optionally warp the mouse to the upper right corner of the
143: * window.
144: */
145: if (WarpOnDeIconify) {
146: status = XGetWindowAttributes (dpy, assoc, &assoc_info);
147: if (status == FAILURE) return(FALSE);
148: status = XWarpPointer (dpy, None, assoc,
149: 0, 0, 0, 0,
150: assoc_info.width >= 7 ?
151: assoc_info.width - 7 : assoc_info.width / 2,
152: assoc_info.height >= 10 ? 10 :
153: assoc_info.height / 2);
154: if (status == FAILURE) return(FALSE);
155: }
156: }
157: else {
158: /*
159: * We have an icon window; all we have to do is
160: * map it.
161: */
162: status = XGetWindowAttributes(dpy, assoc, &assoc_info);
163: if (status == FAILURE) return(FALSE);
164: icon_x = assoc_info.x;
165: icon_y = assoc_info.y;
166: icon_w = assoc_info.width;
167: icon_h = assoc_info.height;
168: icon_bdr = assoc_info.border_width;
169:
170: if (Zap) {
171: /*
172: * Store the zap effect vectors.
173: */
174: num_vectors = StoreZap(
175: zap,
176: window_info.x - 1,
177: window_info.y - 1,
178: window_info.x + window_info.width + (window_info.border_width << 1),
179: window_info.y + window_info.height + (window_info.border_width << 1),
180: icon_x - 1,
181: icon_y - 1,
182: icon_x + icon_w + (icon_bdr << 1),
183: icon_y + icon_h + (icon_bdr << 1)
184: );
185: }
186:
187: /*
188: * Map the icon window.
189: */
190: XMapWindow(dpy, assoc);
191:
192: if (Zap) {
193: /*
194: * Draw zap lines from the window to its icon.
195: */
196: DrawZap();
197: DrawZap();
198: }
199:
200: /*
201: * Unmap the event window.
202: */
203: XAddToSaveSet(dpy, window);
204: XUnmapWindow(dpy, window);
205:
206: /*
207: * Optionally warp the mouse to the icon center.
208: */
209: if (WarpOnIconify) {
210: status = XGetWindowAttributes(dpy, assoc, &assoc_info);
211: if (status == FAILURE) return(FALSE);
212: status = XWarpPointer (dpy, None, assoc,
213: 0, 0, 0, 0,
214: assoc_info.width / 2, assoc_info.height / 2);
215: if (status == FAILURE) return(FALSE);
216: }
217:
218: }
219: return(FALSE);
220: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.