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

1.1       root        1: #ifndef lint
                      2: static char *rcsid_Resize_c = "$Header: Resize.c,v 10.3 86/02/01 16:23:45 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 = "@(#)Resize.c    3.8     1/24/86";
                     45: #endif
                     46: 
                     47: #include "uwm.h"
                     48: 
                     49: Bool Resize(window, mask, button, x0, y0)
                     50: Window window;                          /* Event window. */
                     51: int mask;                               /* Button/key mask. */
                     52: short button;                           /* Button event detail. */
                     53: int x0, y0;                             /* Event mouse position. */
                     54: {
                     55:     register WindowInfo window_info;   /* Event window info. */
                     56:     register WindowInfo assoc_info;    /* Icon's associated window info. */
                     57:     int d;                             /* ??? */
                     58:     int t;                             /* ??? */
                     59:     int x, y;                          /* ??? */
                     60:     int h0, hinc, w0, winc, wadd, hadd;        /* ??? */
                     61:     int x1, y1, x2, y2;                        /* ??? */
                     62:     int mx, my;                                /* ??? */
                     63:     int ox, oy;                                /* ??? */
                     64:     int lx, ly;                                /* ??? */
                     65:     int pop_x, pop_y;                  /* ??? */
                     66:     int hsize, vsize;                  /* ??? */
                     67:     int dx, dy;                                /* ??? */
                     68:     int num_vectors;                   /* Number of vectors to XDraw. */
                     69:     Window assoc;                      /* Window represented by the icon. */
                     70:     Window sub_win;                    /* Mouse query sub window. */
                     71:     XButtonEvent button_event;         /* Button event packet. */
                     72:     Vertex box[MAX_BOX_VECTORS];       /* Box drawing vertex buffer. */
                     73:     Vertex zap[MAX_ZAP_VECTORS];       /* Zap drawing vertex buffer. */
                     74:     Bool domult;                       /* ??? */
                     75:     Bool stop;                         /* Should the window stop changing? */
                     76: 
                     77:     /*
                     78:      * Do nothing if the event window is the root window.
                     79:      */
                     80:     if (window == RootWindow)
                     81:         return(FALSE);
                     82: 
                     83:     /*
                     84:      * Gather info about the event window.
                     85:      */
                     86:     status = XQueryWindow(window, &window_info);
                     87:     if (status == FAILURE) return(FALSE);
                     88: 
                     89:     /*
                     90:      * Do not resize an icon window. 
                     91:      */
                     92:     if (window_info.type == IsIcon)
                     93:         return(FALSE);
                     94: 
                     95:     /*
                     96:      * Clear the vector buffers.
                     97:      */
                     98:     bzero(box, sizeof(box));
                     99:     if (Zap) bzero(zap, sizeof(zap));
                    100: 
                    101:     /*
                    102:      * If we are here then we have a resize operation in progress.
                    103:      */
                    104: 
                    105:     /*
                    106:      * Turn on the resize cursor.
                    107:      */
                    108:     status = XGrabButton(RootWindow, ArrowCrossCursor, mask, EVENTMASK);
                    109:     if (status == FAILURE) {
                    110:         Error("Resize -> Unable to grab button and change cursor.");
                    111:     }
                    112: 
                    113:     /*
                    114:      * Get the event window resize hint.
                    115:      */
                    116:     XGetResizeHint(window, &w0, &h0, &winc, &hinc);
                    117: 
                    118:     /*
                    119:      * If I ever have the time to REALLY figure the rest of this out I will
                    120:      * comment it better.
                    121:      */
                    122:     wadd = winc >> 1;
                    123:     hadd = hinc >> 1;
                    124:     x1 = window_info.x;
                    125:     y1 = window_info.y;
                    126:     x2 = x1 + window_info.width + (window_info.bdrwidth << 1) - 1;
                    127:     y2 = y1 + window_info.height + (window_info.bdrwidth << 1) - 1;
                    128:     domult = (winc > 3 && hinc > 3 &&
                    129:             (window_info.width - w0) % winc == 0 &&
                    130:             (window_info.height - h0) % hinc == 0) ? TRUE : FALSE;
                    131:     if (w0 == 0 && winc == 1 && h0 == 0 && hinc == 1) {
                    132:        w0 = h0 = 1;
                    133:     }
                    134:     mx = x2 - window_info.width + w0 + winc;
                    135:     my = y2 - window_info.height + h0 + hinc;
                    136:     w0 += (window_info.bdrwidth << 1) - 1;
                    137:     h0 += (window_info.bdrwidth << 1) - 1;
                    138:     x = x2;
                    139:     y = y2;
                    140:     dx = dy = 1;
                    141:     if (x0 - x1 < x2 - x0) {
                    142:        dx = -1;
                    143:        x = x1;
                    144:        mx = x2 - (mx - x1);
                    145:        t = x1; x1 = x2; x2 = t;
                    146:     }
                    147:     if (y0 - y1 < y2 - y0) {
                    148:        dy = -1;
                    149:        y = y1;
                    150:        my = y2 - (my - y1);
                    151:        t = y1; y1 = y2; y2 = t;
                    152:     }
                    153:     ox = ((x0 - window_info.x - window_info.bdrwidth) * 3) /
                    154:         window_info.width;
                    155:     oy = ((y0 - window_info.y - window_info.bdrwidth) * 3) /
                    156:         window_info.height;
                    157:     if (window_info.width > 2 && window_info.height > 2 && ((ox + oy) & 1)) {
                    158:        if (ox & 1)
                    159:            dx = 0;
                    160:        else
                    161:            dy = 0;
                    162:     }
                    163: 
                    164:     if (Grid) {
                    165:        num_vectors = StoreGridBox(
                    166:            box,
                    167:            MIN(x1, x), MIN(y1, y),
                    168:            MAX(x1, x), MAX(y1, y)
                    169:        );
                    170:     }
                    171:     else {
                    172:        num_vectors = StoreBox(
                    173:            box,
                    174:            MIN(x1, x), MIN(y1, y),
                    175:            MAX(x1, x), MAX(y1, y)
                    176:        );
                    177:     }
                    178: 
                    179:     /*
                    180:      * If we freeze the server, then we will draw solid
                    181:      * lines instead of flickering ones during resizing.
                    182:      */
                    183:     if (Freeze) XGrabServer();
                    184: 
                    185:     /*
                    186:      * Process any pending exposure events before drawing the box.
                    187:      */
                    188:     while (QLength() > 0) {
                    189:         XPeekEvent(&button_event);
                    190:         if (button_event.window == RootWindow)
                    191:             break;
                    192:         GetButton(&button_event);
                    193:     }
                    194: 
                    195:     /*
                    196:      * Now draw the box.
                    197:      */
                    198:     DrawBox();
                    199:     Frozen = window;
                    200: 
                    201:     stop = FALSE;
                    202:     ox = oy = lx = ly = -1;
                    203: 
                    204:     while (!stop) {
                    205:        if (x != ox || y != oy) {
                    206: 
                    207:             /*
                    208:              * If we've frozen the server, then erase
                    209:              * the old box.
                    210:              */
                    211:             if (Freeze)
                    212:                 DrawBox();
                    213: 
                    214:            if (Grid) {
                    215:                num_vectors = StoreGridBox(
                    216:                    box,
                    217:                    MIN(x1, x), MIN(y1, y),
                    218:                    MAX(x1, x), MAX(y1, y)
                    219:                );
                    220:            }
                    221:            else {
                    222:                num_vectors = StoreBox(
                    223:                    box,
                    224:                    MIN(x1, x), MIN(y1, y),
                    225:                    MAX(x1, x), MAX(y1, y)
                    226:                );
                    227:            }
                    228: 
                    229:             if (Freeze)
                    230:                 DrawBox();
                    231: 
                    232:            if (domult) {
                    233:                hsize = (abs(x - x1) - w0) / winc;
                    234:                vsize = (abs(y - y1) - h0) / hinc;
                    235:                PText[0] = hsize / 100 + '0';
                    236:                PText[1] = (hsize / 10) % 10 + '0';
                    237:                PText[2] = hsize % 10 + '0';
                    238:                PText[4] = vsize / 100 + '0';
                    239:                PText[5] = (vsize / 10) % 10 + '0';
                    240:                PText[6] = vsize % 10 + '0';
                    241: 
                    242:                /*
                    243:                 * If the font is not fixed width we have to
                    244:                 * clear the window to guarantee that the characters
                    245:                 * that were there before are erased.
                    246:                 */
                    247:                if (!(PFontInfo.fixedwidth)) XClear(Pop);
                    248:                XTextPad (
                    249:                    Pop,
                    250:                    PPadding, PPadding,
                    251:                    PText, PTextSize,
                    252:                    PFont, 0, 0, 
                    253:                    PTextForground, PTextBackground,
                    254:                    GXcopy, AllPlanes
                    255:                );
                    256:            }
                    257:            ox = x;
                    258:            oy = y;
                    259:        }
                    260: 
                    261:         if (!Freeze) {
                    262:             DrawBox();
                    263:             DrawBox();
                    264:         }
                    265: 
                    266:        if (XPending() && GetButton(&button_event)) {
                    267: 
                    268:             if (Freeze) {
                    269:                 DrawBox();
                    270:                 Frozen = (Window)0;
                    271:                 XUngrabServer();
                    272:             }
                    273: 
                    274:            if (
                    275:                (button_event.type == ButtonReleased) &&
                    276:                 ((button_event.detail & ValueMask) == button)
                    277:            ){
                    278:                x = button_event.x;
                    279:                y = button_event.y;
                    280:                stop = TRUE;
                    281:            }
                    282:            else {
                    283:                if (domult) {
                    284:                    XUnmapWindow(Pop);
                    285:                }
                    286:                 Grab(mask);
                    287:                return(TRUE);
                    288:            }
                    289:        }
                    290:        else {
                    291:            XUpdateMouse(RootWindow, &x, &y, &sub_win);
                    292:        }
                    293: 
                    294:        if (x == lx && y == ly) {
                    295:            x = ox;
                    296:            y = oy;
                    297:            continue;
                    298:        }
                    299: 
                    300:        lx = x;
                    301:        ly = y;
                    302: 
                    303:         if (dx)
                    304:             ox = -1;
                    305:         else
                    306:             oy = -1;
                    307:         if (domult) {
                    308:             if (dx > 0)
                    309:                 pop_x = x1 + window_info.bdrwidth;
                    310:             else if (dx < 0)
                    311:                 pop_x = x1 - PWidth - window_info.bdrwidth + 1;
                    312:             else
                    313:                 pop_x = window_info.x + window_info.bdrwidth +
                    314:                  (window_info.width - PWidth) / 2;
                    315:             if (dy > 0)
                    316:                 pop_y = y1 + window_info.bdrwidth;
                    317:             else if (dy < 0)
                    318:                 pop_y = y1 - PHeight - window_info.bdrwidth + 1;
                    319:             else
                    320:                 pop_y = window_info.y + window_info.bdrwidth +
                    321:                  (window_info.height - PHeight) / 2;
                    322:             XMoveWindow(Pop, pop_x, pop_y);
                    323:             XMapWindow(Pop);
                    324:         }
                    325: 
                    326:        if (dx) {
                    327:            if ((d = abs(x - x0) + wadd) < 0)
                    328:                d = 0;
                    329:            d = (d / winc) * winc;
                    330:            if (x < x0) {
                    331:                x = x2 - d;
                    332:                if (dx > 0 && x < mx)
                    333:                    x = mx;
                    334:            } else {
                    335:                x = x2 + d;
                    336:                if (dx < 0 && x > mx)
                    337:                    x = mx;
                    338:            }
                    339:        } else
                    340:            x = ox;
                    341:        if (dy) {
                    342:            if ((d = abs(y - y0) + hadd) < 0)
                    343:                d = 0;
                    344:            d = (d / hinc) * hinc;
                    345:            if (y < y0) {
                    346:                y = y2 - d;
                    347:                if (dy > 0 && y < my)
                    348:                    y = my;
                    349:            } else {
                    350:                y = y2 + d;
                    351:                if (dy < 0 && y > my)
                    352:                    y = my;
                    353:            }
                    354:        } else
                    355:            y = oy;
                    356:     }
                    357:     if (x == x2 && y == y2) {
                    358:        XUnmapWindow(Pop);
                    359:        XRaiseWindow(window);
                    360:     } else {
                    361:        if (x < x1) {
                    362:            t = x1; x1 = x; x = t;
                    363:        }
                    364:        if (y < y1) {
                    365:            t = y1; y1 = y; y = t;
                    366:        }
                    367:        dx = x - x1 + 1 - (window_info.bdrwidth << 1);
                    368:        dy = y - y1 + 1 - (window_info.bdrwidth << 1);
                    369:        if (
                    370:            (PWidth > window_info.width) ||
                    371:            (PHeight > window_info.height) ||
                    372:            (PWidth > dx) || 
                    373:            (PHeight > dy)
                    374:        ) {
                    375:            XUnmapWindow(Pop);
                    376:        }
                    377:        else {
                    378:            XUnmapTransparent(Pop);
                    379:        }
                    380:        XConfigureWindow(window, x1, y1, dx, dy);
                    381:     }
                    382:     Grab(mask);
                    383:     return(TRUE);
                    384: }

unix.superglobalmegacorp.com

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