Annotation of 43BSD/contrib/X/xwm/Change.c, revision 1.1.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.