Annotation of 43BSDTahoe/new/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.4 86/11/19 16:24:03 jg Rel $";
                      3: #endif lint
                      4: 
                      5: /*
                      6:  *                     COPYRIGHT 1985, 1986
                      7:  *                DIGITAL EQUIPMENT CORPORATION
                      8:  *                    MAYNARD, MASSACHUSETTS
                      9:  *                     ALL RIGHTS RESERVED.
                     10:  *
                     11:  * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
                     12:  * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
                     13:  * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITIBILITY OF THIS SOFTWARE FOR
                     14:  * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
                     15:  *
                     16:  * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
                     17:  * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
                     18:  * SET FORTH ABOVE.
                     19:  *
                     20:  *
                     21:  * Permission to use, copy, modify, and distribute this software and its
                     22:  * documentation for any purpose and without fee is hereby granted, provided
                     23:  * that the above copyright notice appear in all copies and that both that
                     24:  * copyright notice and this permission notice appear in supporting documentation,
                     25:  * and that the name of Digital Equipment Corporation not be used in advertising
                     26:  * or publicity pertaining to distribution of the software without specific, 
                     27:  * written prior permission.
                     28:  *
                     29:  */
                     30: 
                     31: 
                     32: /*
                     33:  * MODIFICATION HISTORY
                     34:  *
                     35:  * 000 -- M. Gancarz, DEC Ultrix Engineering Group
                     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: short 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:     register WindowInfo 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 ulx, uly;                      /* Event window upper left X and Y. */
                     56:     int lrx, lry;                      /* Event window lower right X and Y. */
                     57:     int init_ulx, init_uly;            /* Init window upper left X and Y. */
                     58:     int init_lrx, init_lry;            /* Init window lower right X and Y. */
                     59:     int num_vectors;                   /* Number of vectors in box. */
                     60:     Window sub_window;                 /* Query mouse event sub-window. */
                     61:     XButtonEvent button_event;         /* Button event packet. */
                     62:     Vertex box[MAX_BOX_VECTORS];       /* Box vertex buffer. */
                     63:     Vertex zap[MAX_ZAP_VECTORS];       /* Zap effect verted buffer. */
                     64: 
                     65:     /*
                     66:      * Do not try to move the root window.
                     67:      */
                     68:     if (window == RootWindow)
                     69:         return(FALSE);
                     70: 
                     71:     /*
                     72:      * Change the cursor.
                     73:      */
                     74:     status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
                     75:     if (status == FAILURE)
                     76:         Error("Move -> Unable to grab button and change cursor.");
                     77: 
                     78:     /*
                     79:      * Clear the vector buffers.
                     80:      */
                     81:     bzero(box, sizeof(box));
                     82:     if (Zap) bzero(zap, sizeof(zap));
                     83:     
                     84:     /*
                     85:      * Gather info on the event window.
                     86:      */
                     87:     status = XQueryWindow(window, &window_info);
                     88:     if (status == FAILURE) return(FALSE);
                     89: 
                     90:     /*
                     91:      * Initialize movement variables.
                     92:      */
                     93:     init_ulx = ulx = window_info.x;
                     94:     init_uly = uly = window_info.y;
                     95:     init_lrx = lrx = window_info.x + window_info.width +
                     96:                      (window_info.bdrwidth << 1) - 1;
                     97:     init_lry = lry = window_info.y + window_info.height +
                     98:                      (window_info.bdrwidth << 1) - 1;
                     99: 
                    100:     /*
                    101:      * Store the box.
                    102:      */
                    103:     if (Grid)
                    104:         num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    105:     else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    106: 
                    107:     /*
                    108:      * Initialize the previous location variables.
                    109:      */
                    110:     prev_x = x;
                    111:     prev_y = y;
                    112: 
                    113:     /*
                    114:      * Freeze the server, if requested by the user.
                    115:      * This results in a solid box instead of a flickering one.
                    116:      */
                    117:     if (Freeze) XGrabServer();
                    118: 
                    119:     /*
                    120:      * Process any pending exposure events before drawing the box.
                    121:      */
                    122:     while (QLength() > 0) {
                    123:         XPeekEvent(&button_event);
                    124:         if (button_event.window == RootWindow)
                    125:             break;
                    126:         GetButton(&button_event);
                    127:     }
                    128: 
                    129:     /*
                    130:      * Now draw the box.
                    131:      */
                    132:     DrawBox();
                    133:     Frozen = window;
                    134: 
                    135:     /*
                    136:      * Main loop.
                    137:      */
                    138:     while (TRUE) {
                    139: 
                    140:        /*
                    141:         * Check to see if we have a change in mouse button status.
                    142:         * This is how we get out of this "while" loop.
                    143:         */
                    144:        if (XPending() && GetButton(&button_event)) {
                    145:            /*
                    146:             * Process the pending events, this sequence is the only
                    147:             * way out of the loop and the routine.
                    148:             */
                    149: 
                    150:             /*
                    151:              * If we froze the server, then erase the last lines drawn.
                    152:              */
                    153:             if (Freeze) {
                    154:                 DrawBox();
                    155:                 Frozen = (Window)0;
                    156:                 XUngrabServer();
                    157:             }
                    158: 
                    159:            if ((button_event.type == ButtonReleased) &&
                    160:                ((button_event.detail & ValueMask) == button)) {
                    161: 
                    162:                /*
                    163:                 * The button was released, so reset the cursor and
                    164:                 * move the window.
                    165:                 */
                    166:                 Grab(mask);
                    167: 
                    168:                if (Zap) {
                    169:                     num_vectors = StoreZap(zap,
                    170:                                            init_ulx, init_uly,
                    171:                                            init_lrx, init_lry,
                    172:                                            ulx, uly,
                    173:                                            lrx, lry);
                    174:                     DrawZap();
                    175:                     DrawZap();
                    176:                 }
                    177:                XMoveWindow(window, ulx, uly);
                    178:                return(TRUE);
                    179:            }
                    180:            else {
                    181: 
                    182:                /*
                    183:                 * Some other button event occured, this aborts the
                    184:                 * current operation.
                    185:                 */
                    186: 
                    187:                /*
                    188:                 * Reset the cursor.
                    189:                 */
                    190:                 Grab(mask);
                    191:                return(TRUE);
                    192:            }
                    193:        }
                    194: 
                    195:         /*
                    196:          * Take care of all the little things that have changed.
                    197:          */
                    198:         XUpdateMouse(RootWindow, &cur_x, &cur_y, &sub_window);
                    199:         if ((cur_x != prev_x) || (cur_y != prev_y)) {
                    200: 
                    201:             /*
                    202:              * If we've frozen the server, then erase the old box first!
                    203:              */
                    204:             if (Freeze)
                    205:                 DrawBox();
                    206: 
                    207:             /*
                    208:              * Box position has changed.
                    209:              */
                    210:             ulx += cur_x - prev_x;
                    211:             uly += cur_y - prev_y;
                    212:             lrx += cur_x - prev_x;
                    213:             lry += cur_y - prev_y;
                    214: 
                    215:             /*
                    216:              * Box needs to be restored.
                    217:              */
                    218:             if (Grid)
                    219:                 num_vectors = StoreGridBox(box, ulx, uly, lrx, lry);
                    220:             else num_vectors = StoreBox(box, ulx, uly, lrx, lry);
                    221: 
                    222: 
                    223:             /*
                    224:              * Draw the new box.
                    225:              */
                    226:             if (Freeze)
                    227:                 DrawBox();
                    228:        }
                    229: 
                    230:        /* 
                    231:         * Save old box position.
                    232:         */
                    233:        prev_x = cur_x;
                    234:        prev_y = cur_y;
                    235: 
                    236:         /*
                    237:          * If server is not frozen, then draw the "flicker" box.
                    238:          */
                    239:         if (!Freeze) {
                    240:             DrawBox();
                    241:             DrawBox();
                    242:         }
                    243:     }
                    244: }

unix.superglobalmegacorp.com

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