|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_MoveOpaque_c = "$Header: MoveOpaque.c,v 10.4 86/11/19 16:24:08 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 = "@(#)MoveOpaque.c 1.7 1/24/86";
40: #endif
41:
42: #include "uwm.h"
43:
44: Bool MoveOpaque(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: int prev_x, prev_y; /* Previous mouse location. */
51: int cur_x, cur_y; /* Current mouse location. */
52: int win_x, win_y; /* Current window location. */
53: WindowInfo window_info; /* Event window information. */
54: Window sub_window; /* Query mouse event sub-window. */
55: XButtonEvent button_event; /* Button event packet. */
56:
57: /*
58: * Do not try to move the root window.
59: */
60: if (window == RootWindow)
61: return(FALSE);
62:
63: /*
64: * Change the cursor.
65: */
66: status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
67: if (status == FAILURE)
68: Error("MoveOpaque -> Unable to grab button and change cursor.");
69:
70: /*
71: * Gather info on the event window.
72: */
73: status = XQueryWindow(window, &window_info);
74: if (status == FAILURE) return(FALSE);
75:
76: /*
77: * Initialize movement variables.
78: */
79: prev_x = cur_x = x;
80: prev_y = cur_y = y;
81: win_x = window_info.x;
82: win_y = window_info.y;
83:
84: /*
85: * Main loop.
86: */
87: while (TRUE) {
88:
89: /*
90: * Check to see if we have a change in mouse button status.
91: * This is how we get out of this "while" loop.
92: */
93: if (XPending() && GetButton(&button_event)) {
94:
95: /*
96: * If the button event was something other than the
97: * release of the original button pressed, then move the
98: * window back to where it was originally.
99: */
100: if ((button_event.type != ButtonReleased) ||
101: ((button_event.detail & ValueMask) != button))
102: XMoveWindow(window, window_info.x, window_info.y);
103:
104: /*
105: * Reset the cursor and return.
106: */
107: Grab(mask);
108: return(TRUE);
109: }
110:
111: /*
112: * Take care of all the little things that have changed;
113: * i.e., move the window, if necessary.
114: */
115: XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_window);
116: if ((cur_x != prev_x) || (cur_y != prev_y)) {
117: win_x += (cur_x - prev_x);
118: win_y += (cur_y - prev_y);
119: XMoveWindow(window, win_x, win_y);
120: prev_x = cur_x;
121: prev_y = cur_y;
122: }
123: }
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.