|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_MoveOpaque_c = "$Header: MoveOpaque.c,v 1.8 87/08/25 11:26:34 swick Exp $";
3: #endif lint
4:
5: #include <X11/copyright.h>
6:
7: /*
8: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
9: *
10: * All Rights Reserved
11: *
12: * Permission to use, copy, modify, and distribute this software and its
13: * documentation for any purpose and without fee is hereby granted,
14: * provided that the above copyright notice appear in all copies and that
15: * both that copyright notice and this permission notice appear in
16: * supporting documentation, and that the name of Digital Equipment
17: * Corporation not be used in advertising or publicity pertaining to
18: * distribution of the software without specific, written prior permission.
19: *
20: *
21: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
22: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
23: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
24: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
25: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
27: * SOFTWARE.
28: */
29:
30:
31:
32: /*
33: * MODIFICATION HISTORY
34: *
35: * 000 -- M. Gancarz, DEC Ultrix Engineering Group
36: * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group,
37: Western Software Lab. Convert to X11.
38: */
39:
40: #ifndef lint
41: static char *sccsid = "@(#)MoveOpaque.c 1.7 1/24/86";
42: #endif
43:
44: #include "uwm.h"
45:
46: Bool MoveOpaque(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: int prev_x, prev_y; /* Previous mouse location. */
53: int cur_x, cur_y; /* Current mouse location. */
54: int win_x, win_y; /* Current window location. */
55: int root_x; /* Root window X location. */
56: int root_y; /* Root window Y location. */
57: int ptrmask; /* state of ptr when queried */
58: XWindowAttributes window_info; /* Event window information. */
59: Window sub_window; /* Query mouse event sub-window. */
60: Window root; /* Query mouse event root. */
61: XEvent button_event; /* Button event packet. */
62:
63: /*
64: * Do not try to move the root window.
65: */
66: if (window == RootWindow(dpy, scr))
67: return(FALSE);
68:
69: /*
70: * Change the cursor.
71: */
72: XChangeActivePointerGrab(dpy, EVENTMASK, ArrowCrossCursor, CurrentTime);
73:
74: /*
75: * Gather info on the event window.
76: */
77: status = XGetWindowAttributes(dpy, window, &window_info);
78: if (status == FAILURE) return(FALSE);
79:
80: /*
81: * Initialize movement variables.
82: */
83: prev_x = cur_x = x;
84: prev_y = cur_y = y;
85: win_x = window_info.x;
86: win_y = window_info.y;
87:
88: /*
89: * Main loop.
90: */
91: while (TRUE) {
92:
93: /*
94: * Check to see if we have a change in mouse button status.
95: * This is how we get out of this "while" loop.
96: */
97: if (XCheckMaskEvent(dpy,
98: ButtonPressMask|ButtonReleaseMask,
99: &button_event)) {
100:
101: /*
102: * If the button event was something other than the
103: * release of the original button pressed, then move the
104: * window back to where it was originally.
105: */
106: if ((button_event.type != ButtonRelease) ||
107: (((XButtonReleasedEvent *)&button_event)->button != button)) {
108: ResetCursor(button);
109: XMoveWindow(dpy, window, window_info.x, window_info.y);
110: }
111:
112: return(TRUE);
113: }
114:
115: /*
116: * Take care of all the little things that have changed;
117: * i.e., move the window, if necessary.
118: */
119: XQueryPointer(dpy, RootWindow(dpy, scr),
120: &root, &sub_window, &root_x, &root_y, &cur_x, &cur_y,
121: &ptrmask);
122: if ((cur_x != prev_x) || (cur_y != prev_y)) {
123: win_x += (cur_x - prev_x);
124: win_y += (cur_y - prev_y);
125: XMoveWindow(dpy, window, win_x, win_y);
126: prev_x = cur_x;
127: prev_y = cur_y;
128: }
129: }
130: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.