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: }

Defined functions

Move defined in line 17; used 2 times

Defined variables

rcsid_Move_c defined in line 12; never used
Last modified: 1986-02-01
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 894
Valid CSS Valid XHTML 1.0 Strict