|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_Resize_c = "$Header: Resize.c,v 10.3 86/02/01 16:23:45 tony Rel $";
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 = "@(#)Resize.c 3.8 1/24/86";
45: #endif
46:
47: #include "uwm.h"
48:
49: Bool Resize(window, mask, button, x0, y0)
50: Window window; /* Event window. */
51: int mask; /* Button/key mask. */
52: short button; /* Button event detail. */
53: int x0, y0; /* Event mouse position. */
54: {
55: register WindowInfo window_info; /* Event window info. */
56: register WindowInfo assoc_info; /* Icon's associated window info. */
57: int d; /* ??? */
58: int t; /* ??? */
59: int x, y; /* ??? */
60: int h0, hinc, w0, winc, wadd, hadd; /* ??? */
61: int x1, y1, x2, y2; /* ??? */
62: int mx, my; /* ??? */
63: int ox, oy; /* ??? */
64: int lx, ly; /* ??? */
65: int pop_x, pop_y; /* ??? */
66: int hsize, vsize; /* ??? */
67: int dx, dy; /* ??? */
68: int num_vectors; /* Number of vectors to XDraw. */
69: Window assoc; /* Window represented by the icon. */
70: Window sub_win; /* Mouse query sub window. */
71: XButtonEvent button_event; /* Button event packet. */
72: Vertex box[MAX_BOX_VECTORS]; /* Box drawing vertex buffer. */
73: Vertex zap[MAX_ZAP_VECTORS]; /* Zap drawing vertex buffer. */
74: Bool domult; /* ??? */
75: Bool stop; /* Should the window stop changing? */
76:
77: /*
78: * Do nothing if the event window is the root window.
79: */
80: if (window == RootWindow)
81: return(FALSE);
82:
83: /*
84: * Gather info about the event window.
85: */
86: status = XQueryWindow(window, &window_info);
87: if (status == FAILURE) return(FALSE);
88:
89: /*
90: * Do not resize an icon window.
91: */
92: if (window_info.type == IsIcon)
93: return(FALSE);
94:
95: /*
96: * Clear the vector buffers.
97: */
98: bzero(box, sizeof(box));
99: if (Zap) bzero(zap, sizeof(zap));
100:
101: /*
102: * If we are here then we have a resize operation in progress.
103: */
104:
105: /*
106: * Turn on the resize cursor.
107: */
108: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
109: if (status == FAILURE) {
110: Error("Resize -> Unable to grab button and change cursor.");
111: }
112:
113: /*
114: * Get the event window resize hint.
115: */
116: XGetResizeHint(window, &w0, &h0, &winc, &hinc);
117:
118: /*
119: * If I ever have the time to REALLY figure the rest of this out I will
120: * comment it better.
121: */
122: wadd = winc >> 1;
123: hadd = hinc >> 1;
124: x1 = window_info.x;
125: y1 = window_info.y;
126: x2 = x1 + window_info.width + (window_info.bdrwidth << 1) - 1;
127: y2 = y1 + window_info.height + (window_info.bdrwidth << 1) - 1;
128: domult = (winc > 3 && hinc > 3 &&
129: (window_info.width - w0) % winc == 0 &&
130: (window_info.height - h0) % hinc == 0) ? TRUE : FALSE;
131: if (w0 == 0 && winc == 1 && h0 == 0 && hinc == 1) {
132: w0 = h0 = 1;
133: }
134: mx = x2 - window_info.width + w0 + winc;
135: my = y2 - window_info.height + h0 + hinc;
136: w0 += (window_info.bdrwidth << 1) - 1;
137: h0 += (window_info.bdrwidth << 1) - 1;
138: x = x2;
139: y = y2;
140: dx = dy = 1;
141: if (x0 - x1 < x2 - x0) {
142: dx = -1;
143: x = x1;
144: mx = x2 - (mx - x1);
145: t = x1; x1 = x2; x2 = t;
146: }
147: if (y0 - y1 < y2 - y0) {
148: dy = -1;
149: y = y1;
150: my = y2 - (my - y1);
151: t = y1; y1 = y2; y2 = t;
152: }
153: ox = ((x0 - window_info.x - window_info.bdrwidth) * 3) /
154: window_info.width;
155: oy = ((y0 - window_info.y - window_info.bdrwidth) * 3) /
156: window_info.height;
157: if (window_info.width > 2 && window_info.height > 2 && ((ox + oy) & 1)) {
158: if (ox & 1)
159: dx = 0;
160: else
161: dy = 0;
162: }
163:
164: if (Grid) {
165: num_vectors = StoreGridBox(
166: box,
167: MIN(x1, x), MIN(y1, y),
168: MAX(x1, x), MAX(y1, y)
169: );
170: }
171: else {
172: num_vectors = StoreBox(
173: box,
174: MIN(x1, x), MIN(y1, y),
175: MAX(x1, x), MAX(y1, y)
176: );
177: }
178:
179: /*
180: * If we freeze the server, then we will draw solid
181: * lines instead of flickering ones during resizing.
182: */
183: if (Freeze) XGrabServer();
184:
185: /*
186: * Process any pending exposure events before drawing the box.
187: */
188: while (QLength() > 0) {
189: XPeekEvent(&button_event);
190: if (button_event.window == RootWindow)
191: break;
192: GetButton(&button_event);
193: }
194:
195: /*
196: * Now draw the box.
197: */
198: DrawBox();
199: Frozen = window;
200:
201: stop = FALSE;
202: ox = oy = lx = ly = -1;
203:
204: while (!stop) {
205: if (x != ox || y != oy) {
206:
207: /*
208: * If we've frozen the server, then erase
209: * the old box.
210: */
211: if (Freeze)
212: DrawBox();
213:
214: if (Grid) {
215: num_vectors = StoreGridBox(
216: box,
217: MIN(x1, x), MIN(y1, y),
218: MAX(x1, x), MAX(y1, y)
219: );
220: }
221: else {
222: num_vectors = StoreBox(
223: box,
224: MIN(x1, x), MIN(y1, y),
225: MAX(x1, x), MAX(y1, y)
226: );
227: }
228:
229: if (Freeze)
230: DrawBox();
231:
232: if (domult) {
233: hsize = (abs(x - x1) - w0) / winc;
234: vsize = (abs(y - y1) - h0) / hinc;
235: PText[0] = hsize / 100 + '0';
236: PText[1] = (hsize / 10) % 10 + '0';
237: PText[2] = hsize % 10 + '0';
238: PText[4] = vsize / 100 + '0';
239: PText[5] = (vsize / 10) % 10 + '0';
240: PText[6] = vsize % 10 + '0';
241:
242: /*
243: * If the font is not fixed width we have to
244: * clear the window to guarantee that the characters
245: * that were there before are erased.
246: */
247: if (!(PFontInfo.fixedwidth)) XClear(Pop);
248: XTextPad (
249: Pop,
250: PPadding, PPadding,
251: PText, PTextSize,
252: PFont, 0, 0,
253: PTextForground, PTextBackground,
254: GXcopy, AllPlanes
255: );
256: }
257: ox = x;
258: oy = y;
259: }
260:
261: if (!Freeze) {
262: DrawBox();
263: DrawBox();
264: }
265:
266: if (XPending() && GetButton(&button_event)) {
267:
268: if (Freeze) {
269: DrawBox();
270: Frozen = (Window)0;
271: XUngrabServer();
272: }
273:
274: if (
275: (button_event.type == ButtonReleased) &&
276: ((button_event.detail & ValueMask) == button)
277: ){
278: x = button_event.x;
279: y = button_event.y;
280: stop = TRUE;
281: }
282: else {
283: if (domult) {
284: XUnmapWindow(Pop);
285: }
286: Grab(mask);
287: return(TRUE);
288: }
289: }
290: else {
291: XUpdateMouse(RootWindow, &x, &y, &sub_win);
292: }
293:
294: if (x == lx && y == ly) {
295: x = ox;
296: y = oy;
297: continue;
298: }
299:
300: lx = x;
301: ly = y;
302:
303: if (dx)
304: ox = -1;
305: else
306: oy = -1;
307: if (domult) {
308: if (dx > 0)
309: pop_x = x1 + window_info.bdrwidth;
310: else if (dx < 0)
311: pop_x = x1 - PWidth - window_info.bdrwidth + 1;
312: else
313: pop_x = window_info.x + window_info.bdrwidth +
314: (window_info.width - PWidth) / 2;
315: if (dy > 0)
316: pop_y = y1 + window_info.bdrwidth;
317: else if (dy < 0)
318: pop_y = y1 - PHeight - window_info.bdrwidth + 1;
319: else
320: pop_y = window_info.y + window_info.bdrwidth +
321: (window_info.height - PHeight) / 2;
322: XMoveWindow(Pop, pop_x, pop_y);
323: XMapWindow(Pop);
324: }
325:
326: if (dx) {
327: if ((d = abs(x - x0) + wadd) < 0)
328: d = 0;
329: d = (d / winc) * winc;
330: if (x < x0) {
331: x = x2 - d;
332: if (dx > 0 && x < mx)
333: x = mx;
334: } else {
335: x = x2 + d;
336: if (dx < 0 && x > mx)
337: x = mx;
338: }
339: } else
340: x = ox;
341: if (dy) {
342: if ((d = abs(y - y0) + hadd) < 0)
343: d = 0;
344: d = (d / hinc) * hinc;
345: if (y < y0) {
346: y = y2 - d;
347: if (dy > 0 && y < my)
348: y = my;
349: } else {
350: y = y2 + d;
351: if (dy < 0 && y > my)
352: y = my;
353: }
354: } else
355: y = oy;
356: }
357: if (x == x2 && y == y2) {
358: XUnmapWindow(Pop);
359: XRaiseWindow(window);
360: } else {
361: if (x < x1) {
362: t = x1; x1 = x; x = t;
363: }
364: if (y < y1) {
365: t = y1; y1 = y; y = t;
366: }
367: dx = x - x1 + 1 - (window_info.bdrwidth << 1);
368: dy = y - y1 + 1 - (window_info.bdrwidth << 1);
369: if (
370: (PWidth > window_info.width) ||
371: (PHeight > window_info.height) ||
372: (PWidth > dx) ||
373: (PHeight > dy)
374: ) {
375: XUnmapWindow(Pop);
376: }
377: else {
378: XUnmapTransparent(Pop);
379: }
380: XConfigureWindow(window, x1, y1, dx, dy);
381: }
382: Grab(mask);
383: return(TRUE);
384: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.