v09i009: TWM with a virtual root window, Part08/09
Tom LaStrange
toml at marvin.Solbourne.COM
Thu Aug 30 05:33:50 AEST 1990
Submitted-by: toml at marvin.Solbourne.COM (Tom LaStrange)
Posting-number: Volume 9, Issue 9
Archive-name: tvtwm/part08
#! /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:
#
#util.c
#util.h
#vdt.c
#vdt.h
#version.c
#version.h
#
# Created by toml () on Wed Aug 29 08:43:39 MDT 1990
#
if test -f 'util.c'
then
echo shar: will not over-write existing file "util.c"
else
echo extracting "util.c"
sed 's/^X//' >util.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: util.c,v 1.39 90/03/16 12:06:46 jim Exp $
X *
X * utility routines for twm
X *
X * 28-Oct-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#if !defined(lint) && !defined(SABER)
Xstatic char RCSinfo[]=
X"$XConsortium: util.c,v 1.39 90/03/16 12:06:46 jim Exp $";
X#endif
X
X#include <stdio.h>
X#include "twm.h"
X#include "util.h"
X#include "gram.h"
X#include "screen.h"
X#include <X11/Xos.h>
X#include <X11/Xatom.h>
X#include <X11/Xmu/Drawing.h>
X#include <X11/Xmu/CharSet.h>
X
Xstatic Pixmap CreateXLogoPixmap(), CreateResizePixmap();
Xstatic Pixmap CreateQuestionPixmap(), CreateMenuPixmap();
Xint HotX, HotY;
X
X/***********************************************************************
X *
X * Procedure:
X * MoveOutline - move a window outline
X *
X * Inputs:
X * root - the window we are outlining
X * x - upper left x coordinate
X * y - upper left y coordinate
X * width - the width of the rectangle
X * height - the height of the rectangle
X * bw - the border width of the frame
X * th - title height
X *
X ***********************************************************************
X */
X
X/* ARGSUSED */
Xvoid MoveOutline(root, x, y, width, height, bw, th)
X Window root;
X int x, y, width, height, bw, th;
X{
X static int lastx = 0;
X static int lasty = 0;
X static int lastWidth = 0;
X static int lastHeight = 0;
X static int lastBW = 0;
X static int lastTH = 0;
X int xl, xr, yt, yb, xinnerl, xinnerr, yinnert, yinnerb;
X int xthird, ythird;
X XSegment outline[18];
X register XSegment *r;
X
X if (x == lastx && y == lasty && width == lastWidth && height == lastHeight
X && lastBW == bw && th == lastTH)
X return;
X
X r = outline;
X
X#define DRAWIT() \
X if (lastWidth || lastHeight) \
X { \
X xl = lastx; \
X xr = lastx + lastWidth - 1; \
X yt = lasty; \
X yb = lasty + lastHeight - 1; \
X xinnerl = xl + lastBW; \
X xinnerr = xr - lastBW; \
X yinnert = yt + lastTH + lastBW; \
X yinnerb = yb - lastBW; \
X xthird = (xinnerr - xinnerl) / 3; \
X ythird = (yinnerb - yinnert) / 3; \
X \
X r->x1 = xl; \
X r->y1 = yt; \
X r->x2 = xr; \
X r->y2 = yt; \
X r++; \
X \
X r->x1 = xl; \
X r->y1 = yb; \
X r->x2 = xr; \
X r->y2 = yb; \
X r++; \
X \
X r->x1 = xl; \
X r->y1 = yt; \
X r->x2 = xl; \
X r->y2 = yb; \
X r++; \
X \
X r->x1 = xr; \
X r->y1 = yt; \
X r->x2 = xr; \
X r->y2 = yb; \
X r++; \
X \
X r->x1 = xinnerl + xthird; \
X r->y1 = yinnert; \
X r->x2 = r->x1; \
X r->y2 = yinnerb; \
X r++; \
X \
X r->x1 = xinnerl + (2 * xthird); \
X r->y1 = yinnert; \
X r->x2 = r->x1; \
X r->y2 = yinnerb; \
X r++; \
X \
X r->x1 = xinnerl; \
X r->y1 = yinnert + ythird; \
X r->x2 = xinnerr; \
X r->y2 = r->y1; \
X r++; \
X \
X r->x1 = xinnerl; \
X r->y1 = yinnert + (2 * ythird); \
X r->x2 = xinnerr; \
X r->y2 = r->y1; \
X r++; \
X \
X if (lastTH != 0) { \
X r->x1 = xl; \
X r->y1 = yt + lastTH; \
X r->x2 = xr; \
X r->y2 = r->y1; \
X r++; \
X } \
X }
X
X /* undraw the old one, if any */
X DRAWIT ();
X
X lastx = x;
X lasty = y;
X lastWidth = width;
X lastHeight = height;
X lastBW = bw;
X lastTH = th;
X
X /* draw the new one, if any */
X DRAWIT ();
X
X#undef DRAWIT
X
X
X if (r != outline)
X {
X XDrawSegments(dpy, root, Scr->DrawGC, outline, r - outline);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * Zoom - zoom in or out of an icon
X *
X * Inputs:
X * wf - window to zoom from
X * wt - window to zoom to
X *
X ***********************************************************************
X */
X
Xvoid
XZoom(wf, wt)
X Window wf, wt;
X{
X int fx, fy, tx, ty; /* from, to */
X unsigned int fw, fh, tw, th; /* from, to */
X long dx, dy, dw, dh;
X long z;
X int j;
X
X if (!Scr->DoZoom || Scr->ZoomCount < 1) return;
X
X if (wf == None || wt == None) return;
X
X XGetGeometry (dpy, wf, &JunkRoot, &fx, &fy, &fw, &fh, &JunkBW, &JunkDepth);
X XGetGeometry (dpy, wt, &JunkRoot, &tx, &ty, &tw, &th, &JunkBW, &JunkDepth);
X
X dx = ((long) (tx - fx)); /* going from -> to */
X dy = ((long) (ty - fy)); /* going from -> to */
X dw = ((long) (tw - fw)); /* going from -> to */
X dh = ((long) (th - fh)); /* going from -> to */
X z = (long) (Scr->ZoomCount + 1);
X
X for (j = 0; j < 2; j++) {
X long i;
X
X XDrawRectangle (dpy, Scr->Root, Scr->DrawGC, fx, fy, fw, fh);
X for (i = 1; i < z; i++) {
X int x = fx + (int) ((dx * i) / z);
X int y = fy + (int) ((dy * i) / z);
X unsigned width = (unsigned) (((long) fw) + (dw * i) / z);
X unsigned height = (unsigned) (((long) fh) + (dh * i) / z);
X
X XDrawRectangle (dpy, Scr->Root, Scr->DrawGC,
X x, y, width, height);
X }
X XDrawRectangle (dpy, Scr->Root, Scr->DrawGC, tx, ty, tw, th);
X }
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * ExpandFilename - expand the tilde character to HOME
X * if it is the first character of the filename
X *
X * Returned Value:
X * a pointer to the new name
X *
X * Inputs:
X * name - the filename to expand
X *
X ***********************************************************************
X */
X
Xchar *
XExpandFilename(name)
Xchar *name;
X{
X char *newname;
X
X if (name[0] != '~') return name;
X
X newname = (char *) malloc (HomeLen + strlen(name) + 2);
X if (!newname) {
X fprintf (stderr,
X "%s: unable to allocate %d bytes to expand filename %s/%s\n",
X ProgramName, HomeLen + strlen(name) + 2, Home, &name[1]);
X } else {
X (void) sprintf (newname, "%s/%s", Home, &name[1]);
X }
X
X return newname;
X}
X
X/***********************************************************************
X *
X * Procedure:
X * GetUnknownIcon - read in the bitmap file for the unknown icon
X *
X * Inputs:
X * name - the filename to read
X *
X ***********************************************************************
X */
X
Xvoid
XGetUnknownIcon(name)
Xchar *name;
X{
X if ((Scr->UnknownPm = GetBitmap(name)) != None)
X {
X XGetGeometry(dpy, Scr->UnknownPm, &JunkRoot, &JunkX, &JunkY,
X (unsigned int *)&Scr->UnknownWidth, (unsigned int *)&Scr->UnknownHeight, &JunkBW, &JunkDepth);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * FindBitmap - read in a bitmap file and return size
X *
X * Returned Value:
X * the pixmap associated with the bitmap
X * widthp - pointer to width of bitmap
X * heightp - pointer to height of bitmap
X *
X * Inputs:
X * name - the filename to read
X *
X ***********************************************************************
X */
X
XPixmap FindBitmap (name, widthp, heightp)
X char *name;
X unsigned int *widthp, *heightp;
X{
X char *bigname;
X Pixmap pm;
X
X if (!name) return None;
X
X /*
X * Names of the form :name refer to hardcoded images that are scaled to
X * look nice in title buttons. Eventually, it would be nice to put in a
X * menu symbol as well....
X */
X if (name[0] == ':') {
X int i;
X static struct {
X char *name;
X Pixmap (*proc)();
X } pmtab[] = {
X { TBPM_XLOGO, CreateXLogoPixmap },
X { TBPM_ICONIFY, CreateXLogoPixmap },
X { TBPM_RESIZE, CreateResizePixmap },
X { TBPM_QUESTION, CreateQuestionPixmap },
X { TBPM_MENU, CreateMenuPixmap }, /* XXX - don't doc, niy */
X };
X
X for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) {
X if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0)
X return (*pmtab[i].proc) (widthp, heightp);
X }
X fprintf (stderr, "%s: no such built-in bitmap \"%s\"\n",
X ProgramName, name);
X return None;
X }
X
X /*
X * Generate a full pathname if any special prefix characters (such as ~)
X * are used. If the bigname is different from name, bigname will need to
X * be freed.
X */
X bigname = ExpandFilename (name);
X if (!bigname) return None;
X
X /*
X * look along bitmapFilePath resource same as toolkit clients
X */
X pm = XmuLocateBitmapFile (ScreenOfDisplay(dpy, Scr->screen), bigname,
X NULL, 0, widthp, heightp, &HotX, &HotY);
X if (pm == None && Scr->IconDirectory && bigname[0] != '/') {
X if (bigname != name) free (bigname);
X /*
X * Attempt to find icon in old IconDirectory (now obsolete)
X */
X bigname = (char *) malloc (strlen(name) + strlen(Scr->IconDirectory) +
X 2);
X if (!bigname) {
X fprintf (stderr,
X "%s: unable to allocate memory for \"%s/%s\"\n",
X ProgramName, Scr->IconDirectory, name);
X return None;
X }
X (void) sprintf (bigname, "%s/%s", Scr->IconDirectory, name);
X if (XReadBitmapFile (dpy, Scr->Root, bigname, widthp, heightp, &pm,
X &HotX, &HotY) != BitmapSuccess) {
X pm = None;
X }
X }
X if (bigname != name) free (bigname);
X if (pm == None) {
X fprintf (stderr, "%s: unable to find bitmap \"%s\"\n",
X ProgramName, name);
X }
X
X return pm;
X}
X
XPixmap GetBitmap (name)
X char *name;
X{
X return FindBitmap (name, &JunkWidth, &JunkHeight);
X}
X
X
XInsertRGBColormap (a, maps, nmaps, replace)
X Atom a;
X XStandardColormap *maps;
X int nmaps;
X Bool replace;
X{
X StdCmap *sc = NULL;
X
X if (replace) { /* locate existing entry */
X for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) {
X if (sc->atom == a) break;
X }
X }
X
X if (!sc) { /* no existing, allocate new */
X sc = (StdCmap *) malloc (sizeof (StdCmap));
X if (!sc) {
X fprintf (stderr, "%s: unable to allocate %d bytes for StdCmap\n",
X ProgramName, sizeof (StdCmap));
X return;
X }
X }
X
X if (replace) { /* just update contents */
X if (sc->maps) XFree ((char *) maps);
X if (sc == Scr->StdCmapInfo.mru) Scr->StdCmapInfo.mru = NULL;
X } else { /* else appending */
X sc->next = NULL;
X sc->atom = a;
X if (Scr->StdCmapInfo.tail) {
X Scr->StdCmapInfo.tail->next = sc;
X } else {
X Scr->StdCmapInfo.head = sc;
X }
X Scr->StdCmapInfo.tail = sc;
X }
X sc->nmaps = nmaps;
X sc->maps = maps;
X
X return;
X}
X
XRemoveRGBColormap (a)
X Atom a;
X{
X StdCmap *sc, *prev;
X
X prev = NULL;
X for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) {
X if (sc->atom == a) break;
X prev = sc;
X }
X if (sc) { /* found one */
X if (sc->maps) XFree ((char *) sc->maps);
X if (prev) prev->next = sc->next;
X if (Scr->StdCmapInfo.head == sc) Scr->StdCmapInfo.head = sc->next;
X if (Scr->StdCmapInfo.tail == sc) Scr->StdCmapInfo.tail = prev;
X if (Scr->StdCmapInfo.mru == sc) Scr->StdCmapInfo.mru = NULL;
X }
X return;
X}
X
XLocateStandardColormaps()
X{
X Atom *atoms;
X int natoms;
X int i;
X
X atoms = XListProperties (dpy, Scr->Root, &natoms);
X for (i = 0; i < natoms; i++) {
X XStandardColormap *maps = NULL;
X int nmaps;
X
X if (XGetRGBColormaps (dpy, Scr->Root, &maps, &nmaps, atoms[i])) {
X /* if got one, then append to current list */
X InsertRGBColormap (atoms[i], maps, nmaps, False);
X }
X }
X if (atoms) XFree ((char *) atoms);
X return;
X}
X
XGetColor(kind, what, name)
Xint kind;
XPixel *what;
Xchar *name;
X{
X XColor color, junkcolor;
X Status stat = 0;
X Colormap cmap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
X
X#ifndef TOM
X if (!Scr->FirstTime)
X return;
X#endif
X
X if (Scr->Monochrome != kind)
X return;
X
X /*
X * small hack to avoid extra roundtrip for color allocation
X */
X if (!((name[0] == '#')
X ? ((stat = XParseColor (dpy, cmap, name, &color)) &&
X XAllocColor (dpy, cmap, &color))
X : XAllocNamedColor (dpy, cmap, name, &color, &junkcolor)))
X {
X /* if we could not allocate the color, let's see if this is a
X * standard colormap
X */
X XStandardColormap *stdcmap = NULL;
X
X /* parse the named color */
X if (name[0] != '#')
X stat = XParseColor (dpy, cmap, name, &color);
X if (!stat)
X {
X fprintf (stderr, "%s: invalid color name \"%s\"\n",
X ProgramName, name);
X return;
X }
X
X /*
X * look through the list of standard colormaps (check cache first)
X */
X if (Scr->StdCmapInfo.mru && Scr->StdCmapInfo.mru->maps &&
X (Scr->StdCmapInfo.mru->maps[Scr->StdCmapInfo.mruindex].colormap ==
X cmap)) {
X stdcmap = &(Scr->StdCmapInfo.mru->maps[Scr->StdCmapInfo.mruindex]);
X } else {
X StdCmap *sc;
X
X for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) {
X int i;
X
X for (i = 0; i < sc->nmaps; i++) {
X if (sc->maps[i].colormap == cmap) {
X Scr->StdCmapInfo.mru = sc;
X Scr->StdCmapInfo.mruindex = i;
X stdcmap = &(sc->maps[i]);
X goto gotit;
X }
X }
X }
X }
X
X gotit:
X if (stdcmap) {
X color.pixel = (stdcmap->base_pixel +
X ((Pixel)((color.red / 65535.0) *
X stdcmap->red_max + 0.5) *
X stdcmap->red_mult) +
X ((Pixel)((color.green /65535.0) *
X stdcmap->green_max + 0.5) *
X stdcmap->green_mult) +
X ((Pixel)((color.blue / 65535.0) *
X stdcmap->blue_max + 0.5) *
X stdcmap->blue_mult));
X } else {
X fprintf (stderr, "%s: unable to allocate color \"%s\"\n",
X ProgramName, name);
X return;
X }
X }
X
X *what = color.pixel;
X}
X
XGetFont(font)
XMyFont *font;
X{
X char *deffontname = "fixed";
X
X if (font->font != NULL)
X XFreeFont(dpy, font->font);
X
X if ((font->font = XLoadQueryFont(dpy, font->name)) == NULL)
X {
X if (Scr->DefaultFont.name) {
X deffontname = Scr->DefaultFont.name;
X }
X if ((font->font = XLoadQueryFont(dpy, deffontname)) == NULL)
X {
X fprintf (stderr, "%s: unable to open fonts \"%s\" or \"%s\"\n",
X ProgramName, font->name, deffontname);
X exit(1);
X }
X
X }
X font->height = font->font->ascent + font->font->descent;
X font->y = font->font->ascent;
X}
X
X
X/*
X * SetFocus - separate routine to set focus to make things more understandable
X * and easier to debug
X */
XSetFocus (tmp_win)
X TwmWindow *tmp_win;
X{
X Window w = (tmp_win ? tmp_win->w : PointerRoot);
X
X#ifdef TRACE
X if (tmp_win) {
X printf ("Focusing on window \"%s\"\n", tmp_win->full_name);
X } else {
X printf ("Unfocusing; Scr->Focus was \"%s\"\n",
X Scr->Focus ? Scr->Focus->full_name : "(nil)");
X }
X#endif
X
X XSetInputFocus (dpy, w, RevertToPointerRoot, CurrentTime);
X}
X
X
X#ifdef NOPUTENV
X/*
X * define our own putenv() if the system doesn't have one.
X * putenv(s): place s (a string of the form "NAME=value") in
X * the environment; replacing any existing NAME. s is placed in
X * environment, so if you change s, the environment changes (like
X * putenv on a sun). Binding removed if you putenv something else
X * called NAME.
X */
Xint
Xputenv(s)
X char *s;
X{
X extern char *index();
X char *v;
X int varlen, idx;
X extern char **environ;
X char **newenv;
X static int virgin = 1; /* true while "environ" is a virgin */
X
X v = index(s, '=');
X if(v == 0)
X return 0; /* punt if it's not of the right form */
X varlen = (v + 1) - s;
X
X for (idx = 0; environ[idx] != 0; idx++) {
X if (strncmp(environ[idx], s, varlen) == 0) {
X if(v[1] != 0) { /* true if there's a value */
X environ[idx] = s;
X return 0;
X } else {
X do {
X environ[idx] = environ[idx+1];
X } while(environ[++idx] != 0);
X return 0;
X }
X }
X }
X
X /* add to environment (unless no value; then just return) */
X if(v[1] == 0)
X return 0;
X if(virgin) {
X register i;
X
X newenv = (char **) malloc((unsigned) ((idx + 2) * sizeof(char*)));
X if(newenv == 0)
X return -1;
X for(i = idx-1; i >= 0; --i)
X newenv[i] = environ[i];
X virgin = 0; /* you're not a virgin anymore, sweety */
X } else {
X newenv = (char **) realloc((char *) environ,
X (unsigned) ((idx + 2) * sizeof(char*)));
X if (newenv == 0)
X return -1;
X }
X
X environ = newenv;
X environ[idx] = s;
X environ[idx+1] = 0;
X
X return 0;
X}
X#endif /* NOPUTENV */
X
X
Xstatic Pixmap CreateXLogoPixmap (widthp, heightp)
X unsigned int *widthp, *heightp;
X{
X int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
X if (h < 0) h = 0;
X
X *widthp = *heightp = (unsigned int) h;
X if (Scr->tbpm.xlogo == None) {
X GC gc, gcBack;
X
X Scr->tbpm.xlogo = XCreatePixmap (dpy, Scr->Root, h, h, 1);
X gc = XCreateGC (dpy, Scr->tbpm.xlogo, 0L, NULL);
X XSetForeground (dpy, gc, 0);
X XFillRectangle (dpy, Scr->tbpm.xlogo, gc, 0, 0, h, h);
X XSetForeground (dpy, gc, 1);
X gcBack = XCreateGC (dpy, Scr->tbpm.xlogo, 0L, NULL);
X XSetForeground (dpy, gcBack, 0);
X
X /*
X * draw the logo large so that it gets as dense as possible; then white
X * out the edges so that they look crisp
X */
X XmuDrawLogo (dpy, Scr->tbpm.xlogo, gc, gcBack, -1, -1, h + 2, h + 2);
X XDrawRectangle (dpy, Scr->tbpm.xlogo, gcBack, 0, 0, h - 1, h - 1);
X
X /*
X * done drawing
X */
X XFreeGC (dpy, gc);
X XFreeGC (dpy, gcBack);
X }
X return Scr->tbpm.xlogo;
X}
X
X
Xstatic Pixmap CreateResizePixmap (widthp, heightp)
X unsigned int *widthp, *heightp;
X{
X int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
X if (h < 0) h = 0;
X
X *widthp = *heightp = (unsigned int) h;
X if (Scr->tbpm.resize == None) {
X XSegment segs[4];
X GC gc;
X int w;
X
X /*
X * create the pixmap
X */
X Scr->tbpm.resize = XCreatePixmap (dpy, Scr->Root, h, h, 1);
X gc = XCreateGC (dpy, Scr->tbpm.resize, 0L, NULL);
X XSetForeground (dpy, gc, 0);
X XFillRectangle (dpy, Scr->tbpm.resize, gc, 0, 0, h, h);
X XSetForeground (dpy, gc, 1);
X
X /*
X * draw the resize button,
X */
X w = (h * 2) / 3;
X segs[0].x1 = w; segs[0].y1 = 0; segs[0].x2 = w; segs[0].y2 = w;
X segs[1].x1 = 0; segs[1].y1 = w; segs[1].x2 = w; segs[1].y2 = w;
X w = w / 2;
X segs[2].x1 = w; segs[2].y1 = 0; segs[2].x2 = w; segs[2].y2 = w;
X segs[3].x1 = 0; segs[3].y1 = w; segs[3].x2 = w; segs[3].y2 = w;
X XDrawSegments (dpy, Scr->tbpm.resize, gc, segs, 4);
X
X /*
X * done drawing
X */
X XFreeGC(dpy, gc);
X }
X return Scr->tbpm.resize;
X}
X
X
X#define questionmark_width 8
X#define questionmark_height 8
Xstatic char questionmark_bits[] = {
X 0x38, 0x7c, 0x64, 0x30, 0x18, 0x00, 0x18, 0x18};
X
Xstatic Pixmap CreateQuestionPixmap (widthp, heightp)
X unsigned int *widthp, *heightp;
X{
X *widthp = questionmark_width;
X *heightp = questionmark_height;
X if (Scr->tbpm.question == None) {
X Scr->tbpm.question = XCreateBitmapFromData (dpy, Scr->Root,
X questionmark_bits,
X questionmark_width,
X questionmark_height);
X }
X /*
X * this must succeed or else we are in deep trouble elsewhere
X */
X return Scr->tbpm.question;
X}
X
X
X/* ARGSUSED */
Xstatic Pixmap CreateMenuPixmap (widthp, heightp)
X int *widthp, *heightp;
X{
X fprintf (stderr, "%s: built-in bitmap \"%s\" not implemented.\n",
X ProgramName, TBPM_MENU);
X return None;
X}
SHAR_EOF
if test 20619 -ne "`wc -c < util.c`"
then
echo shar: error transmitting "util.c" '(should have been 20619 characters)'
fi
fi
if test -f 'util.h'
then
echo shar: will not over-write existing file "util.h"
else
echo extracting "util.h"
sed 's/^X//' >util.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: util.h,v 1.10 89/12/10 17:47:04 jim Exp $
X *
X * utility routines header file
X *
X * 28-Oct-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#ifndef _UTIL_
X#define _UTIL_
X
Xextern void Zoom();
Xextern void MoveOutline();
Xextern Pixmap GetBitmap(), FindBitmap();
Xextern void GetUnknownIcon();
Xextern char *ExpandFilename();
Xextern int GetColor();
X
Xextern int HotX, HotY;
X
X#endif /* _UTIL_ */
SHAR_EOF
if test 2629 -ne "`wc -c < util.h`"
then
echo shar: error transmitting "util.h" '(should have been 2629 characters)'
fi
fi
if test -f 'vdt.c'
then
echo shar: will not over-write existing file "vdt.c"
else
echo extracting "vdt.c"
sed 's/^X//' >vdt.c <<'SHAR_EOF'
X/*****************************************************************************/
X/** Copyright 1990 by Solbourne Computer Inc. **/
X/** Longmont, Colorado **/
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/** name of Solbourne not be used in advertising **/
X/** in publicity pertaining to distribution of the software without **/
X/** specific, written prior permission. **/
X/** **/
X/** SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES WITH REGARD **/
X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
X/** ABILITY AND FITNESS, IN NO EVENT SHALL SOLBOURNE **/
X/** 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 * $XConsortium: vdt.c,v 1.140 90/03/23 11:42:33 jim Exp $
X *
X * Virtual Desktop routines
X *
X * 22-Aug-90 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#if !defined(lint) && !defined(SABER)
Xstatic char RCSinfo[]=
X"$XConsortium: vdt.c,v 1.140 90/03/23 11:42:33 jim Exp $";
X#endif
X
X#include <stdio.h>
X#include <X11/X.h>
X#include <X11/Xatom.h>
X#include "twm.h"
X#include "screen.h"
X#include "vdt.h"
X#include "parse.h"
X#include "move.h"
X
Xstatic int pointerX;
Xstatic int pointerY;
X
X/* private swm atoms */
X/* it would be nice at some point to get these atoms blessed so that
X * we don't have to make them swm specific
X */
X
X/* version 1.2 of swm sends synthetic ConfigureNotify events
X * with respect to the actual root window rather than a
X * clients logical root window. OI clients lokk for this
X * version string on the root window to determine how to
X * interpret the ConfigureNotify event
X */
X#define SWM_VERSION "1.2"
X
XAtom XA_SWM_ROOT = None;
XAtom XA_SWM_VROOT = None;
XAtom XA_SWM_VERSION = None;
X
X/***********************************************************************
X *
X * Procedure:
X * InitVirtualDesktop - init vdt stuff
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XInitVirtualDesktop()
X{
X XA_SWM_ROOT = XInternAtom(dpy, "__SWM_ROOT", False);
X XA_SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False);
X XA_SWM_VERSION = XInternAtom(dpy, "__SWM_VERSION", False);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * SetSWM_ROOT - set the XA_SWM_ROOT property
X * This property always indicates to the application
X * what its "root" window is. This is currently needed
X * by OI based clients, other toolkits don't know about
X * virtual desktops.
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XSetSWM_ROOT(tmp_win)
XTwmWindow *tmp_win;
X{
X if (Scr->VirtualDesktop && !tmp_win->iconmgr)
X {
X XChangeProperty(dpy, tmp_win->w, XA_SWM_ROOT, XA_WINDOW,
X 32, PropModeReplace, (unsigned char *)&tmp_win->root, 1);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * SetSWM_VERSION - set the XA_SWM_VERSION property
X * This property always indicates to the application
X * what its "root" window is. This is needed by OI
X * clients so they can know how to interpret the
X * incoming synthetic ConfigureNotify events.
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XSetSWM_VERSION()
X{
X static char *version = SWM_VERSION;
X XChangeProperty(dpy,Scr->Root,XA_SWM_VERSION, XA_STRING, 8,
X PropModeReplace, (unsigned char *)version, strlen(version));
X}
X
X/***********************************************************************
X *
X * Procedure:
X * RemoveSWM_VERSION - remove the XA_SWM_VERSION property
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XRemoveSWM_VERSION()
X{
X XDeleteProperty(dpy, Scr->Root, XA_SWM_VERSION);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MakeVirtual - make a small virtual window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
XWindow
XMakeVirtual(tmp_win, x, y, width, height, background, border)
XTwmWindow *tmp_win;
Xint x;
Xint y;
Xint width;
Xint height;
Xlong background;
Xlong border;
X{
X Window virtual;
X
X width /= Scr->PannerScale;
X height /= Scr->PannerScale;
X if (width <= 0) width = 1;
X if (height <= 0) height = 1;
X virtual = XCreateSimpleWindow(dpy, Scr->Panner, x, y,
X width, height, 1, border, background);
X XGrabButton(dpy, Button2, AnyModifier, virtual,
X True, ButtonPressMask | ButtonReleaseMask,
X GrabModeAsync, GrabModeAsync, Scr->Panner, None);
X XSelectInput(dpy, virtual, KeyPressMask);
X XSaveContext(dpy, virtual, TwmContext, (caddr_t) tmp_win);
X XSaveContext(dpy, virtual, VirtualContext, (caddr_t) tmp_win);
X XSaveContext(dpy, virtual, ScreenContext, (caddr_t) Scr);
X return (virtual);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ResizeVirtual - resize one of the small virtual windows
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XResizeVirtual(window, width, height)
XWindow window;
Xint width;
Xint height;
X{
X if (window) {
X width /= Scr->PannerScale;
X height /= Scr->PannerScale;
X if (width <= 0) width = 1;
X if (height <= 0) height = 1;
X XResizeWindow(dpy, window, width, height);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MapFrame - map a client window and its frame
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMapFrame(tmp_win)
XTwmWindow *tmp_win;
X{
X XMapWindow(dpy, tmp_win->w);
X XMapWindow(dpy, tmp_win->frame);
X if (tmp_win->virtualWindow && !tmp_win->sticky)
X XMapWindow(dpy, tmp_win->virtualWindow);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * UnmapFrame - unmap a client window and its frame
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XUnmapFrame(tmp_win)
XTwmWindow *tmp_win;
X{
X XUnmapWindow(dpy, tmp_win->frame);
X XUnmapWindow(dpy, tmp_win->w);
X if (tmp_win->virtualWindow && !tmp_win->sticky)
X XUnmapWindow(dpy, tmp_win->virtualWindow);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * RaiseFrame - raise a client window and its frame
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XRaiseFrame(tmp_win)
XTwmWindow *tmp_win;
X{
X XRaiseWindow(dpy, tmp_win->frame);
X if (tmp_win->virtualWindow && !tmp_win->sticky)
X XRaiseWindow(dpy, tmp_win->virtualWindow);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * LowerFrame - lower a client window and its frame
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XLowerFrame(tmp_win)
XTwmWindow *tmp_win;
X{
X XWindowChanges xwc;
X
X if (tmp_win->sticky && Scr->VirtualDesktop) {
X xwc.sibling = Scr->VirtualDesktop;
X xwc.stack_mode = Above;
X XConfigureWindow(dpy, tmp_win->frame, CWSibling|CWStackMode, &xwc);
X }
X else
X XLowerWindow(dpy, tmp_win->frame);
X if (tmp_win->virtualWindow && !tmp_win->sticky)
X XLowerWindow(dpy, tmp_win->virtualWindow);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MapIcon - map the icon window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMapIcon(tmp_win)
XTwmWindow *tmp_win;
X{
X XMapRaised(dpy, tmp_win->icon_w);
X if (tmp_win->virtualIcon && !tmp_win->sticky)
X XMapRaised(dpy, tmp_win->virtualIcon);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * UnmapIcon - unmap the icon window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XUnmapIcon(tmp_win)
XTwmWindow *tmp_win;
X{
X XUnmapWindow(dpy, tmp_win->icon_w);
X if (tmp_win->virtualIcon && !tmp_win->sticky)
X XUnmapWindow(dpy, tmp_win->virtualIcon);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * RaiseIcon - raise a client icon
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XRaiseIcon(tmp_win)
XTwmWindow *tmp_win;
X{
X XRaiseWindow(dpy, tmp_win->icon_w);
X if (tmp_win->virtualIcon && !tmp_win->sticky)
X XRaiseWindow(dpy, tmp_win->virtualIcon);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * LowerIcon - lower an icon
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XLowerIcon(tmp_win)
XTwmWindow *tmp_win;
X{
X XWindowChanges xwc;
X
X if (tmp_win->sticky && Scr->VirtualDesktop) {
X xwc.sibling = Scr->VirtualDesktop;
X xwc.stack_mode = Above;
X XConfigureWindow(dpy, tmp_win->icon_w, CWSibling|CWStackMode, &xwc);
X }
X else
X XLowerWindow(dpy, tmp_win->icon_w);
X if (tmp_win->virtualIcon && !tmp_win->sticky)
X XLowerWindow(dpy, tmp_win->virtualIcon);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MoveIcon - move an icon
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMoveIcon(tmp_win, x, y)
XTwmWindow *tmp_win;
X{
X XWindowChanges xwc;
X
X XMoveWindow(dpy, tmp_win->icon_w, x, y);
X tmp_win->icon_loc_x = x;
X tmp_win->icon_loc_y = y;
X if (tmp_win->virtualIcon)
X XMoveWindow(dpy, tmp_win->virtualIcon, x/Scr->PannerScale, y/Scr->PannerScale);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MakeVirtualDesktop - create the virtual desktop window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMakeVirtualDesktop(width, height)
Xint width, height;
X{
X Pixmap pm, bm;
X unsigned int bmWidth, bmHeight;
X XSetWindowAttributes attr;
X unsigned attrMask;
X
X if (width < Scr->MyDisplayWidth)
X width = 2 * Scr->MyDisplayWidth;
X if (height < Scr->MyDisplayHeight)
X height = 2 * Scr->MyDisplayHeight;
X
X bm = None;
X pm = None;
X if (Scr->vdtPixmap) {
X bm = FindBitmap(Scr->vdtPixmap, &bmWidth, &bmHeight);
X if (bm) {
X GC gc;
X XGCValues gcv;
X
X pm = XCreatePixmap(dpy, Scr->Root, bmWidth, bmHeight, Scr->d_depth);
X gcv.foreground = Scr->vdtC.fore;
X gcv.background = Scr->vdtC.back;
X gc = XCreateGC(dpy, Scr->Root, GCForeground|GCBackground, &gcv);
X XCopyPlane(dpy, bm, pm, gc, 0,0, bmWidth, bmHeight, 0,0, 1);
X XFreeGC(dpy, gc);
X }
X }
X attrMask = CWOverrideRedirect | CWEventMask | CWBackPixmap;
X attr.override_redirect = True;
X attr.event_mask = SubstructureRedirectMask|SubstructureNotifyMask;
X attr.background_pixmap = Scr->rootWeave;
X if (pm)
X attr.background_pixmap = pm;
X else if (Scr->vdtBackgroundSet) {
X attrMask &= ~CWBackPixmap;
X attrMask |= CWBackPixel;
X attr.background_pixel = Scr->vdtC.back;
X }
X
X Scr->VirtualDesktop = XCreateWindow(dpy, Scr->Root, 0, 0,
X width+50, height+50, 0, Scr->d_depth, CopyFromParent,
X Scr->d_visual, attrMask, &attr);
X Scr->vdtWidth = width;
X Scr->vdtHeight = height;
X
X /* this property allows ssetroot to find the virtual root window */
X XChangeProperty(dpy, Scr->VirtualDesktop, XA_SWM_VROOT, XA_WINDOW, 32,
X PropModeReplace, (unsigned char *)&Scr->VirtualDesktop, 1);
X
X if (bm)
X XFreePixmap(dpy, bm);
X if (pm)
X XFreePixmap(dpy, pm);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * MakePanner - create the virtual desktop panner window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMakePanner()
X{
X static XTextProperty wName={(unsigned char *) "Virtual Desktop",XA_STRING,8,15};
X static XTextProperty iName={(unsigned char *) "Desktop",XA_STRING,8,7};
X XSetWindowAttributes attr;
X XSizeHints *sizeHints;
X XWMHints *wmHints;
X XClassHint *classHints;
X int status;
X int x, y, width, height;
X Pixmap pm, bm;
X unsigned int bmWidth, bmHeight;
X unsigned attrMask;
X
X width = Scr->vdtWidth/Scr->PannerScale;
X height = Scr->vdtHeight/Scr->PannerScale;
X
X sizeHints = XAllocSizeHints();
X sizeHints->flags = PBaseSize;
X sizeHints->base_width = width;
X sizeHints->base_height = height;
X sizeHints->min_width = Scr->MyDisplayWidth/Scr->PannerScale;
X sizeHints->min_height = Scr->MyDisplayHeight/Scr->PannerScale;
X XWMGeometry(dpy, Scr->screen, Scr->PannerGeometry, NULL,
X 1, sizeHints, &x, &y, &width, &height, &sizeHints->win_gravity);
X sizeHints->flags = USPosition|PWinGravity|PMinSize;
X
X wmHints = XAllocWMHints();
X wmHints->initial_state = Scr->PannerState;
X wmHints->flags = StateHint;
X
X classHints = XAllocClassHint();
X classHints->res_name = "virtualDesktop";
X classHints->res_class = "Twm";
X
X bm = None;
X pm = None;
X if (Scr->PannerPixmap) {
X bm = FindBitmap(Scr->PannerPixmap, &bmWidth, &bmHeight);
X if (bm) {
X GC gc;
X XGCValues gcv;
X
X pm = XCreatePixmap(dpy, Scr->Root, bmWidth, bmHeight, Scr->d_depth);
X gcv.foreground = Scr->PannerC.fore;
X gcv.background = Scr->PannerC.back;
X gc = XCreateGC(dpy, Scr->Root, GCForeground|GCBackground, &gcv);
X XCopyPlane(dpy, bm, pm, gc, 0,0, bmWidth, bmHeight, 0,0, 1);
X XFreeGC(dpy, gc);
X }
X }
X
X attrMask = CWBackPixmap|CWEventMask;
X attr.background_pixmap = Scr->rootWeave;
X attr.event_mask = ExposureMask | ButtonPressMask;
X if (pm)
X attr.background_pixmap = pm;
X else if (Scr->PannerBackgroundSet) {
X attrMask &= ~CWBackPixmap;
X attrMask |= CWBackPixel;
X attr.background_pixel = Scr->PannerC.back;
X }
X Scr->Panner = XCreateWindow(dpy, Scr->Root, x, y,
X sizeHints->base_width, sizeHints->base_height, 1,
X Scr->d_depth, CopyFromParent,
X Scr->d_visual, attrMask, &attr);
X
X Scr->PannerWidth = sizeHints->base_width;
X Scr->PannerHeight = sizeHints->base_height;
X
X XGrabButton(dpy, Button1, AnyModifier, Scr->Panner,
X True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
X GrabModeAsync, GrabModeAsync, Scr->Panner, None);
X XGrabButton(dpy, Button3, AnyModifier, Scr->Panner,
X True, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask,
X GrabModeAsync, GrabModeAsync, Scr->Panner, None);
X XSetWMProperties(dpy, Scr->Panner, wName, iName, NULL, 0,
X sizeHints, wmHints, classHints);
X
X if (Scr->PannerState != WithdrawnState)
X XMapRaised(dpy, Scr->Panner);
X XSaveContext(dpy, Scr->Panner, ScreenContext, (caddr_t) Scr);
X}
X
Xvoid
XHandlePannerExpose(ev)
XXEvent *ev;
X{
X if (ev->xexpose.count)
X return;
X
X if (!Scr->PannerOutlineWidth) {
X Scr->PannerOutlineWidth = Scr->MyDisplayWidth / Scr->PannerScale -1;
X Scr->PannerOutlineHeight = Scr->MyDisplayHeight / Scr->PannerScale -1;
X }
X XClearWindow(dpy, Scr->Panner);
X XDrawRectangle(dpy, Scr->Panner, Scr->PannerGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X}
X
Xvoid
XHandlePannerButtonPress(ev)
XXEvent *ev;
X{
X pointerX = Scr->PannerOutlineX + Scr->PannerOutlineWidth/2;
X pointerY = Scr->PannerOutlineY + Scr->PannerOutlineHeight/2;
X XWarpPointer(dpy, None, Scr->Panner, 0,0,0,0,
X pointerX, pointerY);
X XClearWindow(dpy, Scr->Panner);
X XDrawRectangle(dpy, Scr->Panner, Scr->DrawGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X}
X
Xvoid
XHandlePannerButtonRelease(ev)
XXEvent *ev;
X{
X XDrawRectangle(dpy, Scr->Panner, Scr->DrawGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X XClearWindow(dpy, Scr->Panner);
X XDrawRectangle(dpy, Scr->Panner, Scr->PannerGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X
X MoveDesktop(Scr->PannerOutlineX * Scr->PannerScale,
X Scr->PannerOutlineY * Scr->PannerScale);
X}
X
Xvoid
XHandlePannerMotionNotify(ev)
XXEvent *ev;
X{
X int deltaX, deltaY;
X int newOutlineX, newOutlineY;
X
X /* get rid of the last outline */
X XDrawRectangle(dpy, Scr->Panner, Scr->DrawGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X
X /* figure out the position of the next outline */
X deltaX = ev->xmotion.x - pointerX;
X deltaY = ev->xmotion.y - pointerY;
X
X newOutlineX = Scr->PannerOutlineX + deltaX;
X newOutlineY = Scr->PannerOutlineY + deltaY;
X
X if (newOutlineX < 0)
X newOutlineX = 0;
X if (newOutlineY < 0)
X newOutlineY = 0;
X if ((newOutlineX + Scr->PannerOutlineWidth) >= Scr->PannerWidth)
X newOutlineX = Scr->PannerWidth - Scr->PannerOutlineWidth - 1;
X if ((newOutlineY + Scr->PannerOutlineHeight) >= Scr->PannerHeight)
X newOutlineY = Scr->PannerHeight - Scr->PannerOutlineHeight - 1;
X
X pointerX = ev->xmotion.x;
X pointerY = ev->xmotion.y;
X Scr->PannerOutlineX = newOutlineX;
X Scr->PannerOutlineY = newOutlineY;
X
X /* draw the new outline */
X XDrawRectangle(dpy, Scr->Panner, Scr->DrawGC,
X Scr->PannerOutlineX, Scr->PannerOutlineY,
X Scr->PannerOutlineWidth, Scr->PannerOutlineHeight);
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * MoveDesktop - move the desktop to a pixel location
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XMoveDesktop(x, y)
Xint x;
Xint y;
X{
X TwmWindow *tmp;
X XEvent ev;
X
X if (x != Scr->vdtPositionX || y != Scr->vdtPositionY) {
X if (x < 0) x = 0;
X if (y < 0) y = 0;
X if ((x + Scr->MyDisplayWidth) > Scr->vdtWidth)
X x = Scr->vdtWidth - Scr->MyDisplayWidth;
X if ((y + Scr->MyDisplayHeight) > Scr->vdtHeight)
X y = Scr->vdtHeight - Scr->MyDisplayHeight;
X XMoveWindow(dpy, Scr->VirtualDesktop, -x, -y);
X Scr->PannerOutlineX = x / Scr->PannerScale;
X Scr->PannerOutlineY = y / Scr->PannerScale;
X Scr->vdtPositionX = x;
X Scr->vdtPositionY = y;
X
X for (tmp = Scr->TwmRoot.next; tmp != NULL; tmp = tmp->next)
X if (!tmp->sticky)
X SendSyntheticConfigureNotify(tmp);
X
X /* go repaint the panner */
X ev.xexpose.count = 0;
X HandlePannerExpose(&ev);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ScrollDesktop - scroll the desktop by screenfuls
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XScrollDesktop(func)
Xint func;
X{
X int x, y;
X
X x = Scr->vdtPositionX;
X y = Scr->vdtPositionY;
X
X switch (func)
X {
X case F_SCROLLHOME:
X x = 0;
X y = 0;
X break;
X case F_SCROLLRIGHT:
X x += Scr->MyDisplayWidth;
X break;
X case F_SCROLLLEFT:
X x -= Scr->MyDisplayWidth;
X break;
X case F_SCROLLDOWN:
X y += Scr->MyDisplayHeight;
X break;
X case F_SCROLLUP:
X y -= Scr->MyDisplayHeight;
X break;
X }
X if (x < 0)
X x = 0;
X if (y < 0)
X y = 0;
X if ((x + Scr->MyDisplayWidth) > Scr->vdtWidth)
X x = Scr->vdtWidth - Scr->MyDisplayWidth;
X if ((y + Scr->MyDisplayHeight) > Scr->vdtHeight)
X y = Scr->vdtHeight - Scr->MyDisplayHeight;
X MoveDesktop(x, y);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ResizeDesktop - resize the desktop, the coordinates are in panner
X * units.
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XResizeDesktop(width, height)
Xint width;
Xint height;
X{
X int vdtWidth, vdtHeight;
X
X if (width != Scr->PannerWidth || height != Scr->PannerHeight) {
X Scr->PannerWidth = width;
X Scr->PannerHeight = height;
X
X vdtWidth = width * Scr->PannerScale;
X vdtHeight = height * Scr->PannerScale;
X
X if (vdtWidth < Scr->vdtWidth) {
X if ((Scr->PannerOutlineX + Scr->PannerOutlineWidth) >= Scr->PannerWidth)
X Scr->PannerOutlineX = Scr->PannerWidth-Scr->PannerOutlineWidth - 1;
X }
X if (vdtHeight < Scr->vdtHeight) {
X if ((Scr->PannerOutlineY+Scr->PannerOutlineHeight) >= Scr->PannerHeight)
X Scr->PannerOutlineY = Scr->PannerHeight-Scr->PannerOutlineHeight-1;
X }
X Scr->vdtWidth = vdtWidth;
X Scr->vdtHeight = vdtHeight;
X
X MoveDesktop(Scr->PannerOutlineX * Scr->PannerScale,
X Scr->PannerOutlineY * Scr->PannerScale);
X
X /* make it just a tad larger than requested */
X XResizeWindow(dpy, Scr->VirtualDesktop, vdtWidth + 2*Scr->PannerScale,
X vdtHeight + 2*Scr->PannerScale);
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * HandlePannerMove - prepare to move a small panner window
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XHandlePannerMove(ev, tmp_win)
XXButtonEvent *ev;
XTwmWindow *tmp_win;
X{
X int cancel;
X int x_root, y_root;
X unsigned objWidth, objHeight;
X int moving_frame;
X
X tmp_win->root = Scr->Panner;
X
X x_root = ev->x_root;
X y_root = ev->y_root;
X
X if (ev->window == tmp_win->virtualWindow) {
X moving_frame = True;
X objWidth = tmp_win->frame_width + 2*tmp_win->frame_bw;
X objHeight = tmp_win->frame_height + 2*tmp_win->frame_bw;
X }
X else {
X moving_frame - False;
X objWidth = tmp_win->icon_w_width + 2;
X objHeight = tmp_win->icon_w_height + 2;
X }
X
X StartMove(tmp_win, ev->window, tmp_win->title_height,
X &x_root, &y_root, &cancel, IN_PANNER, Scr->PannerScale,
X objWidth, objHeight, False, False);
X
X tmp_win->root = Scr->VirtualDesktop;
X
X if (!cancel) {
X if (moving_frame) {
X SetupWindow (tmp_win, x_root, y_root,
X tmp_win->frame_width, tmp_win->frame_height, -1);
X }
X else {
X MoveIcon(tmp_win, x_root, y_root);
X }
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ScrollTo - scroll the virtual desktop to a window of non of
X * the frame is visible
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XScrollTo(tmp_win)
XTwmWindow *tmp_win;
X{
X int x, y;
X int xr, yb;
X
X if (!tmp_win->sticky) {
X x = Scr->vdtPositionX;
X y = Scr->vdtPositionY;
X xr = x + Scr->MyDisplayWidth;
X yb = y + Scr->MyDisplayHeight;
X
X if ((tmp_win->frame_x + tmp_win->frame_width) <= x)
X x = tmp_win->frame_x;
X else if (tmp_win->frame_x >= xr)
X x = tmp_win->frame_x;
X
X if ((tmp_win->frame_y + tmp_win->frame_height) <= y)
X y = tmp_win->frame_y;
X else if (tmp_win->frame_y >= yb)
X y = tmp_win->frame_y;
X
X /* if we are going to scroll, we might as well do it in both
X * directions
X */
X if (x != Scr->vdtPositionX || y != Scr->vdtPositionY) {
X x = tmp_win->frame_x;
X y = tmp_win->frame_y;
X MoveDesktop(x, y);
X }
X }
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ScrollToQuadrant - scroll the virtual desktop to a the quadrant
X * that contains the client window.
X *
X * Returned Value:
X * None
X *
X ***********************************************************************
X */
X
Xvoid
XScrollToQuadrant(tmp_win)
XTwmWindow *tmp_win;
X{
X int x, y;
X int xr, yb;
X
X if (!tmp_win->sticky) {
X x = (tmp_win->frame_x / Scr->MyDisplayWidth) * Scr->MyDisplayWidth;
X y = (tmp_win->frame_y / Scr->MyDisplayHeight) * Scr->MyDisplayHeight;
X MoveDesktop(x, y);
X }
X}
SHAR_EOF
if test 24996 -ne "`wc -c < vdt.c`"
then
echo shar: error transmitting "vdt.c" '(should have been 24996 characters)'
fi
fi
if test -f 'vdt.h'
then
echo shar: will not over-write existing file "vdt.h"
else
echo extracting "vdt.h"
sed 's/^X//' >vdt.h <<'SHAR_EOF'
X/*****************************************************************************/
X/** Copyright 1990 by Solbourne Computer Inc. **/
X/** Longmont, Colorado **/
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/** name of Solbourne not be used in advertising **/
X/** in publicity pertaining to distribution of the software without **/
X/** specific, written prior permission. **/
X/** **/
X/** SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES WITH REGARD **/
X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
X/** ABILITY AND FITNESS, IN NO EVENT SHALL SOLBOURNE **/
X/** 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 * $XConsortium: vdt.c,v 1.140 90/03/23 11:42:33 jim Exp $
X *
X * Virtual Desktop includes
X *
X * 22-Aug-90 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#ifndef _VDT_
X#define _VDT_
X
X#define DEFAULT_PANNER_SCALE 20
X#define DEFAULT_PANNER_GEOMETRY "-0-0"
X
Xextern void InitVirtualDesktop();
Xextern void Set__SWM_ROOT();
Xextern void Set__SWM_VERSION();
Xextern void Remove__SWM_VERSION();
Xextern void MakePanner();
Xextern void MakeVirtualDesktop();
Xextern void MapFrame();
Xextern void UnmapFrame();
Xextern void RaiseFrame();
Xextern void LowerFrame();
Xextern void MapIcon();
Xextern void UnmapIcon();
Xextern void RaiseIcon();
Xextern void LowerIcon();
Xextern void MoveIcon();
Xextern void ResizeVirtual();
Xextern Window MakeVirtual();
Xextern void HandlePannerExpose();
Xextern void HandlePannerButtonPress();
Xextern void HandlePannerButtonRelease();
Xextern void HandlePannerMotionNotify();
Xextern void MoveDesktop();
Xextern void ScrollDesktop();
Xextern void ResizeDesktop();
Xextern void ScrollTo();
X
X#endif /* _VDT_ */
X
SHAR_EOF
if test 3074 -ne "`wc -c < vdt.h`"
then
echo shar: error transmitting "vdt.h" '(should have been 3074 characters)'
fi
fi
if test -f 'version.c'
then
echo shar: will not over-write existing file "version.c"
else
echo extracting "version.c"
sed 's/^X//' >version.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/* char *Version = "MIT X Consortium, R4"; */
Xchar *Version = "$Revision: 4.0 $";
X
SHAR_EOF
if test 2164 -ne "`wc -c < version.c`"
then
echo shar: error transmitting "version.c" '(should have been 2164 characters)'
fi
fi
if test -f 'version.h'
then
echo shar: will not over-write existing file "version.h"
else
echo extracting "version.h"
sed 's/^X//' >version.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 * $XConsortium: version.h,v 1.7 89/10/27 14:01:42 jim Exp $
X *
X * TWM version externs
X *
X * 8-Apr-88 Tom LaStrange Initial Version.
X *
X **********************************************************************/
X
X#ifndef _VERSION_
X#define _VERSION_
X
Xextern char *Version;
X
X#endif /* _VERSION_ */
SHAR_EOF
if test 2457 -ne "`wc -c < version.h`"
then
echo shar: error transmitting "version.h" '(should have been 2457 characters)'
fi
fi
# end of shell archive
exit 0
dan
----------------------------------------------------
O'Reilly && Associates argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list