|
|
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.