|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid_Move_c = "$Header: Move.c,v 1.8 87/08/25 11:24:56 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: * MODIFICATION HISTORY ! 32: * ! 33: * 000 -- M. Gancarz, DEC Ultrix Engineering Group ! 34: * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, ! 35: * Western Software Lab. Port to X11 ! 36: */ ! 37: ! 38: #ifndef lint ! 39: static char *sccsid = "@(#)Move.c 3.8 1/24/86"; ! 40: #endif ! 41: ! 42: #include "uwm.h" ! 43: ! 44: Bool Move(window, mask, button, x, y) ! 45: Window window; /* Event window. */ ! 46: int mask; /* Button/key mask. */ ! 47: int button; /* Button event detail. */ ! 48: int x, y; /* Event mouse position. */ ! 49: { ! 50: register int prev_x; /* Previous event window X location. */ ! 51: register int prev_y; /* Previous event window Y location. */ ! 52: XWindowAttributes window_info; /* Event window information. */ ! 53: int cur_x; /* Current event window X location. */ ! 54: int cur_y; /* Current event window Y location. */ ! 55: int root_x; /* Root window X location. */ ! 56: int root_y; /* Root window Y location. */ ! 57: int ulx, uly; /* Event window upper left X and Y. */ ! 58: int lrx, lry; /* Event window lower right X and Y. */ ! 59: int init_ulx, init_uly; /* Init window upper left X and Y. */ ! 60: int init_lrx, init_lry; /* Init window lower right X and Y. */ ! 61: int num_vectors; /* Number of vectors in box. */ ! 62: int ptrmask; /* state of ptr when queried */ ! 63: Window sub_window; /* Query mouse event sub-window. */ ! 64: Window root; /* Query mouse event root. */ ! 65: XEvent button_event; /* Button event packet. */ ! 66: XSegment box[MAX_BOX_VECTORS]; /* Box vertex buffer. */ ! 67: XSegment zap[MAX_ZAP_VECTORS]; /* Zap effect verted buffer. */ ! 68: ! 69: /* ! 70: * Do not try to move the root window. ! 71: */ ! 72: if (window == RootWindow(dpy, scr)) ! 73: return(FALSE); ! 74: ! 75: /* ! 76: * Change the cursor. ! 77: */ ! 78: XChangeActivePointerGrab(dpy, EVENTMASK, ArrowCrossCursor, CurrentTime); ! 79: ! 80: /* ! 81: * Clear the vector buffers. ! 82: */ ! 83: bzero(box, sizeof(box)); ! 84: if (Zap) bzero(zap, sizeof(zap)); ! 85: ! 86: /* ! 87: * Gather info on the event window. ! 88: */ ! 89: status = XGetWindowAttributes(dpy, window, &window_info); ! 90: if (status == FAILURE) return(FALSE); ! 91: ! 92: /* ! 93: * Initialize movement variables. ! 94: */ ! 95: init_ulx = ulx = window_info.x; ! 96: init_uly = uly = window_info.y; ! 97: init_lrx = lrx = window_info.x + window_info.width + ! 98: (window_info.border_width << 1) - 1; ! 99: init_lry = lry = window_info.y + window_info.height + ! 100: (window_info.border_width << 1) - 1; ! 101: ! 102: /* ! 103: * Store the box. ! 104: */ ! 105: if (Grid) ! 106: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 107: else num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 108: ! 109: /* ! 110: * Initialize the previous location variables. ! 111: */ ! 112: prev_x = x; ! 113: prev_y = y; ! 114: ! 115: /* ! 116: * Freeze the server, if requested by the user. ! 117: * This results in a solid box instead of a flickering one. ! 118: */ ! 119: if (Freeze) XGrabServer(dpy); ! 120: ! 121: /* ! 122: * Process any pending exposure events before drawing the box. ! 123: */ ! 124: while (QLength(dpy) > 0) { ! 125: XPeekEvent(dpy, &button_event); ! 126: if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr)) ! 127: break; ! 128: GetButton(&button_event); ! 129: } ! 130: ! 131: /* ! 132: * Now draw the box. ! 133: */ ! 134: DrawBox(); ! 135: Frozen = window; ! 136: ! 137: /* ! 138: * Main loop. ! 139: */ ! 140: while (TRUE) { ! 141: ! 142: /* ! 143: * Check to see if we have a change in mouse button status. ! 144: * This is how we get out of this "while" loop. ! 145: */ ! 146: if (XPending(dpy) && GetButton(&button_event)) { ! 147: /* ! 148: * Process the pending events, this sequence is the only ! 149: * way out of the loop and the routine. ! 150: */ ! 151: ! 152: if ((button_event.type != ButtonPress) && ! 153: (button_event.type != ButtonRelease)) { ! 154: continue; /* spurious menu event... */ ! 155: } ! 156: ! 157: /* ! 158: * If we froze the server, then erase the last lines drawn. ! 159: */ ! 160: if (Freeze) { ! 161: DrawBox(); ! 162: Frozen = (Window)0; ! 163: XUngrabServer(dpy); ! 164: } ! 165: ! 166: if ((button_event.type == ButtonRelease) && ! 167: (((XButtonReleasedEvent *)&button_event)->button == button)) { ! 168: ! 169: /* ! 170: * The button was released, so move the window. ! 171: */ ! 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(dpy, 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: ResetCursor(button); ! 193: return(TRUE); ! 194: } ! 195: } ! 196: ! 197: /* ! 198: * Take care of all the little things that have changed. ! 199: */ ! 200: XQueryPointer(dpy, ! 201: RootWindow(dpy, scr), &root, &sub_window, ! 202: &root_x, &root_y, &cur_x, &cur_y, &ptrmask); ! 203: if ((cur_x != prev_x) || (cur_y != prev_y)) { ! 204: ! 205: /* ! 206: * If we've frozen the server, then erase the old box first! ! 207: */ ! 208: if (Freeze) ! 209: DrawBox(); ! 210: ! 211: /* ! 212: * Box position has changed. ! 213: */ ! 214: ulx += cur_x - prev_x; ! 215: uly += cur_y - prev_y; ! 216: lrx += cur_x - prev_x; ! 217: lry += cur_y - prev_y; ! 218: ! 219: /* ! 220: * Box needs to be restored. ! 221: */ ! 222: if (Grid) ! 223: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 224: else num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 225: ! 226: ! 227: /* ! 228: * Draw the new box. ! 229: */ ! 230: if (Freeze) ! 231: DrawBox(); ! 232: } ! 233: ! 234: /* ! 235: * Save old box position. ! 236: */ ! 237: prev_x = cur_x; ! 238: prev_y = cur_y; ! 239: ! 240: /* ! 241: * If server is not frozen, then draw the "flicker" box. ! 242: */ ! 243: if (!Freeze) { ! 244: DrawBox(); ! 245: DrawBox(); ! 246: } ! 247: } ! 248: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.