Annotation of 43BSD/contrib/X/xwm/Move.c, revision 1.1

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

unix.superglobalmegacorp.com

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