|
|
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.