|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6202 (0x183a)
Types: TextFile
Notes: UNIX file
Names: »gmgr.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »hr/src/graph/gmgr.c«
#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"