toml@marvin.Solbourne.COM (Tom LaStrange) (08/30/90)
Submitted-by: toml@marvin.Solbourne.COM (Tom LaStrange) Posting-number: Volume 9, Issue 7 Archive-name: tvtwm/part06 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting test in a file # 3. Execute the file with /bin/sh (not csh) to create the files: # #screen.h #ssetroot.c #twm.c #twm.h # # Created by toml () on Wed Aug 29 08:43:36 MDT 1990 # if test -f 'screen.h' then echo shar: will not over-write existing file "screen.h" else echo extracting "screen.h" sed 's/^X//' >screen.h <<'SHAR_EOF' X/* X * Copyright 1989 Massachusetts Institute of Technology X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, provided X * that the above copyright notice appear in all copies and that both that X * copyright notice and this permission notice appear in supporting X * documentation, and that the name of M.I.T. not be used in advertising X * or publicity pertaining to distribution of the software without specific, X * written prior permission. M.I.T. makes no representations about the X * suitability of this software for any purpose. It is provided "as is" X * without express or implied warranty. X * X * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. X * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES X * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION X * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN X * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X */ X X/*********************************************************************** X * X * $XConsortium: screen.h,v 1.61 90/03/15 14:23:04 jim Exp $ X * X * twm per-screen data include file X * X * 11-3-88 Dave Payne, Apple Computer File created X * X ***********************************************************************/ X X#ifndef _SCREEN_ X#define _SCREEN_ X X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/cursorfont.h> X#include "list.h" X#include "menus.h" X#include "iconmgr.h" X Xtypedef struct _StdCmap { X struct _StdCmap *next; /* next link in chain */ X Atom atom; /* property from which this came */ X int nmaps; /* number of maps below */ X XStandardColormap *maps; /* the actual maps */ X} StdCmap; X X#define SIZE_HINDENT 10 X#define SIZE_VINDENT 2 X Xtypedef struct _TitlebarPixmaps { X Pixmap xlogo; X Pixmap resize; X Pixmap question; X Pixmap menu; X} TitlebarPixmaps; X Xtypedef struct ScreenInfo X{ X int screen; /* the default screen */ X int d_depth; /* copy of DefaultDepth(dpy, screen) */ X Visual *d_visual; /* copy of DefaultVisual(dpy, screen) */ X int Monochrome; /* is the display monochrome ? */ X int MyDisplayWidth; /* my copy of DisplayWidth(dpy, screen) */ X int MyDisplayHeight; /* my copy of DisplayHeight(dpy, screen) */ X int MaxWindowWidth; /* largest window to allow */ X int MaxWindowHeight; /* ditto */ X X TwmWindow TwmRoot; /* the head of the twm window list */ X X Window Root; /* the root window */ X Window SizeWindow; /* the resize dimensions window */ X Window InfoWindow; /* the information window */ X Window VirtualDesktop; /* the virtual root window */ X Window Panner; /* the panner window */ X int vdtWidth; /* width of the virtual desktop */ X int vdtHeight; /* height of the virtual desktop */ X int vdtPositionX; /* where the virtual desktop is currently positioned */ X int vdtPositionY; /* where the virtual desktop is currently positioned */ X X name_list *Icons; /* list of icon pixmaps */ X TitlebarPixmaps tbpm; /* titlebar pixmaps */ X Pixmap UnknownPm; /* the unknown icon pixmap */ X Pixmap siconifyPm; /* the icon manager iconify pixmap */ X Pixmap pullPm; /* pull right menu arrow */ X Pixmap hilitePm; /* focus highlight window background */ X Pixmap rootWeave; /* root weave pixmap */ X int hilite_pm_width, hilite_pm_height; /* cache the size */ X X MenuRoot *MenuList; /* head of the menu list */ X MenuRoot *LastMenu; /* the last menu (mostly unused?) */ X MenuRoot *Windows; /* the TwmWindows menu */ X X TwmWindow *Ring; /* one of the windows in window ring */ X TwmWindow *RingLeader; /* current winodw in ring */ X X MouseButton Mouse[MAX_BUTTONS+1][NUM_CONTEXTS][MOD_SIZE]; X MouseButton DefaultFunction; X MouseButton WindowFunction; X X struct { X Colormaps *cmaps; /* current list of colormap windows */ X int maxCmaps; /* maximum number of installed colormaps */ X unsigned long first_req; /* seq # for first XInstallColormap() req in X pass thru loading a colortable list */ X int root_pushes; /* current push level to install root X colormap windows */ X TwmWindow *pushed_window; /* saved window to install when pushes drops X to zero */ X } cmapInfo; X X struct { X StdCmap *head, *tail; /* list of maps */ X StdCmap *mru; /* most recently used in list */ X int mruindex; /* index of mru in entry */ X } StdCmapInfo; X X struct { X int nleft, nright; /* numbers of buttons in list */ X TitleButton *head; /* start of list */ X int border; /* button border */ X int pad; /* button-padding */ X int width; /* width of single button & border */ X int leftx; /* start of left buttons */ X int titlex; /* start of title string */ X int rightoff; /* offset back from right edge */ X } TBInfo; X ColorPair BorderTileC; /* border tile colors */ X ColorPair TitleC; /* titlebar colors */ X ColorPair MenuC; /* menu colors */ X ColorPair MenuTitleC; /* menu title colors */ X ColorPair IconC; /* icon colors */ X ColorPair IconManagerC; /* icon manager colors */ X ColorPair DefaultC; /* default colors */ X ColorPair vdtC; /* virtual desktop colors */ X ColorPair PannerC; /* Panner colors */ X Pixel BorderColor; /* color of window borders */ X Pixel MenuShadowColor; /* menu shadow color */ X Pixel IconBorderColor; /* icon border color */ X Pixel IconManagerHighlight; /* icon manager highlight */ X X Cursor TitleCursor; /* title bar cursor */ X Cursor FrameCursor; /* frame cursor */ X Cursor IconCursor; /* icon cursor */ X Cursor IconMgrCursor; /* icon manager cursor */ X Cursor ButtonCursor; /* title bar button cursor */ X Cursor MoveCursor; /* move cursor */ X Cursor ResizeCursor; /* resize cursor */ X Cursor WaitCursor; /* wait a while cursor */ X Cursor MenuCursor; /* menu cursor */ X Cursor SelectCursor; /* dot cursor for f.move, etc. from menus */ X Cursor DestroyCursor; /* skull and cross bones, f.destroy */ X X name_list *BorderColorL; X name_list *IconBorderColorL; X name_list *BorderTileForegroundL; X name_list *BorderTileBackgroundL; X name_list *TitleForegroundL; X name_list *TitleBackgroundL; X name_list *IconForegroundL; X name_list *IconBackgroundL; X name_list *IconManagerFL; X name_list *IconManagerBL; X name_list *IconMgrs; X name_list *NoTitle; /* list of window names with no title bar */ X name_list *MakeTitle; /* list of window names with title bar */ X name_list *AutoRaise; /* list of window names to auto-raise */ X name_list *IconNames; /* list of window names and icon names */ X name_list *NoHighlight; /* list of windows to not highlight */ X name_list *NoStackModeL; /* windows to ignore stack mode requests */ X name_list *NoTitleHighlight;/* list of windows to not highlight the TB*/ X name_list *DontIconify; /* don't iconify by unmapping */ X name_list *IconMgrNoShow; /* don't show in the icon manager */ X name_list *IconMgrShow; /* show in the icon manager */ X name_list *IconifyByUn; /* windows to iconify by unmapping */ X name_list *StartIconified; /* windows to start iconic */ X name_list *IconManagerHighlightL; /* icon manager highlight colors */ X name_list *SqueezeTitleL; /* windows of which to squeeze title */ X name_list *DontSqueezeTitleL; /* windows of which not to squeeze */ X name_list *WindowRingL; /* windows in ring */ X name_list *WarpCursorL; /* windows to warp cursor to on deiconify */ X name_list *StickyL; /* windows that should be sticky */ X X GC NormalGC; /* normal GC for everything */ X GC MenuGC; /* gc for menus */ X GC DrawGC; /* GC to draw lines for move and resize */ X GC PannerGC; /* GC for the panner outline */ X X unsigned long Black; X unsigned long White; X unsigned long XORvalue; /* number to use when drawing xor'ed */ X MyFont TitleBarFont; /* title bar font structure */ X MyFont MenuFont; /* menu font structure */ X MyFont IconFont; /* icon font structure */ X MyFont SizeFont; /* resize font structure */ X MyFont IconManagerFont; /* window list font structure */ X MyFont DefaultFont; X IconMgr iconmgr; /* default icon manager */ X struct IconRegion *FirstRegion; /* pointer to icon regions */ X struct IconRegion *LastRegion; /* pointer to the last icon region */ X char *IconDirectory; /* icon directory to search */ X int SizeStringOffset; /* x offset in size window for drawing */ X int SizeStringWidth; /* minimum width of size window */ X int BorderWidth; /* border width of twm windows */ X int IconBorderWidth; /* border width of icon windows */ X int UnknownWidth; /* width of the unknown icon */ X int UnknownHeight; /* height of the unknown icon */ X int TitleHeight; /* height of the title bar window */ X TwmWindow *Focus; /* the twm window that has focus */ X int EntryHeight; /* menu entry height */ X int FramePadding; /* distance between decorations and border */ X int TitlePadding; /* distance between items in titlebar */ X int ButtonIndent; /* amount to shrink buttons on each side */ X int NumAutoRaises; /* number of autoraise windows on screen */ X short NoDefaults; /* do not add in default UI stuff */ X short UsePPosition; /* what do with PPosition, see values below */ X short AutoRelativeResize; /* start resize relative to position in quad */ X short FocusRoot; /* is the input focus on the root ? */ X short WarpCursor; /* warp cursor on de-iconify ? */ X short ForceIcon; /* force the icon to the user specified */ X short NoGrabServer; /* don't do server grabs */ X short NoRaiseMove; /* don't raise window following move */ X short NoRaiseResize; /* don't raise window following resize */ X short NoRaiseDeicon; /* don't raise window on deiconify */ X short NoRaiseWarp; /* don't raise window on warp */ X short DontMoveOff; /* don't allow windows to be moved off */ X short DoZoom; /* zoom in and out of icons */ X short TitleFocus; /* focus on window in title bar ? */ X short NoTitlebar; /* put title bars on windows */ X short DecorateTransients; /* put title bars on transients */ X short IconifyByUnmapping; /* simply unmap windows when iconifying */ X short ShowIconManager; /* display the window list */ X short IconManagerDontShow; /* show nothing in the icon manager */ X short BackingStore; /* use backing store for menus */ X short SaveUnder; /* use save under's for menus */ X short RandomPlacement; /* randomly place windows that no give hints */ X short OpaqueMove; /* move the window rather than outline */ X short Highlight; /* should we highlight the window borders */ X short StackMode; /* should we honor stack mode requests */ X short TitleHighlight; /* should we highlight the titlebar */ X short MoveDelta; /* number of pixels before f.move starts */ X short ZoomCount; /* zoom outline count */ X short SortIconMgr; /* sort entries in the icon manager */ X short Shadow; /* show the menu shadow */ X short InterpolateMenuColors;/* make pretty menus */ X short NoIconManagers; /* Don't create any icon managers */ X short ClientBorderWidth; /* respect client window border width */ X short SqueezeTitle; /* make title as small as possible */ X short HaveFonts; /* set if fonts have been loaded */ X short FirstTime; /* first time we've read .twmrc */ X short CaseSensitive; /* be case-sensitive when sorting names */ X short WarpUnmapped; /* allow warping to unmapped windows */ X short PannerState; /* the initial state of the panner */ X short PannerScale; /* scale of the panner */ X char *PannerGeometry; /* geometry of the panner */ X int PannerOutlineWidth; X int PannerOutlineHeight; X int PannerOutlineX; X int PannerOutlineY; X int PannerWidth; X int PannerHeight; X short vdtBackgroundSet; /* vdt background color has been set */ X char *vdtPixmap; /* vdt pixmap */ X short PannerBackgroundSet; /* background of panner is set */ X char *PannerPixmap; /* Panner pixmap */ X X FuncKey FuncKeyRoot; X} ScreenInfo; X Xextern int MultiScreen; Xextern int NumScreens; Xextern ScreenInfo **ScreenList; Xextern ScreenInfo *Scr; Xextern int FirstScreen; X X#define PPOS_OFF 0 X#define PPOS_ON 1 X#define PPOS_NON_ZERO 2 X/* may eventually want an option for having the PPosition be the initial X location for the drag lines */ X X#endif /* _SCREEN_ */ SHAR_EOF if test 12618 -ne "`wc -c < screen.h`" then echo shar: error transmitting "screen.h" '(should have been 12618 characters)' fi fi if test -f 'ssetroot.c' then echo shar: will not over-write existing file "ssetroot.c" else echo extracting "ssetroot.c" sed 's/^X//' >ssetroot.c <<'SHAR_EOF' X/* Copyright 1987, Massachusetts Institute of Technology */ X X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/Xatom.h> X#include <stdio.h> X#include "X11/bitmaps/gray" X#include "X11/bitmaps/root_weave" X X/* X * xsetroot.c MIT Project Athena, X Window system root window X * parameter setting utility. This program will set X * various parameters of the X root window. X * X * Modified: Tom LaStrange, Solbourne Computer 9/28/89 X * Changed to work with swm virtual root and "proper" X * colormap. X * X * Author: Mark Lillibridge, MIT Project Athena X * 11-Jun-87 X */ X Xchar *index(); X X#define Dynamic 1 X XAtom __SWM_VROOT = None; Xchar *program_name; XDisplay *dpy; XColormap colormap; Xint screen; XWindow root; Xchar *fore_color = NULL; Xchar *back_color = NULL; Xint reverse = 0; Xint save_colors = 0; Xint unsave_past = 0; XPixmap save_pixmap = (Pixmap)None; X Xusage() X{ X fprintf(stderr, "usage: %s [options]\n", program_name); X fprintf(stderr, " where options are:\n"); X fprintf(stderr, " -display <display> or -d <display>\n"); X fprintf(stderr, " -fg <color> or -foreground <color>\n"); X fprintf(stderr, " -bg <color> or -background <color>\n"); X fprintf(stderr, " -rv or -reverse\n"); X fprintf(stderr, " -help\n"); X fprintf(stderr, " -def or -default\n"); X fprintf(stderr, " -name <string>\n"); X fprintf(stderr, " -cursor <cursor file> <mask file>\n"); X fprintf(stderr, " -solid <color>\n"); X fprintf(stderr, " -gray or -grey\n"); X fprintf(stderr, " -bitmap <filename>\n"); X fprintf(stderr, " -mod <x> <y>\n"); X exit(1); X /*NOTREACHED*/ X} X XPixmap MakeModulaBitmap(), ReadBitmapFile(); XXColor NameToXColor(); Xunsigned long NameToPixel(); X Xmain(argc, argv) X int argc; X char **argv; X{ X int excl = 0; X int nonexcl = 0; X int restore_defaults = 0; X char *display_name = NULL; X char *name = NULL; X char *cursor_file = NULL; X char *cursor_mask = NULL; X char *solid_color = NULL; X Cursor cursor; X int gray = 0; X char *bitmap_file = NULL; X int mod_x = 0; X int mod_y = 0; X register int i; X unsigned int ww, hh; X Pixmap bitmap; X Window rootReturn, parentReturn, *children; X unsigned int numChildren; X XWindowAttributes attr; X X program_name=argv[0]; X X for (i = 1; i < argc; i++) { X if (!strcmp ("-display", argv[i]) || !strcmp ("-d", argv[i])) { X if (++i>=argc) usage (); X display_name = argv[i]; X continue; X } X if (!strcmp("-help", argv[i])) { X usage(); X } X if (!strcmp("-def", argv[i]) || !strcmp("-default", argv[i])) { X restore_defaults = 1; X continue; X } X if (!strcmp("-name", argv[i])) { X if (++i>=argc) usage(); X name = argv[i]; X nonexcl++; X continue; X } X if (!strcmp("-cursor", argv[i])) { X if (++i>=argc) usage(); X cursor_file = argv[i]; X if (++i>=argc) usage(); X cursor_mask = argv[i]; X nonexcl++; X continue; X } X if (!strcmp("-fg",argv[i]) || !strcmp("-foreground",argv[i])) { X if (++i>=argc) usage(); X fore_color = argv[i]; X continue; X } X if (!strcmp("-bg",argv[i]) || !strcmp("-background",argv[i])) { X if (++i>=argc) usage(); X back_color = argv[i]; X continue; X } X if (!strcmp("-solid", argv[i])) { X if (++i>=argc) usage(); X solid_color = argv[i]; X excl++; X continue; X } X if (!strcmp("-gray", argv[i]) || !strcmp("-grey", argv[i])) { X gray = 1; X excl++; X continue; X } X if (!strcmp("-bitmap", argv[i])) { X if (++i>=argc) usage(); X bitmap_file = argv[i]; X excl++; X continue; X } X if (!strcmp("-mod", argv[i])) { X if (++i>=argc) usage(); X mod_x = atoi(argv[i]); X if (mod_x <= 0) mod_x = 1; X if (++i>=argc) usage(); X mod_y = atoi(argv[i]); X if (mod_y <= 0) mod_y = 1; X excl++; X continue; X } X if (!strcmp("-rv",argv[i]) || !strcmp("-reverse",argv[i])) { X reverse = 1; X continue; X } X usage(); X } X X /* Check for multiple use of exclusive options */ X if (excl > 1) { X fprintf(stderr, "%s: choose only one of {solid, gray, bitmap, mod}\n", X program_name); X usage(); X } X X dpy = XOpenDisplay(display_name); X if (!dpy) { X fprintf(stderr, "%s: unable to open display '%s'\n", X program_name, XDisplayName (display_name)); X usage (); X } X screen = DefaultScreen(dpy); X root = RootWindow(dpy, screen); X X /* use the colormap of the root window instead of DefaultColormap */ X XGetWindowAttributes(dpy, root, &attr); X colormap = attr.colormap; X X /* go look for a virtual root */ X __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False); X XQueryTree(dpy, root, &rootReturn, &parentReturn, &children, &numChildren); X for (i = 0; i < numChildren; i++) X { X Atom actual_type; X int actual_format; X long nitems, bytesafter; X Window *newRoot = NULL; X X if (XGetWindowProperty (dpy, children[i], __SWM_VROOT,0,1, X False, XA_WINDOW, &actual_type, &actual_format, &nitems, &bytesafter, X (unsigned char **) &newRoot) == Success && newRoot) X { X root = *newRoot; X break; X } X } X X /* If there are no arguments then restore defaults. */ X if (!excl && !nonexcl) X restore_defaults = 1; X X /* Handle a cursor file */ X if (cursor_file) { X cursor = CreateCursorFromFiles(cursor_file, cursor_mask); X XDefineCursor(dpy, root, cursor); X XFreeCursor(dpy, cursor); X } X X /* Handle -gray and -grey options */ X if (gray) { X bitmap = XCreateBitmapFromData(dpy, root, gray_bits, X gray_width, gray_height); X SetBackgroundToBitmap(bitmap, gray_width, gray_height); X } X X /* Handle -solid option */ X if (solid_color) { X XSetWindowBackground(dpy, root, NameToPixel(solid_color, X BlackPixel(dpy, screen))); X XClearWindow(dpy, root); X unsave_past = 1; X } X X /* Handle -bitmap option */ X if (bitmap_file) { X bitmap = ReadBitmapFile(bitmap_file, &ww, &hh, (int *)NULL, (int *)NULL); X SetBackgroundToBitmap(bitmap, ww, hh); X } X X /* Handle set background to a modula pattern */ X if (mod_x) { X bitmap = MakeModulaBitmap(mod_x, mod_y); X SetBackgroundToBitmap(bitmap, 16, 16); X } X X#ifdef NOT_ALLOWED X /* Handle set name */ X if (name) X XStoreName(dpy, root, name); X#endif NOT_ALLOWED X X /* Handle restore defaults */ X if (restore_defaults) { X if (root == RootWindow(dpy, screen)) { X if (!cursor_file) X XUndefineCursor(dpy, root); X if (!excl) { X XSetWindowBackgroundPixmap(dpy, root, (Pixmap) None); X XClearWindow(dpy, root); X unsave_past = 1; X } X } X else X { X if (!cursor_file) X XUndefineCursor(dpy, root); X if (!excl) { X bitmap = XCreateBitmapFromData(dpy, root, root_weave_bits, X root_weave_width, root_weave_height); X SetBackgroundToBitmap(bitmap, root_weave_width, root_weave_height); X unsave_past = 1; X } X } X } X X FixupState(); X XCloseDisplay(dpy); X exit (0); X} X X X/* Free past incarnation if needed, and retain state if needed. */ XFixupState() X{ X Atom prop, type; X int format; X unsigned long length, after; X unsigned char *data; X X if (!(DefaultVisual(dpy, screen)->class & Dynamic)) X unsave_past = 0; X if (!unsave_past && !save_colors) X return; X prop = XInternAtom(dpy, "_XSETROOT_ID", False); X if (unsave_past) { X (void)XGetWindowProperty(dpy, root, prop, 0L, 1L, True, AnyPropertyType, X &type, &format, &length, &after, &data); X if ((type == XA_PIXMAP) && (format == 32) && X (length == 1) && (after == 0)) X XKillClient(dpy, *((Pixmap *)data)); X else if (type != None) X fprintf(stderr, "%s: warning: _XSETROOT_ID property is garbage\n", X program_name); X } X if (save_colors) { X if (!save_pixmap) X save_pixmap = XCreatePixmap(dpy, root, 1, 1, 1); X XChangeProperty(dpy, root, prop, XA_PIXMAP, 32, PropModeReplace, X (unsigned char *) &save_pixmap, 1); X XSetCloseDownMode(dpy, RetainPermanent); X } X} X X/* X * SetBackgroundToBitmap: Set the root window background to a caller supplied X * bitmap. X */ XSetBackgroundToBitmap(bitmap, width, height) X Pixmap bitmap; X unsigned int width, height; X{ X Pixmap pix; X GC gc; X XGCValues gc_init; X X gc_init.foreground = NameToPixel(fore_color, BlackPixel(dpy, screen)); X gc_init.background = NameToPixel(back_color, WhitePixel(dpy, screen)); X if (reverse) { X unsigned long temp=gc_init.foreground; X gc_init.foreground=gc_init.background; X gc_init.background=temp; X } X gc = XCreateGC(dpy, root, GCForeground|GCBackground, &gc_init); X pix = XCreatePixmap(dpy, root, width, height, X (unsigned int)DefaultDepth(dpy, screen)); X XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, (unsigned long)1); X XSetWindowBackgroundPixmap(dpy, root, pix); X XFreeGC(dpy, gc); X XFreePixmap(dpy, bitmap); X if (save_colors) X save_pixmap = pix; X else X XFreePixmap(dpy, pix); X XClearWindow(dpy, root); X unsave_past = 1; X} X X X/* X * CreateCursorFromFiles: make a cursor of the right colors from two bitmap X * files. X */ X#define BITMAP_HOT_DEFAULT 8 X XCreateCursorFromFiles(cursor_file, mask_file) X char *cursor_file, *mask_file; X{ X Pixmap cursor_bitmap, mask_bitmap; X unsigned int width, height, ww, hh; X int x_hot, y_hot; X Cursor cursor; X XColor fg, bg, temp; X X fg = NameToXColor(fore_color, BlackPixel(dpy, screen)); X bg = NameToXColor(back_color, WhitePixel(dpy, screen)); X if (reverse) { X temp = fg; fg = bg; bg = temp; X } X X cursor_bitmap = ReadBitmapFile(cursor_file, &width, &height, &x_hot, &y_hot); X mask_bitmap = ReadBitmapFile(mask_file, &ww, &hh, (int *)NULL, (int *)NULL); X X if (width != ww || height != hh) { X fprintf(stderr, X"%s: dimensions of cursor bitmap and cursor mask bitmap are different\n", X program_name); X exit(1); X /*NOTREACHED*/ X } X X if ((x_hot == -1) && (y_hot == -1)) { X x_hot = BITMAP_HOT_DEFAULT; X y_hot = BITMAP_HOT_DEFAULT; X } X if ((x_hot < 0) || (x_hot >= width) || X (y_hot < 0) || (y_hot >= height)) { X fprintf(stderr, "%s: hotspot is outside cursor bounds\n", program_name); X exit(1); X /*NOTREACHED*/ X } X X cursor = XCreatePixmapCursor(dpy, cursor_bitmap, mask_bitmap, &fg, &bg, X (unsigned int)x_hot, (unsigned int)y_hot); X XFreePixmap(dpy, cursor_bitmap); X XFreePixmap(dpy, mask_bitmap); X X return(cursor); X} X X X/* X * MakeModulaBitmap: Returns a modula bitmap based on an x & y mod. X */ XPixmap MakeModulaBitmap(mod_x, mod_y) X int mod_x, mod_y; X{ X int i; X long pattern_line = 0; X char modula_data[16*16/8]; X X for (i=0; i<16; i++) { X pattern_line <<=1; X if ((i % mod_x) == 0) pattern_line |= 0x0001; X } X for (i=0; i<16; i++) { X if ((i % mod_y) == 0) { X modula_data[i*2] = 0xff; X modula_data[i*2+1] = 0xff; X } else { X modula_data[i*2] = pattern_line & 0xff; X modula_data[i*2+1] = (pattern_line>>8) & 0xff; X } X } X X return(XCreateBitmapFromData(dpy, root, modula_data, 16, 16)); X} X X X/* X * NameToXColor: Convert the name of a color to its Xcolor value. X */ XXColor NameToXColor(name, pixel) X char *name; X unsigned long pixel; X{ X XColor c; X X if (!name || !*name) { X c.pixel = pixel; X XQueryColor(dpy, colormap, &c); X } else if (!XParseColor(dpy, colormap, name, &c)) { X fprintf(stderr, "%s: unknown color or bad color format: %s\n", X program_name, name); X exit(1); X /*NOTREACHED*/ X } X return(c); X} X Xstatic Atom colormaps[] = { XXA_RGB_COLOR_MAP, XXA_RGB_BEST_MAP, XXA_RGB_BLUE_MAP, XXA_RGB_DEFAULT_MAP, XXA_RGB_GRAY_MAP, XXA_RGB_GREEN_MAP, XXA_RGB_RED_MAP }; X Xstatic int nummaps = sizeof(colormaps) / sizeof(Atom); X Xunsigned long NameToPixel(name, pixel) X char *name; X unsigned long pixel; X{ X static XStandardColormap last = {0,0,0,0,0,0,0,0}; X XColor ecolor; X X if (!name || !*name) X return pixel; X if (!XParseColor(dpy,colormap,name,&ecolor)) { X fprintf(stderr,"%s: unknown color \"%s\"\n",program_name,name); X exit(1); X /*NOTREACHED*/ X } X if (!XAllocColor(dpy, colormap,&ecolor)) X { X /* check to see if this is one of the standard colormaps */ X if (last.colormap != colormap) X { X int i; X for (i = 0; i < nummaps; i++) X { X if (XGetStandardColormap(dpy, RootWindow(dpy, screen), &last, colormaps[i])) X { X if (last.colormap == colormap) X break; X } X } X if (last.colormap != colormap) X last.colormap = 0; X } X if (last.colormap) X { X ecolor.pixel = last.base_pixel + X (unsigned long)((ecolor.red / 65535.0) * last.red_max + 0.5) * last.red_mult + X (unsigned long)((ecolor.green /65535.0) * last.green_max + 0.5)* last.green_mult + X (unsigned long)((ecolor.blue / 65535.0) * last.blue_max + 0.5)* last.blue_mult; X } X else X { X fprintf(stderr, "%s: unable to allocate color for \"%s\"\n", X program_name, name); X exit(1); X /*NOTREACHED*/ X } X } X if ((ecolor.pixel != BlackPixel(dpy, screen)) && X (ecolor.pixel != WhitePixel(dpy, screen)) && X (DefaultVisual(dpy, screen)->class & Dynamic)) X save_colors = 1; X return(ecolor.pixel); X} X XPixmap ReadBitmapFile(filename, width, height, x_hot, y_hot) X char *filename; X unsigned int *width, *height; X int *x_hot, *y_hot; X{ X Pixmap bitmap; X int status; X X status = XReadBitmapFile(dpy, root, filename, width, X height, &bitmap, x_hot, y_hot); X if (status == BitmapSuccess) X return(bitmap); X else if (status == BitmapOpenFailed) X fprintf(stderr, "%s: can't open file: %s\n", program_name, filename); X else if (status == BitmapFileInvalid) X fprintf(stderr, "%s: bad bitmap format file: %s\n", X program_name, filename); X else X fprintf(stderr, "%s: insufficient memory for bitmap: %s", X program_name, filename); X exit(1); X /*NOTREACHED*/ X} SHAR_EOF if test 13651 -ne "`wc -c < ssetroot.c`" then echo shar: error transmitting "ssetroot.c" '(should have been 13651 characters)' fi fi if test -f 'twm.c' then echo shar: will not over-write existing file "twm.c" else echo extracting "twm.c" sed 's/^X//' >twm.c <<'SHAR_EOF' X/*****************************************************************************/ X/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ X/** Salt Lake City, Utah **/ X/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ X/** Cambridge, Massachusetts **/ X/** **/ X/** All Rights Reserved **/ X/** **/ X/** Permission to use, copy, modify, and distribute this software and **/ X/** its documentation for any purpose and without fee is hereby **/ X/** granted, provided that the above copyright notice appear in all **/ X/** copies and that both that copyright notice and this permis- **/ X/** sion notice appear in supporting documentation, and that the **/ X/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ X/** in publicity pertaining to distribution of the software without **/ X/** specific, written prior permission. **/ X/** **/ X/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ X/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ X/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ X/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ X/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ X/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ X/** OR PERFORMANCE OF THIS SOFTWARE. **/ X/*****************************************************************************/ X X X/*********************************************************************** X * X * $XConsortium: twm.c,v 1.111 90/03/23 13:23:34 jim Exp $ X * X * twm - "Tom's Window Manager" X * X * 27-Oct-87 Thomas E. LaStrange File created X * X ***********************************************************************/ X X#if !defined(lint) && !defined(SABER) Xstatic char RCSinfo[] = X"$XConsortium: twm.c,v 1.111 90/03/23 13:23:34 jim Exp $"; X#endif X X#include <stdio.h> X#include <signal.h> X#include <fcntl.h> X#include "twm.h" X#include "add_window.h" X#include "gc.h" X#include "parse.h" X#include "version.h" X#include "menus.h" X#include "events.h" X#include "util.h" X#include "gram.h" X#include "screen.h" X#include "iconmgr.h" X#include <X11/Xproto.h> X#include <X11/bitmaps/root_weave> X#include "vdt.h" X XDisplay *dpy; /* which display are we talking to */ XWindow ResizeWindow; /* the window we are resizing */ X Xint MultiScreen = TRUE; /* try for more than one screen? */ Xint NumScreens; /* number of screens in ScreenList */ X#ifdef SHAPE Xint HasShape; /* server supports shape extension? */ Xint ShapeEventBase, ShapeErrorBase; X#endif XScreenInfo **ScreenList; /* structures for each screen */ XScreenInfo *Scr = NULL; /* the cur and prev screens */ Xint PreviousScreen; /* last screen that we were on */ Xint FirstScreen; /* TRUE ==> first screen of display */ XBool PrintErrorMessages = False; /* controls error messages */ Xstatic int RedirectError; /* TRUE ==> another window manager running */ Xstatic int CatchRedirectError(); /* for settting RedirectError */ Xstatic int TwmErrorHandler(); /* for everything else */ Xchar Info[INFO_LINES][INFO_SIZE]; /* info strings to print */ Xint InfoLines; Xchar *InitFile = NULL; X XCursor UpperLeftCursor; /* upper Left corner cursor */ XCursor RightButt; XCursor MiddleButt; XCursor LeftButt; X XXContext VirtualContext; /* context for virtual windows */ XXContext TwmContext; /* context for twm windows */ XXContext MenuContext; /* context for all menu windows */ XXContext IconManagerContext; /* context for all window list windows */ XXContext ScreenContext; /* context to get screen data */ XXContext ColormapContext; /* context for colormap operations */ X XXClassHint NoClass; /* for applications with no class */ X XXGCValues Gcv; X Xchar *Home; /* the HOME environment variable */ Xint HomeLen; /* length of Home */ Xint ParseError; /* error parsing the .twmrc file */ X Xint HandlingEvents = FALSE; /* are we handling events yet? */ X XWindow JunkRoot; /* junk window */ XWindow JunkChild; /* junk window */ Xint JunkX; /* junk variable */ Xint JunkY; /* junk variable */ Xunsigned int JunkWidth, JunkHeight, JunkBW, JunkDepth, JunkMask; X Xchar *ProgramName; Xint Argc; Xchar **Argv; Xchar **Environ; X XBool RestartPreviousState = False; /* try to restart in previous state */ X Xunsigned long black, white; X X/*********************************************************************** X * X * Procedure: X * main - start of twm X * X *********************************************************************** X */ X Xmain(argc, argv, environ) X int argc; X char **argv; X char **environ; X{ X Window root, parent, *children; X unsigned int nchildren; X int i, j; X char *display_name = NULL; X unsigned long valuemask; /* mask for create windows */ X XSetWindowAttributes attributes; /* attributes for create windows */ X SigProc old_handler; X int numManaged, firstscrn, lastscrn, scrnum; X extern ColormapWindow *CreateColormapWindow(); X X ProgramName = argv[0]; X Argc = argc; X Argv = argv; X Environ = environ; X X for (i = 1; i < argc; i++) { X if (argv[i][0] == '-') { X switch (argv[i][1]) { X case 'd': /* -display dpy */ X if (++i >= argc) goto usage; X display_name = argv[i]; X continue; X case 's': /* -single */ X MultiScreen = FALSE; X continue; X case 'f': /* -file twmrcfilename */ X if (++i >= argc) goto usage; X InitFile = argv[i]; X continue; X case 'v': /* -verbose */ X PrintErrorMessages = True; X continue; X case 'q': /* -quiet */ X PrintErrorMessages = False; X continue; X } X } X usage: X fprintf (stderr, X "usage: %s [-display dpy] [-f file] [-s] [-q] [-v]\n", X ProgramName); X exit (1); X } X X old_handler = signal(SIGINT, SIG_IGN); X if (old_handler != SIG_IGN) X signal(SIGINT, Done); X X old_handler = signal(SIGHUP, SIG_IGN); X if (old_handler != SIG_IGN) X signal(SIGHUP, Done); X X signal(SIGQUIT, Done); X signal(SIGTERM, Done); X X Home = getenv("HOME"); X if (Home == NULL) X Home = "./"; X X HomeLen = strlen(Home); X X NoClass.res_name = NoName; X NoClass.res_class = NoName; X X if (!(dpy = XOpenDisplay(display_name))) { X fprintf (stderr, "%s: unable to open display \"%s\"\n", X ProgramName, XDisplayName(display_name)); X exit (1); X } X X /* XSynchronize(dpy, True); /* */ X X if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1) { X fprintf (stderr, X "%s: unable to mark display connection as close-on-exec\n", X ProgramName); X exit (1); X } X X#ifdef SHAPE X HasShape = XShapeQueryExtension (dpy, &ShapeEventBase, &ShapeErrorBase); X#endif X VirtualContext = XUniqueContext(); X TwmContext = XUniqueContext(); X MenuContext = XUniqueContext(); X IconManagerContext = XUniqueContext(); X ScreenContext = XUniqueContext(); X ColormapContext = XUniqueContext(); X X InternUsefulAtoms (); X InitVirtualDesktop(); X X /* Set up the per-screen global information. */ X X NumScreens = ScreenCount(dpy); X X if (MultiScreen) X { X firstscrn = 0; X lastscrn = NumScreens - 1; X } X else X { X firstscrn = lastscrn = DefaultScreen(dpy); X } X X InfoLines = 0; X X /* for simplicity, always allocate NumScreens ScreenInfo struct pointers */ X ScreenList = (ScreenInfo **) calloc (NumScreens, sizeof (ScreenInfo *)); X numManaged = 0; X PreviousScreen = DefaultScreen(dpy); X FirstScreen = TRUE; X for (scrnum = firstscrn ; scrnum <= lastscrn; scrnum++) X { X RedirectError = FALSE; X XSetErrorHandler(CatchRedirectError); X XSelectInput(dpy, RootWindow (dpy, scrnum), X ColormapChangeMask | EnterWindowMask | PropertyChangeMask | X SubstructureRedirectMask | KeyPressMask | X ButtonPressMask | ButtonReleaseMask); X XSync(dpy, 0); X XSetErrorHandler(TwmErrorHandler); X X if (RedirectError) X { X fprintf (stderr, "%s: another window manager is already running", X ProgramName); X if (MultiScreen && NumScreens > 0) X fprintf(stderr, " on screen %d?\n", scrnum); X else X fprintf(stderr, "?\n"); X continue; X } X X numManaged ++; X X /* Note: ScreenInfo struct is calloc'ed to initialize to zero. */ X Scr = ScreenList[scrnum] = X (ScreenInfo *) calloc(1, sizeof(ScreenInfo)); X X /* initialize list pointers, remember to put an initialization X * in InitVariables also X */ X Scr->BorderColorL = NULL; X Scr->IconBorderColorL = NULL; X Scr->BorderTileForegroundL = NULL; X Scr->BorderTileBackgroundL = NULL; X Scr->TitleForegroundL = NULL; X Scr->TitleBackgroundL = NULL; X Scr->IconForegroundL = NULL; X Scr->IconBackgroundL = NULL; X Scr->NoTitle = NULL; X Scr->MakeTitle = NULL; X Scr->AutoRaise = NULL; X Scr->IconNames = NULL; X Scr->NoHighlight = NULL; X Scr->NoStackModeL = NULL; X Scr->NoTitleHighlight = NULL; X Scr->DontIconify = NULL; X Scr->IconMgrNoShow = NULL; X Scr->IconMgrShow = NULL; X Scr->IconifyByUn = NULL; X Scr->IconManagerFL = NULL; X Scr->IconManagerBL = NULL; X Scr->IconMgrs = NULL; X Scr->StartIconified = NULL; X Scr->SqueezeTitleL = NULL; X Scr->DontSqueezeTitleL = NULL; X Scr->WindowRingL = NULL; X Scr->WarpCursorL = NULL; X Scr->StickyL = NULL; X /* remember to put an initialization in InitVariables also X */ X X Scr->screen = scrnum; X Scr->d_depth = DefaultDepth(dpy, scrnum); X Scr->d_visual = DefaultVisual(dpy, scrnum); X Scr->Root = RootWindow(dpy, scrnum); X XSaveContext (dpy, Scr->Root, ScreenContext, (caddr_t) Scr); X Scr->VirtualDesktop = None; X Scr->Panner = None; X Scr->PannerScale = DEFAULT_PANNER_SCALE; X Scr->PannerState = NormalState; X Scr->PannerGeometry = DEFAULT_PANNER_GEOMETRY; X X Scr->TwmRoot.cmaps.number_cwins = 1; X Scr->TwmRoot.cmaps.cwins = X (ColormapWindow **) malloc(sizeof(ColormapWindow *)); X Scr->TwmRoot.cmaps.cwins[0] = X CreateColormapWindow(Scr->Root, True, False); X Scr->TwmRoot.cmaps.cwins[0]->visibility = VisibilityPartiallyObscured; X X Scr->cmapInfo.cmaps = NULL; X Scr->cmapInfo.maxCmaps = X MaxCmapsOfScreen(ScreenOfDisplay(dpy, Scr->screen)); X Scr->cmapInfo.root_pushes = 0; X InstallWindowColormaps(0, &Scr->TwmRoot); X X Scr->StdCmapInfo.head = Scr->StdCmapInfo.tail = X Scr->StdCmapInfo.mru = NULL; X Scr->StdCmapInfo.mruindex = 0; X LocateStandardColormaps(); X X Scr->TBInfo.nleft = Scr->TBInfo.nright = 0; X Scr->TBInfo.head = NULL; X Scr->TBInfo.border = 1; X Scr->TBInfo.width = 0; X Scr->TBInfo.leftx = 0; X Scr->TBInfo.titlex = 0; X X Scr->MyDisplayWidth = DisplayWidth(dpy, scrnum); X Scr->MyDisplayHeight = DisplayHeight(dpy, scrnum); X Scr->MaxWindowWidth = 32767 - Scr->MyDisplayWidth; X Scr->MaxWindowHeight = 32767 - Scr->MyDisplayHeight; X X Scr->XORvalue = (((unsigned long) 1) << Scr->d_depth) - 1; X X if (DisplayCells(dpy, scrnum) < 3) X Scr->Monochrome = MONOCHROME; X else X Scr->Monochrome = COLOR; X X /* setup default colors */ X Scr->FirstTime = TRUE; X GetColor(Scr->Monochrome, &black, "black"); X Scr->Black = black; X GetColor(Scr->Monochrome, &white, "white"); X Scr->White = white; X X if (FirstScreen) X { X SetFocus ((TwmWindow *)NULL); X X /* define cursors */ X X NewFontCursor(&UpperLeftCursor, "top_left_corner"); X NewFontCursor(&RightButt, "rightbutton"); X NewFontCursor(&LeftButt, "leftbutton"); X NewFontCursor(&MiddleButt, "middlebutton"); X } X X Scr->iconmgr.x = 0; X Scr->iconmgr.y = 0; X Scr->iconmgr.width = 150; X Scr->iconmgr.height = 5; X Scr->iconmgr.next = NULL; X Scr->iconmgr.prev = NULL; X Scr->iconmgr.lasti = &(Scr->iconmgr); X Scr->iconmgr.first = NULL; X Scr->iconmgr.last = NULL; X Scr->iconmgr.active = NULL; X Scr->iconmgr.scr = Scr; X Scr->iconmgr.columns = 1; X Scr->iconmgr.count = 0; X Scr->iconmgr.name = "TWM"; X Scr->iconmgr.icon_name = "Icons"; X X Scr->IconDirectory = NULL; X X Scr->siconifyPm = None; X Scr->pullPm = None; X Scr->hilitePm = None; X Scr->tbpm.xlogo = None; X Scr->tbpm.resize = None; X Scr->tbpm.question = None; X Scr->tbpm.menu = None; X X Scr->rootWeave = XCreatePixmapFromBitmapData(dpy, Scr->Root, X root_weave_bits, root_weave_width, root_weave_height, X Scr->Black, Scr->White, Scr->d_depth); X X InitVariables(); X InitMenus(); X X /* Parse it once for each screen. */ X ParseTwmrc(InitFile); X if (Scr->SqueezeTitle == -1) Scr->SqueezeTitle = FALSE; X if (!Scr->HaveFonts) CreateFonts(); X CreateGCs(); X MakeMenus(); X X Scr->TitleBarFont.y += Scr->FramePadding; X Scr->TitleHeight = Scr->TitleBarFont.height + Scr->FramePadding * 2; X /* make title height be odd so buttons look nice and centered */ X if (!(Scr->TitleHeight & 1)) Scr->TitleHeight++; X X InitTitlebarButtons (); /* menus are now loaded! */ X X XGrabServer(dpy); X XSync(dpy, 0); X X if (Scr->VirtualDesktop) { X MakeVirtualDesktop(Scr->vdtWidth, Scr->vdtHeight); X MakePanner(); X SetSWM_VERSION(); X XMapRaised(dpy, Scr->VirtualDesktop); X } X X JunkX = 0; X JunkY = 0; X X XQueryTree(dpy, Scr->Root, &root, &parent, &children, &nchildren); X CreateIconManagers(); X if (!Scr->NoIconManagers) X Scr->iconmgr.twm_win->icon = TRUE; X X /* X * weed out icon windows X */ X for (i = 0; i < nchildren; i++) { X if (children[i]) { X XWMHints *wmhintsp = XGetWMHints (dpy, children[i]); X X if (wmhintsp) { X if (wmhintsp->flags & IconWindowHint) { X for (j = 0; j < nchildren; j++) { X if (children[j] == wmhintsp->icon_window) { X children[j] = None; X break; X } X } X } X XFree ((char *) wmhintsp); X } X } X } X X /* X * map all of the non-override windows X */ X for (i = 0; i < nchildren; i++) X { X if (children[i] && MappedNotOverride(children[i])) X { X XUnmapWindow(dpy, children[i]); X SimulateMapRequest(children[i]); X } X } X X if (Scr->ShowIconManager && !Scr->NoIconManagers) X { X Scr->iconmgr.twm_win->icon = FALSE; X if (Scr->iconmgr.count) X { X SetMapStateProp (Scr->iconmgr.twm_win, NormalState); X MapFrame(Scr->iconmgr.twm_win); X } X } X X X attributes.border_pixel = Scr->DefaultC.fore; X attributes.background_pixel = Scr->DefaultC.back; X attributes.event_mask = (ExposureMask | X KeyPressMask | ButtonPressMask); X attributes.backing_store = NotUseful; X attributes.cursor = XCreateFontCursor (dpy, XC_hand2); X valuemask = (CWBorderPixel | CWBackPixel | CWEventMask | X CWBackingStore | CWCursor); X Scr->InfoWindow = XCreateWindow (dpy, Scr->Root, 0, 0, X (unsigned int) 5, (unsigned int) 5, X (unsigned int) BW, 0, X (unsigned int) CopyFromParent, X (Visual *) CopyFromParent, X valuemask, &attributes); X X Scr->SizeStringWidth = XTextWidth (Scr->SizeFont.font, X " 8888 x 8888 ", 13); X valuemask = (CWBorderPixel | CWBackPixel | CWBitGravity); X attributes.bit_gravity = NorthWestGravity; X Scr->SizeWindow = XCreateWindow (dpy, Scr->Root, 0, 0, X (unsigned int) Scr->SizeStringWidth, X (unsigned int) (Scr->SizeFont.height + X SIZE_VINDENT*2), X (unsigned int) BW, 0, X (unsigned int) CopyFromParent, X (Visual *) CopyFromParent, X valuemask, &attributes); X X XUngrabServer(dpy); X X FirstScreen = FALSE; X Scr->FirstTime = FALSE; X } /* for */ X X if (numManaged == 0) { X if (MultiScreen && NumScreens > 0) X fprintf (stderr, "%s: unable to find any unmanaged screens\n", X ProgramName); X exit (1); X } X X RestartPreviousState = False; X HandlingEvents = TRUE; X InitEvents(); X HandleEvents(); X} X X/*********************************************************************** X * X * Procedure: X * InitVariables - initialize twm variables X * X *********************************************************************** X */ X XInitVariables() X{ X FreeList(&Scr->BorderColorL); X FreeList(&Scr->IconBorderColorL); X FreeList(&Scr->BorderTileForegroundL); X FreeList(&Scr->BorderTileBackgroundL); X FreeList(&Scr->TitleForegroundL); X FreeList(&Scr->TitleBackgroundL); X FreeList(&Scr->IconForegroundL); X FreeList(&Scr->IconBackgroundL); X FreeList(&Scr->IconManagerFL); X FreeList(&Scr->IconManagerBL); X FreeList(&Scr->IconMgrs); X FreeList(&Scr->NoTitle); X FreeList(&Scr->MakeTitle); X FreeList(&Scr->AutoRaise); X FreeList(&Scr->IconNames); X FreeList(&Scr->NoHighlight); X FreeList(&Scr->NoStackModeL); X FreeList(&Scr->NoTitleHighlight); X FreeList(&Scr->DontIconify); X FreeList(&Scr->IconMgrNoShow); X FreeList(&Scr->IconMgrShow); X FreeList(&Scr->IconifyByUn); X FreeList(&Scr->StartIconified); X FreeList(&Scr->IconManagerHighlightL); X FreeList(&Scr->SqueezeTitleL); X FreeList(&Scr->DontSqueezeTitleL); X FreeList(&Scr->WindowRingL); X FreeList(&Scr->WarpCursorL); X FreeList(&Scr->StickyL); X X NewFontCursor(&Scr->FrameCursor, "top_left_arrow"); X NewFontCursor(&Scr->TitleCursor, "top_left_arrow"); X NewFontCursor(&Scr->IconCursor, "top_left_arrow"); X NewFontCursor(&Scr->IconMgrCursor, "top_left_arrow"); X NewFontCursor(&Scr->MoveCursor, "fleur"); X NewFontCursor(&Scr->ResizeCursor, "fleur"); X NewFontCursor(&Scr->MenuCursor, "sb_left_arrow"); X NewFontCursor(&Scr->ButtonCursor, "hand2"); X NewFontCursor(&Scr->WaitCursor, "watch"); X NewFontCursor(&Scr->SelectCursor, "dot"); X NewFontCursor(&Scr->DestroyCursor, "pirate"); X X Scr->Ring = NULL; X Scr->RingLeader = NULL; X X Scr->vdtC.fore = black; X Scr->vdtC.back = white; X Scr->PannerC.fore = black; X Scr->PannerC.back = white; X Scr->DefaultC.fore = black; X Scr->DefaultC.back = white; X Scr->BorderColor = black; X Scr->BorderTileC.fore = black; X Scr->BorderTileC.back = white; X Scr->TitleC.fore = black; X Scr->TitleC.back = white; X Scr->MenuC.fore = black; X Scr->MenuC.back = white; X Scr->MenuTitleC.fore = black; X Scr->MenuTitleC.back = white; X Scr->MenuShadowColor = black; X Scr->IconC.fore = black; X Scr->IconC.back = white; X Scr->IconBorderColor = black; X Scr->IconManagerC.fore = black; X Scr->IconManagerC.back = white; X Scr->IconManagerHighlight = black; X X Scr->FramePadding = 2; /* values that look "nice" on */ X Scr->TitlePadding = 8; /* 75 and 100dpi displays */ X Scr->ButtonIndent = 1; X Scr->SizeStringOffset = 0; X Scr->BorderWidth = BW; X Scr->IconBorderWidth = BW; X Scr->UnknownWidth = 0; X Scr->UnknownHeight = 0; X Scr->NumAutoRaises = 0; X Scr->NoDefaults = FALSE; X Scr->UsePPosition = PPOS_OFF; X Scr->FocusRoot = TRUE; X Scr->Focus = NULL; X Scr->WarpCursor = FALSE; X Scr->ForceIcon = FALSE; X Scr->NoGrabServer = FALSE; X Scr->NoRaiseMove = FALSE; X Scr->NoRaiseResize = FALSE; X Scr->NoRaiseDeicon = FALSE; X Scr->NoRaiseWarp = FALSE; X Scr->DontMoveOff = FALSE; X Scr->DoZoom = FALSE; X Scr->TitleFocus = TRUE; X Scr->NoTitlebar = FALSE; X Scr->DecorateTransients = FALSE; X Scr->IconifyByUnmapping = FALSE; X Scr->ShowIconManager = FALSE; X Scr->IconManagerDontShow =FALSE; X Scr->BackingStore = TRUE; X Scr->SaveUnder = TRUE; X Scr->RandomPlacement = FALSE; X Scr->OpaqueMove = FALSE; X Scr->Highlight = TRUE; X Scr->StackMode = TRUE; X Scr->TitleHighlight = TRUE; X Scr->MoveDelta = 0; X Scr->ZoomCount = 8; X Scr->SortIconMgr = FALSE; X Scr->Shadow = TRUE; X Scr->InterpolateMenuColors = FALSE; X Scr->NoIconManagers = FALSE; X Scr->ClientBorderWidth = FALSE; X Scr->SqueezeTitle = -1; X Scr->FirstRegion = NULL; X Scr->LastRegion = NULL; X Scr->FirstTime = TRUE; X Scr->HaveFonts = FALSE; /* i.e. not loaded yet */ X Scr->CaseSensitive = TRUE; X Scr->WarpUnmapped = FALSE; X X /* setup default fonts; overridden by defaults from system.twmrc */ X#define DEFAULT_NICE_FONT "variable" X#define DEFAULT_FAST_FONT "fixed" X X Scr->TitleBarFont.font = NULL; X Scr->TitleBarFont.name = DEFAULT_NICE_FONT; X Scr->MenuFont.font = NULL; X Scr->MenuFont.name = DEFAULT_NICE_FONT; X Scr->IconFont.font = NULL; X Scr->IconFont.name = DEFAULT_NICE_FONT; X Scr->SizeFont.font = NULL; X Scr->SizeFont.name = DEFAULT_FAST_FONT; X Scr->IconManagerFont.font = NULL; X Scr->IconManagerFont.name = DEFAULT_NICE_FONT; X Scr->DefaultFont.font = NULL; X Scr->DefaultFont.name = DEFAULT_FAST_FONT; X X} X X XCreateFonts () X{ X GetFont(&Scr->TitleBarFont); X GetFont(&Scr->MenuFont); X GetFont(&Scr->IconFont); X GetFont(&Scr->SizeFont); X GetFont(&Scr->IconManagerFont); X GetFont(&Scr->DefaultFont); X Scr->HaveFonts = TRUE; X} X X XRestoreWithdrawnLocation (tmp) X TwmWindow *tmp; X{ X int gravx, gravy; X unsigned int bw, mask; X XWindowChanges xwc; X X if (XGetGeometry (dpy, tmp->w, &JunkRoot, &xwc.x, &xwc.y, X &JunkWidth, &JunkHeight, &bw, &JunkDepth)) { X X GetGravityOffsets (tmp, &gravx, &gravy); X if (gravy < 0) xwc.y -= tmp->title_height; X X if (bw != tmp->old_bw) { X int xoff, yoff; X X if (!Scr->ClientBorderWidth) { X xoff = gravx; X yoff = gravy; X } else { X xoff = 0; X yoff = 0; X } X X xwc.x -= (xoff + 1) * tmp->old_bw; X xwc.y -= (yoff + 1) * tmp->old_bw; X } X if (!Scr->ClientBorderWidth) { X xwc.x += gravx * tmp->frame_bw; X xwc.y += gravy * tmp->frame_bw; X } X X mask = (CWX | CWY); X if (bw != tmp->old_bw) { X xwc.border_width = tmp->old_bw; X mask |= CWBorderWidth; X } X X XConfigureWindow (dpy, tmp->w, mask, &xwc); X X if (tmp->wmhints && (tmp->wmhints->flags & IconWindowHint)) { X XUnmapWindow (dpy, tmp->wmhints->icon_window); X } X X } X} X X X/*********************************************************************** X * X * Procedure: X * Done - cleanup and exit twm X * X * Returned Value: X * none X * X * Inputs: X * none X * X * Outputs: X * none X * X * Special Considerations: X * none X * X *********************************************************************** X */ X Xvoid Reborder () X{ X TwmWindow *tmp; /* temp twm window structure */ X int scrnum; X extern Atom XA_SWM_ROOT; X X /* put a border back around all windows */ X X XGrabServer (dpy); X for (scrnum = 0; scrnum < NumScreens; scrnum++) X { X if ((Scr = ScreenList[scrnum]) == NULL) X continue; X X RemoveSWM_VERSION(); X InstallWindowColormaps (0, &Scr->TwmRoot); /* force reinstall */ X for (tmp = Scr->TwmRoot.next; tmp != NULL; tmp = tmp->next) X { X RestoreWithdrawnLocation (tmp); X XDeleteProperty(dpy, tmp->w, XA_SWM_ROOT); X XMapWindow (dpy, tmp->w); X } X X /* cleanup all windows on the virtual root */ X if (Scr->VirtualDesktop) X { X Window root_return,parent_return,*children; X unsigned int num_children; X int i; X int x, y; X unsigned int width, height, bw, depth; X X XQueryTree(dpy, Scr->VirtualDesktop, &root_return,&parent_return, &children, &num_children); X X for (i = 0; i < num_children; i++) X { X XGetGeometry(dpy, children[i], &root_return, &x, &y, &width, &height, &bw, &depth); X XReparentWindow(dpy, children[i], Scr->Root, x, y); X XRemoveFromSaveSet(dpy, children[i]); X } X } X } X X XUngrabServer (dpy); X SetFocus ((TwmWindow*)NULL); X} X Xvoid Done() X{ X Reborder (); X XCloseDisplay(dpy); X exit(0); X} X X X/* X * Error Handlers. If a client dies, we'll get a BadWindow error (except for X * GetGeometry which returns BadDrawable) for most operations that we do before X * manipulating the client's window. X */ X XBool ErrorOccurred = False; XXErrorEvent LastErrorEvent; X Xstatic int TwmErrorHandler(dpy, event) X Display *dpy; X XErrorEvent *event; X{ X LastErrorEvent = *event; X ErrorOccurred = True; X X if (PrintErrorMessages && /* don't be too obnoxious */ X event->error_code != BadWindow && /* watch for dead puppies */ X (event->request_code != X_GetGeometry && /* of all styles */ X event->error_code != BadDrawable)) X XmuPrintDefaultErrorMessage (dpy, event, stderr); X return 0; X} X X X/* ARGSUSED*/ Xstatic int CatchRedirectError(dpy, event) X Display *dpy; X XErrorEvent *event; X{ X RedirectError = TRUE; X LastErrorEvent = *event; X ErrorOccurred = True; X return 0; X} X X XAtom _XA_WM_CHANGE_STATE; XAtom _XA_WM_STATE; XAtom _XA_WM_COLORMAP_WINDOWS; XAtom _XA_WM_PROTOCOLS; XAtom _XA_WM_TAKE_FOCUS; XAtom _XA_WM_SAVE_YOURSELF; XAtom _XA_WM_DELETE_WINDOW; XAtom _XA_TWM_FLAGS; X XInternUsefulAtoms () X{ X _XA_WM_CHANGE_STATE = XInternAtom (dpy, "WM_CHANGE_STATE", False); X _XA_WM_STATE = XInternAtom (dpy, "WM_STATE", False); X _XA_WM_COLORMAP_WINDOWS = XInternAtom (dpy, "WM_COLORMAP_WINDOWS", False); X _XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False); X _XA_WM_TAKE_FOCUS = XInternAtom (dpy, "WM_TAKE_FOCUS", False); X _XA_WM_SAVE_YOURSELF = XInternAtom (dpy, "WM_SAVE_YOURSELF", False); X _XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False); X _XA_TWM_FLAGS = XInternAtom (dpy, "_TWM_FLAGS", False); X} SHAR_EOF if test 25011 -ne "`wc -c < twm.c`" then echo shar: error transmitting "twm.c" '(should have been 25011 characters)' fi fi if test -f 'twm.h' then echo shar: will not over-write existing file "twm.h" else echo extracting "twm.h" sed 's/^X//' >twm.h <<'SHAR_EOF' X/*****************************************************************************/ X/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ X/** Salt Lake City, Utah **/ X/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ X/** Cambridge, Massachusetts **/ X/** **/ X/** All Rights Reserved **/ X/** **/ X/** Permission to use, copy, modify, and distribute this software and **/ X/** its documentation for any purpose and without fee is hereby **/ X/** granted, provided that the above copyright notice appear in all **/ X/** copies and that both that copyright notice and this permis- **/ X/** sion notice appear in supporting documentation, and that the **/ X/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ X/** in publicity pertaining to distribution of the software without **/ X/** specific, written prior permission. **/ X/** **/ X/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ X/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ X/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ X/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ X/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ X/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ X/** OR PERFORMANCE OF THIS SOFTWARE. **/ X/*****************************************************************************/ X X X/*********************************************************************** X * X * $XConsortium: twm.h,v 1.62 90/03/22 09:39:08 jim Exp $ X * X * twm include file X * X * 28-Oct-87 Thomas E. LaStrange File created X * X ***********************************************************************/ X X#ifndef _TWM_ X#define _TWM_ X X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/cursorfont.h> X#ifdef SHAPE X#include <X11/extensions/shape.h> X#endif X X#ifndef WithdrawnState X#define WithdrawnState 0 X#endif X Xtypedef unsigned long Pixel; X X#ifdef SIGNALRETURNSINT Xtypedef int (*SigProc)(); /* type of function returned by signal() */ X#else Xtypedef void (*SigProc)(); /* type of function returned by signal() */ X#endif X X X#define BW 2 /* border width */ X#define BW2 4 /* border width * 2 */ X X#ifndef TRUE X#define TRUE 1 X#define FALSE 0 X#endif X X#define NULLSTR ((char *) NULL) X X#define MAX_BUTTONS 5 /* max mouse buttons supported */ X X/* info stings defines */ X#define INFO_LINES 30 X#define INFO_SIZE 200 X X/* contexts for button presses */ X#define C_NO_CONTEXT -1 X#define C_WINDOW 0 X#define C_TITLE 1 X#define C_ICON 2 X#define C_ROOT 3 X#define C_FRAME 4 X#define C_ICONMGR 5 X#define C_NAME 6 X#define NUM_CONTEXTS 7 X X#define C_WINDOW_BIT (1 << C_WINDOW) X#define C_TITLE_BIT (1 << C_TITLE) X#define C_ICON_BIT (1 << C_ICON) X#define C_ROOT_BIT (1 << C_ROOT) X#define C_FRAME_BIT (1 << C_FRAME) X#define C_ICONMGR_BIT (1 << C_ICONMGR) X#define C_NAME_BIT (1 << C_NAME) X X#define C_ALL_BITS (C_WINDOW_BIT | C_TITLE_BIT | C_ICON_BIT |\ X C_ROOT_BIT | C_FRAME_BIT | C_ICONMGR_BIT) X X/* modifiers for button presses */ X#define MOD_SIZE ((ShiftMask | ControlMask | Mod1Mask) + 1) X X#define TITLE_BAR_SPACE 1 /* 2 pixel space bordering chars */ X#define TITLE_BAR_FONT_HEIGHT 15 /* max of 15 pixel high chars */ X#define TITLE_BAR_HEIGHT (TITLE_BAR_FONT_HEIGHT+(2*TITLE_BAR_SPACE)) X X/* defines for zooming/unzooming */ X#define ZOOM_NONE 0 X X#define FBF(fix_fore, fix_back, fix_font)\ X Gcv.foreground = fix_fore;\ X Gcv.background = fix_back;\ X Gcv.font = fix_font;\ X XChangeGC(dpy, Scr->NormalGC, GCFont|GCForeground|GCBackground,&Gcv) X X#define FB(fix_fore, fix_back)\ X Gcv.foreground = fix_fore;\ X Gcv.background = fix_back;\ X XChangeGC(dpy, Scr->NormalGC, GCForeground|GCBackground,&Gcv) X Xtypedef struct MyFont X{ X char *name; /* name of the font */ X XFontStruct *font; /* font structure */ X int height; /* height of the font */ X int y; /* Y coordinate to draw characters */ X} MyFont; X Xtypedef struct ColorPair X{ X Pixel fore, back; X} ColorPair; X Xtypedef struct _TitleButton { X struct _TitleButton *next; /* next link in chain */ X char *name; /* bitmap name in case of deferal */ X Pixmap bitmap; /* image to display in button */ X int srcx, srcy; /* from where to start copying */ X unsigned int width, height; /* size of pixmap */ X int dstx, dsty; /* to where to start copying */ X int func; /* function to execute */ X char *action; /* optional action arg */ X struct MenuRoot *menuroot; /* menu to pop on F_MENU */ X Bool rightside; /* t: on right, f: on left */ X} TitleButton; X Xtypedef struct _TBWindow { X Window window; /* which window in this frame */ X TitleButton *info; /* description of this window */ X} TBWindow; X Xtypedef struct _SqueezeInfo { X int justify; /* left, center, right */ X int num; /* signed pixel count or numerator */ X int denom; /* 0 for pix count or denominator */ X} SqueezeInfo; X X#define J_LEFT 1 X#define J_CENTER 2 X#define J_RIGHT 3 X X/* Colormap window entry for each window in WM_COLORMAP_WINDOWS X * ICCCM property. X */ Xtypedef struct TwmColormap X{ X Colormap c; /* Colormap id */ X int state; /* install(ability) state */ X unsigned long install_req; /* request number which installed it */ X Window w; /* window causing load of color table */ X int refcnt; X} TwmColormap; X X#define CM_INSTALLABLE 1 X#define CM_INSTALLED 2 X#define CM_INSTALL 4 X Xtypedef struct ColormapWindow X{ X Window w; /* Window id */ X TwmColormap *colormap; /* Colormap for this window */ X int visibility; /* Visibility of this window */ X int refcnt; X} ColormapWindow; X Xtypedef struct Colormaps X{ X ColormapWindow **cwins; /* current list of colormap windows */ X int number_cwins; /* number of elements in current list */ X char *scoreboard; /* conflicts between installable colortables */ X} Colormaps; X X#define ColormapsScoreboardLength(cm) ((cm)->number_cwins * \ X ((cm)->number_cwins - 1) / 2) X X/* Bit definitions for the _TWM_FLAGS property. This property X * will be used to store state information to be used if X * RestartPreviousState is set X */ X#define TWM_FLAGS_STICKY (1 << 0) X X/* for each window that is on the display, one of these structures X * is allocated and linked into a list X */ Xtypedef struct TwmWindow X{ X struct TwmWindow *next; /* next twm window */ X struct TwmWindow *prev; /* previous twm window */ X Window w; /* the child window */ X Window root; /* its idea of the root window */ X Window virtualWindow; /* small panner prepresentation */ X Window virtualIcon; /* small panner prepresentation */ X unsigned long flags; /* _TWM_FLAGS property value */ X int old_bw; /* border width before reparenting */ X Window frame; /* the frame window */ X Window title_w; /* the title bar window */ X Window hilite_w; /* the hilite window */ X Pixmap gray; X Window icon_w; /* the icon window */ X Window icon_bm_w; /* the icon bitmap window */ X int frame_x; /* x position of frame */ X int frame_y; /* y position of frame */ X int frame_width; /* width of frame */ X int frame_height; /* height of frame */ X int frame_bw; /* borderwidth of frame */ X int title_x; X int title_y; X int icon_loc_x; /* icon x coordinate */ X int icon_loc_y; /* icon y coordiante */ X int icon_x; /* icon text x coordinate */ X int icon_y; /* icon text y coordiante */ X int icon_w_width; /* width of the icon window */ X int icon_w_height; /* height of the icon window */ X int icon_width; /* width of the icon bitmap */ X int icon_height; /* height of the icon bitmap */ X int title_height; /* height of the title bar */ X int title_width; /* width of the title bar */ X char *full_name; /* full name of the window */ X char *name; /* name of the window */ X char *icon_name; /* name of the icon */ X int name_width; /* width of name text */ X int highlightx; /* start of highlight window */ X int rightx; /* start of right buttons */ X XWindowAttributes attr; /* the child window attributes */ X XSizeHints hints; /* normal hints */ X XWMHints *wmhints; /* WM hints */ X Window group; /* group ID */ X XClassHint class; X struct WList *list; X /*********************************************************************** X * color definitions per window X **********************************************************************/ X Pixel border; /* border color */ X Pixel icon_border; /* border color */ X ColorPair border_tile; X ColorPair title; X ColorPair iconc; X short iconified; /* has the window ever been iconified? */ X short icon; /* is the window an icon now ? */ X short icon_on; /* is the icon visible */ X short mapped; /* is the window mapped ? */ X short auto_raise; /* should we auto-raise this window ? */ X short forced; /* has had an icon forced upon it */ X short icon_not_ours; /* icon pixmap or window supplied to us */ X short icon_moved; /* user explicitly moved the icon */ X short highlight; /* should highlight this window */ X short stackmode; /* honor stackmode requests */ X short iconify_by_unmapping; /* unmap window to iconify it */ X short iconmgr; /* this is an icon manager window */ X short transient; /* this is a transient window */ X short titlehighlight; /* should I highlight the title bar */ X short sticky; /* is the window sticky */ X struct IconMgr *iconmgrp; /* pointer to it if this is an icon manager */ X int save_frame_x; /* x position of frame */ X int save_frame_y; /* y position of frame */ X int save_frame_width; /* width of frame */ X int save_frame_height; /* height of frame */ X short zoomed; /* is the window zoomed? */ X#ifdef SHAPE X short wShaped; /* this window has a bounding shape */ X#endif X unsigned long protocols; /* which protocols this window handles */ X Colormaps cmaps; /* colormaps for this application */ X TBWindow *titlebuttons; X SqueezeInfo *squeeze_info; /* should the title be squeezed? */ X struct { X struct TwmWindow *next, *prev; X Bool cursor_valid; X int curs_x, curs_y; X } ring; X} TwmWindow; X X#define DoesWmTakeFocus (1L << 0) X#define DoesWmSaveYourself (1L << 1) X#define DoesWmDeleteWindow (1L << 2) X X#define TBPM_XLOGO ":xlogo" /* name of titlebar pixmap for xlogo */ X#define TBPM_ICONIFY ":iconify" /* same image as xlogo */ X#define TBPM_RESIZE ":resize" /* name of titlebar pixmap for resize button */ X#define TBPM_QUESTION ":question" /* name of unknown titlebar pixmap */ X#define TBPM_MENU ":menu" /* name of titlebar pixmap for menus */ X Xextern char *malloc(), *calloc(), *realloc(), *getenv(); Xextern void free(); Xextern void Reborder(), Done(); Xvoid ComputeCommonTitleOffsets(); Xvoid ComputeWindowTitleOffsets(), ComputeTitleLocation(); Xextern char *ProgramName; Xextern Display *dpy; Xextern Window ResizeWindow; /* the window we are resizing */ X#ifdef SHAPE Xextern int HasShape; /* this server supports Shape extension */ X#endif X Xextern int PreviousScreen; X Xextern Cursor UpperLeftCursor; Xextern Cursor RightButt; Xextern Cursor MiddleButt; Xextern Cursor LeftButt; X Xextern XClassHint NoClass; X Xextern XContext VirtualContext; Xextern XContext TwmContext; Xextern XContext MenuContext; Xextern XContext IconManagerContext; Xextern XContext ScreenContext; Xextern XContext ColormapContext; X Xextern char *Home; Xextern int HomeLen; Xextern int ParseError; X Xextern int HandlingEvents; X Xextern Window JunkRoot; Xextern Window JunkChild; Xextern int JunkX; Xextern int JunkY; Xextern unsigned int JunkWidth, JunkHeight, JunkBW, JunkDepth, JunkMask; Xextern XGCValues Gcv; Xextern int InfoLines; Xextern char Info[][INFO_SIZE]; Xextern int Argc; Xextern char **Argv; Xextern char **Environ; Xextern void NewFontCursor(); X Xextern Bool ErrorOccurred; Xextern XErrorEvent LastErrorEvent; X X#define ResetError() (ErrorOccurred = False) X Xextern Bool RestartPreviousState; Xextern Bool GetWMState(); X Xextern Atom _XA_WM_CHANGE_STATE; Xextern Atom _XA_WM_STATE; Xextern Atom _XA_WM_COLORMAP_WINDOWS; Xextern Atom _XA_WM_PROTOCOLS; Xextern Atom _XA_WM_TAKE_FOCUS; Xextern Atom _XA_WM_SAVE_YOURSELF; Xextern Atom _XA_WM_DELETE_WINDOW; Xextern Atom _XA_TWM_FLAGS; X X#endif /* _TWM_ */ SHAR_EOF if test 12901 -ne "`wc -c < twm.h`" then echo shar: error transmitting "twm.h" '(should have been 12901 characters)' fi fi # end of shell archive exit 0 dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.