|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.