v10i068: xlock, Part02/03
Patrick Naughton
naughton at Eng
Wed Nov 14 05:18:21 AEST 1990
Submitted-by: naughton at Eng (Patrick Naughton)
Posting-number: Volume 10, Issue 68
Archive-name: xlock/part02
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 3)."
# Contents: life.c resource.c
# Wrapped by naughton at wind on Tue Oct 30 11:26:50 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'life.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'life.c'\"
else
echo shar: Extracting \"'life.c'\" \(12699 characters\)
sed "s/^X//" >'life.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic char sccsid[] = "@(#)life.c 23.5 90/10/28 XLOCK SMI";
X#endif
X/*-
X * life.c - Conway's game of Life for the xlock X11 terminal locker.
X *
X * Copyright (c) 1989,90 by Sun Microsystems, Inc.
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation.
X *
X * This file is provided AS IS with no warranties of any kind. The author
X * shall have no liability with respect to the infringement of copyrights,
X * trade secrets or any patents by this file or any part thereof. In no
X * event will the author be liable for any lost revenue or profits or
X * other special, indirect and consequential damages.
X *
X * Comments and additions should be sent to the authors:
X *
X * flar at eng.sun.com and naughton at eng.sun.com
X *
X * James A. Graham
X * Patrick J. Naughton
X * MS 14-01
X * Windows and Graphics Group
X * Sun Microsystems, Inc.
X * 2550 Garcia Ave
X * Mountain View, CA 94043
X *
X * Revision History:
X * 29-Jul-90: support for multiple screens.
X * 07-Feb-90: remove bogus semi-colon after #include line.
X * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors.
X * 08-Oct-89: Moved seconds() to an extern.
X * 20-Sep-89: Written.
X */
X
X#include "xlock.h"
X#include "lifeicon.bit"
X
Xstatic XImage logo = {
X 0, 0, /* width, height */
X 0, XYBitmap, 0, /* xoffset, format, data */
X LSBFirst, 8, /* byte-order, bitmap-unit */
X LSBFirst, 8, 1 /* bitmap-bit-order, bitmap-pad, depth */
X};
X#define min(a, b) ((a)<(b)?(a):(b))
X#define MAXROWS 55
X#define MAXCOLS 44
X
Xtypedef struct {
X int shooter;
X int pixelmode;
X int xs;
X int ys;
X int xb;
X int yb;
X long startTime;
X long elapsedTime;
X int nrows;
X int ncols;
X int width;
X int height;
X unsigned char buffer[(MAXROWS + 2) * (MAXCOLS + 2) + 2];
X unsigned char tempbuf[MAXCOLS * 2];
X unsigned char agebuf[(MAXROWS + 2) * (MAXCOLS + 2)];
X} lifestruct;
X
Xstatic lifestruct lifes[MAXSCREENS];
Xstatic int icon_width,
X icon_height;
X
X/* Buffer stores the data for each cell. Each cell is stored as
X * 8 bits representing the presence of a critter in each of it's
X * surrounding 8 cells. There is an empty row and column around
X * the whole array to allow stores without bounds checking as well
X * as an extra row at the end for the fetches into tempbuf.
X *
X * Tempbuf stores the data for the next two rows so that we know
X * the state of those critter before he was modified by the fate
X * of the critters that have already been processed.
X *
X * Agebuf stores the age of each critter.
X */
X
X#define UPLT 0x01
X#define UP 0x02
X#define UPRT 0x04
X#define LT 0x08
X#define RT 0x10
X#define DNLT 0x20
X#define DN 0x40
X#define DNRT 0x80
X
X/* Fates is a lookup table for the fate of a critter. The 256
X * entries represent the 256 possible combinations of the 8
X * neighbor cells. Each entry is one of BIRTH (create a cell
X * or leave one alive), SAME (leave the cell alive or dead),
X * or DEATH (kill anything in the cell).
X */
X#define BIRTH 0
X#define SAME 1
X#define DEATH 2
Xstatic unsigned char fates[256];
Xstatic int initialized = 0;
X
Xstatic int patterns[][128] = {
X { /* EIGHT */
X -3, -3, -2, -3, -1, -3,
X -3, -2, -2, -2, -1, -2,
X -3, -1, -2, -1, -1, -1,
X 0, 0, 1, 0, 2, 0,
X 0, 1, 1, 1, 2, 1,
X 0, 2, 1, 2, 2, 2,
X 99
X },
X { /* PULSAR */
X 1, 1, 2, 1, 3, 1, 4, 1, 5, 1,
X 1, 2, 5, 2,
X 99
X },
X { /* BARBER */
X -7, -7, -6, -7,
X -7, -6, -5, -6,
X -5, -4, -3, -4,
X -3, -2, -1, -2,
X -1, 0, 1, 0,
X 1, 2, 3, 2,
X 3, 4, 5, 4,
X 4, 5, 5, 5,
X 99
X },
X { /* HERTZ */
X -2, -6, -1, -6,
X -2, -5, -1, -5,
X -7, -3, -6, -3, -2, -3, -1, -3, 0, -3, 1, -3, 5, -3, 6, -3,
X -7, -2, -5, -2, -3, -2, 2, -2, 4, -2, 6, -2,
X -5, -1, -3, -1, -2, -1, 2, -1, 4, -1,
X -7, 0, -5, 0, -3, 0, 2, 0, 4, 0, 6, 0,
X -7, 1, -6, 1, -2, 1, -1, 1, 0, 1, 1, 1, 5, 1, 6, 1,
X -2, 3, -1, 3,
X -2, 4, -1, 4,
X 99
X },
X { /* TUMBLER */
X -6, -6, -5, -6, 6, -6, 7, -6,
X -6, -5, -5, -5, 6, -5, 7, -5,
X -5, 5, 6, 5,
X -7, 6, -5, 6, 6, 6, 8, 6,
X -7, 7, -5, 7, 6, 7, 8, 7,
X -7, 8, -6, 8, 7, 8, 8, 8,
X 99
X },
X { /* PERIOD4 */
X -5, -8, -4, -8,
X -7, -7, -5, -7,
X -8, -6, -2, -6,
X -7, -5, -3, -5, -2, -5,
X -5, -3, -3, -3,
X -4, -2,
X 99
X },
X { /* PERIOD5 */
X -5, -8, -4, -8,
X -6, -7, -3, -7,
X -7, -6, -2, -6,
X -8, -5, -1, -5,
X -8, -4, -1, -4,
X -7, -3, -2, -3,
X -6, -2, -3, -2,
X -5, -1, -4, -1,
X 99
X },
X { /* PERIOD6 */
X -4, -8, -3, -8,
X -8, -7, -7, -7, -5, -7,
X -8, -6, -7, -6, -4, -6, -1, -6,
X -3, -5, -1, -5,
X -2, -4,
X -3, -2, -2, -2,
X -3, -1, -2, -1,
X 99
X },
X { /* PINWHEEL */
X -4, -8, -3, -8,
X -4, -7, -3, -7,
X -4, -5, -3, -5, -2, -5, -1, -5,
X -5, -4, -3, -4, 0, -4, 2, -4, 3, -4,
X -5, -3, -1, -3, 0, -3, 2, -3, 3, -3,
X -8, -2, -7, -2, -5, -2, -2, -2, 0, -2,
X -8, -1, -7, -1, -5, -1, 0, -1,
X -4, 0, -3, 0, -2, 0, -1, 0,
X -2, 2, -1, 2,
X -2, 3, -1, 3,
X 99
X },
X { /* ] */
X -1, -1, 0, -1, 1, -1,
X 0, 0, 1, 0,
X -1, 1, 0, 1, 1, 1,
X 99
X },
X { /* cc: */
X -3, -1, -2, -1, -1, -1, 1, -1, 2, -1, 3, -1,
X -3, 0, -2, 0, 1, 0, 2, 0,
X -3, 1, -2, 1, -1, 1, 1, 1, 2, 1, 3, 1,
X 99
X },
X { /* DOLBY */
X -3, -1, -2, -1, -1, -1, 1, -1, 2, -1, 3, -1,
X -3, 0, -2, 0, 2, 0, 3, 0,
X -3, 1, -2, 1, -1, 1, 1, 1, 2, 1, 3, 1,
X 99
X },
X { /* HORIZON */
X -15, 0, -14, 0, -13, 0, -12, 0, -11, 0,
X -10, 0, -9, 0, -8, 0, -7, 0, -6, 0,
X -5, 0, -4, 0, -3, 0, -2, 0, -1, 0,
X 4, 0, 3, 0, 2, 0, 1, 0, 0, 0,
X 9, 0, 8, 0, 7, 0, 6, 0, 5, 0,
X 14, 0, 13, 0, 12, 0, 11, 0, 10, 0,
X 99
X },
X { /* SHEAR */
X -7, -2, -6, -2, -5, -2, -4, -2, -3, -2,
X -2, -2, -1, -2, 0, -2, 1, -2, 2, -2,
X -5, -1, -4, -1, -3, -1, -2, -1, -1, -1,
X 0, -1, 1, -1, 2, -1, 3, -1, 4, -1,
X -3, 0, -2, 0, -1, 0, 0, 0, 1, 0,
X 2, 0, 3, 0, 4, 0, 5, 0, 6, 0,
X -10, 1, -9, 1, -8, 1, -7, 1, -6, 1,
X -5, 1, -4, 1, -3, 1, -2, 1, -1, 1,
X -10, 2, -9, 2, -8, 2, -7, 2, -6, 2,
X -5, 2, -4, 2, -3, 2, -2, 2, -1, 2,
X 99
X },
X { /* VERTIGO */
X 0, -7,
X 0, -6,
X 0, -5,
X 0, -4,
X 0, -3,
X 0, -2,
X 0, -1,
X 0, 0,
X 0, 7,
X 0, 6,
X 0, 5,
X 0, 4,
X 0, 3,
X 0, 2,
X 0, 1,
X 99
X },
X { /* CROSSBAR */
X -5, 0, -4, 0, -3, 0, -2, 0, -1, 0, 4, 0, 3, 0, 2, 0, 1, 0, 0, 0,
X 99
X },
X { /* GOALPOSTS */
X -8, -7, 8, -7,
X -8, -6, 8, -6,
X -8, -5, 8, -5,
X -8, -4, 8, -4,
X -8, -3, 8, -3,
X -8, -2, 8, -2,
X -8, -1, 8, -1,
X -8, 0, 8, 0,
X -8, 1, 8, 1,
X -8, 2, 8, 2,
X -8, 3, 8, 3,
X -8, 4, 8, 4,
X -8, 5, 8, 5,
X -8, 6, 8, 6,
X -8, 7, 8, 7,
X 99
X },
X { /* \ */
X -8, -8, -7, -8,
X -7, -7, -6, -7,
X -6, -6, -5, -6,
X -5, -5, -4, -5,
X -4, -4, -3, -4,
X -3, -3, -2, -3,
X -2, -2, -1, -2,
X -1, -1, 0, -1,
X 0, 0, 1, 0,
X 1, 1, 2, 1,
X 2, 2, 3, 2,
X 3, 3, 4, 3,
X 4, 4, 5, 4,
X 5, 5, 6, 5,
X 6, 6, 7, 6,
X 7, 7, 8, 7,
X 99
X },
X { /* LABYRINTH */
X -4, -4, -3, -4, -2, -4, -1, -4, 0, -4, 1, -4, 2, -4, 3, -4, 4, -4,
X -4, -3, 0, -3, 4, -3,
X -4, -2, -2, -2, -1, -2, 0, -2, 1, -2, 2, -2, 4, -2,
X -4, -1, -2, -1, 2, -1, 4, -1,
X -4, 0, -2, 0, -1, 0, 0, 0, 1, 0, 2, 0, 4, 0,
X -4, 1, -2, 1, 2, 1, 4, 1,
X -4, 2, -2, 2, -1, 2, 0, 2, 1, 2, 2, 2, 4, 2,
X -4, 3, 0, 3, 4, 3,
X -4, 4, -3, 4, -2, 4, -1, 4, 0, 4, 1, 4, 2, 4, 3, 4, 4, 4,
X 99
X }
X};
X
X#define NPATS (sizeof patterns / sizeof patterns[0])
X
Xstatic void
Xdrawcell(win, row, col)
X Window win;
X int row,
X col;
X{
X lifestruct *lp = &lifes[screen];
X
X XSetForeground(dsp, Scr[screen].gc, WhitePixel(dsp, screen));
X if (!mono && Scr[screen].npixels > 2) {
X unsigned char *loc = lp->buffer + ((row + 1) * (lp->ncols + 2)) + col + 1;
X unsigned char *ageptr = lp->agebuf + (loc - lp->buffer);
X unsigned char age = *ageptr;
X
X if (++age >= Scr[screen].npixels)
X age = 0;
X XSetForeground(dsp, Scr[screen].gc, Scr[screen].pixels[age]);
X *ageptr = age + 1;
X }
X if (lp->pixelmode)
X XFillRectangle(dsp, win, Scr[screen].gc,
X lp->xb + lp->xs * col, lp->yb + lp->ys * row, lp->xs, lp->ys);
X else
X XPutImage(dsp, win, Scr[screen].gc, &logo,
X 0, 0, lp->xb + lp->xs * col, lp->yb + lp->ys * row,
X icon_width, icon_height);
X}
X
Xstatic void
Xerasecell(win, row, col)
X Window win;
X int row,
X col;
X{
X lifestruct *lp = &lifes[screen];
X XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
X XFillRectangle(dsp, win, Scr[screen].gc,
X lp->xb + lp->xs * col, lp->yb + lp->ys * row, lp->xs, lp->ys);
X}
X
Xstatic void
Xspawn(loc)
X unsigned char *loc;
X{
X lifestruct *lp = &lifes[screen];
X *(loc - lp->ncols - 2 - 1) |= UPLT;
X *(loc - lp->ncols - 2) |= UP;
X *(loc - lp->ncols - 2 + 1) |= UPRT;
X *(loc - 1) |= LT;
X *(loc + 1) |= RT;
X *(loc + lp->ncols + 2 - 1) |= DNLT;
X *(loc + lp->ncols + 2) |= DN;
X *(loc + lp->ncols + 2 + 1) |= DNRT;
X *(lp->agebuf + (loc - lp->buffer)) = 0;
X}
X
Xstatic void
Xkill(loc)
X unsigned char *loc;
X{
X lifestruct *lp = &lifes[screen];
X *(loc - lp->ncols - 2 - 1) &= ~UPLT;
X *(loc - lp->ncols - 2) &= ~UP;
X *(loc - lp->ncols - 2 + 1) &= ~UPRT;
X *(loc - 1) &= ~LT;
X *(loc + 1) &= ~RT;
X *(loc + lp->ncols + 2 - 1) &= ~DNLT;
X *(loc + lp->ncols + 2) &= ~DN;
X *(loc + lp->ncols + 2 + 1) &= ~DNRT;
X}
X
Xstatic void
Xsetcell(win, row, col)
X Window win;
X int row;
X int col;
X{
X lifestruct *lp = &lifes[screen];
X unsigned char *loc;
X
X loc = lp->buffer + ((row + 1) * (lp->ncols + 2)) + col + 1;
X spawn(loc);
X drawcell(win, row, col);
X}
X
Xvoid
Xdrawlife(win)
X Window win;
X{
X unsigned char *loc,
X *temploc;
X int row,
X col,
X cells = 0;
X unsigned char fate;
X lifestruct *lp = &lifes[screen];
X
X loc = lp->buffer + lp->ncols + 2 + 1;
X temploc = lp->tempbuf;
X /* copy the first 2 rows to the tempbuf */
X bcopy(loc, temploc, lp->ncols);
X bcopy(loc + lp->ncols + 2, temploc + lp->ncols, lp->ncols);
X for (row = 0; row < lp->nrows; ++row) {
X for (col = 0; col < lp->ncols; ++col) {
X fate = fates[*temploc];
X *temploc = *(loc + (lp->ncols + 2) * 2);
X switch (fate) {
X case BIRTH:
X if (!(*(loc + 1) & RT)) {
X spawn(loc);
X }
X /* NO BREAK */
X case SAME:
X if (*(loc + 1) & RT) {
X ++cells;
X drawcell(win, row, col);
X }
X break;
X case DEATH:
X if (*(loc + 1) & RT) {
X kill(loc);
X erasecell(win, row, col);
X }
X break;
X }
X loc++;
X temploc++;
X }
X loc += 2;
X if (temploc >= lp->tempbuf + lp->ncols * 2)
X temploc = lp->tempbuf;
X }
X if (!cells)
X lp->startTime = 0;
X lp->elapsedTime = seconds() - lp->startTime;
X
X if (!lp->shooter && lp->elapsedTime > timeout / 2) {
X setcell(win, 0, 2);
X setcell(win, 1, 2);
X setcell(win, 2, 2);
X setcell(win, 2, 1);
X setcell(win, 1, 0);
X lp->shooter = 1;
X }
X}
X
Xstatic void
Xinit_fates()
X{
X int i,
X bits,
X neighbors;
X
X for (i = 0; i < 256; i++) {
X neighbors = 0;
X for (bits = i; bits; bits &= (bits - 1))
X neighbors++;
X if (neighbors == 3)
X fates[i] = BIRTH;
X else if (neighbors == 2)
X fates[i] = SAME;
X else
X fates[i] = DEATH;
X }
X}
X
X
Xvoid
Xinitlife(win)
X Window win;
X{
X int row,
X col;
X int *patptr;
X XWindowAttributes xgwa;
X lifestruct *lp = &lifes[screen];
X
X lp->startTime = seconds();
X lp->shooter = 0;
X icon_width = lifeicon_width;
X icon_height = lifeicon_height;
X
X if (!initialized) {
X initialized = 1;
X srandom(time((long *) 0));
X init_fates();
X logo.data = lifeicon_bits;
X logo.width = icon_width;
X logo.height = icon_height;
X logo.bytes_per_line = (icon_width + 7) / 8;
X }
X XGetWindowAttributes(dsp, win, &xgwa);
X lp->width = xgwa.width;
X lp->height = xgwa.height;
X lp->pixelmode = (lp->width < 4 * icon_width);
X if (lp->pixelmode) {
X lp->ncols = 32;
X lp->nrows = 32;
X } else {
X lp->ncols = min(lp->width / icon_width, MAXCOLS);
X lp->nrows = min(lp->height / icon_height, MAXROWS);
X }
X lp->xs = lp->width / lp->ncols;
X lp->ys = lp->height / lp->nrows;
X lp->xb = (lp->width - lp->xs * lp->ncols) / 2;
X lp->yb = (lp->height - lp->ys * lp->nrows) / 2;
X
X XSetForeground(dsp, Scr[screen].gc, BlackPixel(dsp, screen));
X XFillRectangle(dsp, win, Scr[screen].gc, 0, 0, lp->width, lp->height);
X
X bzero(lp->buffer, sizeof(lp->buffer));
X patptr = &patterns[random() % NPATS][0];
X while ((col = *patptr++) != 99) {
X row = *patptr++;
X col += lp->ncols / 2;
X row += lp->nrows / 2;
X setcell(win, row, col);
X }
X}
END_OF_FILE
if test 12699 -ne `wc -c <'life.c'`; then
echo shar: \"'life.c'\" unpacked with wrong size!
fi
# end of 'life.c'
fi
if test -f 'resource.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'resource.c'\"
else
echo shar: Extracting \"'resource.c'\" \(19605 characters\)
sed "s/^X//" >'resource.c' <<'END_OF_FILE'
X#ifndef lint
Xstatic char sccsid[] = "@(#)resource.c 1.12 90/10/30 XLOCK SMI";
X#endif
X/*-
X * resource.c - resource management for xlock.
X *
X * Copyright (c) 1988-90 by Patrick Naughton and Sun Microsystems, Inc.
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted,
X * provided that the above copyright notice appear in all copies and that
X * both that copyright notice and this permission notice appear in
X * supporting documentation.
X *
X * This file is provided AS IS with no warranties of any kind. The author
X * shall have no liability with respect to the infringement of copyrights,
X * trade secrets or any patents by this file or any part thereof. In no
X * event will the author be liable for any lost revenue or profits or
X * other special, indirect and consequential damages.
X *
X * Comments and additions should be sent to the author:
X *
X * naughton at eng.sun.com
X *
X * Patrick J. Naughton
X * MS 14-01
X * Windows and Graphics Group
X * Sun Microsystems, Inc.
X * 2550 Garcia Ave
X * Mountain View, CA 94043
X *
X * Revision History:
X * 29-Oct-90: Added #include <ctype.h> for missing isupper() on some OS revs.
X * moved -mode option, reordered Xrm database evaluation.
X * 28-Oct-90: Added text strings.
X * 26-Oct-90: Fix bug in mode specific options.
X * 31-Jul-90: Fix ':' handling in parsefilepath
X * 07-Jul-90: Created from resource work in xlock.c
X *
X */
X
X#include <stdio.h>
X#include "xlock.h"
X#include <netdb.h>
X#include <math.h>
X#include <ctype.h>
X
X#include <X11/Xresource.h>
X
X/*
X * Declare external interface routines for supported screen savers.
X */
X
Xextern void inithop();
Xextern void drawhop();
X
Xextern void initlife();
Xextern void drawlife();
X
Xextern void initqix();
Xextern void drawqix();
X
Xextern void initimage();
Xextern void drawimage();
X
Xextern void initblank();
Xextern void drawblank();
X
Xextern void initswarm();
Xextern void drawswarm();
X
Xtypedef struct {
X char *cmdline_arg;
X void (*lp_init) ();
X void (*lp_callback) ();
X char *desc;
X} LockStruct;
X
Xstatic LockStruct LockProcs[] = {
X {"hop", inithop, drawhop, "Hopalong iterated fractals"},
X {"qix", initqix, drawqix, "Spinning lines a la Qix(tm)"},
X {"image", initimage, drawimage, "Random bouncing image"},
X {"life", initlife, drawlife, "Conway's game of Life"},
X {"swarm", initswarm, drawswarm, "Swarm of bees"},
X {"blank", initblank, drawblank, "Blank screen"},
X};
X#define NUMPROCS (sizeof LockProcs / sizeof LockProcs[0])
X
X#ifndef MAXHOSTNAMELEN
X#define MAXHOSTNAMELEN 64 /* SunOS 3.5 does not define this */
X#endif
X
Xextern char *getenv();
X
X#ifndef DEF_FILESEARCHPATH
X#define DEF_FILESEARCHPATH "/usr/lib/X11/%T/%N%S"
X#endif
X#define DEF_DISPLAY ":0"
X#define DEF_MODE "hop"
X#define DEF_FONT "-*-lucida-medium-r-normal-sans-24-*-*-*-*-*-*-*"
X#define DEF_BG "White"
X#define DEF_FG "Black"
X#define DEF_NAME "Name: "
X#define DEF_PASS "Password: "
X#define DEF_INFO "Enter password to unlock; select icon to lock."
X#define DEF_VALID "Validating login..."
X#define DEF_INVALID "Invalid login."
X#define DEF_TIMEOUT "30" /* secs till password entry times out */
X#define DEF_BC "100" /* vectors (or whatever) per batch */
X#define DEF_DELAY "1000" /* microseconds between batches */
X#define DEF_NICE "10" /* xlock process nicelevel */
X#define DEF_SAT "1.0" /* color ramp saturation 0->1 */
X#define CLASSNAME "XLock"
X
Xstatic XrmOptionDescRec genTable[] = {
X {"-mode", ".mode", XrmoptionSepArg, (caddr_t) NULL},
X {"-nolock", ".nolock", XrmoptionNoArg, (caddr_t) "on"},
X {"+nolock", ".nolock", XrmoptionNoArg, (caddr_t) "off"},
X {"-remote", ".remote", XrmoptionNoArg, (caddr_t) "on"},
X {"+remote", ".remote", XrmoptionNoArg, (caddr_t) "off"},
X {"-mono", ".mono", XrmoptionNoArg, (caddr_t) "on"},
X {"+mono", ".mono", XrmoptionNoArg, (caddr_t) "off"},
X {"-allowroot", ".allowroot", XrmoptionNoArg, (caddr_t) "on"},
X {"+allowroot", ".allowroot", XrmoptionNoArg, (caddr_t) "off"},
X {"-enablesaver", ".enablesaver", XrmoptionNoArg, (caddr_t) "on"},
X {"+enablesaver", ".enablesaver", XrmoptionNoArg, (caddr_t) "off"},
X {"-allowaccess", ".allowaccess", XrmoptionNoArg, (caddr_t) "on"},
X {"+allowaccess", ".allowaccess", XrmoptionNoArg, (caddr_t) "off"},
X {"-echokeys", ".echokeys", XrmoptionNoArg, (caddr_t) "on"},
X {"+echokeys", ".echokeys", XrmoptionNoArg, (caddr_t) "off"},
X {"-v", ".verbose", XrmoptionNoArg, (caddr_t) "on"},
X {"+v", ".verbose", XrmoptionNoArg, (caddr_t) "off"},
X {"-nice", ".nice", XrmoptionSepArg, (caddr_t) NULL},
X {"-timeout", ".timeout", XrmoptionSepArg, (caddr_t) NULL},
X {"-font", ".font", XrmoptionSepArg, (caddr_t) NULL},
X {"-bg", ".background", XrmoptionSepArg, (caddr_t) NULL},
X {"-fg", ".foreground", XrmoptionSepArg, (caddr_t) NULL},
X {"-background", ".background", XrmoptionSepArg, (caddr_t) NULL},
X {"-foreground", ".foreground", XrmoptionSepArg, (caddr_t) NULL},
X {"-name", ".name", XrmoptionSepArg, (caddr_t) NULL},
X {"-password", ".password", XrmoptionSepArg, (caddr_t) NULL},
X {"-info", ".info", XrmoptionSepArg, (caddr_t) NULL},
X {"-validate", ".validate", XrmoptionSepArg, (caddr_t) NULL},
X {"-invalid", ".invalid", XrmoptionSepArg, (caddr_t) NULL},
X};
X#define genEntries (sizeof genTable / sizeof genTable[0])
X
Xstatic XrmOptionDescRec modeTable[] = {
X {"-delay", ".delay", XrmoptionSepArg, (caddr_t) NULL},
X {"-batchcount", ".batchcount", XrmoptionSepArg, (caddr_t) NULL},
X {"-saturation", ".saturation", XrmoptionSepArg, (caddr_t) NULL},
X};
X#define modeEntries (sizeof modeTable / sizeof modeTable[0])
X
Xstatic XrmOptionDescRec cmdlineTable[] = {
X {"-display", ".display", XrmoptionSepArg, (caddr_t) NULL},
X {"-nolock", ".nolock", XrmoptionNoArg, (caddr_t) "on"},
X {"+nolock", ".nolock", XrmoptionNoArg, (caddr_t) "off"},
X {"-remote", ".remote", XrmoptionNoArg, (caddr_t) "on"},
X {"+remote", ".remote", XrmoptionNoArg, (caddr_t) "off"},
X};
X#define cmdlineEntries (sizeof cmdlineTable / sizeof cmdlineTable[0])
X
X
Xtypedef struct {
X char *opt;
X char *desc;
X} OptionStruct;
X
Xstatic OptionStruct opDesc[] = {
X {"-help", "print out this message"},
X {"-display displayname", "X server to contact"},
X {"-/+mono", "turn on/off monochrome override"},
X {"-/+nolock", "turn on/off no password required mode"},
X {"-/+remote", "turn on/off remote host access"},
X {"-/+allowroot", "turn on/off allow root password mode"},
X {"-/+enablesaver", "turn on/off enable X server screen saver"},
X {"-/+allowaccess", "turn on/off allow new clients to connect"},
X {"-/+echokeys", "turn on/off echo '?' for each password key"},
X {"-/+v", "turn on/off verbose mode"},
X {"-delay usecs", "microsecond delay between screen updates"},
X {"-batchcount num", "number of things per batch"},
X {"-nice level", "nice level for xlock process"},
X {"-timeout seconds", "number of seconds before password times out"},
X {"-saturation value", "saturation of color ramp"},
X {"-font fontname", "font to use for password prompt"},
X {"-bg color", "background color to use for password prompt"},
X {"-fg color", "foreground color to use for password prompt"},
X {"-name string", "text string to use for Name prompt"},
X {"-password string", "text string to use for Password prompt"},
X {"-info string", "text string to use for instructions"},
X {"-validate string", "text string to use for validating password message"},
X {"-invalid string", "text string to use for invalid password message"},
X};
X#define opDescEntries (sizeof opDesc / sizeof opDesc[0])
X
Xchar *display;
Xchar *mode;
Xchar *fontname;
Xchar *background;
Xchar *foreground;
Xchar *text_name;
Xchar *text_pass;
Xchar *text_info;
Xchar *text_valid;
Xchar *text_invalid;
Xfloat saturation;
Xint nicelevel;
Xint delay;
Xint batchcount;
Xint timeout;
XBool mono;
XBool nolock;
XBool remote;
XBool allowroot;
XBool enablesaver;
XBool allowaccess;
XBool echokeys;
XBool verbose;
X
X#define t_String 0
X#define t_Float 1
X#define t_Int 2
X#define t_Bool 3
X
Xtypedef struct {
X caddr_t *var;
X char *name;
X char *class;
X char *def;
X int type;
X} argtype;
X
Xstatic argtype genvars[] = {
X {(caddr_t *) &fontname, "font", "Font", DEF_FONT, t_String},
X {(caddr_t *) &background, "background", "Background", DEF_BG, t_String},
X {(caddr_t *) &foreground, "foreground", "Foreground", DEF_FG, t_String},
X {(caddr_t *) &text_name, "name", "Name", DEF_NAME, t_String},
X {(caddr_t *) &text_pass, "password", "Password", DEF_PASS, t_String},
X {(caddr_t *) &text_info, "info", "Info", DEF_INFO, t_String},
X {(caddr_t *) &text_valid, "validate", "Validate", DEF_VALID, t_String},
X {(caddr_t *) &text_invalid, "invalid", "Invalid", DEF_INVALID, t_String},
X {(caddr_t *) &nicelevel, "nice", "Nice", DEF_NICE, t_Int},
X {(caddr_t *) &timeout, "timeout", "Timeout", DEF_TIMEOUT, t_Int},
X {(caddr_t *) &mono, "mono", "Mono", "off", t_Bool},
X {(caddr_t *) &nolock, "nolock", "NoLock", "off", t_Bool},
X {(caddr_t *) &remote, "remote", "Remote", "off", t_Bool},
X {(caddr_t *) &allowroot, "allowroot", "AllowRoot", "off", t_Bool},
X {(caddr_t *) &enablesaver, "enablesaver", "EnableSaver", "off", t_Bool},
X {(caddr_t *) &allowaccess, "allowaccess", "AllowAccess", "off", t_Bool},
X {(caddr_t *) &echokeys, "echokeys", "EchoKeys", "off", t_Bool},
X {(caddr_t *) &verbose, "verbose", "Verbose", "off", t_Bool},
X};
X#define NGENARGS (sizeof genvars / sizeof genvars[0])
X
Xstatic argtype modevars[] = {
X {(caddr_t *) &saturation, "saturation", "Saturation", DEF_SAT, t_Float},
X {(caddr_t *) &delay, "delay", "Delay", DEF_DELAY, t_Int},
X {(caddr_t *) &batchcount, "batchcount", "BatchCount", DEF_BC, t_Int},
X};
X#define NMODEARGS (sizeof modevars / sizeof modevars[0])
X
X
Xstatic void
XSyntax(badOption)
X char *badOption;
X{
X int col,
X len,
X i;
X
X fprintf(stderr, "%s: bad command line option \"%s\"\n\n",
X ProgramName, badOption);
X
X fprintf(stderr, "usage: %s", ProgramName);
X col = 8 + strlen(ProgramName);
X for (i = 0; i < opDescEntries; i++) {
X len = 3 + strlen(opDesc[i].opt); /* space [ string ] */
X if (col + len > 79) {
X fprintf(stderr, "\n "); /* 3 spaces */
X col = 3;
X }
X fprintf(stderr, " [%s]", opDesc[i].opt);
X col += len;
X }
X
X len = 8 + strlen(LockProcs[0].cmdline_arg);
X if (col + len > 79) {
X fprintf(stderr, "\n "); /* 3 spaces */
X col = 3;
X }
X fprintf(stderr, " [-mode %s", LockProcs[0].cmdline_arg);
X col += len;
X for (i = 1; i < NUMPROCS; i++) {
X len = 3 + strlen(LockProcs[i].cmdline_arg);
X if (col + len > 79) {
X fprintf(stderr, "\n "); /* 3 spaces */
X col = 3;
X }
X fprintf(stderr, " | %s", LockProcs[i].cmdline_arg);
X col += len;
X }
X fprintf(stderr, "]\n");
X
X fprintf(stderr, "\nType %s -help for a full description.\n\n",
X ProgramName);
X exit(1);
X}
X
Xstatic void
XHelp()
X{
X int i;
X
X fprintf(stderr, "usage:\n %s [-options ...]\n\n", ProgramName);
X fprintf(stderr, "where options include:\n");
X for (i = 0; i < opDescEntries; i++) {
X fprintf(stderr, " %-28s %s\n", opDesc[i].opt, opDesc[i].desc);
X }
X
X fprintf(stderr, " %-28s %s\n", "-mode mode", "animation mode");
X fprintf(stderr, " where mode is one of:\n");
X for (i = 0; i < NUMPROCS; i++) {
X fprintf(stderr, " %-23s %s\n",
X LockProcs[i].cmdline_arg, LockProcs[i].desc);
X }
X putc('\n', stderr);
X
X exit(0);
X}
X
X
Xstatic void
XLowerString(s)
X char *s;
X{
X
X while (*s) {
X if (isupper(*s))
X *s += ('a' - 'A');
X s++;
X }
X}
X
Xstatic void
XGetResource(database, parentname, parentclass,
X name, class, valueType, def, valuep)
X XrmDatabase database;
X char *parentname;
X char *parentclass;
X char *name;
X char *class;
X int valueType;
X char *def;
X caddr_t *valuep; /* RETURN */
X{
X char *type;
X XrmValue value;
X char *string;
X char buffer[1024];
X char fullname[1024];
X char fullclass[1024];
X int len;
X
X sprintf(fullname, "%s.%s", parentname, name);
X sprintf(fullclass, "%s.%s", parentclass, class);
X if (XrmGetResource(database, fullname, fullclass, &type, &value)) {
X string = value.addr;
X len = value.size;
X } else {
X string = def;
X len = strlen(string);
X }
X (void) strncpy(buffer, string, sizeof(buffer));
X buffer[sizeof(buffer) - 1] = '\0';
X
X switch (valueType) {
X case t_String:
X {
X char *s = (char *) malloc(len + 1);
X if (s == (char *) NULL)
X error("%s: GetResource - couldn't allocate memory");
X (void) strncpy(s, string, len);
X s[len] = '\0';
X *((char **) valuep) = s;
X }
X break;
X case t_Bool:
X LowerString(buffer);
X *((int *) valuep) = (!strcmp(buffer, "true") ||
X !strcmp(buffer, "on") ||
X !strcmp(buffer, "enabled") ||
X !strcmp(buffer, "yes")) ? True : False;
X break;
X case t_Int:
X *((int *) valuep) = atoi(buffer);
X break;
X case t_Float:
X *((float *) valuep) = (float) atof(buffer);
X break;
X }
X}
X
X
Xstatic XrmDatabase
Xparsefilepath(xfilesearchpath, TypeName, ClassName)
X char *xfilesearchpath;
X char *TypeName;
X char *ClassName;
X{
X XrmDatabase database = NULL;
X char appdefaults[1024];
X char *src;
X char *dst;
X
X src = xfilesearchpath;
X appdefaults[0] = '\0';
X dst = appdefaults;
X while (1) {
X if (*src == '%') {
X src++;
X switch (*src) {
X case '%':
X case ':':
X *dst++ = *src++;
X *dst = '\0';
X break;
X case 'T':
X (void) strcat(dst, TypeName);
X src++;
X dst += strlen(TypeName);
X break;
X case 'N':
X (void) strcat(dst, ClassName);
X src++;
X dst += strlen(ClassName);
X break;
X case 'S':
X src++;
X break;
X default:
X src++;
X break;
X }
X } else if (*src == ':') {
X database = XrmGetFileDatabase(appdefaults);
X if (database == NULL) {
X dst = appdefaults;
X src++;
X } else
X break;
X } else if (*src == '\0') {
X database = XrmGetFileDatabase(appdefaults);
X break;
X } else {
X *dst++ = *src++;
X *dst = '\0';
X }
X }
X return database;
X}
X
X
Xstatic void
Xopen_display()
X{
X if (display != NULL) {
X extern char *strchr();
X char *colon = strchr(display, ':');
X int n = colon - display;
X
X if (colon == NULL)
X error("%s: Malformed -display argument, \"%s\"\n", display);
X
X /*
X * only restrict access to other displays if we are locking and if the
X * Remote resource is not set.
X */
X if (nolock)
X remote = True;
X if (!remote && n
X && strncmp(display, "unix", n)
X && strncmp(display, "localhost", n)) {
X char hostname[MAXHOSTNAMELEN];
X struct hostent *host;
X char **hp;
X int badhost = 1;
X
X if (gethostname(hostname, MAXHOSTNAMELEN))
X error("%s: Can't get local hostname.\n");
X
X if (!(host = gethostbyname(hostname)))
X error("%s: Can't get hostbyname.\n");
X
X if (strncmp(display, host->h_name, n)) {
X for (hp = host->h_aliases; *hp; hp++) {
X if (!strncmp(display, *hp, n)) {
X badhost = 0;
X break;
X }
X }
X if (badhost) {
X *colon = (char) 0;
X error("%s: can't lock %s's display\n", display);
X }
X }
X }
X } else
X display = ":0.0";
X if (!(dsp = XOpenDisplay(display)))
X error("%s: unable to open display %s.\n", display);
X}
X
Xvoid
Xprintvar(class, var)
X char *class;
X argtype var;
X{
X switch (var.type) {
X case t_String:
X fprintf(stderr, "%s.%s: %s\n",
X class, var.name, *((char **) var.var));
X break;
X case t_Bool:
X fprintf(stderr, "%s.%s: %s\n",
X class, var.name, *((int *) var.var)
X ? "True" : "False");
X break;
X case t_Int:
X fprintf(stderr, "%s.%s: %d\n",
X class, var.name, *((int *) var.var));
X break;
X case t_Float:
X fprintf(stderr, "%s.%s: %f\n",
X class, var.name, *((float *) var.var));
X break;
X }
X}
X
X
Xvoid
XGetResources(argc, argv)
X int argc;
X char *argv[];
X{
X XrmDatabase RDB = NULL;
X XrmDatabase modeDB = NULL;
X XrmDatabase cmdlineDB = NULL;
X XrmDatabase generalDB = NULL;
X XrmDatabase homeDB = NULL;
X XrmDatabase applicationDB = NULL;
X XrmDatabase serverDB = NULL;
X char modename[1024];
X char modeclass[1024];
X char *env;
X char *serverString;
X int i;
X
X XrmInitialize();
X
X env = getenv("XFILESEARCHPATH");
X applicationDB = parsefilepath(env ? env : DEF_FILESEARCHPATH,
X "app-defaults", CLASSNAME);
X
X XrmParseCommand(&cmdlineDB, cmdlineTable, cmdlineEntries, ProgramName,
X &argc, argv);
X
X (void) XrmMergeDatabases(applicationDB, &RDB);
X (void) XrmMergeDatabases(cmdlineDB, &RDB);
X
X env = getenv("DISPLAY");
X GetResource(RDB, ProgramName, CLASSNAME, "display", "Display", t_String,
X env ? env : DEF_DISPLAY, &display);
X GetResource(RDB, ProgramName, CLASSNAME, "nolock", "NoLock", t_Bool,
X "off", (caddr_t *) &nolock);
X GetResource(RDB, ProgramName, CLASSNAME, "remote", "Remote", t_Bool,
X "off", (caddr_t *) &remote);
X
X open_display();
X serverString = XResourceManagerString(dsp);
X if (serverString) {
X serverDB = XrmGetStringDatabase(serverString);
X (void) XrmMergeDatabases(serverDB, &RDB);
X } else {
X char buf[1024];
X env = getenv("HOME");
X sprintf(buf, "%s/.Xdefaults", env ? env : "");
X homeDB = XrmGetFileDatabase(buf);
X (void) XrmMergeDatabases(homeDB, &RDB);
X }
X
X XrmParseCommand(&generalDB, genTable, genEntries, ProgramName, &argc, argv);
X (void) XrmMergeDatabases(generalDB, &RDB);
X
X GetResource(RDB, ProgramName, CLASSNAME, "mode", "Mode", t_String,
X DEF_MODE, (caddr_t *) &mode);
X sprintf(modename, "%s.%s", ProgramName, mode);
X sprintf(modeclass, "%s.%s", CLASSNAME, mode);
X
X XrmParseCommand(&modeDB, modeTable, modeEntries, modeclass, &argc, argv);
X (void) XrmMergeDatabases(modeDB, &RDB);
X
X /* Parse the rest of the command line */
X for (argc--, argv++; argc > 0; argc--, argv++) {
X if (**argv != '-')
X Syntax(*argv);
X switch (argv[0][1]) {
X case 'h':
X Help();
X /* NOTREACHED */
X default:
X Syntax(*argv);
X /* NOTREACHED */
X }
X }
X
X /* the RDB is set, now query load the variables from the database */
X
X for (i = 0; i < NGENARGS; i++)
X GetResource(RDB, ProgramName, CLASSNAME,
X genvars[i].name, genvars[i].class,
X genvars[i].type, genvars[i].def, genvars[i].var);
X
X for (i = 0; i < NMODEARGS; i++)
X GetResource(RDB, modename, modeclass,
X modevars[i].name, modevars[i].class,
X modevars[i].type, modevars[i].def, modevars[i].var);
X
X (void) XrmDestroyDatabase(RDB);
X
X if (verbose) {
X for (i = 0; i < NGENARGS; i++)
X printvar(ProgramName, genvars[i]);
X for (i = 0; i < NMODEARGS; i++)
X printvar(modename, modevars[i]);
X }
X}
X
X
XCheckResources()
X{
X int i;
X
X if (batchcount < 1)
X Syntax("-batchcount argument must be positive.");
X if (saturation < 0.0 || saturation > 1.0)
X Syntax("-saturation argument must be between 0.0 and 1.0.");
X
X for (i = 0; i < NUMPROCS; i++) {
X if (!strncmp(LockProcs[i].cmdline_arg, mode, strlen(mode))) {
X init = LockProcs[i].lp_init;
X callback = LockProcs[i].lp_callback;
X break;
X }
X }
X if (i == NUMPROCS) {
X fprintf(stderr, "Unknown mode: ");
X Syntax(mode);
X }
X}
END_OF_FILE
if test 19605 -ne `wc -c <'resource.c'`; then
echo shar: \"'resource.c'\" unpacked with wrong size!
fi
# end of 'resource.c'
fi
echo shar: End of archive 2 \(of 3\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 3 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
dan
----------------------------------------------------
O'Reilly && Associates argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
--
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