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

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright    Massachusetts Institute of Technology    1985  */
        !             4: 
        !             5: /*
        !             6:  *     Change - This subroutine implements window size manipulation
        !             7:  *     for the X Window System window manager (xwm).
        !             8:  *
        !             9:  */
        !            10: 
        !            11: #ifndef lint
        !            12: static char *rcsid_Change_c = "$Header: Change.c,v 10.3 86/02/01 16:09:10 tony Rel $";
        !            13: #endif
        !            14: 
        !            15: #include "xwm.h"
        !            16: 
        !            17: Bool Change(window, x0, y0)
        !            18:     Window window;                     /* Event window. */
        !            19:     int x0, y0;                                /* Event mouse coordinates. */
        !            20: {
        !            21:     register WindowInfo window_info;   /* Event window info. */
        !            22:     register WindowInfo assoc_info;    /* Icon's associated window info. */
        !            23:     int d;                             /* ??? */
        !            24:     int t;                             /* ??? */
        !            25:     int x, y;                          /* ??? */
        !            26:     int h0, hinc, w0, winc, wadd, hadd;        /* ??? */
        !            27:     int x1, y1, x2, y2;                        /* ??? */
        !            28:     int mx, my;                                /* ??? */
        !            29:     int ox, oy;                                /* ??? */
        !            30:     int lx, ly;                                /* ??? */
        !            31:     int pop_x, pop_y;                  /* ??? */
        !            32:     int hsize, vsize;                  /* ??? */
        !            33:     int dx, dy;                                /* ??? */
        !            34:     int status;                                /* Routine call return status. */
        !            35:     int num_vectors;                   /* Number of vectors to XDraw. */
        !            36:     Window assoc;                      /* Window represented by the icon. */
        !            37:     Window sub_win;                    /* Mouse query sub window. */
        !            38:     XButtonEvent button_event;         /* Button event packet. */
        !            39:     Vertex box[MAX_BOX_VECTORS];       /* Box drawing vertex buffer. */
        !            40:     Vertex zap[MAX_ZAP_VECTORS];       /* Zap drawing vertex buffer. */
        !            41:     Bool domult;                       /* ??? */
        !            42:     Bool stop;                         /* Should the window stop changing? */
        !            43:     Bool changing;                     /* Is the window changing? */
        !            44: 
        !            45:     /*
        !            46:      * Clear the vector buffers.
        !            47:      */
        !            48:     bzero(box, sizeof(box));
        !            49:     if (Zap) bzero(zap, sizeof(zap));
        !            50: 
        !            51:     /*
        !            52:      * Gather info about the event window.
        !            53:      */
        !            54:     status = XQueryWindow(window, &window_info);
        !            55:     if (status == FAILURE) {
        !            56:        /*
        !            57:         * If there is a query error, abort the operation.
        !            58:         */
        !            59:        return(FALSE);
        !            60:     }
        !            61: 
        !            62:     /*
        !            63:      * Check to see if we have an icon window.
        !            64:      */
        !            65:     if (window_info.type == IsIcon) {
        !            66:        /*
        !            67:         * We have an uniconify event, wait for a change in button state.
        !            68:         */
        !            69:        assoc = window_info.assoc_wind;
        !            70: 
        !            71:        /*
        !            72:         * Gather info about the assoc window.
        !            73:         */
        !            74:        status = XQueryWindow(assoc, &assoc_info);
        !            75:        if (status == FAILURE) {
        !            76:            /*
        !            77:             * If there is a query error, abort the operation.
        !            78:             */
        !            79:            return(FALSE);
        !            80:        }
        !            81: 
        !            82:        /*
        !            83:         * Spin our wheels untill there is a button event.
        !            84:         */
        !            85:        while (!GetButton(&button_event));
        !            86: 
        !            87:        /*
        !            88:         * Ok, we have a button event, process it.
        !            89:         */
        !            90:        if (
        !            91:            (button_event.type == ButtonReleased) &&
        !            92:            ((button_event.detail & ValueMask) == MiddleButton)
        !            93:        ){
        !            94:            /*
        !            95:             * Middle button came up, this means we have to uniconify the
        !            96:             * window.
        !            97:             */
        !            98: 
        !            99:            if (Zap) {
        !           100:                /*
        !           101:                 * Store the zap vector buffer.
        !           102:                 */
        !           103:                num_vectors = StoreZap(
        !           104:                    zap,
        !           105:                    assoc_info.x - 1,
        !           106:                    assoc_info.y - 1,
        !           107:                    assoc_info.x + assoc_info.width +
        !           108:                        (assoc_info.bdrwidth << 1),
        !           109:                    assoc_info.y + assoc_info.height +
        !           110:                        (assoc_info.bdrwidth << 1),
        !           111:                    window_info.x - 1,
        !           112:                    window_info.y - 1,
        !           113:                    window_info.x + window_info.width +
        !           114:                        (window_info.bdrwidth << 1),
        !           115:                    window_info.y + window_info.height +
        !           116:                        (window_info.bdrwidth << 1)
        !           117:                );
        !           118:            }
        !           119:            
        !           120:            /*
        !           121:             * Map the window and synchronize.
        !           122:             */
        !           123:            XMapWindow(assoc);
        !           124: 
        !           125:            if (Zap) {
        !           126:                /*
        !           127:                 * Draw the zap lines.
        !           128:                 */
        !           129:                XDraw(
        !           130:                    RootWindow,
        !           131:                    zap, num_vectors,
        !           132:                    DRAW_HEIGHT, DRAW_WIDTH,
        !           133:                    DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
        !           134:                );
        !           135:                XDraw(
        !           136:                    RootWindow,
        !           137:                    zap, num_vectors,
        !           138:                    DRAW_HEIGHT, DRAW_WIDTH,
        !           139:                    DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
        !           140:                );
        !           141:            }
        !           142: 
        !           143:            /*
        !           144:             * Unmap the icon window.
        !           145:             */
        !           146:            XUnmapWindow(window);
        !           147: 
        !           148:            /*
        !           149:             * This changed the window, return TRUE.
        !           150:             */
        !           151:            return(TRUE);
        !           152:        }
        !           153:        else {
        !           154:            /*
        !           155:             * Some other button event occured.
        !           156:             * Don't change window, return FALSE.
        !           157:             */
        !           158:             return(FALSE);
        !           159:        }
        !           160:     }
        !           161: 
        !           162:     /*
        !           163:      * If we are here then we have a resize operation in progress.
        !           164:      */
        !           165: 
        !           166:     /*
        !           167:      * Get the event window resize hint.
        !           168:      */
        !           169:     XGetResizeHint(window, &w0, &h0, &winc, &hinc);
        !           170: 
        !           171:     /*
        !           172:      * If I ever have the time to REALLY figure the rest of this out I will
        !           173:      * comment it better.
        !           174:      */
        !           175:     wadd = winc >> 1;
        !           176:     hadd = hinc >> 1;
        !           177:     x1 = window_info.x;
        !           178:     y1 = window_info.y;
        !           179:     x2 = x1 + window_info.width + (window_info.bdrwidth << 1) - 1;
        !           180:     y2 = y1 + window_info.height + (window_info.bdrwidth << 1) - 1;
        !           181:     domult = (winc > 3 && hinc > 3 &&
        !           182:             (window_info.width - w0) % winc == 0 &&
        !           183:             (window_info.height - h0) % hinc == 0) ? TRUE : FALSE;
        !           184:     if (w0 == 0 && winc == 1 && h0 == 0 && hinc == 1) {
        !           185:        w0 = 1;
        !           186:        h0 = 1;
        !           187:     }
        !           188:     mx = x2 - window_info.width + w0 + winc;
        !           189:     my = y2 - window_info.height + h0 + hinc;
        !           190:     w0 += (window_info.bdrwidth << 1) - 1;
        !           191:     h0 += (window_info.bdrwidth << 1) - 1;
        !           192:     x = x2;
        !           193:     y = y2;
        !           194:     dx = 1;
        !           195:     dy = 1;
        !           196:     if (x0 - x1 < x2 - x0) {
        !           197:        dx = -1;
        !           198:        x = x1;
        !           199:        mx = x2 - (mx - x1);
        !           200:        t = x1; x1 = x2; x2 = t;
        !           201:     }
        !           202:     if (y0 - y1 < y2 - y0) {
        !           203:        dy = -1;
        !           204:        y = y1;
        !           205:        my = y2 - (my - y1);
        !           206:        t = y1; y1 = y2; y2 = t;
        !           207:     }
        !           208:     ox = ((x0 - window_info.x - window_info.bdrwidth) * 3) /
        !           209:         window_info.width;
        !           210:     oy = ((y0 - window_info.y - window_info.bdrwidth) * 3) /
        !           211:         window_info.height;
        !           212:     if (window_info.width > 2 && window_info.height > 2 && ((ox + oy) & 1)) {
        !           213:        if (ox & 1)
        !           214:            dx = 0;
        !           215:        else
        !           216:            dy = 0;
        !           217:     }
        !           218: 
        !           219:     stop = FALSE;
        !           220:     changing = FALSE;
        !           221:     ox = -1;
        !           222:     oy = -1;
        !           223:     lx = -1;
        !           224:     ly = -1;
        !           225: 
        !           226:     while (!stop) {
        !           227:        if (x != ox || y != oy) {
        !           228:            if (Grid) {
        !           229:                num_vectors = StoreGridBox(
        !           230:                    box,
        !           231:                    min(x1, x), min(y1, y),
        !           232:                    max(x1, x), max(y1, y)
        !           233:                );
        !           234:            }
        !           235:            else {
        !           236:                num_vectors = StoreBox(
        !           237:                    box,
        !           238:                    min(x1, x), min(y1, y),
        !           239:                    max(x1, x), max(y1, y)
        !           240:                );
        !           241:            }
        !           242:            if (domult && changing) {
        !           243:                hsize = (abs(x - x1) - w0) / winc;
        !           244:                vsize = (abs(y - y1) - h0) / hinc;
        !           245:                PText[0] = hsize / 100 + '0';
        !           246:                PText[1] = (hsize / 10) % 10 + '0';
        !           247:                PText[2] = hsize % 10 + '0';
        !           248:                PText[4] = vsize / 100 + '0';
        !           249:                PText[5] = (vsize / 10) % 10 + '0';
        !           250:                PText[6] = vsize % 10 + '0';
        !           251: 
        !           252:                /*
        !           253:                 * If the font is not fixed width we have to
        !           254:                 * clear the window to guarantee that the characters
        !           255:                 * that were there before are erased.
        !           256:                 */
        !           257:                if (!(PFontInfo.fixedwidth)) XClear(Pop);
        !           258:                XTextPad (
        !           259:                    Pop,
        !           260:                    PPadding, PPadding,
        !           261:                    PText, PTextSize,
        !           262:                    PFont, 0, 0, 
        !           263:                    PTextForground, PTextBackground,
        !           264:                    GXcopy, AllPlanes
        !           265:                );
        !           266:            }
        !           267:            ox = x;
        !           268:            oy = y;
        !           269:        }
        !           270: 
        !           271:        if (changing) {
        !           272:            XDraw(
        !           273:                RootWindow,
        !           274:                box, num_vectors,
        !           275:                DRAW_HEIGHT, DRAW_WIDTH,
        !           276:                DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
        !           277:            );
        !           278:            XDraw(
        !           279:                RootWindow,
        !           280:                box, num_vectors,
        !           281:                DRAW_HEIGHT, DRAW_WIDTH,
        !           282:                DRAW_VALUE, DRAW_FUNC, DRAW_PLANES
        !           283:            );
        !           284:        }
        !           285: 
        !           286:        if (XPending() && GetButton(&button_event)) {
        !           287:            if (
        !           288:                (button_event.type == ButtonReleased) &&
        !           289:                ((button_event.detail & ValueMask) == MiddleButton)
        !           290:            ){
        !           291:                x = button_event.x;
        !           292:                y = button_event.y;
        !           293:                stop = TRUE;
        !           294:            }
        !           295:            else {
        !           296:                if (domult && changing) {
        !           297:                    XUnmapWindow(Pop);
        !           298:                }
        !           299:                return(FALSE);
        !           300:            }
        !           301:        }
        !           302:        else {
        !           303:            XQueryMouse(RootWindow, &x, &y, &sub_win);
        !           304:        }
        !           305: 
        !           306:        if (x == lx && y == ly) {
        !           307:            x = ox;
        !           308:            y = oy;
        !           309:            continue;
        !           310:        }
        !           311: 
        !           312:        lx = x;
        !           313:        ly = y;
        !           314: 
        !           315:        if (!changing) {
        !           316:            if (abs(x - x0) < Delta && abs(y - y0) < Delta) {
        !           317:                x = ox;
        !           318:                y = oy;
        !           319:                continue;
        !           320:            }
        !           321:            if (dx)
        !           322:                ox = -1;
        !           323:            else
        !           324:                oy = -1;
        !           325:            changing = TRUE;
        !           326:            if (domult) {
        !           327:                if (dx > 0)
        !           328:                    pop_x = x1 + window_info.bdrwidth;
        !           329:                else if (dx < 0)
        !           330:                    pop_x = x1 - PWidth - window_info.bdrwidth + 1;
        !           331:                else
        !           332:                    pop_x = window_info.x + window_info.bdrwidth +
        !           333:                         (window_info.width - PWidth) / 2;
        !           334:                if (dy > 0)
        !           335:                    pop_y = y1 + window_info.bdrwidth;
        !           336:                else if (dy < 0)
        !           337:                    pop_y = y1 - PHeight - window_info.bdrwidth + 1;
        !           338:                else
        !           339:                    pop_y = window_info.y + window_info.bdrwidth +
        !           340:                         (window_info.height - PHeight) / 2;
        !           341:                XMoveWindow(Pop, pop_x, pop_y);
        !           342:                XMapWindow(Pop);
        !           343:            }
        !           344:        }
        !           345:        if (dx) {
        !           346:            if ((d = abs(x - x0) + wadd) < 0)
        !           347:                d = 0;
        !           348:            d = (d / winc) * winc;
        !           349:            if (x < x0) {
        !           350:                x = x2 - d;
        !           351:                if (dx > 0 && x < mx)
        !           352:                    x = mx;
        !           353:            } else {
        !           354:                x = x2 + d;
        !           355:                if (dx < 0 && x > mx)
        !           356:                    x = mx;
        !           357:            }
        !           358:        } else
        !           359:            x = ox;
        !           360:        if (dy) {
        !           361:            if ((d = abs(y - y0) + hadd) < 0)
        !           362:                d = 0;
        !           363:            d = (d / hinc) * hinc;
        !           364:            if (y < y0) {
        !           365:                y = y2 - d;
        !           366:                if (dy > 0 && y < my)
        !           367:                    y = my;
        !           368:            } else {
        !           369:                y = y2 + d;
        !           370:                if (dy < 0 && y > my)
        !           371:                    y = my;
        !           372:            }
        !           373:        } else
        !           374:            y = oy;
        !           375:     }
        !           376:     if (!changing) return(FALSE);
        !           377:     if (x == x2 && y == y2) {
        !           378:        XUnmapWindow(Pop);
        !           379:        XRaiseWindow(window);
        !           380:     } else {
        !           381:        if (x < x1) {
        !           382:            t = x1; x1 = x; x = t;
        !           383:        }
        !           384:        if (y < y1) {
        !           385:            t = y1; y1 = y; y = t;
        !           386:        }
        !           387:        dx = x - x1 + 1 - (window_info.bdrwidth << 1);
        !           388:        dy = y - y1 + 1 - (window_info.bdrwidth << 1);
        !           389:        if (
        !           390:            (PWidth > window_info.width) ||
        !           391:            (PHeight > window_info.height) ||
        !           392:            (PWidth > dx) || 
        !           393:            (PHeight > dy)
        !           394:        ) {
        !           395:            XUnmapWindow(Pop);
        !           396:        }
        !           397:        else {
        !           398:            XUnmapTransparent(Pop);
        !           399:        }
        !           400:        XConfigureWindow(window, x1, y1, dx, dy);
        !           401:     }
        !           402:     return(TRUE);
        !           403: }
        !           404: 
        !           405: 
        !           406: 
        !           407: 
        !           408: 

unix.superglobalmegacorp.com

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