|
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"