|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_Move_c = "$Header: Move.c,v 10.3 86/02/01 16:23:17 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 = "@(#)Move.c 3.8 1/24/86";
45: #endif
46:
47: #include "uwm.h"
48:
49: Bool Move(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 int prev_x; /* Previous event window X location. */
56: register int prev_y; /* Previous event window Y location. */
57: register WindowInfo window_info; /* Event window information. */
58: int cur_x; /* Current event window X location. */
59: int cur_y; /* Current event window Y location. */
60: int ulx, uly; /* Event window upper left X and Y. */
61: int lrx, lry; /* Event window lower right X and Y. */
62: int init_ulx, init_uly; /* Init window upper left X and Y. */
63: int init_lrx, init_lry; /* Init window lower right X and Y. */
64: int num_vectors; /* Number of vectors in box. */
65: Window sub_window; /* Query mouse event sub-window. */
66: XButtonEvent button_event; /* Button event packet. */
67: Vertex box[MAX_BOX_VECTORS]; /* Box vertex buffer. */
68: Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect verted buffer. */
69:
70: /*
71: * Do not try to move the root window.
72: */
73: if (window == RootWindow)
74: return(FALSE);
75:
76: /*
77: * Change the cursor.
78: */
79: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
80: if (status == FAILURE)
81: Error("Move -> Unable to grab button and change cursor.");
82:
83: /*
84: * Clear the vector buffers.
85: */
86: bzero(box, sizeof(box));
87: if (Zap) bzero(zap, sizeof(zap));
88:
89: /*
90: * Gather info on the event window.
91: */
92: status = XQueryWindow(window, &window_info);
93: if (status == FAILURE) return(FALSE);
94:
95: /*
96: * Initialize movement variables.
97: */
98: init_ulx = ulx = window_info.x;
99: init_uly = uly = window_info.y;
100: init_lrx = lrx = window_info.x + window_info.width +
101: (window_info.bdrwidth << 1) - 1;
102: init_lry = lry = window_info.y + window_info.height +
103: (window_info.bdrwidth << 1) - 1;
104:
105: /*
106: * Store the box.
107: */
108: if (Grid)
109: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
110: else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
111:
112: /*
113: * Initialize the previous location variables.
114: */
115: prev_x = x;
116: prev_y = y;
117:
118: /*
119: * Freeze the server, if requested by the user.
120: * This results in a solid box instead of a flickering one.
121: */
122: if (Freeze) XGrabServer();
123:
124: /*
125: * Process any pending exposure events before drawing the box.
126: */
127: while (QLength() > 0) {
128: XPeekEvent(&button_event);
129: if (button_event.window == RootWindow)
130: break;
131: GetButton(&button_event);
132: }
133:
134: /*
135: * Now draw the box.
136: */
137: DrawBox();
138: Frozen = window;
139:
140: /*
141: * Main loop.
142: */
143: while (TRUE) {
144:
145: /*
146: * Check to see if we have a change in mouse button status.
147: * This is how we get out of this "while" loop.
148: */
149: if (XPending() && GetButton(&button_event)) {
150: /*
151: * Process the pending events, this sequence is the only
152: * way out of the loop and the routine.
153: */
154:
155: /*
156: * If we froze the server, then erase the last lines drawn.
157: */
158: if (Freeze) {
159: DrawBox();
160: Frozen = (Window)0;
161: XUngrabServer();
162: }
163:
164: if ((button_event.type == ButtonReleased) &&
165: ((button_event.detail & ValueMask) == button)) {
166:
167: /*
168: * The button was released, so reset the cursor and
169: * move the window.
170: */
171: Grab(mask);
172:
173: if (Zap) {
174: num_vectors = StoreZap(zap,
175: init_ulx, init_uly,
176: init_lrx, init_lry,
177: ulx, uly,
178: lrx, lry);
179: DrawZap();
180: DrawZap();
181: }
182: XMoveWindow(window, ulx, uly);
183: return(TRUE);
184: }
185: else {
186:
187: /*
188: * Some other button event occured, this aborts the
189: * current operation.
190: */
191:
192: /*
193: * Reset the cursor.
194: */
195: Grab(mask);
196: return(TRUE);
197: }
198: }
199:
200: /*
201: * Take care of all the little things that have changed.
202: */
203: XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_window);
204: if ((cur_x != prev_x) || (cur_y != prev_y)) {
205:
206: /*
207: * If we've frozen the server, then erase the old box first!
208: */
209: if (Freeze)
210: DrawBox();
211:
212: /*
213: * Box position has changed.
214: */
215: ulx += cur_x - prev_x;
216: uly += cur_y - prev_y;
217: lrx += cur_x - prev_x;
218: lry += cur_y - prev_y;
219:
220: /*
221: * Box needs to be restored.
222: */
223: if (Grid)
224: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
225: else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
226:
227:
228: /*
229: * Draw the new box.
230: */
231: if (Freeze)
232: DrawBox();
233: }
234:
235: /*
236: * Save old box position.
237: */
238: prev_x = cur_x;
239: prev_y = cur_y;
240:
241: /*
242: * If server is not frozen, then draw the "flicker" box.
243: */
244: if (!Freeze) {
245: DrawBox();
246: DrawBox();
247: }
248: }
249: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.