jkh@ardent.UUCP (Jordan K. Hubbard) (06/06/88)
#! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 3 (of 8)." # Contents: Gadget.c GridBox.c Iconify.c Icons.c Move.c NewIconify.c # Wrapped by jkh@ardent on Sun Jun 5 18:56:29 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Gadget.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Gadget.c'\" else echo shar: Extracting \"'Gadget.c'\" \(7997 characters\) sed "s/^X//" >'Gadget.c' <<'END_OF_FILE' X/* X * Written February 29th, 1988. X * By Jordan Hubbard, for Ardent Computer Corporation. X * X */ X#include "awm.h" X#include "X11/Xutil.h" X extern XContext AwmContext; X AwmInfoPtr IsGadgetWin(w, gnum) Window w; int *gnum; X{ X AwmInfoPtr awi; X int i; X X Entry("IsGadgetWin") X X if (!XFindContext(dpy, w, AwmContext, &awi)) { X Window *wp; X X if (!awi->gadgets) X Leave((AwmInfoPtr)NULL) X for (i = 0; i < NumGadgets; i++) X if (awi->gadgets[i] == w) { X if (gnum) X *gnum = i; X Leave(awi) X } X Leave((AwmInfoPtr)NULL) X } X} X Boolean FPutGadgets(w, mask, button, x, y) Window w; int mask, button, x, y; X{ X Entry("FPutGadgets") X X if (w == RootWindow(dpy, scr)) X Leave(FALSE) X PutGadgets(w); X Leave(TRUE) X} X X/* X * This routine adds and gadgets onto title bar 'w' (though just X * about any window would do, I suppose). X */ int PutGadgets(w) Window w; X{ X int i, dir; X int rx, lx, nx, ny; X XWindowAttributes xwa; X XSetWindowAttributes swa; X unsigned long valuemask; X GadgetDecl *gdec; X AwmInfo *awi; X char *cp; X Boolean change = FALSE; X Binding *bptr; X Window tmp; X X Entry("PutGadgets") X X /* are there any gadgets declared? */ X if (NumGadgets < 1) X Leave_void X /* does this window have a title? */ X if (!(awi = IsTitled(w))) X Leave_void X else X w = awi->title; X /* if the window already has gadgets, this is a reshuffle */ X if (awi->gadgets) X change = TRUE; X else X awi->gadgets = (Window *)malloc(sizeof(Window) * NumGadgets + 1); X if (XGetWindowAttributes(dpy, w, &xwa) == BadWindow) { X fprintf(stderr, "PutGadgets: Can't get attributes for title window %x\n", X w); X Leave_void X } X /* define some initial positioning information */ X dir = RightGadgetGravity; X lx = 0; X rx = xwa.width; X valuemask = CWBackPixel | CWEventMask; X swa.event_mask = (ButtonPressMask | ButtonReleaseMask | ExposureMask); X for (i = 0; i < NumGadgets && Gadgets[i]; i++) { X XGCValues gcv; X X gdec = Gadgets[i]; X X /* Does gadget have its own gravity? */ X if (gdec->gravity != NoGadgetGravity) X dir = gdec->gravity; X ny = xwa.height - gdec->high; X if (ny <= 0) { X ny = 0; X gdec->high = xwa.height; X } X else X ny = (ny / 2) - 1; X if (ny < 0) X ny = 0; X if (dir == LeftGadgetGravity) { X nx = lx + gdec->offset; X if (nx != 0 && nx == lx) /* not first time through, add pad */ X nx = lx + GadgetPad; X if (nx < 0) X nx = 0; X lx = nx + gdec->wide; X dir = RightGadgetGravity; X } X else { /* right gravity */ X nx = rx - gdec->wide - gdec->offset; X if (!gdec->offset && rx != xwa.width) X nx -= GadgetPad; X if (nx > xwa.width) X nx = xwa.width - gdec->wide - 1; X rx = nx; X dir = LeftGadgetGravity; X } X if (change == FALSE) { X swa.background_pixel = gdec->backcolor; X tmp = awi->gadgets[i] = XCreateWindow(dpy, w, nx, ny, gdec->wide, X gdec->high, 1, X xwa.depth, xwa.class, X xwa.visual, valuemask, &swa); X if (!tmp) { X fprintf(stderr, "PutGadgets: Unable to create gadget window #%d\n", X i); X Leave_void X } X if (gdec->data) { X Pixmap pix; X X pix = XCreatePixmapFromBitmapData(dpy, tmp, gdec->data, X gdec->wide, gdec->high, X gdec->forecolor, gdec->backcolor, X xwa.depth); X if (!pix) { X fprintf(stderr, "PutGadgets: Unable to create pixmap for #%d\n", X i); X fprintf(stderr, "Using grey...\n"); X pix = GrayPixmap; X } X XSetWindowBackgroundPixmap(dpy, tmp, pix); X XFreePixmap(dpy, pix); X } X XMapWindow(dpy, tmp); X XSaveContext(dpy, tmp, AwmContext, awi); X } X else X XMoveWindow(dpy, awi->gadgets[i], nx, ny); X } X if (change == FALSE) /* make sure the window array is null terminated */ X awi->gadgets[i] = (Window)NULL; X Leave_void X} X int FreeGadget(n) int n; X{ X Entry("FreeGadget") X X if (Gadgets[n]->data) X XFree(Gadgets[n]->data); X if (Gadgets[n]->name) X free(Gadgets[n]->name); X /* They tell me that this is not necessary for read-only cells. True? X if (Gadgets[n]->forecolor) X XFreeColors(dpy, DefaultColormap(dpy, scr), X &(Gadgets[n]->forecolor), 1, AllPlanes); X if (Gadgets[n]->backcolor) X XFreeColors(dpy, DefaultColormap(dpy, scr), X &(Gadgets[n]->backcolor), 1, AllPlanes); X */ /* color free's commented out */ X} X int CheckGadgets() X{ X int i, status = 0; X X Entry("CheckGadgets") X X for (i = 0; i < NumGadgets; i++) X if (!Gadgets[i]) { X fprintf(stderr, "awm: Gadget #%d is not declared!\n", X i); X fprintf(stderr, "All gadgets from 0 to %d must be declared.\n", X NumGadgets - 1); X status = 1; X } X Leave(status) X} X Boolean ResetGadgets() X{ X int i; X X Entry("ResetGadgets") X X for (i = 0; i < NumGadgets; i++) { X FreeGadget(i); X free(Gadgets[i]); X Gadgets[i] = 0; X } X NumGadgets = 0; X} X Boolean FDestroyGadgets(w, mask, button, x, y) Window w; int mask, button, x, y; X{ X Entry("FDestroyGadgets") X X if (w == RootWindow(dpy, scr)) X Leave(FALSE) X DestroyGadgets(w); X Leave(TRUE) X} X int DestroyGadgets(w) Window w; X{ X int i; X AwmInfoPtr awi; X X Entry("DestroyGadgets") X X if (!(awi = IsTitled(w))) X Leave_void X if (!awi->gadgets) X Leave_void X for (i = 0; i < NumGadgets && Gadgets[i]; i++) { X XDeleteContext(dpy, awi->gadgets[i], AwmContext); X XDestroyWindow(dpy, awi->gadgets[i]); X } X free(awi->gadgets); X awi->gadgets = 0; X Leave_void X} X int PaintGadgets(w) Window w; X{ X int i, y, x = 0; X AwmInfoPtr awi; X GadgetDecl *gdec; X X Entry("PaintGadgets") X X if (!(awi = IsTitled(w))) X Leave_void X if (!awi->gadgets) X Leave_void X for (i = 0; i < NumGadgets && Gadgets[i]; i++) { X gdec = Gadgets[i]; X if (!gdec->data) { X XGCValues gcv; X X gcv.font = gdec->fontInfo->fid; X gcv.foreground = gdec->forecolor; X gcv.background = gdec->backcolor; X XChangeGC(dpy, awi->winGC, (GCFont | GCForeground | GCBackground), X &gcv); X y = (gdec->high + (gdec->fontInfo->max_bounds.ascent - X gdec->fontInfo->max_bounds.descent)) / 2; X x = 0; X if (strlen(gdec->name) == 1) { /* it's a glyph (we think) */ X XFontStruct *real_font; X XCharStruct char_info; X int char_number, index, byte1, byte2; X X real_font = gdec->fontInfo; X char_number = gdec->name[0]; X char_info = real_font->max_bounds; X index = char_number; X X if (real_font->per_char) { X if (!real_font->min_byte1 && !real_font->max_byte1) { X if (char_number < real_font->min_char_or_byte2 || X char_number > real_font->max_char_or_byte2) X index = real_font->default_char; X index -= real_font->min_char_or_byte2; X } else { X byte2 = index & 0xff; X byte1 = (index>>8) & 0xff; X if (byte1 < real_font->min_byte1 || X byte1 > real_font->max_byte1 || X byte2 < real_font->min_char_or_byte2 || X byte2 > real_font->max_char_or_byte2) { X byte2 = real_font->default_char & 0xff; X byte1 = (real_font->default_char>>8)&0xff; X } X byte1 -= real_font->min_byte1; X byte2 -= real_font->min_char_or_byte2; X index = byte1 * (real_font->max_char_or_byte2 - X real_font->min_char_or_byte2 + 1) + X byte2; X } X char_info = real_font->per_char[index]; X } X x = 0 - char_info.lbearing; X y = char_info.ascent; X } X XDrawString(dpy, awi->gadgets[i], awi->winGC, x, X y, gdec->name, strlen(gdec->name)); X } X } X Leave(0) X} END_OF_FILE if test 7997 -ne `wc -c <'Gadget.c'`; then echo shar: \"'Gadget.c'\" unpacked with wrong size! fi # end of 'Gadget.c' fi if test -f 'GridBox.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'GridBox.c'\" else echo shar: Extracting \"'GridBox.c'\" \(7071 characters\) sed "s/^X//" >'GridBox.c' <<'END_OF_FILE' X#ifndef lint static char *rcsid_StoreGridBox_c = "$Header: GridBox.c,v 1.3 87/09/11 08:21:55 toddb Exp $"; X#endif lint X X#include "X11/copyright.h" X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X X X X/* X * MODIFICATION HISTORY X * X * 000 -- M. Gancarz, DEC Ultrix Engineering Group X * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, X Western Software Lab. Converted to X11. X */ X X#ifndef lint static char *sccsid = "@(#)StoreGridBox.c 3.8 1/24/86"; X#endif X extern int Fheight; X X/* X * StoreGridBox - This subroutine is used by the X Window Manager (xwm) X * to store the vertices for the movement resize grid and box in a X * vertex list. X */ X X#include "awm.h" X X/* X * Store the vertices for the movement resize grid and box in a vertex list. X */ int StoreGridBox(box, ulx, uly, lrx, lry) register XSegment box[]; int ulx; /* Upper left X coordinate. */ int uly; /* Upper left Y coordinate. */ int lrx; /* Lower right X coordinate. */ int lry; /* Lower right Y coordinate. */ X{ X register int xthird, ythird; X int x1third, y1third; X int x2third, y2third; X X Entry("StoreGridBox") X X /* X * Xor in. X */ X box[0].x1 = ulx; box[0].y1 = uly; X box[0].x2 = lrx; box[0].y2 = uly; X X box[1].x1 = lrx; box[1].y1 = uly; X box[1].x2 = lrx; box[1].y2 = lry; X X box[2].x1 = lrx; box[2].y1 = lry; X box[2].x2 = ulx; box[2].y2 = lry; X X box[3].x1 = ulx; box[3].y1 = lry; X box[3].x2 = ulx; box[3].y2 = uly; X X X /* X * These are the X and Y calculations for the parts of the grid that X * are dependent on the division by 3 calculations. X */ X X /* X * Y dimension third. X */ X ythird = (lry - uly) / 3; X y1third = uly + ythird; X y2third = y1third + ythird; X X /* X * X dimension third. X */ X xthird = (lrx - ulx) / 3; X x1third = ulx + xthird; X x2third = x1third + xthird; X X box[4].x1 = x1third; box[4].y1 = lry; X box[4].x2 = x1third; box[4].y2 = uly; X X box[5].x1 = x2third; box[5].y1 = lry; X box[5].x2 = x2third; box[5].y2 = uly; X X box[6].x1 = ulx; box[6].y1 = y1third; X box[6].x2 = lrx; box[6].y2 = y1third; X X box[7].x1 = ulx; box[7].y1 = y2third; X box[7].x2 = lrx; box[7].y2 = y2third; X X /* X * Do not erase if we're freezing the screen. X */ X if (Freeze) X Leave(8) X X /* X * From here on we're retracing the segments to clear the X * grid using GXxor. X */ X box[8].x1 = ulx; box[8].y1 = uly; X box[8].x2 = lrx; box[8].y2 = uly; X X box[9].x1 = lrx; box[9].y1 = uly; X box[9].x2 = lrx; box[9].y2 = lry; X X box[10].x1 = lrx; box[10].y1 = lry; X box[10].x2 = ulx; box[10].y2 = lry; X X box[11].x1 = ulx; box[11].y1 = lry; X box[11].x2 = ulx; box[11].y2 = uly; X X box[12].x1 = x1third; box[12].y1 = lry; X box[12].x2 = x1third; box[12].y2 = uly; X X box[13].x1 = x2third; box[13].y1 = lry; X box[13].x2 = x2third; box[13].y2 = uly; X X box[14].x1 = ulx; box[14].y1 = y1third; X box[14].x2 = lrx; box[14].y2 = y1third; X X box[15].x1 = ulx; box[15].y1 = y2third; X box[15].x2 = lrx; box[15].y2 = y2third; X X X /* X * Total number of segments is 16. X */ X Leave(16) X} X X/* X * Store the vertices for the movement resize grid and box in a vertex list. X * This is just like the routine above, but it adds a line for titled windows. X */ X extern int Fheight; X int StoreTitleGridBox(box, ulx, uly, lrx, lry) register XSegment box[]; int ulx; /* Upper left X coordinate. */ int uly; /* Upper left Y coordinate. */ int lrx; /* Lower right X coordinate. */ int lry; /* Lower right Y coordinate. */ X{ X register int xthird, ythird; X int x1third, y1third; X int x2third, y2third; X X Entry("StoreTitleGridBox") X X /* X * Xor in. X */ X box[0].x1 = ulx; box[0].y1 = uly; X box[0].x2 = lrx; box[0].y2 = uly; X X box[1].x1 = ulx; box[1].y1 = uly + Fheight + 2; X box[1].x2 = lrx; box[1].y2 = uly + Fheight + 2; X X box[2].x1 = lrx; box[2].y1 = uly; X box[2].x2 = lrx; box[2].y2 = lry; X X box[3].x1 = lrx; box[3].y1 = lry; X box[3].x2 = ulx; box[3].y2 = lry; X X box[4].x1 = ulx; box[4].y1 = lry; X box[4].x2 = ulx; box[4].y2 = uly; X X X /* X * These are the X and Y calculations for the parts of the grid that X * are dependent on the division by 3 calculations. X */ X X /* X * Y dimension third. X */ X ythird = (lry - uly - Fheight - 2) / 3; X y1third = uly + ythird + Fheight + 2; X y2third = y1third + ythird; X X /* X * X dimension third. X */ X xthird = (lrx - ulx) / 3; X x1third = ulx + xthird; X x2third = x1third + xthird; X X box[5].x1 = x1third; box[5].y1 = lry; X box[5].x2 = x1third; box[5].y2 = uly + Fheight + 3; X X box[6].x1 = x2third; box[6].y1 = lry; X box[6].x2 = x2third; box[6].y2 = uly + Fheight + 3; X X box[7].x1 = ulx; box[7].y1 = y1third; X box[7].x2 = lrx; box[7].y2 = y1third; X X box[8].x1 = ulx; box[8].y1 = y2third; X box[8].x2 = lrx; box[8].y2 = y2third; X X /* X * Do not erase if we're freezing the screen. X */ X if (Freeze) X Leave(9) X X /* X * From here on we're retracing the segments to clear the X * grid using GXxor. X */ X box[9].x1 = ulx; box[9].y1 = uly; X box[9].x2 = lrx; box[9].y2 = uly; X X box[10].x1 = ulx; box[10].y1 = uly + Fheight + 2; X box[10].x2 = lrx; box[10].y2 = uly + Fheight + 2; X X box[11].x1 = lrx; box[11].y1 = uly; X box[11].x2 = lrx; box[11].y2 = lry; X X box[12].x1 = lrx; box[12].y1 = lry; X box[12].x2 = ulx; box[12].y2 = lry; X X box[13].x1 = ulx; box[13].y1 = lry; X box[13].x2 = ulx; box[13].y2 = uly; X X box[14].x1 = x1third; box[14].y1 = lry; X box[14].x2 = x1third; box[14].y2 = uly + Fheight + 3; X X box[15].x1 = x2third; box[15].y1 = lry; X box[15].x2 = x2third; box[15].y2 = uly + Fheight + 3; X X box[16].x1 = ulx; box[16].y1 = y1third; X box[16].x2 = lrx; box[16].y2 = y1third; X X box[17].x1 = ulx; box[17].y1 = y2third; X box[17].x2 = lrx; box[17].y2 = y2third; X X X /* X * Total number of segments is 18. X */ X Leave(18) X} END_OF_FILE if test 7071 -ne `wc -c <'GridBox.c'`; then echo shar: \"'GridBox.c'\" unpacked with wrong size! fi # end of 'GridBox.c' fi if test -f 'Iconify.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Iconify.c'\" else echo shar: Extracting \"'Iconify.c'\" \(6147 characters\) sed "s/^X//" >'Iconify.c' <<'END_OF_FILE' X/* $Header: Iconify.c,v 1.1 87/09/11 08:21:28 toddb Exp $ */ X#include "X11/copyright.h" X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X X X X/* X * MODIFICATION HISTORY X * X * 000 -- M. Gancarz, DEC Ultrix Engineering Group X * 001 -- R. Kittell, DEC Storage A/D May 20, 1986 X * Add optional warp of mouse to the upper right corner on de-iconify, X * and to the icon center on iconify. X * 002 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, X * Western Software Lab. Port to X11. X * 003 -- Jordan Hubbard, Ardent Computer. X * Many mods to cope with context manager, titled windows. Almost a total X * rewrite. X */ X X#ifndef lint static char *sccsid = "%W% %G%"; X#endif X X#include "awm.h" X Boolean Iconify(window, mask, button, x, y) Window window; /* Event window. */ int mask; /* Button/key mask. */ int button; /* Button event detail. */ int x, y; /* Event mouse position. */ X{ X XWindowAttributes fromInfo; /* info on "from" window */ X XWindowAttributes toInfo; /* info on "to" window */ X int mse_x, mse_y; /* Mouse X and Y coordinates. */ X int sub_win_x, sub_win_y; /* relative Mouse coordinates. */ X int num_vectors; /* Number of vectors in zap buffer. */ X int mmask; /* Mouse state */ X Window root; /* Mouse root window. */ X Window from, to; /* from -> to windows */ X Window sub_win; /* Mouse position sub-window. */ X XSegment zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */ X Boolean dozap; /* local Zap */ X AwmInfoPtr awi; X X Entry("Iconify") X X /* X * Do not try to iconify the root window. X */ X if (window == RootWindow(dpy, scr)) X Leave(FALSE) X /* X * The original idea of zap lines has one flaw. If a window wants X * to be created iconic, it should just appear that way without any X * fuss. CheckMap() calls us with (win, 0, 0, 0, 0) when this is the X * case, so we can special case this to turn off Zap temporarily. X * Since we don't want to mess with the global "Zap", we use X * "dozap" instead. X */ X dozap = (mask || button || x || y) ? Zap : FALSE; X /* X * Clear the vector buffer. X */ X if (dozap) X bzero(zap, sizeof(zap)); X X /* X * Get the mouse cursor position in case we must put a new X * icon there. X */ X XQueryPointer(dpy, RootWindow(dpy, scr), &root, &sub_win, X &mse_x, &mse_y, &sub_win_x, &sub_win_y, &mmask); X X X /* X * Figure out which direction we're going in (icon->window or vica-versa) X */ X awi = GetAwmInfo(window); X if (awi->state == ICON) { X from = awi->icon; X to = (awi->frame) ? awi->frame : awi->client; X if (awi->placed == FALSE) X PlaceWindow(to); X } X else if (awi->state == WINDOW) { X from = (awi->frame) ? awi->frame : awi->client; X to = (awi->icon) ? awi->icon : MakeIcon(window, mse_x, mse_y, TRUE); X } X else { X printf("Iconify: Window %x has unknown state '%x'\n", X awi->client, awi->state); X Leave(FALSE) X } X status = XGetWindowAttributes(dpy, from, &fromInfo); X if (status == FAILURE) X Leave(FALSE) X status = XGetWindowAttributes(dpy, to, &toInfo); X if (status == FAILURE) X Leave(FALSE) X X /* X * Store the zap vector buffer. X */ X if (dozap) { X num_vectors = X StoreZap(zap, X fromInfo.x - 1, X fromInfo.y - 1, X fromInfo.x + fromInfo.width + X (fromInfo.border_width << 1), X fromInfo.y + fromInfo.height + X (fromInfo.border_width << 1), X toInfo.x - 1, X toInfo.y - 1, X toInfo.x + toInfo.width + X (toInfo.border_width << 1), X toInfo.y + toInfo.height + X (toInfo.border_width << 1)); X } X if (awi->state == ICON) { X if (!awi->frame) X XRemoveFromSaveSet(dpy, awi->client); X awi->state = WINDOW; X } X else if (awi->state == WINDOW) { X XAddToSaveSet(dpy, awi->client); X awi->state = ICON; X } X else X fprintf(stderr, "Window state for window %x got munged!\n", X awi->client); X /* X * Map the target. X */ X XMapRaised(dpy, to); X if (dozap) { X /* X * Draw the zap lines. X */ X DrawZap(); X } X /* X * Unmap the "from" window. X */ X XUnmapWindow(dpy, from); X XFlush(dpy); X /* X * Optionally warp the mouse to the upper right corner of the X * window. X */ X if (WarpOnDeIconify && awi->state == WINDOW) { X int y; X X y = (toInfo.height >= 10) ? 10 : toInfo.height / 2; X if (awi->frame) { /* compensate for title */ X XWindowAttributes xwa; X XGetWindowAttributes(dpy, awi->title, &xwa); X y += xwa.height + 2; X } X status = XWarpPointer (dpy, None, to, X 0, 0, 0, 0, X toInfo.width >= 7 ? X toInfo.width - 7 : toInfo.width / 2, X y); X } X X if (WarpOnIconify && awi->state == ICON) X status = XWarpPointer (dpy, None, to, X 0, 0, 0, 0, X toInfo.width / 2, toInfo.height / 2); X Leave(TRUE) X} END_OF_FILE if test 6147 -ne `wc -c <'Iconify.c'`; then echo shar: \"'Iconify.c'\" unpacked with wrong size! fi # end of 'Iconify.c' fi if test -f 'Icons.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Icons.c'\" else echo shar: Extracting \"'Icons.c'\" \(9559 characters\) sed "s/^X//" >'Icons.c' <<'END_OF_FILE' X/* $Header: Icons.c,v 1.4 87/09/09 12:00:29 swick Exp $ */ X#include "X11/copyright.h" X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X X X X/* X * MODIFICATION HISTORY X * X * 000 -- L. Guarino Reid, DEC Ultrix Engineering Group X */ X X#ifndef lint static char *sccsid = "%W% %G%"; X#endif X X#include "awm.h" X#include "X11/Xutil.h" X extern XContext AwmContext; X X/* the client should pass us a bitmap (single-plane pixmap with background=0 X * and foreground = 1). It is our responsibility to convert it to a pixmap X * of the appropriate depth for a window tile and also color it with the X * appropriate background and foreground pixels. X * X * we'll use the (global) IconGC for the fore/background pixels. X */ X static Pixmap MakePixmapFromBitmap( bitmap, clipmask, width_return, height_return ) Pixmap bitmap, clipmask; unsigned int *width_return, *height_return; X{ X Pixmap tile; X Window junkW; X int junk, width, height; X GC iGC; X XGCValues gcv; X X Entry("MakePixmapFromBitmap") X X if (!XGetGeometry( dpy, bitmap, &junkW, &junk, &junk, X &width, &height, &junk, &junk )) { X Warning( "client passed invalid pixmap for icon." ); X Leave( NULL ) X } X tile = XCreatePixmap( dpy, RootWindow(dpy, scr), width, height, X DefaultDepth(dpy, scr) ); X if (clipmask) X XSetClipMask(dpy, IconGC, clipmask); X gcv.foreground = ITextForeground; X gcv.background = ITextBackground; X iGC = XCreateGC(dpy, RootWindow(dpy, scr), (GCForeground | GCBackground), X &gcv); X XCopyPlane( dpy, bitmap, tile, iGC, 0, 0, width, height, 0, 0, 1 ); X XFreeGC(dpy, iGC); X if (width_return) X *width_return = width; X if (height_return) X *height_return = height; X Leave(tile) X} X char *GetIconName(window) Window window; X{ X char *name; X Status status; X long len, after; X Atom a_type; X int a_form; X X Entry("GetIconName") X X status = XGetWindowProperty(dpy, window, XA_WM_ICON_NAME, 0, 256, X False, XA_STRING, &a_type, &a_form, &len, &after, X &name); X X if (status != Success) { X status = XGetWindowProperty(dpy, window, XA_WM_NAME, 0, NAME_LEN, X False, XA_STRING, &a_type, &a_form, &len, X &after, &name); X if (status != Success) X Leave((char *)NULL) X } X if (a_form == 0) /* we have no bananas */ X Leave((char *)NULL) X if (a_form != 8) { X Warning("Window has icon_name in wrong format"); X if (name) X free(name); X Leave((char *)NULL) X } X if (len > NAME_LEN) { X Warning("Window has icon_name greater than maximum length"); X len = NAME_LEN; X } X if (!len) X Leave((char *)NULL) X name[len] = 0; X Leave(name) X} X Boolean IsIcon(icon, win) Window icon; Window *win; X{ X AwmInfoPtr awi; X X Entry("IsIcon") X X if (win) X *win = 0; X awi = GetAwmInfo(icon); X if (!awi) X Leave(FALSE) X if (awi->icon == icon) { X if (win) X *win = awi->client; X Leave(TRUE) X } X else if (awi->client == icon || awi->frame == icon) { X if (win) X *win = awi->icon; X Leave(FALSE) X } X Leave(FALSE) X} X RemoveIcon(window) Window window; X{ X AwmInfoPtr awi; X X Entry("RemoveIcon") X X if ((awi = GetAwmInfo(window)) != NULL) { X XDeleteContext(dpy, awi->icon, AwmContext); X if (awi->own) { X XDestroyWindow(dpy, awi->icon); X if (awi->iconPixmap != IBackPixmap) X XFreePixmap(dpy, awi->iconPixmap); X } X awi->icon = 0; X awi->state = WINDOW; X } X Leave_void X} X GetDefaultSize(window, icon_w, icon_h) Window window; int *icon_w, *icon_h; X{ X char *name; /* Event window name. */ X X Entry("GetDefaultSize") X X /* X * Determine the size of the icon window. X */ X name = GetIconName(window); X *icon_h = IFontInfo->ascent + IFontInfo->descent; X if (name) { X *icon_w = XTextWidth(IFontInfo, name, strlen(name)); X if (*icon_w == 0) X *icon_w = *icon_h; X } X else X *icon_w = *icon_h; X Leave_void X} X Window MakeIcon(window, x, y, mousePositioned) Window window; /* associated window. */ int x, y; /* Event mouse position. */ Boolean mousePositioned; X{ X Window icon; /* icon window. */ X int icon_x, icon_y; /* Icon U. L. X and Y coordinates. */ X int icon_w, icon_h; /* Icon width and height. */ X int icon_bdr; /* Icon border width. */ X int mask; /* Icon event mask */ X int depth; /* for XGetGeometry */ X XSetWindowAttributes iconValues; /* for icon window creation */ X unsigned long iconValues_mask; /* for above */ X XWMHints *wmhints; /* see if icon position provided */ X XWMHints *XGetWMHints(); X Pixmap clip = 0; X Window AddIcon(); X X Entry("MakeIcon") X X iconValues.background_pixmap = IBackPixmap; X mask = (ExposureMask | StructureNotifyMask | KeyPressMask); X /* X * Process window manager hints. X */ X if (wmhints = XGetWMHints(dpy, window)) { X if (wmhints->flags & IconWindowHint) X Leave(AddIcon(window, wmhints->icon_window, FALSE, X (StructureNotifyMask), (Pixmap)NULL)) X else if (wmhints->flags & IconPixmapHint) { X if (wmhints->flags & IconMaskHint) X clip = wmhints->icon_mask; X iconValues.background_pixmap = X MakePixmapFromBitmap(wmhints->icon_pixmap, clip, X &icon_w, &icon_h ); X if (iconValues.background_pixmap) X mask = (StructureNotifyMask); X else { X iconValues.background_pixmap = IBackPixmap; X wmhints->flags &= ~IconPixmapHint; X GetDefaultSize(window, &icon_w, &icon_h); X } X } X else GetDefaultSize(window, &icon_w, &icon_h); X } X else GetDefaultSize(window, &icon_w, &icon_h); X X /* X * Fix up sizes by padding. X */ X if (!wmhints || !(wmhints->flags & (IconPixmapHint|IconWindowHint))) { X icon_w += (HIconPad << 1); X icon_h += (VIconPad << 1); X } X X /* X * Set the icon border attributes. X */ X if (!wmhints || !(wmhints->flags & IconWindowHint)) { X icon_bdr = IBorderWidth; X iconValues.border_pixel = IBorder; X } X X if (wmhints && (wmhints->flags & IconPositionHint)) { X icon_x = wmhints->icon_x; X icon_y = wmhints->icon_y; X } else { X if (mousePositioned) { X /* X * Determine the coordinates of the icon window; X * normalize so that we don't lose the icon off the X * edge of the screen. X */ X icon_x = x - (icon_w >> 1) + 1; X if (icon_x < 0) icon_x = 0; X icon_y = y - (icon_h >> 1) + 1; X if (icon_y < 0) icon_y = 0; X if ((icon_x - 1 + icon_w + (icon_bdr << 1)) > ScreenWidth) { X icon_x = ScreenWidth - icon_w - (icon_bdr << 1) + 1; X } X if ((icon_y - 1 + icon_h + (icon_bdr << 1)) > ScreenHeight) { X icon_y = ScreenHeight - icon_h - (icon_bdr << 1) + 1; X } X } X else { X icon_x = x + (icon_w >> 1); X icon_y = y + (icon_y >> 1); X } X X } X X /* X * Create the icon window. X */ X iconValues_mask = CWBorderPixel | CWBackPixmap; X /* X * Here we assume that if they want save unders, they'll also want X * backing store on the icons. Perhaps a dangerous assumption, but X * one we have to make at this point. X */ X if (SaveUnder) { X iconValues.backing_store = WhenMapped; X iconValues_mask |= CWBackingStore; X } X Leave(AddIcon(window, X XCreateWindow( X dpy, RootWindow(dpy, scr), X icon_x, icon_y, X icon_w, icon_h, X icon_bdr, 0, CopyFromParent, CopyFromParent, X iconValues_mask, &iconValues), X TRUE, mask, iconValues.background_pixmap)) X X} X Window AddIcon(window, icon, own, mask, background) Window window, icon; Boolean own; int mask; Pixmap background; X{ X Binding *bptr; X AwmInfoPtr awi; X X Entry("AddIcon") X X if (icon == NULL) X Leave(NULL) X /* X * Use the text cursor whenever the mouse is in the icon window. X */ X XDefineCursor(dpy, icon, TextCursor); X X /* X * Select "key pressed", "window exposure" and "unmap window" X * events for the icon window. X */ X XSelectInput(dpy, icon, mask); X /* X * Handle any registered grabs for the icon window. X */ X for (bptr = Blist; bptr; bptr = bptr->next) X if (bptr->context & ICON) X Grab(bptr->mask, icon); X awi = GetAwmInfo(window); X awi->icon = icon; X awi->own = own; X awi->iconPixmap = background; X XSaveContext(dpy, icon, AwmContext, awi); X Leave(icon) X} END_OF_FILE if test 9559 -ne `wc -c <'Icons.c'`; then echo shar: \"'Icons.c'\" unpacked with wrong size! fi # end of 'Icons.c' fi if test -f 'Move.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Move.c'\" else echo shar: Extracting \"'Move.c'\" \(7893 characters\) sed "s/^X//" >'Move.c' <<'END_OF_FILE' X#ifndef lint X static char *rcsid_Move_c = "$Header: Move.c,v 1.8 87/08/25 11:24:56 swick Exp $"; X#endif lint X X#include "X11/copyright.h" X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X X/* X * MODIFICATION HISTORY X * X * 000 -- M. Gancarz, DEC Ultrix Engineering Group X * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, X * Western Software Lab. Port to X11 X */ X X#ifndef lint static char *sccsid = "@(#)Move.c 3.8 1/24/86"; X#endif X X#include "awm.h" X Boolean Move(window, mask, button, x, y) Window window; /* Event window. */ int mask; /* Button/key mask. */ int button; /* Button event detail. */ int x, y; /* Event mouse position. */ X{ X register int prev_x; /* Previous event window X location. */ X register int prev_y; /* Previous event window Y location. */ X XWindowAttributes window_info; /* Event window information. */ X int cur_x; /* Current event window X location. */ X int cur_y; /* Current event window Y location. */ X int root_x; /* Root window X location. */ X int root_y; /* Root window Y location. */ X int ulx, uly; /* Event window upper left X and Y. */ X int lrx, lry; /* Event window lower right X and Y. */ X int init_ulx, init_uly; /* Init window upper left X and Y. */ X int init_lrx, init_lry; /* Init window lower right X and Y. */ X int num_vectors; /* Number of vectors in box. */ X int ptrmask; /* state of ptr when queried */ X Window sub_window; /* Query mouse event sub-window. */ X Window root; /* Query mouse event root. */ X AwmInfoPtr awi; X XEvent button_event; /* Button event packet. */ X XSegment box[MAX_BOX_VECTORS]; /* Box vertex buffer. */ X XSegment zap[MAX_ZAP_VECTORS]; /* Zap effect verted buffer. */ X int (*storegrid_func)(); /* Function to use for grid */ X int (*storebox_func)(); /* Function to use for box */ X X Entry("Move") X X /* X * Do not try to move the root window. X */ X if (window == RootWindow(dpy, scr)) X Leave(FALSE) X X /* X * Change the cursor. X */ X grab_pointer(); X /* X * Clear the vector buffers. X */ X bzero(box, sizeof(box)); X if (Zap) X bzero(zap, sizeof(zap)); X X /* X * Gather info on the event window. X */ X awi = GetAwmInfo(window); X if (!awi) X Leave(FALSE) X status = XGetWindowAttributes(dpy, window, &window_info); X if (status == FAILURE) X Leave(FALSE) X X if (awi->title && !IsIcon(window, NULL)) { X storegrid_func = StoreTitleGridBox; X storebox_func = StoreTitleBox; X } X else { X storegrid_func = StoreGridBox; X storebox_func = StoreBox; X } X /* X * Initialize movement variables. X */ X init_ulx = ulx = window_info.x; X init_uly = uly = window_info.y; X init_lrx = lrx = window_info.x + window_info.width + X (window_info.border_width << 1) - 1; X init_lry = lry = window_info.y + window_info.height + X (window_info.border_width << 1) - 1; X X /* X * Store the box. X */ X if (Grid) X num_vectors = (*storegrid_func)(box, ulx, uly, lrx, lry); X else X num_vectors = (*storebox_func)(box, ulx, uly, lrx, lry); X X /* X * Initialize the previous location variables. X */ X prev_x = x; X prev_y = y; X X /* X * Freeze the server, if requested by the user. X * This results in a solid box instead of a flickering one. X */ X if (Freeze) X XGrabServer(dpy); X Snatched = True; X /* X * Process any pending exposure events before drawing the box. X */ X while (QLength(dpy) > 0) { X XPeekEvent(dpy, &button_event); X if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr)) X break; X GetButton(&button_event); X } X X /* X * Now draw the box. X */ X X DrawBox(); X Frozen = window; X X /* X * Main loop. X */ X while (TRUE) { X X /* X * Check to see if we have a change in mouse button status. X * This is how we get out of this "while" loop. X */ X if (XPending(dpy) && !ProcessRequests(box, num_vectors) && X GetButton(&button_event)) { X /* X * Process the pending events, this sequence is the only X * way out of the loop and the routine. X */ X X if ((button_event.type != ButtonPress) && X (button_event.type != ButtonRelease)) { X continue; /* spurious menu event... */ X } X X /* X * If we froze the server, then erase the last lines drawn. X */ X if (Freeze) { X DrawBox(); X Frozen = (Window)0; X XUngrabServer(dpy); X } X X if ((button_event.type == ButtonRelease) && X (((XButtonReleasedEvent *)&button_event)->button == button)) { X X /* X * The button was released, so move the window. X */ X X if (Zap) { X num_vectors = StoreZap(zap, X init_ulx, init_uly, X init_lrx, init_lry, X ulx, uly, X lrx, lry); X DrawZap(); X DrawZap(); X } X#ifdef titan /* 5x4 alignment */ X ulx += (ulx % 5); X uly += (uly % 4); X#endif /* titan */ X if (Wall) { X if (ulx < 0) X ulx = 0; X if (ulx > (ScreenWidth - window_info.width)) X ulx = (ScreenWidth - window_info.width); X if (uly < 0) X uly = 0; X if (uly > (ScreenHeight - window_info.height)) X uly = (ScreenHeight - window_info.height); X } X XMoveWindow(dpy, window, ulx, uly); X Snatched = False; X ungrab_pointer(); X Leave(TRUE) X } X else { X /* X * Some other button event occured, this aborts the X * current operation. X */ X X ResetCursor(button); X Snatched = False; X ungrab_pointer(); X Leave(TRUE) X } X } X X /* X * Take care of all the little things that have changed. X */ X XQueryPointer(dpy, X RootWindow(dpy, scr), &root, &sub_window, X &root_x, &root_y, &cur_x, &cur_y, &ptrmask); X if ((cur_x != prev_x) || (cur_y != prev_y)) { X X /* X * If we've frozen the server, then erase the old box first! X */ X if (Freeze) X DrawBox(); X X /* X * Box position has changed. X */ X ulx += cur_x - prev_x; X uly += cur_y - prev_y; X lrx += cur_x - prev_x; X lry += cur_y - prev_y; X X /* X * Box needs to be restored. X */ X if (Grid) X num_vectors = (*storegrid_func)(box, ulx, uly, lrx, lry); X else X num_vectors = (*storebox_func)(box, ulx, uly, lrx, lry); X X X /* X * Draw the new box. X */ X if (Freeze) X DrawBox(); X } X X /* X * Save old box position. X */ X prev_x = cur_x; X prev_y = cur_y; X X /* X * If server is not frozen, then draw the "flicker" box. X */ X if (!Freeze) { X DrawBox(); X DrawBox(); X } X } X} END_OF_FILE if test 7893 -ne `wc -c <'Move.c'`; then echo shar: \"'Move.c'\" unpacked with wrong size! fi # end of 'Move.c' fi if test -f 'NewIconify.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'NewIconify.c'\" else echo shar: Extracting \"'NewIconify.c'\" \(10332 characters\) sed "s/^X//" >'NewIconify.c' <<'END_OF_FILE' X#include "X11/copyright.h" X X/* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X X/* X * MODIFICATION HISTORY X * X * 000 -- M. Gancarz, DEC Ultrix Engineering Group X * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, X * Western Software Lab. Port to X11. X */ X X#ifndef lint static char *sccsid = "%W% %G%"; X#endif X X#include "awm.h" X Boolean NewIconify(window, mask, button, x, y) Window window; /* Event window. */ int mask; /* Button/key mask. */ int button; /* Button event detail. */ int x, y; /* Event mouse position. */ X{ X XWindowAttributes fromInfo; /* from window info. */ X XWindowAttributes toInfo; /* to window info. */ X Window from, to; X char *name; /* Event window name. */ X int mse_x, mse_y; /* Mouse X and Y coordinates. */ X int new_x, new_y; /* To U. L. X and Y coordinates. */ X int new_w, new_h; /* To width and height. */ X int bdw; /* border width */ X int prev_x; /* Previous event window X location. */ X int prev_y; /* Previous event window Y location. */ X int cur_x; /* Current event window X location. */ X int cur_y; /* Current event window Y location. */ X int root_x; /* Root window X location. */ X int root_y; /* Root window Y location. */ X int ulx, uly; /* Event window upper left X and Y. */ X int lrx, lry; /* Event window lower right X and Y. */ X int init_ulx, init_uly; /* Init window upper left X and Y. */ X int init_lrx, init_lry; /* Init window lower right X and Y. */ X int num_vectors; /* Number of vectors in box. */ X int status; /* Routine call return status. */ X int ptrmask; /* pointer query state. */ X Window root; /* Mouse root window. */ X Window icon; /* Icon window. */ X Window sub_win; /* Mouse position sub-window. */ X XEvent button_event; /* Button event packet. */ X XSegment box[MAX_BOX_VECTORS]; /* Box vertex buffer. */ X XSegment zap[MAX_ZAP_VECTORS]; /* Zap effect vertex buffer. */ X int (*storegrid_func)(); /* Function to use for grid */ X int (*storebox_func)(); /* Function to use for box */ X Boolean iconifying; /* Are we iconifying? */ X AwmInfoPtr awi; X X Entry("NewIconify") X X /* X * Do not lower or iconify the root window. X */ X if (window == RootWindow(dpy, scr)) X Leave(FALSE) X X /* X * Change the cursor to the icon cursor. X */ X grab_pointer(); X X /* X * Clear the vector buffers. X */ X bzero(box, sizeof(box)); X if (Zap) X bzero(zap, sizeof(zap)); X X /* X * Get info on the event window. X */ X awi = GetAwmInfo(window); X if (!awi) X Leave(FALSE) X /* X * Are we iconifying or de-iconifying? X */ X if (awi->state == ICON) { X from = awi->icon; X to = (awi->frame) ? awi->frame : awi->client; X } X else if (awi->state == WINDOW) { X from = (awi->frame) ? awi->frame : awi->client; X to = (awi->icon) ? awi->icon : MakeIcon(window, x, y, FALSE); X } X else { X fprintf(stderr, "NewIconify: Window %x has unknown state '%x'\n", X awi->client, awi->state); X Leave(FALSE) X } X status = XGetWindowAttributes(dpy, from, &fromInfo); X if (status == FAILURE) X Leave(FALSE) X X status = XGetWindowAttributes(dpy, to, &toInfo); X if (status == FAILURE) X Leave(FALSE) X X /* X * Initialize the movement variables. X */ X init_ulx = ulx = x - (toInfo.width >> 1) - toInfo.border_width; X init_uly = uly = y - (toInfo.height >> 1) - toInfo.border_width; X init_lrx = lrx = x + (toInfo.width >> 1) + toInfo.border_width - 1; X init_lry = lry = y + (toInfo.height >> 1) + toInfo.border_width - 1; X prev_x = x; X prev_y = y; X X if (awi->frame && awi->state == ICON) { X storegrid_func = StoreTitleGridBox; X storebox_func = StoreTitleBox; X } X else { X storegrid_func = StoreGridBox; X storebox_func = StoreBox; X } X X /* X * Store the box. X */ X if (Grid) X num_vectors = storegrid_func(box, ulx, uly, lrx, lry); X else X num_vectors = storebox_func(box, ulx, uly, lrx, lry); X X /* X * Freeze the server, if requested by the user. X * This results in a solid box instead of a flickering one. X */ X if (Freeze) X XGrabServer(dpy); X X /* X * Process any outstanding events before drawing the box. X */ X while (QLength(dpy) > 0) { X XPeekEvent(dpy, &button_event); X if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr)) X break; X GetButton(&button_event); X } X X /* X * Draw the box. X */ X DrawBox(); X if (Freeze) X Frozen = window; X X /* X * We spin our wheels here looking for mouse movement or a change X * in the status of the buttons. X */ X Snatched = TRUE; X while (TRUE) { X X /* X * Check to see if we have a change in mouse button status. X * This is how we get out of this "while" loop. X */ X if (XPending(dpy) && !ProcessRequests(box, num_vectors) && X GetButton(&button_event)) { X /* X * Process the pending events, this sequence is the only X * way out of the loop and the routine. X */ X X if ((button_event.type != ButtonPress) && X (button_event.type != ButtonRelease)) { X continue; /* spurious menu event... */ X } X X /* X * If we froze the server, then erase the last lines drawn. X */ X if (Freeze) { X DrawBox(); X Frozen = (Window)0; X XUngrabServer(dpy); X } X X /* X * Save the mouse cursor location. X */ X if (button_event.type == ButtonPress || X button_event.type == ButtonRelease) { X mse_x = ((XButtonEvent *)&button_event)->x; X mse_y = ((XButtonEvent *)&button_event)->y; X break; X } X } X else { X /* X * Continue to track the mouse until we get a change X * in button status. X */ X XQueryPointer(dpy, RootWindow(dpy, scr), X &root, &sub_win, &root_x, &root_y, &cur_x, X &cur_y, &ptrmask); X X /* X * If the mouse has moved, then make sure the box follows it. X */ X if ((cur_x != prev_x) || (cur_y != prev_y)) { X X /* X * If we've frozen the server, then erase the old box first! X */ X if (Freeze) X DrawBox(); X X /* X * Set the new box position. X */ X ulx += cur_x - prev_x; X uly += cur_y - prev_y; X lrx += cur_x - prev_x; X lry += cur_y - prev_y; X X /* X * Calculate the vectors for the new box. X */ X X if (Grid) X num_vectors = storegrid_func(box, ulx, uly, lrx, X lry); X else X num_vectors = storebox_func(box, ulx, uly, lrx, lry); X X /* X * Draw the new box. X */ X if (Freeze) X DrawBox(); X } X X /* X * Save the old box position. X */ X prev_x = cur_x; X prev_y = cur_y; X X /* X * If server is not frozen, then draw the "flicker" box. X */ X if (!Freeze) { X DrawBox(); X DrawBox(); X } X } X } X Snatched = FALSE; X /* X * If the button is not a button release of the same button pressed, X * then abort the operation. X */ X if ((button_event.type != ButtonRelease) || X (((XButtonReleasedEvent *)&button_event)->button != button)) { X ResetCursor(button); X ungrab_pointer(); X Leave(TRUE) X } X X /* X * If we are here we have committed to iconifying/deiconifying. X */ X X /* X * Determine the coordinates of the icon or window; X * normalize the window or icon coordinates if the user so desires. X */ X new_w = toInfo.width; X new_h = toInfo.height; X bdw = toInfo.border_width; X new_x = mse_x - (new_w >> 1) - bdw; X new_y = mse_y - (new_h >> 1) - bdw; X if ((NIcon && awi->state == WINDOW) || (NWindow && awi->state == ICON)) { X if (new_x < 0) new_x = 0; X if (new_y < 0) new_y = 0; X if ((new_x - 1 + new_w + (bdw << 1)) > ScreenWidth) { X new_x = ScreenWidth - new_w - (bdw << 1) + 1; X } X if ((new_y - 1 + new_h + (bdw << 1)) > ScreenHeight) { X new_y = ScreenHeight - new_h - (bdw << 1) + 1; X } X } X if (awi->state == ICON) { X awi->state = WINDOW; X awi->placed = TRUE; X if (!awi->title) X XRemoveFromSaveSet(dpy, awi->client); X } X else if (awi->state == WINDOW) { X awi->state = ICON; X XAddToSaveSet(dpy, awi->client); X } X else X fprintf(stderr, "NewIconify: Window state got trashed!\n"); X X /* X * Move the window into place. X */ X XMoveWindow(dpy, to, new_x, new_y); X X /* X * Map the icon window. X */ X XMapRaised(dpy, to); X if (Zap) { X num_vectors = StoreZap(zap, X fromInfo.x, X fromInfo.y, X fromInfo.x + fromInfo.width X + (fromInfo.border_width << 1), X fromInfo.y + fromInfo.height X + (fromInfo.border_width << 1), X ulx, uly, lrx, lry); X DrawZap(); X DrawZap(); X } X /* X * Unmap the event window. X */ X XUnmapWindow(dpy, from); X XFlush(dpy); X ungrab_pointer(); X Leave(TRUE) X} END_OF_FILE if test 10332 -ne `wc -c <'NewIconify.c'`; then echo shar: \"'NewIconify.c'\" unpacked with wrong size! fi # end of 'NewIconify.c' fi echo shar: End of archive 3 \(of 8\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0