|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright Massachusetts Institute of Technology 1985 */ ! 4: ! 5: /* ! 6: * Move - Window movement subroutine for the X Window System window ! 7: * manager (xwm). ! 8: * ! 9: * File: Move.c ! 10: */ ! 11: #ifndef lint ! 12: static char *rcsid_Move_c = "$Header: Move.c,v 10.3 86/02/01 16:09:58 tony Rel $"; ! 13: #endif ! 14: ! 15: #include "xwm.h" ! 16: ! 17: Move(window, x, y) ! 18: Window window; ! 19: int x; ! 20: int y; ! 21: { ! 22: register int prev_x; /* Previous event window X location. */ ! 23: register int prev_y; /* Previous event window Y location. */ ! 24: register WindowInfo window_info; /* Event window information. */ ! 25: int cur_x; /* Current event window X location. */ ! 26: int cur_y; /* Current event window Y location. */ ! 27: int ulx, uly; /* Event window upper left X and Y. */ ! 28: int lrx, lry; /* Event window lower right X and Y. */ ! 29: int init_ulx, init_uly; /* Init window upper left X and Y. */ ! 30: int init_lrx, init_lry; /* Init window lower right X and Y. */ ! 31: int status; /* Routine call status. */ ! 32: int num_vectors; /* Number of vectors in box. */ ! 33: Window sub_window; /* Query mouse event sub-window. */ ! 34: XButtonEvent button_event; /* Button event packet. */ ! 35: Bool moving; /* Are we moving the window? */ ! 36: Vertex box[MAX_BOX_VECTORS]; /* Box vertex buffer. */ ! 37: Vertex zap[MAX_ZAP_VECTORS]; /* Zap effect verted buffer. */ ! 38: ! 39: /* ! 40: * Clear the vector buffers. ! 41: */ ! 42: bzero(box, sizeof(box)); ! 43: if (Zap) bzero(zap, sizeof(zap)); ! 44: ! 45: /* ! 46: * Gather info on the event window since we may move it. ! 47: */ ! 48: status = XQueryWindow(window, &window_info); ! 49: if (status == FAILURE) { ! 50: /* ! 51: * If there is a query error, abort the operation and return. ! 52: */ ! 53: return; ! 54: } ! 55: ! 56: /* ! 57: * Initialize movement variables. ! 58: */ ! 59: ulx = window_info.x; ! 60: init_ulx = ulx; ! 61: uly = window_info.y; ! 62: init_uly = uly; ! 63: lrx = window_info.x + window_info.width + (window_info.bdrwidth << 1) - 1; ! 64: init_lrx = lrx; ! 65: lry = window_info.y + window_info.height + (window_info.bdrwidth << 1) - 1; ! 66: init_lry = lry; ! 67: ! 68: moving = FALSE; ! 69: ! 70: while (TRUE) { ! 71: ! 72: /* ! 73: * Check to see if we have a change in mouse button status. ! 74: * This is how we get out of this "while" loop. ! 75: */ ! 76: if (XPending() && GetButton(&button_event)) { ! 77: /* ! 78: * Process the pending events, this sequence is the only ! 79: * way out of the loop and the routine. ! 80: */ ! 81: if ( ! 82: (button_event.type == ButtonReleased) && ! 83: ((button_event.detail & ValueMask) == RightButton) ! 84: ){ ! 85: /* ! 86: * Ok, the right button was released. ! 87: * If we are not moving see if we should be. If we ! 88: * have move more than Delta pixels then start moving ! 89: * the window. ! 90: */ ! 91: cur_x = button_event.x; ! 92: cur_y = button_event.y; ! 93: ! 94: if ( ! 95: !moving && ! 96: (abs(cur_x - x) > Delta) || (abs(cur_y - y) > Delta) ! 97: ){ ! 98: /* ! 99: * Start moving. ! 100: */ ! 101: /* ! 102: * Change the cursor. ! 103: */ ! 104: status = XGrabButton( ! 105: RootWindow, ! 106: ArrowCrossCursor, ! 107: (RightMask | ButtonMask), ! 108: (ButtonPressed | ButtonReleased) ! 109: ); ! 110: if (status == FAILURE) { ! 111: Error("Move -> Unable to grab right button and change cursor."); ! 112: } ! 113: ! 114: /* ! 115: * Set the moving flag. ! 116: */ ! 117: moving = TRUE; ! 118: } ! 119: ! 120: if (moving) { ! 121: /* ! 122: * We are moveing so reset the cursor and move the ! 123: * window. ! 124: */ ! 125: status = XGrabButton( ! 126: RootWindow, ! 127: CircleCursor, ! 128: (RightMask | ButtonMask), ! 129: (ButtonPressed | ButtonReleased) ! 130: ); ! 131: if (status == FAILURE) { ! 132: Error("Move -> Unable to grab right button and change cursor."); ! 133: } ! 134: ! 135: if (Zap) { ! 136: num_vectors = StoreZap( ! 137: zap, ! 138: init_ulx, init_uly, ! 139: init_lrx, init_lry, ! 140: ulx, uly, ! 141: lrx, lry ! 142: ); ! 143: XDraw( ! 144: RootWindow, ! 145: zap, num_vectors, ! 146: DRAW_HEIGHT, DRAW_WIDTH, ! 147: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 148: ); ! 149: XDraw( ! 150: RootWindow, ! 151: zap, num_vectors, ! 152: DRAW_HEIGHT, DRAW_WIDTH, ! 153: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 154: ); ! 155: } ! 156: ! 157: XMoveWindow(window, ulx, uly); ! 158: return; ! 159: } ! 160: else { ! 161: /* ! 162: * We didn't move so this must have been a raise ! 163: * window operation only. No need to reset the ! 164: * cursor since we only change it if we are moving. ! 165: */ ! 166: XRaiseWindow(window); ! 167: return; ! 168: } ! 169: } ! 170: else { ! 171: /* ! 172: * Some other button event occured, this aborts the ! 173: * current operation. ! 174: */ ! 175: if (moving) { ! 176: /* ! 177: * If we were moving then reset the cursor. ! 178: */ ! 179: status = XGrabButton( ! 180: RootWindow, ! 181: CircleCursor, ! 182: (RightMask | ButtonMask), ! 183: (ButtonPressed | ButtonReleased) ! 184: ); ! 185: if (status == FAILURE) { ! 186: Error("Move -> Unable to grab right button and change cursor."); ! 187: } ! 188: } ! 189: return; ! 190: } ! 191: } ! 192: ! 193: if (!moving) { ! 194: /* ! 195: * If we are not moving see if we should be. If we ! 196: * have move more than Delta pixels then start moving ! 197: * the window. ! 198: */ ! 199: XQueryMouse(RootWindow, &cur_x, &cur_y, &sub_window); ! 200: if ((abs(cur_x - x) > Delta) || (abs(cur_y - y) > Delta)) { ! 201: /* ! 202: * Start moving. ! 203: */ ! 204: ! 205: /* ! 206: * Change the cursor. ! 207: */ ! 208: status = XGrabButton( ! 209: RootWindow, ! 210: ArrowCrossCursor, ! 211: (RightMask | ButtonMask), ! 212: (ButtonPressed | ButtonReleased) ! 213: ); ! 214: if (status == FAILURE) { ! 215: Error("Move -> Unable to grab right button and change cursor."); ! 216: } ! 217: ! 218: /* ! 219: * Store the box. ! 220: */ ! 221: if (Grid) { ! 222: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 223: } ! 224: else { ! 225: num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 226: } ! 227: ! 228: /* ! 229: * Initialize the previous location variables. ! 230: */ ! 231: prev_x = x; ! 232: prev_y = y; ! 233: ! 234: /* ! 235: * Set the moving flag. ! 236: */ ! 237: moving = TRUE; ! 238: } ! 239: else { ! 240: /* ! 241: * We haven't moved enough yet. ! 242: */ ! 243: continue; ! 244: } ! 245: } ! 246: ! 247: if (moving) { ! 248: /* ! 249: * If we have begun moving or have been moving take care ! 250: * of all the little that have to change. ! 251: */ ! 252: XQueryMouse(RootWindow, &cur_x, &cur_y, &sub_window); ! 253: if ((cur_x != prev_x) || (cur_y != prev_y)) { ! 254: /* ! 255: * Box position has changed. ! 256: */ ! 257: ulx += cur_x - prev_x; ! 258: uly += cur_y - prev_y; ! 259: lrx += cur_x - prev_x; ! 260: lry += cur_y - prev_y; ! 261: ! 262: /* ! 263: * Box needs to be restored. ! 264: */ ! 265: if (Grid) { ! 266: num_vectors = StoreGridBox(box, ulx, uly, lrx, lry); ! 267: } ! 268: else { ! 269: num_vectors = StoreBox(box, ulx, uly, lrx, lry); ! 270: } ! 271: ! 272: /* ! 273: * Save old box position. ! 274: */ ! 275: prev_x = cur_x; ! 276: prev_y = cur_y; ! 277: } ! 278: ! 279: /* ! 280: * Draw Box. ! 281: */ ! 282: XDraw( ! 283: RootWindow, ! 284: box, num_vectors, ! 285: DRAW_HEIGHT, DRAW_WIDTH, ! 286: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 287: ); ! 288: XDraw( ! 289: RootWindow, ! 290: box, num_vectors, ! 291: DRAW_HEIGHT, DRAW_WIDTH, ! 292: DRAW_VALUE, DRAW_FUNC, DRAW_PLANES ! 293: ); ! 294: } ! 295: } ! 296: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.