DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦0befc8129⟧ TextFile

    Length: 6202 (0x183a)
    Types: TextFile
    Notes: UNIX file
    Names: »gmgr.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »hr/src/graph/gmgr.c« 

TextFile

#include	<signal.h>
#include	<stdio.h>
#include	<math.h>
#include	<jlib.h>

#define	GWOPEN	0x0001			/* its open		*/
#define	GWUPD	0x0002			/* it needs updating	*/
#define GWNODRAW 0x0004			/* don't draw		*/
#define	GWLOCK	0x0008			/* already drawing	*/

#define	GWINSET	8			/* amount to inset clipping region */
#define	GWINDOW	(WINDOW+10)		/* devno of 1st window	*/
#define GNW	(4)			/* number of windows	*/
#define	PUMP	127
#define	XCEN	(gw->g_width/2)
#define	YCEN	(gw->g_height/2)
#define	NLINE	18

int	myfd;
char	*MYDEVICE = "/dev/wmgr1";
struct	jqueue	sendq,
		s_replyq;
struct job	j_start();

int	Wid = -1;
int	tenable;


struct gwindow
{
	uint		g_flag;		/* state		  */
	int		g_width;	/* width in pixels	  */
	int		g_height;	/* height in pixels	  */
	int		g_state;	/* active drawing routine */
	uint		g_x[NLINE],	/* x-coordinates	  */
			g_y[NLINE];	/* y-coordinates	  */
} gwindow[GNW];


RECT gwrect[GNW] =				/* new window rectangles   */
{
	{ 500,  150,  900,  550},
	{ 450,  200,  850,  600},
	{ 400,  250,  800,  650},
	{ 350,  300,  750,  700}
};


extern int	gwopen(),
		gwclose(),
		gwsize(),
		gwcircle(),
		gwdraw(),
		gwupd();


main()
{
	extern int mu_enable;

	myfd = open( MYDEVICE, 2);
	if ( myfd < 0 )
		croak("can't open %s", MYDEVICE);
	jmain();
}


readmesg()
{
	register struct gwindow *gw;
	extern int	tenable;
	struct job	*p;
	MESSAGE		m;


	if ( ioctl(myfd, CIOGETM, &m) != 0 )
	{
		if ( errno != EDATTN )
			croak("CIOGETM errno = %d", errno);
		while ( p = sendq.jq_head )
		{
			if ( ioctl(myfd, CIOSENDM, &p->j_m) != 0 )
			{
				if ( errno != EDBUSY )
					croak("CIOSENDM errno = %d", errno);
				break;
			}
			jalert( &sendq );
		}
		return;
	}


	if (m.msg_Sender == SMGR)
		switch (m.msg_Cmd) {
		case WM_CHARACTER:
		case WM_MTRANS:
		case WM_MMOVE:
			break;
		case WM_UPDATE:
			gw = &gwindow[(m.msg_Data[0] >> 8)-GWINDOW];
			if ( gw->g_flag & GWOPEN && not (gw->g_flag & GWNODRAW) )
			{
				if ( gw->g_flag & GWLOCK )
					gw->g_flag |= GWUPD;
				else
				{
					gw->g_flag |= GWLOCK;
					p = jstart( gwdraw );
					p->j_m.msg_Sender = gw-gwindow+GWINDOW;
				}
			}
			break;
		case WM_SIZECHANGE:
			p = jstart( gwsize );
			p->j_m = m;
			break;
		case WM_REPLY:
		case WM_ACK:
			s_replyq.jq_head->j_m = m;
			jalert( &s_replyq );
			break;
		default:
			croak( "bad command from smgr %d", m.msg_Cmd);
		}
	else if ( m.msg_Cmd == WM_OPEN && WINDOW <= m.msg_Sender )
	{
		p = jstart( gwopen );
		p->j_m = m;
	}
	else if (GWINDOW<=m.msg_Sender && m.msg_Sender<GWINDOW+GNW)
		switch (m.msg_Cmd) {
		case WM_GETC:
			ioctl(myfd, CIODATA, m.msg_Sender, 0);
			break;

		case WM_TIOGETP:
		case WM_TIOGETC:
			m.msg_Data[0] = 0;
			m.msg_Data[1] = 0;
			m.msg_Data[2] = 0;
			ioctl(myfd, CIOTCHRS, &m);
			break;

		case WM_PUTD:
		case WM_TIOSETN:
		case WM_TIOSETP:
		case WM_TIOSETC:
		case WM_TIOFLSH:
			break;

		case WM_CLOSE:
			p = jstart( gwclose );
			p->j_m = m;
			break;
		case PUMP:
			gw = &gwindow[m.msg_Sender-GWINDOW];
			if ( gw->g_flag & GWLOCK )
				break;
			gw->g_flag |= GWLOCK;
			gw->g_state ^= 01;
			p = jstart( gwdraw );
			p->j_m = m;
			break;
		}
	else
	{
		fprintf(stderr, "gmgr: command %d\015\n", m.msg_Cmd);
		fprintf(stderr, "gmgr: src %d, errno=%d\015\n", m.msg_Sender, errno);
		croak( "\007bad src");
	}
}


gwopen()
{
	int		wid;
	int		i;
	int		y;
	GRAPH		g;
	WIN_CREATE	w;
	struct gwindow	*gw;
	RECT		*gwr;
	extern	RECT	R_inset();

	wid = my->j_m.msg_Sender;
	gw  = &gwindow[wid-GWINDOW];
	gwr = &gwrect[wid-GWINDOW];
	w.wc_type = 0;
	w.wc_dims = *gwr;
	w.wc_ascii = NULL;
	i = S_Create(wid, &w);
	if ( i < 0 )
	{
		printf("gmgr: Bad Wid %d", i);
		ioctl(myfd, CIOACK, wid, -1);
		return;
	}
	gw->g_flag = GWOPEN+GWLOCK;
	gw->g_width = gwr->corner.x - gwr->origin.x;
	gw->g_height = gwr->corner.y - gwr->origin.y;
	gw->g_state = 0;
	setpoints(wid);
	ioctl(myfd, CIOACK, wid, 0);
	gwcircle(wid);
}

gwclose()
{
	int	wid;

	wid = my->j_m.msg_Sender;
	gwindow[wid - GWINDOW].g_flag = 0;
	S_Close(wid);
	ioctl(myfd, CIOACK, wid, 0 );
}


gwsize()
{
	int	wid;
	RECT	rect;
	register struct gwindow *gw;
	extern	RECT S_GetPhy();
	extern	RECT R_inset();

	wid = (uint)my->j_m.msg_Data[0] >> 8;
	gw = &gwindow[wid - GWINDOW];
	if ( gw->g_flag & GWOPEN )
	{
		rect = S_GetPhy(wid);
		gw->g_width = rect.corner.x - rect.origin.x;
		gw->g_height = rect.corner.y - rect.origin.y;
		setpoints(wid);
		if ( gw->g_flag & GWLOCK )
			gw->g_flag |= GWUPD;
		else
		{
			gw->g_flag |= GWLOCK;
			draw(wid);
		}
	}
}


gwmove(wid, x, y)
int	wid,
	x,
	y;
{
	G_Move(wid, x, y);
	if ( gwindow[wid-GWINDOW].g_flag & GWOPEN )
		G_GetPoint(wid);
}


gwtoline(wid, x, y)
int	wid,
	x,
	y;
{
	if ( gwindow[wid-GWINDOW].g_flag & GWNODRAW )
		return;
	G_Line(wid, x, y);
}


gwline(wid, x, y, xf, yf)
int	wid,
	x,
	y,
	xf,
	yf;
{
	if ( gwindow[wid-GWINDOW].g_flag & GWNODRAW )
		return;
	G_Move(wid, x, y);
	G_Line(wid, xf, yf);
	if ( gwindow[wid-GWINDOW].g_flag & GWOPEN )
		G_GetPoint(wid);
}


gwdraw()
{
	
	draw(my->j_m.msg_Sender);
}


draw(wid)
int wid;
{
	if ( gwindow[wid-GWINDOW].g_state )
		gwfrog(wid);
	else
		gwcircle(wid);
}


gwcircle(wid)
int wid;
{
	register int	i,
			j;
	register struct window *gw;
	GRAPH		g;

	g.wn_Logop = L_NDST;
	G_SetGraph(wid, &g, GCLOG);
	gw = &gwindow[wid-GWINDOW];
   top:
	S_ClrClip(wid);
	for ( i=1 ; i < NLINE-1 ; ++i )
		for ( j=0 ; j < i ; ++j )
		{
			gwline(wid, gw->g_x[i], gw->g_y[i], gw->g_x[j], gw->g_y[j]);
			if ( gw->g_flag & GWUPD )
			{
				gw->g_flag &= ~GWUPD;
				goto top;
			}
			if ( !(gw->g_flag & GWOPEN) )
				return;
		}
	gw->g_flag &= ~GWLOCK;
}


setpoints(wid)
int	wid;
{
	register uint	i,
			radx,
			rady;
	register struct gwindow	*gw;

	gw = &gwindow[wid-GWINDOW];
	if ( (radx = XCEN) < 32 || (rady = YCEN) < 32 )
	{
		gw->g_flag |= GWNODRAW;
		return;
	}
	gw->g_flag &= ~GWNODRAW;
	radx -= 32;
	rady -= 32;
	for ( i=0 ; i < NLINE ; i++ )
	{
		gw->g_x[i] = radx * cos((2*PI*i)/(NLINE-1)) + XCEN;
		gw->g_y[i] = rady * sin((2*PI*i)/(NLINE-1)) + YCEN;
	}
}


warn(s)
char *s;
{
	fprintf(stderr, "\007gmgr: %r\n", &s);
}


croak(s)
char *s;
{
	fprintf(stderr, "gmgr: %r\n", &s);
	exit(0);
}

nomem()
{
	fprintf(stderr, "gmgr: no mem\n");
	exit(0);
}

#include "gfrog.c"