|
|
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: 11597 (0x2d4d)
Types: TextFile
Notes: UNIX file
Names: »smgr.c«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »hr/src/smgr/smgr.c«
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include "smgr.h"
extern MESSAGE msg;
extern int nameofroutine();
extern LAYER *DM_frontmost, *DM_rearmost;;
extern WSTRUCT *wtbl[];
extern void (*wmgr_tab[])();
extern FONT_HEADER *aftable[];
char MYDEVICE[] = "/dev/smgr";
char DEF_FONT[] = "/usr/hr/fonts/sysfont";
int DEF_MOUSE[] = { 0xfffc, 0xfff8, 0xfff0, 0xffe0,
0xffc0, 0xffc0, 0xffe0, 0xfff0,
0xfff8, 0xfffc, 0xf3fe, 0xe1ff,
0x80ff, 0x007f, 0x003e, 0x001c };
#define SM_MSG_BUF (50)
MESSAGE mbuf[SM_MSG_BUF];
int mbuf_head, mbuf_tail;
int myfd;
sigalrm()
{
signal(SIGALRM, sigalrm);
ioctl(myfd, CIOWAIT);
errno = 0;
return ~0;
}
main()
{
int i;
#ifdef DEBUG
peteprint("initial entry\n");
#endif
signal(SIGSEGV, nameofroutine);
myfd = open( MYDEVICE, 2);
if ( myfd < 0 )
{
peteprint("open failed %s\n", MYDEVICE);
exit(0);
}
ioctl(myfd, CIOEVMGR);
signal(SIGALRM, sigalrm);
for ( i = 0; i < SM_MSG_BUF; i++ )
{
mbuf[i].msg_Sender = 0;
mbuf[i].msg_Cmd = 0;
mbuf[i].msg_Data[0] = 0;
mbuf[i].msg_Data[1] = 0;
mbuf[i].msg_Data[2] =0;
}
mbuf_head = mbuf_tail = 0;
for ( i = 0; i < FM_MAXFONT; i++)
aftable[i] = (FONT_HEADER *)FONT_NULL;
i = FM_open(DEF_FONT);
if ( i != 0 )
{
peteprint("System Font failed to open\n");
exit(0);
}
SM_Reset();
ioctl(myfd, CIOMOUSE, DEF_MOUSE);
ioctl(myfd, CIOMSEON, (char*)NULL);
sm_main();
}
sm_main()
{
MESSAGE m;
#ifdef DEBUG
peteprint(" sm_main\n");
#endif
loop
{
if ( ioctl(myfd, CIOGETM, &m) < 0 )
{
if ( !errno )
continue;
if ( errno != EDATTN )
die( "CIOGETM errno = %d\n", errno);
while ( mbuf_head != mbuf_tail )
if ( ioctl( myfd, CIOSENDM, &mbuf[mbuf_head]) < 0 )
if ( errno != EDBUSY )
die( "CIOSENDM errno = %d\n", errno);
else
break;
else
{
#ifdef MESSAGETRACE
peteprint("empty one message wid = %d\n", mbuf[mbuf_head].msg_Data[0]>>8);
#endif
if (++mbuf_head == SM_MSG_BUF )
mbuf_head = 0;
}
}
else
do_msg(&m);
}
}
do_msg(m)
MESSAGE *m;
{
register int wid;
msg = *m;
#ifdef DEBUG
peteprint("\nINCOMING MESSAGE : %d, %d, %d, %d, %d\n", msgSender, msgCmd,
msgData0, msgData1, msgData2);
peteprint("\tlast three in hex : %x, %x, %x\n", msgData0, msgData1, msgData2);
#endif
/* map the window id, a minor device number, down into the range */
/* zero (0) - MAX_WINDOW */
/* This process is reversed on the way out by sendmsg */
/* ONLY IF msgWid >= WINDOW */
if ( msgWid >= WINDOW )
msgWid -= WINDOW;
#ifdef TRACE
else
if ( (msgSender != 0) && (msgSender != DESKTOP) )
peteprint("funky wid (%d) from %d\n", msgWid, msgSender);
#endif
wid = msgWid;
if ( msgCmd == 100 )
exit(0);
/* There are only three valid sources of messages. A window */
/* manager, the desktop process, and the kbd_mouse hardware */
if ( not isvsender(msgSender) )
{
#ifdef TRACE
peteprint("not valid sender %d\n", msgSender);
#endif
return;
}
/* make sure it's a valid command number */
if ( not isvcmd(msgCmd) )
{
#ifdef TRACE
peteprint("invalid cmd : %d\n", msgCmd);
#endif
return;
}
/* the mouse is only allowed to do two things, both of which */
/* require an active window */
if ( iskbdmouse(msgSender) )
{
if ( msgCmd == SM_KKEY )
SM_Keyboard();
else if ( msgCmd == SM_MKEY )
SM_Mmkey();
else if ( msgCmd == SM_MOUSE )
SM_Mouse();
/* in any event... */
return;
}
switch (msgCmd )
{
case SM_OPENFONT:
SM_OpenFont();
return;
case SM_CLOSEFONT:
SM_CloseFont();
return;
case SM_GETFONTPARAM:
SM_GetFontParam();
return;
case SM_CREATE:
SM_Create();
return;
case SM_CLOSE:
/* The only difference here is that you don't */
/* save off the window when you exit */
if ( not legalwindow(wid) )
{
#ifdef TRACE
peteprint("close illegal window\n");
#endif
return;
}
if ( wtbl[wid]!=(WSTRUCT *)NULL )
gk = *wtbl[wid];
else
{
#ifdef TRACE
peteprint("close null window\n");
#endif
return;
}
/* and now, make sure that if this is a
* window manager request
* that this window manager owns this window
*/
if ( iswmgr(msgSender) )
if ( msgSender != gkWmgr )
{
#ifdef TRACE
peteprint("wrong wmgr\n");
#endif
return;
}
(*wmgr_tab[msgCmd])();
return;
case SM_WRESET:
case SM_GETXCLIP:
case SM_GETYCLIP:
case SM_SETXCLIP:
case SM_SETYCLIP:
case SM_CLRCLIP:
case SM_GETPHY:
case SM_SETLOG:
case SM_GETLOG:
case SM_SETEVMSK:
case SM_GETEVMSK:
case SM_RSTEVMSK:
case SM_SETMPAT:
case SM_GETMPAT:
case SM_GETMOUSE:
case SM_CHAR:
case SM_STRING:
case SM_CHARW:
case SM_STRW:
case SM_SCROLL:
case SM_DEFCURS:
case SM_DRAWCURS:
case SM_SETGRAPH:
case SM_GETGRAPH:
case SM_RSTGRAPH:
case SM_GETPOINT:
case SM_RSTPOINT:
case SM_POINT:
case SM_TOPOINT:
case SM_MOVE:
case SM_TOMOVE:
case SM_LINE:
case SM_TOLINE:
case SM_POLY:
case SM_TOPOLY:
case SM_RECT:
case SM_RRECT:
case SM_OVAL:
case SM_WEDGE:
case SM_ARC:
case SM_AMAP:
if ( not legalwindow(wid) )
{
#ifdef TRACE
peteprint("not legal window general\n");
#endif
return;
}
if ( wtbl[wid]!=(WSTRUCT *)NULL )
gk = *wtbl[wid];
else
{
#ifdef TRACE
peteprint("non-existant window general\n");
#endif
return;
}
/* and now, make sure that if this is a
* window manager request
* that this window manager owns this window
*/
if ( iswmgr(msgSender) )
if ( msgSender != gkWmgr )
{
#ifdef TRACE
peteprint("not owner general \n");
#endif
return;
}
(*wmgr_tab[msgCmd])();
*wtbl[wid] = gk;
return;
case SM_FRONT:
case SM_BACK:
case SM_SETPHY:
case SM_SETSIZE:
case SM_UPDATE:
if ( not isdesktop(msgSender) )
{
#ifdef TRACE
peteprint("not desktop\n");
#endif
return;
}
if ( not legalwindow(wid) )
{
#ifdef TRACE
peteprint("not legal wid, dtop\n");
#endif
msgCmd = WM_NACK;
msgReceiver = DESKTOP;
sendmsg( &msg );
return;
}
if ( wtbl[wid]!=(WSTRUCT *)NULL )
gk = *wtbl[wid];
else
{
#ifdef TRACE
peteprint("null window, dtop\n");
#endif
msgCmd = WM_NACK;
msgReceiver = DESKTOP;
sendmsg( &msg );
return;
}
(*wmgr_tab[msgCmd])();
*wtbl[wid] = gk;
return;
case SM_TRACK:
case SM_UNTRACK:
case SM_UPDALL:
case SM_WHOTOPAT:
case SM_WHOFRONT:
if ( not isdesktop(msgSender) )
{
#ifdef TRACE
peteprint("not dtop, final\n");
#endif
return;
}
(*wmgr_tab[msgCmd])();
return;
break;
default:
peteprint("Bad cmd in switch %d\n", msgCmd);
break;
}
}
sendmsg(m)
register MESSAGE *m;
{
MESSAGE mm;
/* map the window id back up to a minor device number unless it */
/* was a negative number, in which case leave it alone */
mm = *m;
if ( (mm.msg_Data[0] >> 8) >= 0 )
mm.msg_Data[0] += WINDOW << 8;
#ifdef TRACE
else
if ( mm.msg_Receiver != DESKTOP )
peteprint("sending funky wid %d to %d \n",
mm.msg_Data[0], mm.msg_Receiver);
#endif
if ( mbuf_head == mbuf_tail )
if ( ioctl( myfd, CIOSENDM, &mm) < 0 )
{
if ( errno != EDBUSY )
die( "CIOSEND errno = %d\n", errno);
}
else
return;
if (mbuf_tail == (mbuf_head-1) )
{
peteprint(" internal buffer overflow\n");
return;
}
if ( (mbuf_tail == (SM_MSG_BUF-1)) && (mbuf_head == 0) )
{
peteprint(" internal buffer overflow\n");
return;
}
mbuf[mbuf_tail] = mm;
#ifdef MESSAGETRACE
peteprint("add message wid = %d\n", mbuf[mbuf_tail].msg_Data[0]>>8);
#endif
if ( ++mbuf_tail == SM_MSG_BUF )
mbuf_tail = 0;
}
getdata(src, n, srcp, dstp)
register uint src, n;
register char *srcp, *dstp;
{
register XFER x;
x.x_src = src;
x.x_count = n;
x.x_srcp = srcp;
x.x_dstp = dstp;
if ( ioctl(myfd, CIOGETD, &x) < 0 )
die(" CIOGETD errno = %d\n", errno);
}
nameofroutine()
{
fflush(stdout);
fflush(stderr);
peteprint("How dare you attempt to violate a segment which doesn't\n");
peteprint("belong to you. You animal !!!\n");
exit(0);
}
peteprint( fmt )
char *fmt;
{
FILE *fopen(), *pp;
pp = fopen("/dev/console", "w");
if ( pp == NULL )
printf("peteprint blew up \n");
fprintf(pp, "SMGR: %r", &fmt);
fclose(pp);
}
die( fmt )
char *fmt;
{
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "%r\n", &fmt);
exit(1);
}
#ifdef TRACE
int DB_dump()
{
register int i;
LAYER *lp;
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "\n\nfr = 0x%lx, re = 0x%lx\n",
DM_frontmost, DM_rearmost);
for (i=0; i<MAX_WINDOWS; i++ )
if ( wtbl[i] != (WSTRUCT *)NULL)
DB_pw(i);
fprintf(fp, "Unallocated Windows : ");
for (i=0; i<MAX_WINDOWS; i++)
if ( wtbl[i] == (WSTRUCT *)NULL)
fprintf(fp, " %d ", i);
fprintf(fp,"\n");
fprintf(fp, "list from front to rear : ");
for ( lp = DM_frontmost; lp; lp = lp->back )
fprintf(fp, " %d ", wtbl[lp2id(lp)]->wn_Wid);
fprintf(fp,"\n");
fprintf(fp," list from rear to front : ");
for ( lp = DM_rearmost; lp; lp = lp->front )
fprintf(fp, " %d ", wtbl[lp2id(lp)]->wn_Wid);
fprintf(fp, "\n\n\n");
fclose(fp);
return;
}
int DB_map()
{
register int i;
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "\nAllocated windows : ");
for (i=0; i<=MAX_WINDOWS; i++ )
if ( wtbl[i] != (WSTRUCT *)NULL)
fprintf(fp, " %d ", i);
fprintf(fp, "\n\n\n");
fclose(fp);
return;
}
DB_pw(id)
int id;
{
WSTRUCT *wp, w;
RECT r;
int i;
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "\n");
fprintf(fp, "Window %d\n", id);
wp = wtbl[id];
if ( wp == (WSTRUCT *)NULL)
{
fprintf(fp, "Window undefined\n");
return;
}
w = *wp;
r = w.wn_Layer->rect;
fprintf(fp, "Wid = %d Type = %d Flags = %d, Ev = %d, Wmgr = %d\n",
w.wn_Wid, w.wn_Type,w.wn_Flags,w.wn_Evmask,w.wn_Wmgr);
fprintf(fp, "Layer data: (%d,%d) (%d,%d) w = %d, b = 0x%lx\n ",
r.origin.x, r.origin.y, r.corner.x, r.corner.y,
w.wn_Layer->width, w.wn_Layer->base);
r = w.wn_Crect;
fprintf(fp, "Clipping rect: (%d,%d) (%d,%d) Psize = (%d,%d),Lorig = (%d,%d)\n",
r.origin.x, r.origin.y, r.corner.x, r.corner.y,
w.wn_Psize.x, w.wn_Psize.y, w.wn_Lorigin.x, w.wn_Lorigin.y);
fprintf(fp, "Font: %d, Pen : H = %d W = %d, P = %d\n",
w.wn_G.wn_Font.fi_Id, w.wn_G.wn_Pen.pn_Height,
w.wn_G.wn_Pen.pn_Width, w.wn_G.wn_Pen.pn_Pat);
fprintf(fp, "Dp = (%d, %d) FPat = %d, BPat = %d, Logop = %d\n",
w.wn_Dp.x, w.wn_Dp.y, w.wn_G.wn_Fpat,
w.wn_G.wn_Bpat, w.wn_G.wn_Logop);
fprintf(fp, "Visible list printing :\n");
for( i = 0; i < MAX_LRBUF; i++ )
if ( w.wn_Layer->reg[i].flag )
DB_bmpr( w.wn_Layer->reg[i] );
fprintf(fp, "\n");
fclose(fp);
}
DB_bmpr(i)
SM_REGION i;
{
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "\t(%d, %d), (%d, %d), w = %d, b = 0x%lx ",
i.bm.rect.origin.x, i.bm.rect.origin.y,
i.bm.rect.corner.x, i.bm.rect.corner.y,
i.bm.width, i.bm.base);
if ( i.flag == L_VISIBLE )
fprintf(fp, "VISIBLE\n");
else if ( i.flag == L_OBSCURED )
fprintf(fp, "OBSCURED by %d\n", lp2id(i.cov_by));
else
fprintf(fp, "ERROR\n");
fclose(fp);
return;
}
DB_prect(r)
RECT r;
{
FILE *fopen(), *fp;
fp = fopen("/dev/console", "w");
fprintf(fp, "\t(%d, %d), (%d, %d)\n", r.origin.x,r.origin.y,r.corner.x,r.corner.y);
fclose(fp);
}
#endif