tkacik@kyzyl.mi.org (Tom Tkacik) (06/08/91)
Submitted-by: tkacik@kyzyl.mi.org (Tom Tkacik) Posting-number: Volume 1, Issue 28 Archive-name: moire/part01 Here is the latest version of moire. It now generates more patterns, including pentagrams and triangles. And it has fixed the iswind() problem. This just seemes like a good time to repost this. -- Tom Tkacik | tkacik@kyzyl.mi.org | To rent this space, call 1-800-555-QUIP. tkacik@hobbes.cs.gmr.com | #--------------------------------CUT HERE------------------------------------- #! /bin/sh # # This is a shell archive. Save this into a file, edit it # and delete all lines above this comment. Then give this # file to sh by executing the command "sh file". The files # will be extracted into the current directory owned by # you with default permissions. # echo 'x - Makefile' if test -f Makefile; then echo 'shar: not overwriting Makefile'; else sed 's/^X//' << '________This_Is_The_END________' > Makefile X# X# for gcc uncomment the following two lines X#CC = gcc X#GNULIB=/usr/local/lib/gcc-gnulib X XLDFLAGS = -s XSHAREDLIB=/lib/crt0s.o /lib/shlib.ifile X XCFLAGS = -O X XNAME = moire XDIR = /usr/games XSRC = moire.c line.c prewinit.c XOBJ = moire.o line.o prewinit.o X X$(NAME): $(OBJ) X $(LD) $(LDFLAGS) $(SHAREDLIB) $(OBJ) $(GNULIB) -o moire X Xinstall: X mv $(NAME) $(DIR)/$(NAME) X chgrp bin $(DIR)/$(NAME) X chown bin $(DIR)/$(NAME) X Xlint: $(SRC) X lint -x -u $(SRC) X X# use gcc as a version of lint (for ANSI C compatability) X# because the standard include files use #sccs X# do not be pedantic about pre-processing Xpedantic: $(SRC) X gcc -ansi -E moire.c > junk.c X gcc -ansi -pedantic -S junk.c X gcc -ansi -E line.c > junk.c X gcc -ansi -pedantic -S junk.c X gcc -ansi -E prewinit.c > junk.c X gcc -ansi -pedantic -S junk.c X rm junk.c junk.s X X Xclean: X rm -f $(OBJ) moire ________This_Is_The_END________ if test `wc -c < Makefile` -ne 858; then echo 'shar: Makefile was damaged during transit (should have been 858 bytes)' fi fi ; : end of overwriting check echo 'x - README' if test -f README; then echo 'shar: not overwriting README'; else sed 's/^X//' << '________This_Is_The_END________' > README XI wrote this demo program while trying my hand at line and Xcircle generation. It has a few more options than the earlier version. X XAlso, the iswind() problem is now solved for those of you who allow Xlogins from other than the console. X XLine drawing is done using Bresenham's line algorithm. XCircles are drawn using a modification to Bresenham's circle algorithm Xso that they appear round. I use an aspect ratio of 3/2. XI had to generalize Bresenham's circle algorithm to generate the Xellipses. Getting it right was very tricky. XTo make it worse, I tried to make it more efficient by performing Xstrength reduction on the code. The result, is that the algorithm Xis not easy to follow. The meak of heart should not try to Xmodify it, (or even look at it). X XThe lines and circles are first drawn to an array in memory, and Xthen wrastop() is used to copy it to the screen. It would be faster Xto draw directly to the video memory, (but I have not made the Xhardware modification necessary to do so). Perhaps it's time to get Xthat vidpal and mgr. X XThis code is placed in the public domain, with the hope it can be used Xin real programs :-). X XThomas Tkacik Xtkacik@kyzyl.mi.org X ________This_Is_The_END________ if test `wc -c < README` -ne 1177; then echo 'shar: README was damaged during transit (should have been 1177 bytes)' fi fi ; : end of overwriting check echo 'x - line.c' if test -f line.c; then echo 'shar: not overwriting line.c'; else sed 's/^X//' << '________This_Is_The_END________' > line.c X/* X * line.c X * written by Thomas Tkacik kyzyl!tkacik X * X * This code is submitted to the public domain X * You may do with it what you wish X */ X X#include <sys/window.h> X#include <stdio.h> X X#define SHORTS 45 /* shorts per row */ X#define WIDTH SHORTS*16 X#define HEIGHT 12*25 /* user lines */ X#define SCREEN_SHORTS SHORTS*HEIGHT /* number of shorts on screen */ X X#define abs(x) (((x)>0)?(x):(-x)) X#define sign(x) (((x)>=0)?1:-1) X Xunsigned short screen[HEIGHT][SHORTS]; /* what's on the screen */ X X/* X * display prints out all of the new changes X */ X Xvoid Xdisplay(wn, x, y, width, height) Xint wn, x, y, width, height; X{ X /* if wrastop fails just keep going */ X /* do not bother printing an error message */ X /* it will work the next time */ X X (void)wrastop(wn,screen[0],SHORTS*2,0,0,x,y,x,y,width,height, X SRCSRC,DSTSRC,0); X} X X/* X * clearmem the entire screen image in memory X */ X Xvoid Xclearmem() X{ X register int i; X register unsigned short *scrpt; X X scrpt = screen[0]; X for(i=0; i < HEIGHT*SHORTS; i++) X *(scrpt++) = 0; X} X X X/* X * dot if the given point is on the screen X * change its value (xor it with 1) X */ X Xvoid Xdot(x, y) Xregister int x, y; X{ X if((x>=0) && (y>=0) && (x<WIDTH) && (y<HEIGHT)) X screen[y][x>>4] ^= 1<<(x & 0xf); X} X X/* X * draw a line between two points using bresenham's algorithm X * the starting point is drawn but not the end point X */ X Xvoid Xline(x1, y1, x2, y2) Xregister int x1, y1; X int x2, y2; X{ X register short error, delta_x, delta_y; X register short y_gt_x = 0; /* assume delta_x > delta_y */ X short i; X int sign_x, sign_y; X X X delta_x = x2 - x1; /* algorithm wants 2*deltas */ X delta_y = y2 - y1; X X sign_x = sign(delta_x); /* used for determining direction */ X sign_y = sign(delta_y); X X delta_x = abs(delta_x); X delta_y = abs(delta_y); X X if(delta_y>delta_x) { X x2 = y1; /* swap x1 and y1 */ X y1 = x1; X x1 = x2; X X x2 = delta_y; /* swap delta_x and delta_y */ X delta_y = delta_x; X delta_x = x2; X X x2 = sign_y; /* swap sign_x and sign_y */ X sign_y = sign_x; X sign_x = x2; X X y_gt_x = 1; /* delta_y > delta_x! */ X } X X delta_y *= 2; /* delta_y is only used as 2*delta_y */ X error = delta_y - delta_x; /* actually 2*delta_y-delta_x */ X X for(i=0; i < delta_x; i++) { X if(y_gt_x) /* if so then swap on plotting pixels */ X dot(y1,x1); /* turn on pixel */ X else X dot(x1,y1); X X if(error >= 0) { X y1 += sign_y; X error += (delta_y - 2*delta_x); X } else { X error += delta_y; X } X X x1 += sign_x; X } X} X X/* X * circle will draw a circle centered at the specified point X * and with the specified radius using a slightly modified X * version of bresenham's circle algorithm X * X * this routine is made so that the circles appear to be round X * X * r is the width of the circle in pixels X * the height will be calculated X * X */ X X#define AX 2 /* aspect ratio is AX/AY */ X#define AY 3 X#define AX2 (AX*AX) X#define AY2 (AY*AY) X Xvoid Xcircle(x, y, r) Xint x, y, r; X{ X register int error, delta_x, delta_y; X register int x1, y1; X X x1 = 0; X y1 = r; X error = AX2 + AY2 - (2*AY2*r); X X while(y1>=0) { X dot(x+x1,y+y1); X dot(x-x1,y+y1); X dot(x+x1,y-y1); X dot(x-x1,y-y1); X X delta_x = 2*(error - AX2*x1) - AX2; X delta_y = 2*(error + AY2*y1) - AY2; X X if((error < 0) && (delta_y <= 0)) { X x1++; X error += (2*AX2*x1 + AX2); X } else if((error > 0) && (delta_x > 0)) { X y1--; X error += (AY2 - 2*AY2*y1); X } else { X x1++; X y1--; X error += 2*AX2*x1 - 2*AY2*y1 + AX + AY; X } X } X} X X/* X * draw an ellipse with center at x,y X * and major and minor axes axis_x and axis_y X * X * a generalization of bresenham's circle algorithm is used X * X * I have made the code harder to understand by performing X * strength reduction so fewer multiplies are required X * being replaced with additions X * (more could be done, but then too many registers are needed) X * X * Gcc does a nice job of using registers X * X */ X Xvoid Xellipse(x, y, axis_x, axis_y) Xregister int x, y; Xint axis_x, axis_y; X{ X register int x1, y1, delta_x, delta_y; X int dx, dy, error, axis_x2, axis_y2; X short x_gt_y; /* is axis_x > axis_y */ X X /* check for the degenerate cases */ X if((axis_x == 0) && (axis_y == 0)) { X dot(x, y); X return; X } X else if(axis_x == 0) { X line(x, y-axis_y, x, y+axis_y); X dot(x, y+axis_y); /* line does not do the endpoint */ X return; X } X else if(axis_y == 0) { X line(x-axis_x, y, x+axis_x, y); X dot(x+axis_x, y); /* line does not do the endpoint */ X return; X } X X /* make axis_y the larger of axis_x and axis_y */ X X x_gt_y = 0; X X if(axis_y < axis_x) { X axis_x ^= axis_y; /* swap axis_x and axis_y */ X axis_y ^= axis_x; X axis_x ^= axis_y; X X x_gt_y = 1; /* axis_y < axis_x! */ X } X X /* initialize error term and counters */ X X x1 = 0; X y1 = axis_y; X axis_x2 = axis_x * axis_x; X axis_y2 = axis_y * axis_y; X dx = axis_y2; X dy = axis_x2 * (1 - 2*axis_y); X error = axis_x2 + axis_y2 - (2*axis_x2*axis_y); X X /* first do the two end points */ X /* because we draw all four quadrants */ X /* the end points will get drawn twice, erasing them */ X /* they get done now so that they only get drawn once */ X if(x_gt_y) { X dot(x, y + axis_x); X dot(x, y - axis_x); X } else { X dot(x + axis_x, y); X dot(x - axis_x, y); X } X X /* draw the rest of the ellipse */ X X while(y1 > 0) { X if(x1 > 0) { X if(x_gt_y) { /* were x and y switched */ X dot(x + y1, y + x1); X dot(x - y1, y + x1); X dot(x + y1, y - x1); X dot(x - y1, y - x1); X } else { X dot(x + x1, y + y1); X dot(x - x1, y + y1); X dot(x + x1, y - y1); X dot(x - x1, y - y1); X } X } else { /* for very skinny ellipses */ X if(x_gt_y) { X dot(x + y1, y); X dot(x - y1, y); X } else { X dot(x, y + y1); X dot(x, y - y1); X } X } X X delta_x = 2*(error - axis_y2*x1) - axis_y2; X delta_y = 2*(error + axis_x2*y1) - axis_x2; X X if((error<0) && (delta_y<=0)) { X x1 += 1; X dx += 2*axis_y2; X error += dx; X } else if((error>0) && (delta_x>0)) { X y1 -= 1; X dy += 2*axis_x2; X error += dy; X } else { X x1 += 1; X y1 -= 1; X dx += 2*axis_y2; X dy += 2*axis_x2; X error += dx + dy; X } X } X} X ________This_Is_The_END________ if test `wc -c < line.c` -ne 6068; then echo 'shar: line.c was damaged during transit (should have been 6068 bytes)' fi fi ; : end of overwriting check echo 'x - moire.6' if test -f moire.6; then echo 'shar: not overwriting moire.6'; else sed 's/^X//' << '________This_Is_The_END________' > moire.6 X.\" .TH MAHJONGG 6 "1 August 1988" X.TH MOIRE 6 X.SH NAME Xmoire \- Create moire patterns X.SH SYNOPSIS X.B moire X[ \fB-lcxvpt+\fP ] [ \fB-b\fP ] [ \fB-n \fI###\fP ] X.SH DESCRIPTION X.I Moire Xcreates moire patterns by bouncing lines around a window. XVarious circle and line figures can also be used. XBy default, 100 lines are used, but this can be set to any number less than 100. XMoire opens a bordered window when it begins, and allows this window to Xbe moved or resized. XIt is also possible to have \fImoire\fR run in a full screen window without Xa border. XThis allows moire to replace the background pattern, Xwith other windows in front. X.SH OPTIONS X.IP \fB\-l XGenerate moire patterns with lines. XThis is the default. X.IP \fB\-c XGenerate moire patterns with circles. X.IP \fB\-+ XGenerate moire patterns with crosses. X.IP \fB\-v XGenerate moire patterns with vees. X.IP \fB\-p XGenerate moire patterns with pentagrams. X.IP \fB\-t XGenerate moire patterns with triangles. X.IP \fB\-x XGenerate moire patterns with exes. X.IP \fB\-b XRun \fImoire\fR in a full screen borderless window. X.IP \fB\-n \fI#\fR XStart with \fI#\fR number of lines, circles, or crosses. X.SH FILES X/usr/games/moire executable X.SH AUTHOR XThomas Tkacik X.br Xtkacik@kyzyl.mi.org X.SH BUGS XThat's not a bug, it's a feature! ________This_Is_The_END________ if test `wc -c < moire.6` -ne 1281; then echo 'shar: moire.6 was damaged during transit (should have been 1281 bytes)' fi fi ; : end of overwriting check echo 'x - moire.c' if test -f moire.c; then echo 'shar: not overwriting moire.c'; else sed 's/^X//' << '________This_Is_The_END________' > moire.c X/* X * moire.c X * written by Thomas Tkacik kyzyl!tkacik X * X * This code is submitted to the public domain X * You may do with it what you wish X */ X X#include <stdio.h> X#include <termio.h> X#include <sys/signal.h> X#include <tam.h> X#include <kcodes.h> X#include <sys/window.h> X#include "moire.h" X Xvoid prewinit(); X X/* the number of lines to keep */ Xint num_lines = DEFLINE; X X/* the end points of each line */ Xstruct points { X short x1,y1; X short x2,y2; X} lines[MAXLINE],increment; X X/* the bounding box */ Xstruct rect { X short xmin,ymin; X short xmax,ymax; X} border; X X/* window structure */ Xstruct uwdata win; X X/* window discriptor */ Xint wn; X X/* terminal status */ Xstruct termio termstat; X Xint Xmain(argc, argv) Xint argc; Xchar **argv; X{ X int c, errflg = 0; /* for use with getopt() */ X extern int optind; X extern char *optarg; X X int bordered = BORDERED; /* bordered or borderless window */ X int type = LINE; X X while((c = getopt(argc, argv, "lc+vdptxbn:")) != EOF) { X switch(c) { X case 'n': X num_lines = atoi(optarg); X if(num_lines > MAXLINE) X num_lines = MAXLINE; X break; X case 'l': X type = LINE; X break; X case '+': X type = CROSS; X break; X case 'c': X type = CIRCLE; X break; X case 'v': X type = VEE; X break; X case 'd': X type = DIAMOND; X break; X case 'p': X type = PENTA; X break; X case 't': X type = TRIANGLE; X break; X case 'x': X type = EX; X break; X case 'b': X bordered = BORDERLESS; X break; X default: X errflg = 1; X } X } X if(errflg == 1) { X (void)fprintf(stderr,"Usage: %s [-lxcvdpt+] [-b] [-n #]\n", argv[0]); X exit(1); X } X X /* initialize the window */ X X initialize(bordered); X X moire(type); X X return(0); X} X X/* X * initialize the window and signals X */ X Xvoid Xinitialize(bordered) Xint bordered; X{ X /* pre-check if things are ok --- no need to call iswind() */ X prewinit(); X X /* initialize the tam routines */ X winit(); X X /* open the moire window */ X X if(bordered == BORDERED) { X if((wn = wcreate(1,0,18,76, BORDRESIZE)) == -1) { X (void)fprintf(stderr, X "could not open window wn = %d\n",wn); X wexit(1); X } X } else { X if((wn = wcreate(1,0,24,80, NBORDER)) == -1) { X (void)fprintf(stderr, X "could not open window wn = %d\n",wn); X wexit(1); X } X } X X /* label the moire window */ X wlabel(wn, "Moire"); X wuser(wn, "Moire"); X X /* turn off the cursor */ X wputs(wn,"\033[=1C"); X X /* enable interrupts */ X /* set the interrupt character to control-c */ X X (void)ioctl(wn, TCGETA, &termstat); X termstat.c_lflag |= ISIG; X termstat.c_cc[0] = CNTL_C; X (void)ioctl(wn, TCSETA, &termstat); X X /* determine the initial window size */ X X (void)ioctl(wn,WIOCGETD,&win); X border.xmin = 1; X border.ymin = 1; X border.xmax = win.uw_width; X border.ymax = win.uw_height; X X /* clear the memory image of the screen */ X clearmem(); X X /* set up signals */ X X (void)signal(SIGHUP, leave); X (void)signal(SIGINT, leave); X (void)signal(SIGQUIT, leave); X (void)signal(SIGWIND, resize); X} X X/* X * generate the moire patterns X */ X Xvoid Xmoire(type) Xint type; X{ X int i, j; X void srand48(); X long time(); X X /* initialize the random number generator */ X X srand48((long)getpid() + time((long *)0)); X X /* set the first line */ X X lines[0].x1 = 2; X lines[0].y1 = 2; X lines[0].x2 = 2; X lines[0].y2 = 2; X X /* set the increment values */ X X increment.x1 = newinc(2,4,0); X increment.y1 = newinc(3,5,0); X increment.x2 = newinc(4,7,1); X increment.y2 = newinc(3,6,1); X X /* draw the first line */ X X draw(0, type); X X /* draw the rest of the lines before deleting any */ X X for(i = 1; i < num_lines; i++) { X update(i,i-1); X draw(i, type); X } X X /* now delete and add lines */ X X j = num_lines - 1; X i = 0; X for(;;) { X if(i >= num_lines) X i = 0; X X /* erase old line */ X draw(i, type); X X /* find new line */ X update(i,j); X X /* draw new line */ X draw(i, type); X X j = i; X i += 1; X } X} X X/* X * find the coordinates of the next line X * given the previous line X * check if it should bounce off a wall X */ X Xvoid Xupdate(i,j) Xint i,j; X{ X /* calculate new x1 */ X X lines[i].x1 = lines[j].x1 + increment.x1; X if(lines[i].x1 >= border.xmax) { X increment.x1 = -newinc(2,4,0); X lines[i].x1 = 2*border.xmax-lines[i].x1; X } X if(lines[i].x1 <= 0) { X increment.x1 = newinc(2,4,0); X lines[i].x1 = -lines[i].x1; X } X X /* calculate new y1 */ X X lines[i].y1 = lines[j].y1 + increment.y1; X if(lines[i].y1 >= border.ymax) { X increment.y1 = -newinc(3,5,0); X lines[i].y1 = 2*border.ymax-lines[i].y1; X } X if(lines[i].y1 <= 0) { X increment.y1 = newinc(3,5,0); X lines[i].y1 = -lines[i].y1; X } X X /* calculate new x2 */ X X lines[i].x2 = lines[j].x2 + increment.x2; X if(lines[i].x2 >= border.xmax) { X increment.x2 = -newinc(4,7,1); X lines[i].x2 = 2*border.xmax-lines[i].x2; X } X if(lines[i].x2 <= 0) { X increment.x2 = newinc(4,7,1); X lines[i].x2 = -lines[i].x2; X } X X /* calculate new y2 */ X X lines[i].y2 = lines[j].y2 + increment.y2; X if(lines[i].y2 >= border.ymax) { X increment.y2 = -newinc(3,6,1); X lines[i].y2 = 2*border.ymax-lines[i].y2; X } X if(lines[i].y2 <= 0) { X increment.y2 = newinc(3,6,1); X lines[i].y2 = -lines[i].y2; X } X} X X/* X * Xor the line to the in memory screen X * and then display it on the moire window X */ X Xvoid Xdraw(i, type) Xint i; Xint type; X{ X int xmin, ymin, xmax, ymax; X int xmean, ymean; X X xmin = lines[i].x1; X ymin = lines[i].y1; X xmax = lines[i].x2; X ymax = lines[i].y2; X X /* find the center of the cross or circle */ X X xmean = (xmin + xmax) / 2; X ymean = (ymin + ymax) / 2; X X X /* draw or erase pattern to/from the internal image */ X /* because line xor's the line onto the screen image */ X /* if it is already there, it will be erased */ X X switch(type) { X case LINE: X line(xmin, ymin, xmax, ymax); X break; X case CROSS: X line(xmean, ymin, xmean, ymax); X line(xmin, ymean, xmax, ymean); X break; X case CIRCLE: X ellipse(xmean, ymean, abs(xmax-xmin)/2, abs(ymax-ymin)/2); X break; X case VEE: X line(xmin, ymin, xmean, ymax); X line(xmean, ymax, xmax, ymin); X break; X case DIAMOND: X line(xmin, ymean, xmean, ymin); X line(xmean, ymin, xmax, ymean); X line(xmax, ymean, xmean, ymax); X line(xmean, ymax, xmin, ymean); X break; X case PENTA: X line(xmin, ymin, xmean, ymax); X line(xmean, ymax, xmax, ymin); X line(xmax, ymin, xmin, ymean); X line(xmin, ymean, xmax, ymean); X line(xmax, ymean, xmin, ymin); X break; X case TRIANGLE: X line(xmin, ymin, xmean, ymax); X line(xmean, ymax, xmax, ymin); X line(xmax, ymin, xmin, ymin); X break; X case EX: X line(xmin, ymin, xmax, ymax); X line(xmax, ymin, xmin, ymax); X break; X } X X /* make sure that min really is smaller than max */ X X if(xmin > xmax) { X xmin = xmax; X xmax = lines[i].x1; X } X if(ymin > ymax) { X ymin = ymax; X ymax = lines[i].y1; X } X X /* is the line still visible -- the screen may now be smaller */ X X if((xmin < border.xmax-1) && (ymin < border.ymax-1)) { X X /* display the smallest region containing the new line */ X X if(xmax > border.xmax-1) X xmax = border.xmax-1; X if(ymax > border.ymax-1) X ymax = border.ymax-1; X X display(wn, xmin, ymin, xmax-xmin+1, ymax-ymin+1); X } X} X X/* X * get a new increment value X */ X Xint Xnewinc(least, range, even) Xint least, range, even; X{ X return(((int)(least + drand48()*range) & ~1) + even); X} X X/* X * resize is called whenever the window size is changed X */ X Xint Xresize() X{ X /* determine new window size */ X X (void)ioctl(wn,WIOCGETD,&win); X X border.xmax = win.uw_width; X border.ymax = win.uw_height; X X /* reset signal trap */ X X (void)signal(SIGWIND, resize); X return 0; X} X X/* X * exit the program X */ X Xint Xleave() X{ X wdelete(wn); X wexit(0); X X return 0; X} X ________This_Is_The_END________ if test `wc -c < moire.c` -ne 7666; then echo 'shar: moire.c was damaged during transit (should have been 7666 bytes)' fi fi ; : end of overwriting check echo 'x - moire.h' if test -f moire.h; then echo 'shar: not overwriting moire.h'; else sed 's/^X//' << '________This_Is_The_END________' > moire.h X/* X * moire.h X * written by Thomas Tkacik tetnix!tet X * X * This code is submitted to the public domain X * You may do with it what you wish X */ X X#define MAXLINE 100 /* maximum number of lines that may appear */ X#define DEFLINE 60 /* default number that will appear */ X#define MAXHEIGHT 248 /* maximum height of screen in pixels */ X#define MAXWIDTH 685 /* maximum width of screen in pixels */ X X#define LINE 0 X#define CROSS 1 X#define CIRCLE 2 X#define VEE 3 X#define DIAMOND 4 X#define PENTA 5 X#define TRIANGLE 6 X#define EX 7 X#define BORDERED 0 X#define BORDERLESS 1 X X#define CNTL_C '\003' /* Control C */ X X#define min(x,y) ((x)<(y)?(x):(y)) X Xextern void display(); Xextern void clearmem(); Xextern void dot(); Xextern void line(); Xextern void circle(); Xextern void ellipse(); X Xextern void initialize(); Xextern void moire(); Xextern void update(); Xextern void draw(); Xextern int newinc(); Xextern int resize(); Xextern int leave(); X Xextern int (*signal())(); Xextern int ioctl(); Xextern void exit(); Xextern double drand48(); X ________This_Is_The_END________ if test `wc -c < moire.h` -ne 1026; then echo 'shar: moire.h was damaged during transit (should have been 1026 bytes)' fi fi ; : end of overwriting check echo 'x - prewinit.c' if test -f prewinit.c; then echo 'shar: not overwriting prewinit.c'; else sed 's/^X//' << '________This_Is_The_END________' > prewinit.c X/* X * This routine should be executed before running the tam routine winit() X * It will check if the program is being run from the console, and will X * get a fresh window for the program to use. X * X * Iswind() is not needed. This routine does the job. X * X * This routine is in the public domain. X * Not only are you allowed to use this code, I wish you would. X * X * Thomas Tkacik tkacik@kyzyl.mi.org X */ X X#include <fcntl.h> X#include <stdio.h> X#include <sys/window.h> X Xvoid prewinit() X{ X X struct uwdata win_data; X int wn; X X /* will fail if not a window */ X if(ioctl(1, WIOCGETD, &win_data) == -1) { X (void)fprintf(stderr, "must use the bitmapped display\n"); X exit(1); X } X X /* everything is fine, running from the console */ X X /* detach from stdin, stout and stderr, and get a fresh window */ X (void)close(0); X if((wn = open("/dev/window", O_RDWR )) == -1) { X (void)fprintf(stderr, "cannot open window\n"); X exit(1); X } X (void)close(1); X (void)close(2); X (void)dup(wn); X (void)dup(wn); X} X ________This_Is_The_END________ if test `wc -c < prewinit.c` -ne 997; then echo 'shar: prewinit.c was damaged during transit (should have been 997 bytes)' fi fi ; : end of overwriting check exit 0 -- Tom Tkacik | tkacik@kyzyl.mi.org | To rent this space, call 1-800-555-QUIP. tkacik@hobbes.cs.gmr.com | -- David H. Brierley Home: dave@galaxia.newport.ri.us; Work: dhb@quahog.ssd.ray.com Send comp.sources.3b1 submissions to comp-sources-3b1@galaxia.newport.ri.us %% Can I be excused, my brain is full. **