Annotation of 43BSD/contrib/X/xnwm/wmsubs.c, revision 1.1

1.1     ! root        1: #include "wm.h"
        !             2: 
        !             3: #include "../cursors/icon.cursor"
        !             4: #include "../cursors/xterm.cursor"
        !             5: #include "../cursors/xterm_mask.cursor"
        !             6: 
        !             7: #define solid_vcount (1 + 4*2) /* We're goin' around twice */
        !             8: #define flash_vcount (1 + 4*4) /* 4 times, if flashing! */
        !             9: 
        !            10: #ifndef lint
        !            11: static char *rcsid_wmsubs_c = "$Header: wmsubs.c,v 10.3 86/02/01 16:02:10 tony Rel $";
        !            12: #endif
        !            13: 
        !            14: int vcount;
        !            15: Vertex solidBox[solid_vcount], flashBox[flash_vcount], *box;
        !            16: 
        !            17: int iconHeight;
        !            18: Window sizeWin;
        !            19: int sizeWidth, sizeHeight;
        !            20: int variableWidth;
        !            21: int sizeX, sizeY;              /* Where the size window is */
        !            22: Pixmap behindSize = 0;         /* And what it obscures */
        !            23: 
        !            24: Window oldfocus;
        !            25: 
        !            26: InitializeWm()
        !            27: {
        !            28:        SetUpSizeWindow();
        !            29:        SetUpBox();
        !            30:        StoreWmCursors();
        !            31: 
        !            32:        FocusOn(RootWindow);
        !            33:        oldfocus = 0;
        !            34: }
        !            35: 
        !            36: SetUpSizeWindow()
        !            37: {
        !            38:        FontInfo finfo;
        !            39:        register int i, minwid, maxwid;
        !            40:        short cwid[10];
        !            41: 
        !            42:        status = XQueryFont(sizefont, &finfo);
        !            43:        if (status == 0) Error("Couldn't query size font in SetUpSizeWindow");
        !            44: 
        !            45:        status = XCharWidths("0123456789x", 11, sizefont, cwid);
        !            46:        if (status == 0) Error("Couldn't get char widths in SetUpSizeWindow");
        !            47: 
        !            48:        minwid = 99999;
        !            49:        maxwid = 0;
        !            50:        for (i = 0; i <= 10; i++) {
        !            51:            if (cwid[i] < minwid) minwid = cwid[i];
        !            52:            else if (cwid[i] > maxwid) maxwid = cwid[i];
        !            53:        }
        !            54: 
        !            55:        variableWidth = (minwid != maxwid);
        !            56: 
        !            57:        sizeWidth = 7 * maxwid + 4;
        !            58:        sizeHeight = finfo.height + 4;
        !            59: 
        !            60:        sizeWin = XCreateWindow(RootWindow, 0, 0,
        !            61:                sizeWidth - 2, sizeHeight - 2,
        !            62:                1, bgPixmap, fgPixmap);
        !            63:        if (sizeWin == 0) Error("Couldn't create sizeWin in SetUpSizeWindow");
        !            64: 
        !            65:        status = XQueryFont(iconfont, &finfo);
        !            66:        if (status == 0) Error("Couldn't query icon font in SetUpSizeWindow");
        !            67: 
        !            68:        iconHeight = finfo.height + 8;
        !            69: }
        !            70: 
        !            71: SetUpBox()
        !            72: {
        !            73:        register int i;
        !            74: 
        !            75:        if (freeze) {
        !            76:            vcount = solid_vcount;
        !            77:            i = solid_vcount - 1;
        !            78:            box = solidBox;
        !            79:        } else {
        !            80:            vcount = flash_vcount;
        !            81:            i = flash_vcount - 1;
        !            82:            box = flashBox;
        !            83:        }
        !            84: 
        !            85:        box[i--].flags = VertexRelative | VertexDrawLastPoint;
        !            86:        while (i > 0) box[i--].flags = VertexRelative;
        !            87:        box[0].flags = 0;
        !            88: 
        !            89:        if (!freeze) box[solid_vcount-1].flags |= VertexDrawLastPoint;
        !            90: }
        !            91: 
        !            92: StoreWmCursors()
        !            93: {
        !            94:        iconCursor = XCreateCursor(icon_width, icon_height, 
        !            95:                (caddr_t) icon_bits, (caddr_t) NULL,
        !            96:                8, 8,
        !            97:                WhitePixel, BlackPixel,
        !            98:                GXcopyInverted);
        !            99:        if (iconCursor == 0) {
        !           100:            Error("Couldn't store iconCursor in StoreWmCursors");
        !           101:        }
        !           102:        textCursor = XCreateCursor(xterm_width, xterm_height, 
        !           103:                (caddr_t) xterm_bits, (caddr_t) xterm_mask_bits,
        !           104:                8, 8,
        !           105:                bgColor, fgColor,
        !           106:                GXcopyInverted);
        !           107:        if (textCursor == 0) {
        !           108:            Error("Couldn't store textCursor in StoreWmCursors");
        !           109:        }
        !           110: }
        !           111: 
        !           112: /* ARGSUSED */
        !           113: 
        !           114: Raise(which, loc, w, winfo)
        !           115:        int which;
        !           116:        Locator loc;
        !           117:        Window w;
        !           118:        WindowInfo *winfo;
        !           119: {
        !           120:        BEvent newbutton;
        !           121:        Window neww;
        !           122: 
        !           123:        if (w == RootWindow) return;
        !           124: 
        !           125:        GetButton(&newbutton);
        !           126:        if (!MatchUp(newbutton, which)) return;
        !           127: 
        !           128:        InterpretLocatorW(RootWindow, &neww, newbutton.location);
        !           129:        if (neww != w) return;
        !           130: 
        !           131:        if (popup) UnmapPopup();
        !           132: 
        !           133:        XRaiseWindow(w);
        !           134: }
        !           135: 
        !           136: /* ARGSUSED */
        !           137: 
        !           138: Lower(which, loc, w, winfo)
        !           139:        int which;
        !           140:        Locator loc;
        !           141:        Window w;
        !           142:        WindowInfo *winfo;
        !           143: {
        !           144:        BEvent newbutton;
        !           145:        Window neww;
        !           146: 
        !           147:        if (w == RootWindow) return;
        !           148: 
        !           149:        GetButton(&newbutton);
        !           150:        if (!MatchUp(newbutton, which)) return;
        !           151: 
        !           152:        InterpretLocatorW(RootWindow, &neww, newbutton.location);
        !           153:        if (neww != w) return;
        !           154: 
        !           155:        if (popup) UnmapPopup();
        !           156: 
        !           157:        XLowerWindow(w);
        !           158: }
        !           159: 
        !           160: Move(which, loc, w, winfo)
        !           161:        int which;
        !           162:        Locator loc;
        !           163:        Window w;
        !           164:        WindowInfo *winfo;
        !           165: {
        !           166:        Window subwindow;
        !           167:        BEvent newbutton;
        !           168:        int x, y, oldx, oldy, left, top;
        !           169:        int stop = FALSE;
        !           170: 
        !           171:        if (w == RootWindow) return;
        !           172: 
        !           173:        InterpretLocatorXY(RootWindow, &x, &y, loc);
        !           174: 
        !           175:        left = winfo->x;
        !           176:        top = winfo->y;
        !           177: 
        !           178:        oldx = x;
        !           179:        oldy = y;
        !           180: 
        !           181:        StoreBox(left, top, winfo->width + (winfo->bdrwidth << 1) - 1,
        !           182:                winfo->height + (winfo->bdrwidth << 1) - 1);
        !           183: 
        !           184:        /* If we're willing to freeze the server, we don't flicker the box.
        !           185:           If not, we do double inverts that draw and then erase the box,
        !           186:           so we have to do them more often */
        !           187: 
        !           188:        if (freeze) XGrabServer();
        !           189:        DrawBox();
        !           190: 
        !           191:        while (!stop) {
        !           192:            /* If we've moved at all, change the box and reset old x,y */
        !           193: 
        !           194:            if (x != oldx || y != oldy) {
        !           195:                if (freeze) DrawBox();          /* Erase */
        !           196:                oldx = x;
        !           197:                oldy = y;
        !           198:                box[0].x = left;
        !           199:                box[0].y = top;
        !           200:                DrawBox();              /* Redraw */
        !           201:            } else if (!freeze) DrawBox();
        !           202: 
        !           203:            /* Find the new x,y.  If there's an event, use that; otherwise
        !           204:               query the mouse */
        !           205: 
        !           206:            if (XPending()) {
        !           207:                if (!GetEvent(&newbutton)) {
        !           208:                    QueryMouse(RootWindow, &x, &y, &subwindow);
        !           209:                }
        !           210:                else if (!MatchUp(newbutton, which)) break;
        !           211:                else {
        !           212:                    x = newbutton.x;
        !           213:                    y = newbutton.y;
        !           214:                    stop = TRUE;
        !           215:                }
        !           216:            } else QueryMouse(RootWindow, &x, &y, &subwindow);
        !           217: 
        !           218:            left += x - oldx;
        !           219:            top += y - oldy;
        !           220:        }
        !           221: 
        !           222:        if (freeze) {
        !           223:            DrawBox();                  /* Erase */
        !           224:            XUngrabServer();
        !           225:        }
        !           226: 
        !           227:        if (!stop) return;
        !           228: 
        !           229:        if (popup) UnmapPopup();
        !           230: 
        !           231:        XMoveWindow(w, left, top);
        !           232: 
        !           233:        FrameFocus();   /* Fix up frame */
        !           234: }
        !           235: 
        !           236: Resize(which, loc, w, winfo)
        !           237:        int which;
        !           238:        Locator loc;
        !           239:        Window w;
        !           240:        WindowInfo *winfo;
        !           241: {
        !           242:        BEvent newbutton;
        !           243:        int t;
        !           244:        int baseheight, hinc, basewidth, winc;
        !           245:        int x0, y0;             /* Initial x,y of mouse */
        !           246:        int fixedx, fixedy;     /* x,y of fixed corner */
        !           247:        int movex, movey;       /* x,y of movable corner */
        !           248:        int limitx, limity;     /* limit to movement due to min window size */
        !           249:        int oldx, oldy;         /* previous location of moving corner */
        !           250:        int newx, newy;         /* new location of moving corner */
        !           251:        int lastx, lasty;       /* previous cursor location */
        !           252:        int x, y;               /* new cursor location */
        !           253:        int dx, dy;             /* flags indicating movement direction */
        !           254:        int width, height;      /* width & height of window */
        !           255:        int usesize, stop = FALSE;
        !           256:        Window subwindow;
        !           257: 
        !           258:        if (w == RootWindow) return;
        !           259: 
        !           260:        /* Find out about window and get resizing info */
        !           261: 
        !           262:        status = XGetResizeHint(w, &basewidth, &baseheight, &winc, &hinc);
        !           263:        if (status == 0) Error("Couldn't get resize hint in Resize");
        !           264:        InterpretLocatorXY(RootWindow, &x0, &y0, loc);
        !           265: 
        !           266:        /* Initially fixedx is left, fixedy top, movex right, and
        !           267:           movey bottom */
        !           268: 
        !           269:        fixedx = winfo->x;
        !           270:        fixedy = winfo->y;
        !           271:        width = winfo->width + (winfo->bdrwidth << 1) - 1;
        !           272:        height = winfo->height + (winfo->bdrwidth << 1) - 1;
        !           273:        movex = fixedx + width;
        !           274:        movey = fixedy + height;
        !           275: 
        !           276:        /* We only will use a size window if the increments are large
        !           277:           enough and the current window size corresponds to the hints */
        !           278: 
        !           279:        usesize = (winc > 3 && hinc > 3 &&
        !           280:             (winfo->width - basewidth) % winc == 0 &&
        !           281:             (winfo->height - baseheight) % hinc == 0);
        !           282: 
        !           283:        if (basewidth == 0 && winc == 1 && baseheight == 0 && hinc == 1) {
        !           284:            basewidth = 1;
        !           285:            baseheight = 1;
        !           286:        }
        !           287: 
        !           288:        /* movex,y are still right and bottom */
        !           289: 
        !           290:        limitx = movex - winfo->width + basewidth + winc;
        !           291:        limity = movey - winfo->height + baseheight + hinc;
        !           292: 
        !           293:        basewidth += (winfo->bdrwidth << 1) - 1;
        !           294:        baseheight += (winfo->bdrwidth << 1) - 1;
        !           295: 
        !           296:        /* Calculate the moving directions dx,dy */
        !           297: 
        !           298:        CalculateMovingEdges(&dx, &dy, x0, fixedx, movex,
        !           299:                y0, fixedy, movey, winfo);
        !           300: 
        !           301:        /* Figure out which edges to move depending upon which ninth
        !           302:           the cursor is in.  Adjust fixed and move edges accordingly:
        !           303: 
        !           304:           dx,y indicate which edges are fixed.  Values:
        !           305: 
        !           306:                dx      fixedx  movex           dy      fixedy  movey
        !           307:                1,0     left    right           1,0     top     bottom
        !           308:                -1      right   left            -1      bottom  top
        !           309: 
        !           310:           A value of 0 means that both edges are fixed in that direction */
        !           311: 
        !           312:        /* If we're moving left edge, switch */
        !           313: 
        !           314:        if (dx == -1) {
        !           315:            limitx = movex - (limitx - fixedx);
        !           316:            t = fixedx; fixedx = movex; movex = t;
        !           317:            width = -width;
        !           318:        }
        !           319: 
        !           320:        /* If we're moving top edge, switch */
        !           321: 
        !           322:        if (dy == -1) {
        !           323:            limity = movey - (limity - fixedy);
        !           324:            t = fixedy; fixedy = movey; movey = t;
        !           325:            height = -height;
        !           326:        }
        !           327: 
        !           328:        oldx = newx = movex;
        !           329:        oldy = newy = movey;
        !           330:        lastx = x0;
        !           331:        lasty = y0;
        !           332: 
        !           333:        StoreBox(fixedx, fixedy, width, height);
        !           334: 
        !           335:        /* If we're willing to freeze the server, we don't flicker the box.
        !           336:           If not, we do double inverts that draw and then erase the box,
        !           337:           so we have to do them more often */
        !           338: 
        !           339:        if (freeze) XGrabServer();
        !           340:        DrawBox();              /* Draw box */
        !           341: 
        !           342:        if (usesize) {
        !           343:            CreateSize (dx, dy, fixedx, fixedy, winfo);
        !           344:            FillinSize ((abs(width) - basewidth) / winc,
        !           345:                    (abs(height) - baseheight) / hinc);
        !           346:        }
        !           347: 
        !           348:        /* Loop until a button event occurs */
        !           349: 
        !           350:        while (!stop) {
        !           351:            /* If we've moved at all, change the box, fill in the
        !           352:               size window and reset old x,y */
        !           353: 
        !           354:            if (newx != oldx || newy != oldy) {
        !           355:                if (freeze) DrawBox();          /* Erase */
        !           356:                StoreBox(fixedx, fixedy, width, height);
        !           357: 
        !           358:                if (usesize) {
        !           359:                    FillinSize ((abs(width) - basewidth) / winc,
        !           360:                            (abs(height) - baseheight) / hinc);
        !           361:                }
        !           362:                oldx = newx;
        !           363:                oldy = newy;
        !           364:                DrawBox();              /* Redraw */
        !           365:            } else if (!freeze) DrawBox();
        !           366: 
        !           367:            /* Find the cursor x,y -- by an event if there is one, by
        !           368:               querying if not */
        !           369: 
        !           370:            if (XPending()) {
        !           371:                if (!GetEvent(&newbutton)) {
        !           372:                    QueryMouse(RootWindow, &x, &y, &subwindow);
        !           373:                }
        !           374:                else if (!MatchUp(newbutton, which)) break;
        !           375:                else {
        !           376:                    x = newbutton.x;
        !           377:                    y = newbutton.y;
        !           378:                    stop = TRUE;
        !           379:                }
        !           380:            } else QueryMouse(RootWindow, &x, &y, &subwindow);
        !           381: 
        !           382:            /* If we haven't moved since last time, skip the rest */
        !           383: 
        !           384:            if (x == lastx && y == lasty) continue;
        !           385: 
        !           386:            lastx = x;
        !           387:            lasty = y;
        !           388: 
        !           389:            newx = CalculateChange(dx, x, x0, winc, limitx, movex, oldx);
        !           390:            newy = CalculateChange(dy, y, y0, hinc, limity, movey, oldy);
        !           391:            width += newx - oldx;
        !           392:            height += newy - oldy;
        !           393:        }
        !           394: 
        !           395:        if (freeze) {
        !           396:            DrawBox();                  /* Erase */
        !           397:            XUngrabServer();
        !           398:        }
        !           399: 
        !           400:        if (!stop) {
        !           401:            if (usesize) DestroySize();
        !           402:            return;
        !           403:        }
        !           404: 
        !           405: 
        !           406:        if (newx == movex && newy == movey) {           /* i.e. no change */
        !           407:            if (usesize) DestroySize();
        !           408:            XRaiseWindow(w);
        !           409:        } else {
        !           410: 
        !           411:            /* Re-exchange things so that fixedx,y is the left top */
        !           412: 
        !           413:            if (newx < fixedx) {
        !           414:                t = fixedx; fixedx = newx; newx = t;
        !           415:            }
        !           416:            if (newy < fixedy) {
        !           417:                t = fixedy; fixedy = newy; newy = t;
        !           418:            }
        !           419: 
        !           420:            /* Calculate new width and height. */
        !           421: 
        !           422:            width = newx - fixedx + 1 - (winfo->bdrwidth << 1);
        !           423:            height = newy - fixedy + 1 - (winfo->bdrwidth << 1);
        !           424: 
        !           425:            if (usesize) DestroySize();
        !           426: 
        !           427:            if (popup) UnmapPopup();
        !           428: 
        !           429:            XConfigureWindow(w, fixedx, fixedy, width, height);
        !           430:            FrameFocus();
        !           431:        }
        !           432: }
        !           433: 
        !           434: CalculateMovingEdges(dx, dy, x0, fixedx, movex, y0, fixedy, movey, winfo)
        !           435:        int *dx, *dy, x0, fixedx, movex, y0, fixedy, movey;
        !           436:        WindowInfo *winfo;
        !           437: {
        !           438:        int xthird, ythird;
        !           439: 
        !           440:        *dx = *dy = 1;
        !           441: 
        !           442:        /* If we're closer to the left than to the right, switch */
        !           443: 
        !           444:        if (x0 - fixedx < movex - x0) *dx = -1;
        !           445: 
        !           446:        /* If we're closer to the top than the bottom, switch */
        !           447: 
        !           448:        if (y0 - fixedy < movey - y0) *dy = -1;
        !           449: 
        !           450:        /* Now, watch closely!  We take the offset from the point to the
        !           451:           left edge, multiply by 3 and divide by the width.  This gives
        !           452:           a value of 0, 1, or 2 depending if the point is in the left,
        !           453:           middle, or right thirds.  Do the same for y.  Add them together.
        !           454:           If the result is odd, the point must be in one of the edge ninths,
        !           455:           rather than a corner ninth or the middle ninth.  Figure out
        !           456:           which one and set dx,y accordingly. (gag) */
        !           457: 
        !           458:        if (winfo->width > 2 && winfo->height > 2) {
        !           459:            xthird = ((x0 - winfo->x - winfo->bdrwidth) * 3) / winfo->width;
        !           460:            ythird = ((y0 - winfo->y - winfo->bdrwidth) * 3) / winfo->height;
        !           461: 
        !           462:            if ((xthird + ythird) & 1) {
        !           463:                if (xthird & 1) *dx = 0;
        !           464:                else *dy = 0;
        !           465:            }
        !           466:        }
        !           467: }
        !           468: 
        !           469: FillinSize(hsize, vsize)
        !           470:        register int hsize, vsize;
        !           471: {
        !           472:        static char sizeText[7] = {'0', '0', '0', 'x', '0', '0', '0'};
        !           473: 
        !           474:        sizeText[0] = vsize / 100 + '0';
        !           475:        sizeText[1] = (vsize / 10) % 10 + '0';
        !           476:        sizeText[2] = vsize % 10 + '0';
        !           477:        sizeText[4] = hsize / 100 + '0';
        !           478:        sizeText[5] = (hsize / 10) % 10 + '0';
        !           479:        sizeText[6] = hsize % 10 + '0';
        !           480:        if (variableWidth) XClear(sizeWin);
        !           481:        XText(sizeWin, 1, 1, sizeText, sizeof(sizeText), sizefont,
        !           482:                bgColor, fgColor);
        !           483: }
        !           484: 
        !           485: CreateSize(dx, dy, fixedx, fixedy, winfo)
        !           486:        int dx, dy, fixedx, fixedy;
        !           487:        WindowInfo *winfo;
        !           488: {
        !           489:        int px, py;                     /* Size x, y */
        !           490: 
        !           491:        /* If a corner is being moved, put the size window in the opposite
        !           492:           corner.  If an edge, put in middle of opposite edge. */
        !           493: 
        !           494:        if (dx > 0) px = fixedx + winfo->bdrwidth;
        !           495:        else if (dx < 0) px = fixedx - sizeWidth - winfo->bdrwidth + 1;
        !           496:        else px = winfo->x + winfo->bdrwidth +
        !           497:                (winfo->width - sizeWidth) / 2;
        !           498: 
        !           499:        if (dy > 0) py = fixedy + winfo->bdrwidth;
        !           500:        else if (dy < 0) py = fixedy - sizeHeight - winfo->bdrwidth + 1;
        !           501:        else py = winfo->y + winfo->bdrwidth +
        !           502:                (winfo->height - sizeHeight) / 2;
        !           503: 
        !           504:        if (freeze) {
        !           505:            sizeX = px;
        !           506:            sizeY = py;
        !           507:            behindSize = XPixmapSave(RootWindow, px, py,
        !           508:                    sizeWidth, sizeHeight);
        !           509:            /* Ok to return 0; this means it wasn't on the screen */
        !           510:        }
        !           511: 
        !           512:        XMoveWindow(sizeWin, px, py);
        !           513:        XMapWindow(sizeWin);
        !           514: }
        !           515: 
        !           516: DestroySize()
        !           517: {
        !           518:        if (behindSize != 0) {
        !           519:            XUnmapTransparent(sizeWin);
        !           520:            XPixmapPut(RootWindow, 0, 0, sizeX, sizeY, sizeWidth, sizeHeight,
        !           521:                    behindSize, GXcopy, AllPlanes);
        !           522:            XFreePixmap(behindSize);
        !           523:            behindSize = 0;
        !           524:        } else XUnmapWindow(sizeWin);
        !           525: }
        !           526: 
        !           527: int CalculateChange(direction, new, orig, inc, limit, origedge, oldedge)
        !           528:        int direction, new, orig, inc, limit, origedge, oldedge;
        !           529: {
        !           530:        register int d, newedge;
        !           531: 
        !           532:        if (direction) {                /* If we're changing this way */
        !           533: 
        !           534:            /* Calculate the change in cursor position in inc units */
        !           535: 
        !           536:            d = abs(new - orig) + (inc >> 1);;
        !           537:            d = (d / inc) * inc;
        !           538: 
        !           539:            /* Adjust the new position and check against the limit */
        !           540: 
        !           541:            if (new < orig) {
        !           542:                newedge = origedge - d;
        !           543:                if (direction > 0 && newedge < limit) newedge = limit;
        !           544:            } else {
        !           545:                newedge = origedge + d;
        !           546:                if (direction < 0 && newedge > limit) newedge = limit;
        !           547:            }
        !           548:        } else newedge = oldedge;
        !           549: 
        !           550:        return(newedge);
        !           551: }
        !           552: 
        !           553: /* ARGSUSED */
        !           554: 
        !           555: Iconify(which, loc, w, winfo)
        !           556:        int which;
        !           557:        Locator loc;
        !           558:        Window w;
        !           559:        WindowInfo *winfo;
        !           560: {
        !           561:        int x, y;
        !           562:        BEvent newbutton;
        !           563:        int width, height;
        !           564:        char *iconName;
        !           565:        WindowInfo iconInfo;
        !           566:        Window icon = 0;
        !           567:        struct _xy {short x, y} *xy;    /* To turn locators into xy pairs */
        !           568:        int downx, downy;
        !           569: 
        !           570:        if (w == RootWindow) return;
        !           571: 
        !           572:        /* First change the cursor into the icon cursor */
        !           573: 
        !           574:        status = XGrabMouse(RootWindow, iconCursor,
        !           575:                ButtonPressed | ButtonReleased);
        !           576:        if (status == 0) Error("Couldn't grab mouse in Iconify");
        !           577: 
        !           578:        /* Then wait for the upbutton; if it doesn't occur abort */
        !           579: 
        !           580:        GetButton(&newbutton);
        !           581:        if (!MatchUp(newbutton, which)) return;
        !           582:        x = newbutton.x;
        !           583:        y = newbutton.y;
        !           584: 
        !           585:        /* See if it already has an associated icon window;
        !           586:           if not, figure out the size */
        !           587: 
        !           588:        if (winfo->assoc_wind == 0) {
        !           589:            height = iconHeight;
        !           590: 
        !           591:            /* Now get the name of the window */
        !           592: 
        !           593:            status = XFetchName(w, &iconName);
        !           594:            if (status == 0) Error("Couldn't fetch name in Iconify");
        !           595: 
        !           596:            width = XQueryWidth(iconName, iconfont);
        !           597:            if (width == 0) width = height;
        !           598:            else width += 8;
        !           599: 
        !           600:        } else {
        !           601:            icon = winfo->assoc_wind;
        !           602:            QueryWindow(icon, &iconInfo);
        !           603:            height = iconInfo.height;
        !           604:            width = iconInfo.width;
        !           605: 
        !           606:            xy = (struct _xy *) &loc;
        !           607:            downx = xy->x;
        !           608:            downy = xy->y;
        !           609:        }
        !           610: 
        !           611:        /* Center the icon on the new cursor position */
        !           612: 
        !           613:        x -= width >> 1 + 1;
        !           614:        if (x < 0) x = 0;
        !           615:        if (x + width + 2 > screen_width) x = screen_width - width - 2;
        !           616: 
        !           617:        y -= height >> 1 + 1;
        !           618:        if (y < 0) y = 0;
        !           619:        if (y + height + 2 > screen_height) y = screen_height - height - 2;
        !           620: 
        !           621:        /* Open the icon, give it a text cursor, choose key events, and
        !           622:           map it */
        !           623: 
        !           624:        if (icon == 0) {
        !           625:            icon = XCreateWindow(RootWindow, x, y, width, height,
        !           626:                    1, fgPixmap, gray);
        !           627:            if (icon == 0) Error("Couldn't create icon in Iconify");
        !           628:            XSelectInput(icon, KeyPressed|ExposeWindow|UnmapWindow);
        !           629:            XDefineCursor(icon, textCursor);
        !           630:            XSetIconWindow(w, icon);
        !           631:        } else {
        !           632:            xy = (struct _xy *) &(newbutton.location);
        !           633:            if (abs(xy->x - downx) > iconifyDelta ||
        !           634:                    abs(xy->y - downy) > iconifyDelta) {
        !           635:                XMoveWindow(icon, x, y);
        !           636:            }
        !           637:        }
        !           638: 
        !           639:        if (popup) UnmapPopup();
        !           640: 
        !           641:        XMapWindow(icon);
        !           642:        XUnmapWindow(w);
        !           643:        
        !           644:        /* If the iconified window was the focus, change to the background */
        !           645: 
        !           646:        if (focus == w) FocusOn(RootWindow);
        !           647:        FrameFocus();
        !           648: }
        !           649: 
        !           650: /* ARGSUSED */
        !           651: 
        !           652: Deiconify(which, loc, w, winfo)
        !           653:        int which;
        !           654:        Locator loc;
        !           655:        Window w;
        !           656:        WindowInfo *winfo;
        !           657: {
        !           658:        BEvent newbutton;
        !           659:        Window neww;
        !           660: 
        !           661:        if (w == RootWindow) return;
        !           662: 
        !           663:        GetButton(&newbutton);
        !           664: 
        !           665:        if (!MatchUp(newbutton, which)) return;
        !           666: 
        !           667:        InterpretLocatorW(RootWindow, &neww, newbutton.location);
        !           668:        if (neww != w) return;
        !           669: 
        !           670:        if (popup) UnmapPopup();
        !           671: 
        !           672:        XUnmapWindow(w);
        !           673:        XMapWindow(winfo->assoc_wind);
        !           674: 
        !           675:        /* If icon was the focus, change to the window itself */
        !           676: 
        !           677:        if (focus == w) FocusOn(winfo->assoc_wind);
        !           678:        FrameFocus();
        !           679: }
        !           680: 
        !           681: /* ARGSUSED */
        !           682: 
        !           683: Select(which, loc, w, winfo)
        !           684:        int which;
        !           685:        Locator loc;
        !           686:        Window w;
        !           687:        WindowInfo *winfo;
        !           688: {
        !           689:        BEvent newbutton;
        !           690:        Window neww;
        !           691: 
        !           692:        GetButton(&newbutton);
        !           693:        if (!MatchUp(newbutton, which)) return;
        !           694: 
        !           695:        InterpretLocatorW(RootWindow, &neww, newbutton.location);
        !           696:        if (neww == 0) neww = RootWindow;
        !           697:        if (neww != w) return;
        !           698: 
        !           699:        /* See if the current focus is an icon.  If not, set oldfocus
        !           700:           so we can go back to it if we want to */
        !           701: 
        !           702:        if (focusInfo.type != IsIcon) oldfocus = focus;
        !           703: 
        !           704:        if (popup) UnmapPopup();
        !           705: 
        !           706:        FocusOn(w);
        !           707:        FrameFocus();           /* Now frame the focus window */
        !           708:        XRaiseWindow(focus);
        !           709: }
        !           710: 
        !           711: FocusOn(w)
        !           712:        Window w;
        !           713: {
        !           714:        focus = w;
        !           715:        QueryWindow(focus, &focusInfo);
        !           716:        XFocusKeyboard(focus);
        !           717: }
        !           718: 
        !           719: FrameFocus()
        !           720: {
        !           721:        if (frameWidth == 0) return;    /* Nothing to do */
        !           722: 
        !           723:        /* Remove the frame from around any old focus window first */
        !           724: 
        !           725:        XClear(RootWindow);
        !           726: 
        !           727:        if (focus == RootWindow) return;
        !           728:        QueryWindow(focus, &focusInfo); /* Refresh it */
        !           729: 
        !           730:        /* Undo the default clipmode for the base window */
        !           731:        
        !           732:        XClipClipped(RootWindow);
        !           733: 
        !           734:        XPixSet(RootWindow, 
        !           735:                focusInfo.x - frameWidth, focusInfo.y - frameWidth,
        !           736:                focusInfo.width + 2 * (focusInfo.bdrwidth + frameWidth),
        !           737:                focusInfo.height + 2 * (focusInfo.bdrwidth + frameWidth),
        !           738:                fgColor);
        !           739: 
        !           740:        XClipDrawThrough(RootWindow);   /* Put it back */
        !           741: }
        !           742: 
        !           743: /* ARGSUSED */
        !           744: 
        !           745: Circulate(which, loc, w, winfo)
        !           746:        int which;
        !           747:        Locator loc;
        !           748:        Window w;
        !           749:        WindowInfo *winfo;
        !           750: {
        !           751:        if (popup) UnmapPopup();
        !           752: 
        !           753:        XCircWindowUp(RootWindow);
        !           754: }
        !           755: 
        !           756: EditIconName(be, name)
        !           757:         XKeyPressedEvent *be;
        !           758:        register char *name;
        !           759: {
        !           760:        Window w = be->window;
        !           761:        short charcode = be->detail;
        !           762:        register int nameLen, c;
        !           763:        int x0, y0, size;
        !           764:        WindowInfo winfo;
        !           765:        register char *string;
        !           766:        int nbytes;
        !           767:        register int i;
        !           768: 
        !           769:        string = XLookupMapping (be, &nbytes);
        !           770:        nameLen = (name == NULL) ? 0 : strlen(name);
        !           771: 
        !           772:        for (i = 0; i < nbytes; i++) {
        !           773:                c = string[i];
        !           774: 
        !           775:        
        !           776:                if (c == '\177') {      /* a 'delete' */
        !           777:                    if (nameLen > 0)
        !           778:                       name[--nameLen] = '\0';
        !           779:                         /* control-u if you can't read ascii */
        !           780:                } else if (c == '\025') {
        !           781:                    if (nameLen > 0) {
        !           782:                        *name = '\0';
        !           783:                        nameLen = 0;
        !           784:                    }
        !           785: 
        !           786:                } else if (c == '\r') {         /* return means reset focus */
        !           787:                    FocusOn(oldfocus ? oldfocus : RootWindow);
        !           788:                    oldfocus = 0;
        !           789:                    FrameFocus();
        !           790: 
        !           791:                } else if (c <= 0)
        !           792:                    ;   /* unknown character, ignore it */
        !           793: 
        !           794:                /* Else append the letter to the name */
        !           795: 
        !           796:                else {
        !           797:                    if (name == NULL)
        !           798:                        name = (char *) malloc (nameLen + 2);
        !           799:                    else
        !           800:                        name = (char *) realloc(name, nameLen + 2);
        !           801:                    if (name == NULL) {
        !           802:                        errno = ENOMEM;
        !           803:                        perror("newwm:");
        !           804:                    }
        !           805:                    name[nameLen] = c;
        !           806:                    name[++nameLen] = '\0';
        !           807:                }
        !           808:        }
        !           809: 
        !           810:        QueryWindow(w, &winfo);
        !           811:        x0 = winfo.x;
        !           812:        y0 = winfo.y;
        !           813: 
        !           814:        size = XQueryWidth(name, iconfont);
        !           815: 
        !           816:        /* Make sure icon is entirely on screen */
        !           817: 
        !           818:        if (x0 < 0) x0 = 0;
        !           819:        else if (x0 + size + 10 > screen_width) {
        !           820:            x0 = screen_width - size - 10;
        !           821:        }
        !           822: 
        !           823:        if (y0 < 0) y0 = 0;
        !           824:        else if (y0 + iconHeight + 2 > screen_height) {
        !           825:            y0 = screen_height - iconHeight - 2;
        !           826:        }
        !           827: 
        !           828:        XConfigureWindow(w, x0, y0, size + 8, iconHeight);
        !           829:        XWarpMouse(w, (size+8) >> 1, iconHeight >> 1);
        !           830:        FrameFocus();           /* Redraw frame */
        !           831:        XStoreName(winfo.assoc_wind, name);
        !           832: 
        !           833:        /* Don't redraw the text yet; the expose event will cause that */
        !           834: }
        !           835: 
        !           836: StoreBox (x, y, w, h)
        !           837:        int x, y, w, h;
        !           838: {
        !           839:        box[0].x = x;           box[0].y = y;
        !           840:        box[1].x = w+2;         box[1].y = 0;
        !           841:        box[2].x = 0;           box[2].y = h+2;
        !           842:        box[3].x = -(w+2);      box[3].y = 0;
        !           843:        box[4].x = 0;           box[4].y = -(h+1);
        !           844:        box[5].x = w+1;         box[5].y = 0;
        !           845:        box[6].x = 0;           box[6].y = h;
        !           846:        box[7].x = -w;          box[7].y = 0;
        !           847:        box[8].x = 0;           box[8].y = -(h-1);
        !           848: 
        !           849:        if (!freeze) {
        !           850:            box[9].x = 0;       box[9].y = h-1;
        !           851:            box[10].x = w;      box[10].y = 0;
        !           852:            box[11].x = 0;      box[11].y = -h;
        !           853:            box[12].x = -(w+1); box[12].y = 0;
        !           854:            box[13].x = 0;      box[13].y = h+1;
        !           855:            box[14].x = w+2;    box[14].y = 0;
        !           856:            box[15].x = 0;      box[15].y = -(h+2);
        !           857:            box[16].x = -(w+2); box[16].y = 0;
        !           858:        }
        !           859: }
        !           860: 
        !           861: DrawBox()
        !           862: {
        !           863:        XDraw(RootWindow, box, vcount, 1, 1, 0,
        !           864:                GXinvert, AllPlanes);
        !           865: }
        !           866: 
        !           867: InterpretLocator (w, x, y, subw, loc)
        !           868:        Window w;
        !           869:        Window *subw;
        !           870:        Locator loc;
        !           871:        int *x, *y;
        !           872: {
        !           873:        status = XInterpretLocator(w, x, y, subw, loc);
        !           874:        if (status == 0) Error("Couldn't interpret in InterpretLocator");
        !           875: }
        !           876: 
        !           877: InterpretLocatorW (w, subw, loc)
        !           878:        Window w;
        !           879:        Window *subw;
        !           880:        Locator loc;
        !           881: {
        !           882:        int x, y;
        !           883: 
        !           884:        status = XInterpretLocator(w, &x, &y, subw, loc);
        !           885:        if (status == 0) Error("Couldn't interpret in InterpretLocator");
        !           886: }
        !           887: 
        !           888: InterpretLocatorXY (w, x, y, loc)
        !           889:        Window w;
        !           890:        Locator loc;
        !           891:        int *x, *y;
        !           892: {
        !           893:        Window subw;
        !           894: 
        !           895:        status = XInterpretLocator(w, x, y, &subw, loc);
        !           896:        if (status == 0) Error("Couldn't interpret in InterpretLocator");
        !           897: }
        !           898: 
        !           899: QueryMouse (w, x, y, subw)
        !           900:        Window w;
        !           901:        Window *subw;
        !           902:        int *x, *y;
        !           903: {
        !           904:        status = XQueryMouse(w, x, y, subw);
        !           905:        if (status == 0) Error("Couldn't query mouse in QueryMouse");
        !           906: }
        !           907: 
        !           908: QueryWindow (w, info)
        !           909:        Window w;
        !           910:        WindowInfo *info;
        !           911: {
        !           912:        status = XQueryWindow(w, info);
        !           913:        if (status == 0) Error("Couldn't query windown in QueryWindow");
        !           914: }

unix.superglobalmegacorp.com

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