Annotation of 43BSD/contrib/X/uwm/Move.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.