[comp.sources.unix] v17i038: MGR, Bellcore window manager, Part37/61

rsalz@uunet.uu.net (Rich Salz) (01/26/89)

Submitted-by: Stephen A. Uhler <sau@bellcore.com>
Posting-number: Volume 17, Issue 38
Archive-name: mgr/part37




#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 37 (of 61)."
# Contents:  demo/msg/do.c lib/scribe.c.4 src/mgr.c
# Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:46 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'demo/msg/do.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'demo/msg/do.c'\"
else
echo shar: Extracting \"'demo/msg/do.c'\" \(14264 characters\)
sed "s/^X//" >'demo/msg/do.c' <<'END_OF_FILE'
X/*	$Header: do.c,v 4.1 88/06/21 14:02:38 bianchi Exp $
X	$Source: /tmp/mgrsrc/demo/msg/RCS/do.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/demo/msg/RCS/do.c,v $$Revision: 4.1 $";
X
X/*                        Copyright (c) 1987 Bellcore
X *                            All Rights Reserved
X *       Permission is granted to copy or use this program, EXCEPT that it
X *       may not be sold for profit, the copyright notice must be reproduced
X *       on copies, and credit should be given to Bellcore where it is due.
X *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* do a service */
X
X#include <stdio.h>
X#include <signal.h>
X#include "term.h"
X#include "do.h"
X
X#define dprintf		if (debug) fprintf
X#define have_icon(icon)	(icon->w && icon->h)
X#define GET_OPT(i)	\
X	strlen(argv[i])>2 ? argv[i]+2 : argv[++i]
X
X#define MSG		'&'		/* message leader */
X
X#define TIMEOUT		3		/* need first response by now */
X
X#define NORMAL		0		/* quiescent icon */
X#define RUNNING		1		/* icon while running command */
X#define ACTIVE		2		/* icon while window active */
X
X/* remote options */
X
X#define NONE	0			/* no remotes at all */
X#define LOCAL	1			/* command runs locally, ship file */
X#define REMOTE	2			/* command runs remotely */
X
Xint debug;
Xint wx,wy,border;			/* initial window parameters */
Xint fw, fh;				/* font size */
Xstruct icon *icon;			/* current icon */
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   register int i;
X
X   char *index(), *ttyname(), *getenv();
X   int timeout(),clean();
X
X   struct icon icons[3];		/* icons */
X   char line[100];			/* mgr inout buffer */
X   char file[100];			/* command args go here */
X   char message[100];			/* place to format messages */
X   char temp[100];			/* temp file name */
X   char do_host[32];			/* our host */
X
X   char action;				/* message command */
X   char *client_host;			/* client host */
X   char *command;			/* command to run */
X   char *name = NULL;			/* server name (if not command) */
X   char *path;				/* path part of file name */
X
X   int id;				/* id of sender */
X   int code;				/* return code from command */
X   int xpos, ypos;			/* where command window goes */
X   int wide ,high;			/* command window size */
X   int nowindow = 0;			/* no command window */
X   int font=0;				/* font in leiu of icon */
X   int wait=0;				/* wait for ack at command term. */
X   int remote=NONE;			/* remote requests permitted */
X   int icon_count=0;			/* Number of icons */
X   int servers = 0;			/* number of servers out there */
X   int bailout = 0;			/* bail out w/out running command */
X
X   debug = (int) getenv("DEBUG");
X
X   /* check for valid environment */
X
X   if (argc < 3) {
X      fprintf(stderr,"usage: %s [options] -c<command> icon1 icon2 [icon3]\n",
X              *argv);
X      fprintf(stderr,"options:\n");
X      fprintf(stderr,"   -C nnn   number of columns\n");
X      fprintf(stderr,"   -R nnn   number of rows\n");
X      fprintf(stderr,"   -f n     font\n");
X      fprintf(stderr,"   -n name  name of command (if not command name)\n");
X      fprintf(stderr,"   -p       wait for CR at command termination\n");
X      fprintf(stderr,"   -W       don't make alternate window\n");
X      fprintf(stderr,"   -x nnn   starting window position\n");
X      fprintf(stderr,"   -y nnn   starting window position\n");
X      fprintf(stderr,"   -i       interactive starting icon position\n");
X      fprintf(stderr,"   -r       permit remote invocations\n");
X      fprintf(stderr,"   -N       remote invocations run over there1\n");
X      exit(1);
X      }
X
X   ckmgrterm( *argv );
X   
X   /* setup mgr */
X
X   m_setup(M_FLUSH);
X   chmod(ttyname(2),0600);	/* this is not gauranteed */
X   m_push(P_POSITION|P_FONT|P_EVENT|P_FLAGS);
X
X   signal(SIGTERM,clean);
X   signal(SIGINT,clean);
X   signal(SIGHUP,clean);
X   signal(SIGALRM,timeout);
X
X   m_ttyset();
X   m_setmode(M_NOWRAP);
X   m_setmode(M_ABS);
X   m_func(B_COPY);
X
X   m_setevent(ACCEPT,"&%f:%m\r");
X   m_setevent(REDRAW,"R\r");
X   m_setevent(RESHAPE,"S\r");
X   m_setevent(MOVE,"M\r");
X   m_setevent(ACTIVATE,"A\r");
X   m_setevent(DEACTIVATE,"D\r");
X
X   get_size(&wx,&wy,&wide,&high);
X   get_param(0,0,0,&border);
X   font = get_font(&fw,&fh);
X   dprintf(stderr,"%d,%d %dx%d font %d (%d,%d)\n",wx,wy,wide,high,font,fw,fh);
X
X   xpos = wx, ypos=wy;
X   gethostname(do_host,sizeof(do_host));
X
X   /* check arguments */
X
X   for(i=1;i<argc;i++) {
X      if (*argv[i] == '-')
X         switch (argv[i][1]) {
X            case 'W':				/* don't make alt. window */
X               nowindow++;
X               break;
X            case 'r':				/* remote file, local command */
X               remote=LOCAL;
X               break;
X            case 'N':				/* remote commmand,local file */
X               remote=REMOTE;
X               break;
X            case 'p':				/* wait for ack */
X               wait++;
X               break;
X            case 'n':				/* specify command name */
X               name = GET_OPT(i);
X               break;
X            case 'c':				/* specify command */
X               command = GET_OPT(i);
X               break;
X            case 'f':				/* specify font */
X               font = atoi(GET_OPT(i));
X               break;
X            case 'C':				/* specify columns */
X               wide = 2*border + fw * atoi(GET_OPT(i));
X               break;
X            case 'R':				/* specify rows */
X               high = 2*border + fh * atoi(GET_OPT(i));
X               break;
X            case 'w':				/* specify wide */
X               wide = atoi(GET_OPT(i));
X               break;
X            case 'i':				/* specify icon start */
X               {
X                  int x,y;
X                  m_push(P_EVENT);
X                  m_setevent(BUTTON_1,"Z %p\r");
X                  fprintf(stderr,"Click button 1 to indicate icon position\n");
X                  while (*m_gets(line) != 'Z')
X                     ;
X                  sscanf(line,"Z %d %d",&x,&y);
X                  wx += x, wy +=y;
X                  m_pop();
X                  }
X               break;
X            case 'x':				/* specify x_start */
X               xpos = atoi(GET_OPT(i));
X               break;
X            case 'y':				/* specify y_start */
X               ypos = atoi(GET_OPT(i));
X               break;
X            default:
X               fprintf(stderr,"%s: bad flag %c ignored\n",argv[0],argv[i][1]);
X            }
X      else if (icon_count < 3) {
X         download_icon(&icons[icon_count],argv[i],icon_count+1,font);
X         icon_count++;
X         }
X      else
X         fprintf(stderr,"%s: invalid arg [%s] ignored\n",argv[0],argv[i]);
X      }
X
X   if (RUNNING > icon_count) {
X      fprintf(stderr,"%s: Not enough icons specified\n",argv[0]);
X      exit(2);
X      }
X      
X   if (debug) 
X      getchar();
X
X   set_icon(&icons[NORMAL]);
X
X   if (name == NULL)
X      name = command;
X
X   m_setevent(NOTIFY,name);
X   sprintf(message,"%c %s",S_HI,name);
X
X   m_broadcast(message);
X   alarm(TIMEOUT);
X   m_clearmode(M_ACTIVATE);
X   m_flush();
X   dprintf(stderr,"%s: broadcast id\r\n",name);
X         
X   while(m_gets(line) != NULL) {
X
X      /* process messages */
X
X      if (*line == MSG) {
X         sscanf(line+1,"%d:%c %[^\n]", &id,&action,file);
X         dprintf(stderr,"%s id: %d message: %s\r\n",name,id,file);
X         switch (action) {
X            case C_DO:			/* received command */
X               dprintf(stderr,"%s received command from %d (%s)\r\n",
X                       name,id,file);
X               sprintf(message,"%c%c",S_REPLY,R_RCVD);
X               m_sendto(id,message);
X               set_icon(&icons[RUNNING]);
X
X               /* no file name in command, use snarf buffer */
X
X               if (*file == C_SNARF) {
X                  m_put();
X                  m_gets(file);
X                  dprintf(stderr,"%s snarfing (%s)\r\n", name,file);
X                  }
X
X               /* get host name (if none, assume local host) */
X
X               if (path=index(file,HOST)) {
X                  *path = '\0';
X                  client_host = file;
X                  path++;
X                  }
X               else {
X                  path = file;
X                  client_host = do_host;
X                  }
X
X               dprintf(stderr,"Got %s at %s\n",path,client_host);
X              
X               if (strcmp(client_host,do_host)!= 0)
X                  switch (remote) {
X                     case NONE:		/* no remote access allowed */ 
X                        sprintf(message,"%c%c",S_REPLY,R_HOST);
X                        m_sendto(id,message);
X                        bailout++;
X                        break;
X                     case LOCAL:	/* ship file to command */
X                        sprintf(temp,"TEMP/%s:%s.%d",
X                               client_host,path,getpid());
X                        sprintf(message,"rcp %s:%s %s",
X                               client_host,path,temp);
X                        if (system(message)) {
X                           sprintf(message,"%c%c",S_REPLY,R_NET);
X                           m_sendto(id,message);
X                           bailout++;
X                           }
X                        break;
X                     case REMOTE:	/* run command remotely */
X                        sprintf(message,"rsh %s '%s %s'",
X                                client_host,command,path);
X                        break;
X                     }
X               else
X                  sprintf(message,"%s %s",command,path);
X               
X               if (bailout)
X                  break;
X
X               if (nowindow) {
X                  m_ttyreset();
X                  dprintf(stderr,"%s Running [%s] no window\n",name,message);
X                  code = system(message);
X                  m_ttyset();
X                  }
X               else 
X                  code = do_command(message,0,0,font,xpos,ypos,wide,high,wait);
X               set_icon(&icons[NORMAL]);
X               sprintf(message,"%c%c",S_REPLY,code==0?R_DONE:R_BAD);
X               m_sendto(id,message);
X               m_clearmode(M_ACTIVATE);
X               break;
X            case C_WHO:			/* received who-are-you inquiry */
X               dprintf(stderr,"%s received query from %d\r\n",name,id);
X               sprintf(message,"%c%c %s",S_REPLY,R_WHO,name);
X               m_sendto(id,message);
X               break;
X            case S_HI:			/* Hi, I'm a server */
X               dprintf(stderr,"%s Server HI message, ignored\r\n",name);
X               alarm(0);
X               break;
X            case S_BYE:			/* server died */
X               dprintf(stderr,"%s Server BYE message, ignored\r\n",name);
X               break;
X            case S_REPLY:		/* someone thinks I'm a client */
X               dprintf(stderr,"%s Oops, I got a server reply message\r\n",name);
X               break;
X            default:			/* unknown message */
X               sprintf(message,"%c%c",S_REPLY,R_UNKWN);
X               m_sendto(id,message);
X               dprintf(stderr,"%s unknown message\r\n",name);
X               break;
X            }
X         }
X      else {
X
X         /* process mgr events */
X
X         dprintf(stderr,"%s Not a message: %s\r\n",name,line);
X         switch(*line) {
X            case 'M':				/* moved */
X              get_size(&wx,&wy,0,0);
X              break;
X            case 'S':				/* reshape */
X              get_size(&wx,&wy,0,0);
X              reset_icon();
X              break;
X            case 'R':				/* redraw */
X              reset_icon();
X              break;
X#ifdef OOPS
X            case 'A':				/* window activated */
X              if (icon_count > ACTIVE)
X                 set_icon(&icons[ACTIVE]);
X              break;
X            case 'D':				/* window deactivated */
X              if (icon_count > ACTIVE)
X                 set_icon(&icons[NORMAL]);
X              break;
X#endif
X            }
X         }
X      m_flush();
X      }
X   }
X   
X/* down load an icon */
X
Xdownload_icon(icon,name,where,font)
Xregister struct icon *icon;	/* name of icon to download */
Xchar *name;			/* text string in lieu of icon */
Xint where;			/* bitmap to download icon to */
Xint font;			/* char font if no icon */
X   {
X   int size;
X   char line[100];
X   int w_in=0,h_in=0;
X
X   /* look only on the local machine */
X
X   dprintf(stderr,"   looking for %s\r\n",name);
X   m_bitfromfile(where,name);
X   m_flush();
X   m_gets(line);
X   sscanf(line,"%d %d",&w_in,&h_in);
X   dprintf(stderr,"   Found %s (%d x %d)\r\n",name,w_in,h_in);
X   icon->w = w_in;
X   icon->h = h_in;
X   icon->type = (h_in && w_in) ? where : font;
X   icon->name = name;
X   return(w_in && h_in);
X   } 
X
X/* put icon in a window */
X
Xset_icon(name)
Xstruct icon *name;		/* name of icon */
X   {
X   m_push(P_EVENT);
X   if (have_icon(name)) {
X      m_font(1);
X      dprintf(stderr,"Setting icon %s\r\n",name->name);
X      m_shapewindow(wx,wy,name->w+2*border,name->h+2*border);
X      m_bitcopyto(0,0,name->w,name->h,0,0,0,name->type);
X      }
X   else {
X      dprintf(stderr,"Setting text %s\r\n",name->name);
X      m_font(name->type);
X      m_size(strlen(name->name),1);
X      m_clear();
X      m_printstr(name->name);
X      }
X   m_flush();
X   m_clearmode(M_ACTIVATE);
X   m_pop();
X   icon = name;
X   }
X
Xreset_icon()
X   {
X   if (icon)
X      set_icon(icon);
X   }
X
X/* time out */
X
Xint
Xtimeout(n)
Xint n;
X   {
X   fprintf(stderr,"Can't send messages, sorry\n");
X   clean(n);
X   }
X
X/*	Clean up and exit */
X
Xclean(n)
Xint n;
X   {
X   char message[40];
X
X   sprintf(message,"%c",S_BYE);
X   m_broadcast(message);
X   m_gets(message);
X   m_popall();
X   m_clear();
X   m_ttyreset();
X   exit(n);
X   }
X
X/* run  a command in a sub window */
X
Xdo_command(command,menu,count,font,xpos,ypos,wide,high,wait)
Xchar *command;
Xstruct menu_entry *menu;
Xint count;
Xint font,xpos,ypos,wide,high;
Xint wait;
X   {
X   int code;		/* return code from command */
X   int n;		/* sub-window number */
X
X   n=m_makewindow(xpos,ypos,wide,high);
X
X   if (n==0) {			/* can't make window */
X      m_printstr("\007\fCan't open command window, sorry");
X      return(-1);
X      }
X
X   m_selectwin(n);
X   if (count) {
X      menu_load(1,count,menu);
X      m_selectmenu(1);
X      }
X   if (font > 0)
X      m_font(font);
X   m_ttyreset();
X   dprintf(stderr,"Running [%s]\n",command);
X   code = system(command);
X   if (wait) {
X      char temp[10];
X      m_gets(temp);
X      }
X   m_ttyset();
X   m_selectwin(0);
X   m_destroywin(n);
X   return(code);
X   }
END_OF_FILE
# end of 'demo/msg/do.c'
fi
if test -f 'lib/scribe.c.4' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lib/scribe.c.4'\"
else
echo shar: Extracting \"'lib/scribe.c.4'\" \(14275 characters\)
sed "s/^X//" >'lib/scribe.c.4' <<'END_OF_FILE'
X	31, 31, 0, -1, 2, 0, 4, 0, 6, -1};
Xstatic char c347[115] = {
X	56, -11, 13,			/*, 8, 26, Z  */
X	7, 11, 6, 9, 0, 3, -4, -2, -6, -5, -9, -9, 31, 31, 4, 6,
X	-4, -3, 31, 31, 9, 12, 6, 8, 4, 5, 0, 0, -6, -6, -7, -8,
X	31, 31, -9, 10, -7, 12, -4, 11, 3, 11, 9, 12, 31, 31, -8, 11,
X	-4, 10, 1, 10, 6, 11, 31, 31, -9, 10, -5, 9, 0, 9, 5, 10,
X	7, 11, 31, 31, -7, -8, -5, -7, 0, -6, 5, -6, 9, -7, 31, 31,
X	-6, -8, -1, -7, 4, -7, 8, -8, 31, 31, -9, -9, -3, -8, 4, -8,
X	7, -9, 9, -7, 31, 31, -6, 2, -1, 2, 31, 31, 2, 2, 6, 2};
Xstatic char c348[25] = {
X	11, -7, 9,			/*, 1, 49, [  */
X	-3, 16, -3, -16, 31, 31, -2, 16, -2, -16, 31, 31, -3, 16, 4, 16,
X	31, 31, -3, -16, 4, -16};
Xstatic char c349[7] = {
X	2, -11, 11,			/*, 1, 40, /  */
X	-9, 16, 9, -16};
Xstatic char c350[25] = {
X	11, -7, 9,			/*, 1, 50, ]  */
X	2, 16, 2, -16, 31, 31, 3, 16, 3, -16, 31, 31, -4, 16, 3, 16,
X	31, 31, -4, -16, 3, -16};
Xstatic char c351[17] = {
X	7, -11, 11,			/*, 9, 28, 1, */
X	-8, -2, 0, 3, 8, -2, 31, 31, -8, -2, 0, 2, 8, -2};
Xstatic char c352[7] = {
X	2, -12, 12,			/*, 1, 38, -  */
X	-9, -12, 9, -12};
Xstatic char c353[15] = {
X	6, -6, 6,			/*, 9, 30, 3, */
X	-2, 12, 3, 6, 31, 31, -2, 12, -3, 11, 3, 6};
Xstatic char c354[107] = {
X	52, -8, 11,			/*, 7, 1, A  */
X	-2, 0, -4, -2, -5, -4, -5, -6, -4, -8, -2, -9, 0, -7, 3, -6,
X	31, 31, -5, -4, -4, -6, -3, -7, -1, -8, 31, 31, -4, -2, -4, -4,
X	-3, -6, -1, -7, 0, -7, 31, 31, -4, 2, -2, 2, 1, 3, 3, 4,
X	4, 5, 6, 3, 5, 2, 5, -6, 6, -7, 7, -7, 31, 31, -3, 4,
X	-4, 3, -1, 3, 31, 31, 2, 3, 5, 3, 4, 4, 4, -7, 5, -8,
X	31, 31, -5, 3, -3, 5, -2, 4, 0, 3, 3, 2, 3, -7, 5, -9,
X	7, -7, 31, 31, -5, 3, 0, -2};
Xstatic char c355[89] = {
X	43, -9, 11,			/*, 7, 2, B  */
X	-6, 10, -5, 8, -5, -6, -7, -7, 31, 31, -4, 8, -5, 10, -4, 11,
X	-4, -6, -1, -8, 31, 31, -6, 10, -3, 12, -3, -6, -1, -7, 0, -8,
X	31, 31, -7, -7, -5, -7, -3, -8, -2, -9, 0, -8, 3, -7, 5, -7,
X	31, 31, -3, 2, 0, 3, 2, 4, 3, 5, 4, 4, 6, 3, 7, 3,
X	5, 2, 5, -7, 31, 31, 2, 4, 4, 3, 4, -6, 31, 31, 0, 3,
X	1, 3, 3, 2, 3, -7};
Xstatic char c356[71] = {
X	34, -8, 8,			/*, 7, 3, C  */
X	-4, 3, -4, -6, -6, -7, -5, -7, -3, -8, -2, -9, 31, 31, -3, 3,
X	-3, -7, -1, -8, 31, 31, -2, 3, -2, -6, 0, -7, 4, -5, -1, -8,
X	-2, -9, 31, 31, -4, 3, 0, 4, 2, 5, 3, 4, 5, 3, 6, 3,
X	31, 31, 1, 4, 2, 3, 4, 3, 31, 31, -2, 3, 0, 4, 2, 2,
X	4, 2, 6, 3};
Xstatic char c357[83] = {
X	40, -9, 10,			/*, 7, 4, D  */
X	0, 5, -2, 4, -5, 3, -5, -6, -7, -7, 31, 31, -4, 3, -4, -6,
X	-1, -8, 31, 31, 0, 5, -3, 3, -3, -6, -1, -7, 0, -8, 31, 31,
X	-7, -7, -5, -7, -3, -8, -2, -9, 0, -8, 3, -7, 5, -7, 31, 31,
X	-5, 10, -2, 12, -1, 9, 5, 3, 5, -7, 31, 31, -2, 9, -4, 10,
X	-3, 11, -2, 9, 4, 3, 4, -6, 31, 31, -5, 10, 3, 2, 3, -7};
Xstatic char c358[65] = {
X	31, -8, 8,			/*, 7, 5, E  */
X	-4, 3, -4, -6, -6, -7, -5, -7, -3, -8, -2, -9, 31, 31, -3, 3,
X	-3, -7, -1, -8, 31, 31, -2, 3, -2, -6, 0, -7, 4, -5, -1, -8,
X	-2, -9, 31, 31, -4, 3, 0, 4, 2, 5, 5, 1, 3, 0, -2, -3,
X	31, 31, 1, 4, 4, 1, 31, 31, -2, 3, 0, 4, 3, 0};
Xstatic char c359[83] = {
X	40, -8, 8,			/*, 7, 6, F  */
X	-4, 10, -4, -6, -6, -7, -5, -7, -3, -8, -2, -9, 31, 31, -3, 10,
X	-3, -7, -1, -8, 31, 31, -2, 10, -2, -6, 0, -7, 1, -7, -1, -8,
X	-2, -9, 31, 31, -4, 10, 0, 11, 2, 12, 3, 11, 5, 10, 6, 10,
X	31, 31, 1, 11, 2, 10, 4, 10, 31, 31, -2, 10, 0, 11, 2, 9,
X	4, 9, 6, 10, 31, 31, -7, 5, -4, 5, 31, 31, -2, 5, 1, 5};
Xstatic char c360[113] = {
X	55, -9, 11,			/*, 7, 7, G  */
X	-5, 3, -5, -6, -7, -7, -6, -7, -4, -8, -3, -9, -2, -8, 0, -7,
X	3, -6, 31, 31, -4, 2, -4, -7, -2, -8, 31, 31, -3, 3, -3, -6,
X	-1, -7, 0, -7, 31, 31, -5, 3, -3, 3, 0, 4, 2, 5, 3, 4,
X	5, 3, 7, 3, 5, 2, 5, -10, 4, -13, 2, -15, 0, -16, -1, -15,
X	-3, -14, -5, -14, 31, 31, 1, 4, 4, 2, 4, -10, 31, 31, 1, -15,
X	-1, -14, -2, -14, 31, 31, 0, 4, 1, 3, 3, 2, 3, -8, 4, -11,
X	4, -13, 31, 31, 2, -15, 1, -14, -1, -13, -3, -13, -5, -14};
Xstatic char c361[95] = {
X	46, -9, 11,			/*, 7, 8, H  */
X	-6, 10, -5, 8, -5, -6, -7, -7, -6, -7, -4, -8, -3, -9, 31, 31,
X	-4, 8, -5, 10, -4, 11, -4, -7, -2, -8, 31, 31, -6, 10, -3, 12,
X	-3, -6, -1, -7, -3, -9, 31, 31, -3, 2, 0, 3, 2, 4, 3, 5,
X	4, 4, 6, 3, 7, 3, 5, 2, 5, -7, 3, -9, 2, -11, 31, 31,
X	2, 4, 4, 3, 4, -7, 3, -9, 31, 31, 0, 3, 1, 3, 3, 2,
X	3, -7, 2, -11, 2, -14, 3, -16, 4, -16, 2, -14};
Xstatic char c362[71] = {
X	34, -5, 7,			/*, 7, 9, I  */
X	0, 12, -2, 10, 0, 9, 2, 10, 0, 12, 31, 31, 0, 11, -1, 10,
X	1, 10, 0, 11, 31, 31, 0, 5, -1, 4, -3, 3, -1, 2, -1, -7,
X	1, -9, 3, -7, 31, 31, 0, 2, 1, 3, 0, 4, -1, 3, 0, 2,
X	0, -7, 1, -8, 31, 31, 0, 5, 1, 4, 3, 3, 1, 2, 1, -6,
X	2, -7, 3, -7};
Xstatic char c363[79] = {
X	38, -5, 7,			/*, 7, 10, J  */
X	0, 12, -2, 10, 0, 9, 2, 10, 0, 12, 31, 31, 0, 11, -1, 10,
X	1, 10, 0, 11, 31, 31, 0, 5, -1, 4, -3, 3, -1, 2, -1, -7,
X	1, -9, 2, -11, 31, 31, 0, 2, 1, 3, 0, 4, -1, 3, 0, 2,
X	0, -7, 1, -9, 31, 31, 0, 5, 1, 4, 3, 3, 1, 2, 1, -7,
X	2, -11, 2, -14, 0, -16, -2, -16, -2, -15, 0, -16};
Xstatic char c364[101] = {
X	49, -9, 10,			/*, 7, 11, K  */
X	-6, 10, -5, 8, -5, -6, -7, -7, -6, -7, -4, -8, -3, -9, 31, 31,
X	-4, 8, -5, 10, -4, 11, -4, -7, -2, -8, 31, 31, -6, 10, -3, 12,
X	-3, -6, -1, -7, -3, -9, 31, 31, -3, 2, 0, 4, 2, 5, 4, 2,
X	1, 0, -3, -3, 31, 31, 1, 4, 3, 2, 31, 31, 0, 4, 2, 1,
X	31, 31, 1, 0, 2, -1, 4, -6, 5, -7, 6, -7, 31, 31, 1, -1,
X	2, -2, 3, -7, 4, -8, 31, 31, 0, -1, 1, -2, 2, -7, 4, -9,
X	6, -7};
Xstatic char c365[45] = {
X	21, -5, 7,			/*, 7, 12, L  */
X	-2, 10, -1, 8, -1, -6, -3, -7, -2, -7, 0, -8, 1, -9, 31, 31,
X	0, 8, -1, 10, 0, 11, 0, -7, 2, -8, 31, 31, -2, 10, 1, 12,
X	1, -6, 3, -7, 4, -7, 2, -8, 1, -9};
Xstatic char c366[135] = {
X	66, -13, 15,			/*, 7, 13, M  */
X	-11, 3, -10, 3, -9, 2, -9, -6, -11, -7, -10, -7, -8, -8, -7, -9,
X	31, 31, -9, 4, -8, 3, -8, -7, -6, -8, 31, 31, -11, 3, -9, 5,
X	-7, 3, -7, -6, -5, -7, -7, -9, 31, 31, -7, 2, -4, 3, -2, 4,
X	-1, 5, 1, 3, 1, -6, 3, -7, 1, -9, 31, 31, -2, 4, 0, 3,
X	0, -7, 2, -8, 31, 31, -4, 3, -3, 3, -1, 2, -1, -6, -2, -7,
X	0, -8, 1, -9, 31, 31, 1, 2, 4, 3, 6, 4, 7, 5, 8, 4,
X	10, 3, 11, 3, 9, 2, 9, -6, 10, -7, 11, -7, 31, 31, 6, 4,
X	8, 3, 8, -7, 9, -8, 31, 31, 4, 3, 5, 3, 7, 2, 7, -7,
X	9, -9, 11, -7};
Xstatic char c367[91] = {
X	44, -9, 11,			/*, 7, 14, N  */
X	-7, 3, -6, 3, -5, 2, -5, -6, -7, -7, -6, -7, -4, -8, -3, -9,
X	31, 31, -5, 4, -4, 3, -4, -7, -2, -8, 31, 31, -7, 3, -5, 5,
X	-3, 3, -3, -6, -1, -7, -3, -9, 31, 31, -3, 2, 0, 3, 2, 4,
X	3, 5, 4, 4, 6, 3, 7, 3, 5, 2, 5, -6, 6, -7, 7, -7,
X	31, 31, 2, 4, 4, 3, 4, -7, 5, -8, 31, 31, 0, 3, 1, 3,
X	3, 2, 3, -7, 5, -9, 7, -7};
Xstatic char c368[81] = {
X	39, -9, 11,			/*, 7, 15, O  */
X	-5, 3, -5, -6, -7, -7, 31, 31, -4, 2, -4, -6, -1, -8, 31, 31,
X	-3, 3, -3, -6, -1, -7, 0, -8, 31, 31, -7, -7, -5, -7, -3, -8,
X	-2, -9, 0, -8, 3, -7, 5, -7, 31, 31, -5, 3, -3, 3, 0, 4,
X	2, 5, 3, 4, 5, 3, 7, 3, 5, 2, 5, -7, 31, 31, 1, 4,
X	4, 2, 4, -6, 31, 31, 0, 4, 1, 3, 3, 2, 3, -7};
Xstatic char c369[109] = {
X	53, -9, 11,			/*, 7, 16, P  */
X	-6, 5, -5, 3, -5, -6, -7, -7, -5, -7, -5, -16, 31, 31, -5, 4,
X	-4, 3, -4, -15, -3, -14, -4, -12, 31, 31, -4, -7, -3, -7, -1, -8,
X	31, 31, -6, 5, -4, 4, -3, 3, -3, -6, -1, -7, 0, -8, 31, 31,
X	-3, -8, -2, -9, 0, -8, 3, -7, 5, -7, 31, 31, -3, -8, -3, -12,
X	-2, -14, -5, -16, 31, 31, -3, 2, 0, 3, 2, 4, 3, 5, 4, 4,
X	6, 3, 7, 3, 5, 2, 5, -7, 31, 31, 2, 4, 4, 3, 4, -6,
X	31, 31, 0, 3, 1, 3, 3, 2, 3, -7};
Xstatic char c370[89] = {
X	43, -9, 11,			/*, 7, 17, Q  */
X	-5, 3, -5, -6, -7, -7, 31, 31, -4, 2, -4, -7, -2, -8, 31, 31,
X	-3, 3, -3, -6, -1, -7, 0, -7, 31, 31, -7, -7, -6, -7, -4, -8,
X	-3, -9, -2, -8, 0, -7, 3, -6, 31, 31, -5, 3, -3, 3, 0, 4,
X	2, 5, 3, 4, 5, 3, 7, 3, 5, 2, 5, -16, 31, 31, 1, 4,
X	4, 2, 4, -15, 3, -14, 4, -12, 31, 31, 0, 4, 1, 3, 3, 2,
X	3, -12, 2, -14, 5, -16};
Xstatic char c371[77] = {
X	37, -8, 8,			/*, 7, 18, R  */
X	-6, 3, -5, 3, -4, 2, -4, -6, -6, -7, -5, -7, -3, -8, -2, -9,
X	31, 31, -5, 4, -3, 3, -3, -7, -1, -8, 31, 31, -6, 3, -4, 5,
X	-2, 3, -2, -6, 0, -7, 1, -7, -1, -8, -2, -9, 31, 31, -2, 3,
X	2, 5, 3, 4, 5, 3, 6, 3, 31, 31, 1, 4, 2, 3, 4, 3,
X	31, 31, 0, 4, 2, 2, 4, 2, 6, 3};
Xstatic char c372[119] = {
X	58, -8, 10,			/*, 7, 19, S  */
X	-5, 3, -5, -1, -3, -2, 3, -2, 5, -3, 5, -7, 31, 31, -4, 3,
X	-4, -1, 31, 31, 4, -3, 4, -7, 31, 31, -2, 4, -3, 3, -3, -1,
X	-1, -2, 31, 31, 1, -2, 3, -3, 3, -7, 2, -8, 31, 31, -5, 3,
X	-2, 4, 0, 5, 2, 4, 4, 4, 5, 5, 31, 31, -1, 4, 1, 4,
X	31, 31, -2, 4, 0, 3, 2, 3, 4, 4, 31, 31, 5, -7, 2, -8,
X	0, -9, -2, -8, -4, -8, -6, -9, 31, 31, 1, -8, -1, -8, 31, 31,
X	2, -8, 0, -7, -3, -7, -6, -9, 31, 31, 5, 5, 4, 3, 2, 0,
X	-3, -5, -6, -9};
Xstatic char c373[57] = {
X	27, -5, 7,			/*, 7, 20, T  */
X	-2, 10, -1, 8, -1, -6, -3, -7, -2, -7, 0, -8, 1, -9, 31, 31,
X	0, 8, -1, 10, 0, 11, 0, -7, 2, -8, 31, 31, -2, 10, 1, 12,
X	1, -6, 3, -7, 4, -7, 2, -8, 1, -9, 31, 31, -4, 5, -1, 5,
X	31, 31, 1, 5, 4, 5};
Xstatic char c374[95] = {
X	46, -9, 11,			/*, 7, 21, U  */
X	-7, 3, -6, 3, -5, 2, -5, -6, -7, -7, 31, 31, -6, 4, -4, 3,
X	-4, -7, -2, -8, 31, 31, -7, 3, -5, 5, -3, 3, -3, -6, -1, -7,
X	0, -7, 31, 31, -7, -7, -6, -7, -4, -8, -3, -9, -2, -8, 0, -7,
X	3, -6, 31, 31, 3, 5, 4, 4, 6, 3, 7, 3, 5, 2, 5, -6,
X	6, -7, 7, -7, 31, 31, 2, 4, 4, 3, 4, -7, 5, -8, 31, 31,
X	3, 5, 1, 3, 3, 2, 3, -7, 5, -9, 7, -7};
Xstatic char c375[73] = {
X	35, -9, 11,			/*, 7, 22, V  */
X	-6, 5, -5, 3, -5, -6, -2, -9, 0, -7, 3, -6, 5, -6, 31, 31,
X	-5, 4, -4, 3, -4, -6, -1, -8, 31, 31, -6, 5, -4, 4, -3, 3,
X	-3, -5, -2, -6, 0, -7, 31, 31, 3, 5, 4, 4, 6, 3, 7, 3,
X	5, 2, 5, -6, 31, 31, 2, 4, 4, 3, 4, -5, 31, 31, 3, 5,
X	1, 3, 3, 2, 3, -6};
Xstatic char c376[115] = {
X	56, -13, 15,			/*, 7, 23, W  */
X	-10, 5, -9, 3, -9, -6, -6, -9, -4, -7, -1, -6, 31, 31, -9, 4,
X	-8, 3, -8, -6, -5, -8, 31, 31, -10, 5, -8, 4, -7, 3, -7, -5,
X	-6, -6, -4, -7, 31, 31, -1, 5, -3, 3, -1, 2, -1, -6, 2, -9,
X	4, -7, 7, -6, 9, -6, 31, 31, -2, 4, 0, 3, 0, -6, 3, -8,
X	31, 31, -1, 5, 0, 4, 2, 3, 1, 2, 1, -5, 2, -6, 4, -7,
X	31, 31, 7, 5, 8, 4, 10, 3, 11, 3, 9, 2, 9, -6, 31, 31,
X	6, 4, 8, 3, 8, -5, 31, 31, 7, 5, 5, 3, 7, 2, 7, -6};
Xstatic char c377[119] = {
X	58, -10, 11,			/*, 7, 24, X  */
X	-7, 3, -6, 3, -4, 2, -3, 1, 1, -7, 2, -8, 4, -9, 6, -7,
X	31, 31, -5, 4, -3, 3, 2, -7, 4, -8, 31, 31, -7, 3, -5, 5,
X	-3, 4, -2, 3, 2, -5, 3, -6, 5, -7, 6, -7, 31, 31, 0, -1,
X	3, 5, 4, 4, 6, 4, 7, 5, 31, 31, 3, 4, 4, 3, 5, 3,
X	31, 31, 2, 3, 4, 2, 6, 3, 7, 5, 31, 31, -1, -3, -4, -9,
X	-5, -8, -7, -8, -8, -9, 31, 31, -4, -8, -5, -7, -6, -7, 31, 31,
X	-3, -7, -5, -6, -7, -7, -8, -9, 31, 31, -5, -2, -2, -2, 31, 31,
X	1, -2, 4, -2};
Xstatic char c378[121] = {
X	59, -9, 11,			/*, 7, 25, Y  */
X	-7, 3, -6, 3, -5, 2, -5, -6, -7, -7, 31, 31, -6, 4, -4, 3,
X	-4, -7, -2, -8, 31, 31, -7, 3, -5, 5, -3, 3, -3, -6, -1, -7,
X	0, -7, 31, 31, -7, -7, -6, -7, -4, -8, -3, -9, -2, -8, 0, -7,
X	3, -6, 31, 31, 3, 5, 4, 4, 6, 3, 7, 3, 5, 2, 5, -10,
X	4, -13, 2, -15, 0, -16, -1, -15, -3, -14, -5, -14, 31, 31, 2, 4,
X	4, 3, 4, -10, 31, 31, 1, -15, -1, -14, -2, -14, 31, 31, 3, 5,
X	1, 3, 3, 2, 3, -8, 4, -11, 4, -13, 31, 31, 2, -15, 1, -14,
X	-1, -13, -3, -13, -5, -14};
Xstatic char c379[77] = {
X	37, -9, 11,			/*, 7, 26, Z  */
X	6, 5, -6, -9, 31, 31, -6, 3, -4, 2, -1, 2, 2, 3, 6, 5,
X	31, 31, -5, 4, -3, 3, 1, 3, 31, 31, -6, 3, -4, 5, -2, 4,
X	2, 4, 6, 5, 31, 31, -6, -9, -2, -7, 1, -6, 4, -6, 6, -7,
X	31, 31, -1, -7, 3, -7, 5, -8, 31, 31, -6, -9, -2, -8, 2, -8,
X	4, -9, 6, -7, 31, 31, -4, -2, 4, -2};
Xstatic char c380[57] = {
X	27, -7, 9,			/*, 3, 49, [  */
X	2, 16, -1, 13, -2, 10, -2, 8, -1, 5, 2, 2, 31, 31, 0, 14,
X	-1, 11, -1, 7, 0, 4, 31, 31, 2, 2, -1, 0, 2, -2, 31, 31,
X	2, -2, -1, -5, -2, -8, -2, -10, -1, -13, 2, -16, 31, 31, 0, -4,
X	-1, -7, -1, -11, 0, -14};
Xstatic char c381[7] = {
X	2, -4, 4,			/*, 9, 14, N  */
X	0, 16, 0, -16};
Xstatic char c382[57] = {
X	27, -7, 9,			/*, 3, 50, ]  */
X	-2, 16, 1, 13, 2, 10, 2, 8, 1, 5, -2, 2, 31, 31, 0, 14,
X	1, 11, 1, 7, 0, 4, 31, 31, -2, 2, 1, 0, -2, -2, 31, 31,
X	-2, -2, 1, -5, 2, -8, 2, -10, 1, -13, -2, -16, 31, 31, 0, -4,
X	1, -7, 1, -11, 0, -14};
Xstatic char c383[49] = {
X	23, -12, 14,			/*, 3, 59, >  */
X	-9, -3, -9, -1, -8, 2, -6, 3, -4, 3, -2, 2, 2, -1, 4, -2,
X	6, -2, 8, -1, 9, 1, 31, 31, -9, -1, -8, 1, -6, 2, -4, 2,
X	-2, 1, 2, -2, 4, -3, 6, -3, 8, -2, 9, 1, 9, 3};
Xstatic char c384[7] = {
X	2, -12, 14,			/*, 3, 38, -  */
X	-9, -12, 9, -12};
X
Xstatic char *p[384] = { 
X	c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12,
X	c13, c14, c15, c16, c17, c18, c19, c20, c21, c22, c23, c24,
X	c25, c26, c27, c28, c29, c30, c31, c32, c33, c34, c35, c36,
X	c37, c38, c39, c40, c41, c42, c43, c44, c45, c46, c47, c48,
X	c49, c50, c51, c52, c53, c54, c55, c56, c57, c58, c59, c60,
X	c61, c62, c63, c64, c65, c66, c67, c68, c69, c70, c71, c72,
X	c73, c74, c75, c76, c77, c78, c79, c80, c81, c82, c83, c84,
X	c85, c86, c87, c88, c89, c90, c91, c92, c93, c94, c95, c96,
X	c97, c98, c99, c100,c101,c102,c103,c104,c105,c106,c107,c108,
X	c109,c110,c111,c112,c113,c114,c115,c116,c117,c118,c119,c120,
X	c121,c122,c123,c124,c125,c126,c127,c128,c129,c130,c131,c132,
X	c133,c134,c135,c136,c137,c138,c139,c140,c141,c142,c143,c144,
X	c145,c146,c147,c148,c149,c150,c151,c152,c153,c154,c155,c156,
X	c157,c158,c159,c160,c161,c162,c163,c164,c165,c166,c167,c168,
X	c169,c170,c171,c172,c173,c174,c175,c176,c177,c178,c179,c180,
X	c181,c182,c183,c184,c185,c186,c187,c188,c189,c190,c191,c192,
X	c193,c194,c195,c196,c197,c198,c199,c200,c201,c202,c203,c204,
X	c205,c206,c207,c208,c209,c210,c211,c212,c213,c214,c215,c216,
X	c217,c218,c219,c220,c221,c222,c223,c224,c225,c226,c227,c228,
X	c229,c230,c231,c232,c233,c234,c235,c236,c237,c238,c239,c240,
X	c241,c242,c243,c244,c245,c246,c247,c248,c249,c250,c251,c252,
X	c253,c254,c255,c256,c257,c258,c259,c260,c261,c262,c263,c264,
X	c265,c266,c267,c268,c269,c270,c271,c272,c273,c274,c275,c276,
X	c277,c278,c279,c280,c281,c282,c283,c284,c285,c286,c287,c288,
X	c289,c290,c291,c292,c293,c294,c295,c296,c297,c298,c299,c300,
X	c301,c302,c303,c304,c305,c306,c307,c308,c309,c310,c311,c312,
X	c313,c314,c315,c316,c317,c318,c319,c320,c321,c322,c323,c324,
X	c325,c326,c327,c328,c329,c330,c331,c332,c333,c334,c335,c336,
X	c337,c338,c339,c340,c341,c342,c343,c344,c345,c346,c347,c348,
X	c349,c350,c351,c352,c353,c354,c355,c356,c357,c358,c359,c360,
X	c361,c362,c363,c364,c365,c366,c367,c368,c369,c370,c371,c372,
X	c373,c374,c375,c376,c377,c378,c379,c380,c381,c382,c383,c384};
X/*--------------------------*/
X	i = char_per_font * font + (ch-32);
X	c = error_char;
X	if (i >= 0 && i <383) c = p[i];
X	*npts = ( *c++) << 1;		/* convert pt count to coord count*/
X	*min = *c++;			/* extent of char, in char coords*/
X	*max = *c++;
X	for (i=0; i<*npts; i++) *pts++ = *c++;
X}
X
END_OF_FILE
# end of 'lib/scribe.c.4'
fi
if test -f 'src/mgr.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/mgr.c'\"
else
echo shar: Extracting \"'src/mgr.c'\" \(13239 characters\)
sed "s/^X//" >'src/mgr.c' <<'END_OF_FILE'
X/*                        Copyright (c) 1987 Bellcore
X *                            All Rights Reserved
X *       Permission is granted to copy or use this program, EXCEPT that it
X *       may not be sold for profit, the copyright notice must be reproduced
X *       on copies, and credit should be given to Bellcore where it is due.
X *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/*	$Header: mgr.c,v 4.7 88/07/28 11:11:05 sau Exp $
X	$Source: /tmp/mgrsrc/src/RCS/mgr.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/mgr.c,v $$Revision: 4.7 $";
X
X/* main routine for MGR */
X
X#include "bitmap.h"
X#include <stdio.h>
X#include <sys/signal.h>
X#ifdef sun
X#include <sys/time.h> 
X#endif
X#include <errno.h>
X#include "defs.h"
X#include "menu.h"
X#include "font.h"
X#include "event.h"
X
X#ifndef Min
X#define Min(x,y)		((x)>(y)?(y):(x))
X#endif
X#define POLL(poll)		(poll&mask ? &set_poll : (struct timeval *) 0)
X
X#ifdef sun
Xstruct timeval set_poll = {
X   (long) 0, (long) POLL_INT
X   };				/* set select to poll */
X#endif
X
Xchar *mouse_dev = MOUSE_DEV;		/* name of mouse device */
Xstatic int bitmaptype = 1;			/* old, non portable bitmap format */
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   register WINDOW *win;		/* current window to update */
X   register int i;			/* counter */
X   register int count;			/* # chars read from shell */
X   int maxbuf = MAXBUF;			/* # chars processed per window */
X   int shellbuf = MAXSHELL;		/* # chars processed per shell */
X   int type=1;				/* state var. for parsing argv */
X   int reads;				/* masks, result of select */
X   int tty;				/* fd for controlling tty */
X
X   unsigned char c;			/* reads from kbd go here */
X   char start_file[MAX_PATH];		/* name of startup file */
X   char *screen_dev = SCREEN_DEV;	/* name of frame buffer */
X   char *default_font = (char * )0;	/* default font */
X   char *rindex(), *getenv(), *ttyname();
X   char *term = getenv("TERM");		/* place to put terminal name */
X#ifdef SHRINK
X   BITMAP *prime;
X#endif
X
X   SETMOUSEICON(&mouse_arrow);
X
X   /* process arguments */
X
X   sprintf(start_file,"%s/%s",getenv("HOME"),STARTFILE);
X   while(--argc > 0) {
X      argv++;
X#ifdef DEBUG
X      dprintf(S)(stderr,"argument %s type %c\r\n",*argv,type==1?'*':type);
X#endif
X      switch(type) {
X         case 1:	/* looking for flag */
X              if (**argv == '-')
X                 switch(type = *(*argv+1)) {
X#ifdef DEBUG
X                 case 'd': debug = 1;
X                           strcpy(debug_level,*argv+2);
X                           fprintf(stderr,"Debug level: [%s]\n",debug_level);
X                           type = 1;
X                           break;
X#endif
X                 case 'v': 		/* print version number */
X                           printf("Mgr version %s created on %s at: %s\n",
X                                  version[0],version[1],version[2]);
X                           exit(1);
X                 case 'V': 		/* print version and options */
X                           printf("Mgr version %s created on %s at: %s by %s\n",
X                                  version[0],version[1],version[2],version[5]);
X                           printf("Compile flags: %s\n",version[3]);
X                           printf("Home directory: %s\n",version[4]);
X									printf("built with: %s\n",version[6]);
X                           exit(1);
X                 case 'x': strcpy(start_file,"/dev/null");
X                           type = 1;
X                           break;
X                 case 'n': 	/* use new style bitmap headers */
X                           bitmaptype = 0;
X                           break;
X                 }
X              else fprintf(stderr,"Invalid argument %s, ignored\n",*argv);
X              break;
X         case 'm':	/* set mouse device */
X              mouse_dev = *argv;
X              type = 1;
X              break;
X         case 's':	/* set start file */
X              strcpy(start_file,*argv);
X              type = 1;
X              break;
X         case 'F':	/* set default font file */
X              default_font = *argv;
X              type = 1;
X         case 'P':	/* set polling timeout */
X              set_poll.tv_usec = (long) atoi(*argv);
X              break;
X         case 'b':	/* set shell buffering */
X              shellbuf = atoi(*argv);
X              shellbuf = BETWEEN(5,shellbuf,1024);
X              break;
X         case 'B':	/* set window buffering */
X              maxbuf = atoi(*argv);
X              maxbuf = BETWEEN(1,maxbuf,shellbuf);
X              break;
X         case 'f':	/* set font directory */
X              font_dir = *argv;
X              type = 1;
X              break;
X         case 'i':	/* set icon directory */
X              icon_dir = *argv;
X              type = 1;
X              break;
X         case 'S':	/* set alternate frame buffer */
X              screen_dev = *argv;
X              type = 1;
X              break;
X         default:	/* invalid flag */
X             fprintf(stderr,"Invalid flag %c, ignored\r\n",type);
X              type = 1;
X              break;
X         }
X      }
X
X   /* keep mgr from being run within itself */
X
X   if (term && strcmp(TERMNAME,term)==0) {
X      fprintf(stderr,"Can't invoke mgr from within itself\n");
X      exit(1);
X      }
X   /* save tty modes for ptty's */
X
X   save_modes(0);
X
X   /* free all unused fd's */
X
X   count = getdtablesize();
X   for(i=3;i<count;i++)
X      close(i);
X
X#ifdef WHO
X   save_utmp(ttyname(0));
X#endif
X
X   /* initialize the keyboard; sometimes a special device */
X   initkbd();
X
X   /* initialize the bell; sometimes a special device requiring funnys */
X   initbell();
X
X   /* get the default font file */
X
X   if (default_font || (default_font = getenv(DEFAULT_FONT)))
X      font = open_font(default_font);
X
X   if (font == (struct font *) 0)
X      font = open_font("");
X   font->ident = 0;
X
X   /* set up the default font names */
X
X   /* open the mouse */
X
X   if ((mouse=open(mouse_dev,2)) <0) {
X      perror("can't find the mouse, or it is already in use\n");
X      exit(1);
X      }
X
X   if (set_mouseio(mouse) < 0)
X      fprintf(stderr,"can't set mouse to exclusive use\n");
X
X   mousex=mousey=32;
X
X   /* find the screen */
X
X#ifdef SHRINK			/* for sdh */
X
X#ifndef X0
X# define X0 64
X#endif
X#ifndef Y0
X# define Y0 64
X#endif
X#ifndef W0
X# define W0 1024
X#endif
X#ifndef H0
X# define H0 772
X#endif
X
X   if ((prime = bit_open(screen_dev)) == (BITMAP *) 0) {
X      perror("can't find the screen");
X      exit(2);
X      }
X   screen = bit_create(prime,X0&~0xf,Y0&~0xf,W0&~0xf,H0&~0xf);
X#else
X   if ((screen = bit_open(screen_dev)) == (BITMAP *) 0) {
X      perror("can't find the screen");
X      exit(2);
X      }
X#endif
X
X   copyright(screen);
X
X   set_tty(0);
X
X   SETMOUSEICON(&mouse_cup);
X
X   /* catch the right interrupts */
X
X   for(i=0;i<NSIG;i++) switch(i) {
X      case SIGCHLD:     signal(SIGCHLD,sig_child);
X                        break;
X      case SIGILL:	/* <= 3.0 abort gererates this one */
X      case SIGCONT:
X      case SIGIOT:	/* 3.2 abort generates this (gee thanks, SUN!) */
X      case SIGQUIT:
X                        break;
X      case SIGTTIN:
X      case SIGTTOU:     signal(i,SIG_IGN);
X                        break;
X      default:          signal(i,catch);
X                        break;
X      }
X
X   /* set the terminal type */
X
X   if (term && strlen(term) >= strlen(TERMNAME))
X      strcpy(term,TERMNAME);
X
X	/* get default font definitions */
X
X      {
X      char buff[MAX_PATH];
X      sprintf(buff,"%s/%s",font_dir,STARTFILE);
X      startup(buff);
X      }
X
X   /* process startup file */
X
X   startup(start_file);
X   if (active != (WINDOW *) 0)
X      ACTIVE_ON();
X   else {
X      MOUSE_OFF(mousex,mousey);
X      erase_win(screen,0,0);
X      MOUSE_ON(mousex,mousey);
X   }
X
X   /* turn on mouse cursor */
X
X   MOUSE_OFF(mousex,mousey);
X   SETMOUSEICON(&mouse_arrow);
X   MOUSE_ON(mousex,mousey);
X
X   /* void tty association 		(does bad things when mgr crashes) */
X
X   /*  void_tty();       Flakey ... Commented Out! */
X
X   /* always look for keyboard and mouse input */
X
X   mask |= (1<<mouse) | (1<<0); 
X
X   /* main polling loop */
X
X   while(1) {
X
X      /* see if any window died */
X
X      for(win=active;win != (WINDOW *) 0;) 
X         if (W(flags)&W_DIED) {
X#ifdef DEBUG
X            dprintf(d)(stderr,"Destroying %s-%d\r\n",W(tty),W(num));
X#endif
X            destroy(win);
X            win = active;
X            }
X         else
X            win = W(next);
X
X      /* wait for input */
X
X      reads = mask & ~poll;
X
X#ifdef DEBUG
X      dprintf(l)(stderr,"select: mask=0x%x poll=0x%x 0x%x got\r\n",
X                 mask,poll,reads);
X#endif
X#ifdef sun
X      if (select(32,&reads,0,0,POLL(poll)) <0) {
X#ifdef DEBUG
X         dprintf(l)(stderr,"select failed %d->%d\r\n",
X                 reads, mask & ~poll);
X         if (debug) 
X            perror("Select:");
X#endif
X         reads = mask & ~poll;
X         continue;
X         }
X#else
X	????? /* I need to package up select some how */
X#endif
X#ifdef DEBUG
X      dprintf(l)(stderr,"0x%x\r\n",reads);
X#endif
X
X      /* process mouse */
X
X      if (reads & (1<<mouse))
X         do {
X            proc_mouse(mouse);
X            }
X         while(mouse_count());
X      
X      /* process keyboard input */
X      
X      if (reads&1 && active && !(ACTIVE(flags)&W_NOINPUT)) {
X         read(0,&c,1);
X#ifdef BUCKEY
X         if ( (ACTIVE(flags)&W_NOBUCKEY)  ||  !do_buckey(c) )
X            write(ACTIVE(to_fd),&c,1);
X#else
X         write(ACTIVE(to_fd),&c,1);
X#endif
X			if (ACTIVE(flags)&W_DUPKEY && c==ACTIVE(dup))
X         	write(ACTIVE(to_fd),&c,1);
X         continue;
X         }
X       else if (reads&1 && !active) {		/* toss the input */
X         read(0,&c,1);
X#ifdef BUCKEY
X         do_buckey(c);
X#endif
X	 }
X
X      /* process shell output */
X
X      for(win=active;win != (WINDOW *) 0;win=W(next)) {
X         register int fd_bit = W(from_fd) ? 1<<W(from_fd) : 0;
X
X         /* read data into buffer */
X
X         if (fd_bit&reads&(~poll)) {
X            W(current) = 0;
X            if ((W(max) = read(W(from_fd),W(buff),shellbuf)) > 0) {
X               poll |= fd_bit;
X#ifdef DEBUG
X               dprintf(p)(stderr,"%s: reading %d [%.*s]\r\n",W(tty),
X                     W(max),W(max),W(buff));
X#endif
X               }
X            else {
X               poll &= ~fd_bit;
X#ifdef KILL
X               if (W(flags)&W_NOKILL)
X                  W(flags) |= W_DIED;
X#endif
X#ifdef DEBUG
X               if(debug) {
X                  fprintf(stderr,"%s: Select boo-boo fd(%d) code %d\r\n",
X                          W(tty),W(from_fd),W(max));
X                  perror(W(tty)); 
X                  }
X#endif
X               }
X            }
X 
X         /* check for window to auto-expose */
X
X         if (fd_bit&poll && W(flags)&W_EXPOSE && !(W(flags)&W_ACTIVE)) {
X#ifdef DEBUG
X            dprintf(m)(stderr,"%s: activating self\r\n",W(tty));
X#endif
X            MOUSE_OFF(mousex,mousey);
X            cursor_off();
X            ACTIVE_OFF();
X            expose(win);
X            ACTIVE_ON();
X            cursor_on();
X            MOUSE_ON(mousex,mousey);
X            }
X
X         /* write data into the window */
X
X         if (fd_bit&poll && W(flags)&(W_ACTIVE|W_BACKGROUND)) {
X            
X#ifdef PRIORITY			/* use priority scheduling */
X            if (win==active)
X               count = Min(maxbuf,W(max)-W(current));
X            else if (W(flags)&W_ACTIVE)
X               count = Min(maxbuf>>1,W(max)-W(current));
X            else
X               count = Min(maxbuf>>2,W(max)-W(current));
X#else				/* use round robin scheduling */
X            count = Min(maxbuf,W(max)-W(current));
X#endif
X
X            i = put_window(win,W(buff)+W(current),count);
X#ifdef DEBUG
X            dprintf(w)(stderr,"%s: writing %d/%d %.*s [%.*s]\r\n",
X                       W(tty),i,count,i,W(buff)+W(current),count-i,
X                       W(buff)+W(current)+i);
X#endif
X
X            W(current) += i;
X            if (W(current) >= W(max))
X               poll &= ~fd_bit;
X            }
X         }
X      }
X   }
X
X/*************************************************************************
X *	catch dead children 
X */
X
Xsig_child(sig)
Xint sig;
X   {
X   register WINDOW *win;
X   extern int errno;
X
X   /* see if a shell has died, mark deleted */
X
X#ifdef DEBUG
X   dprintf(d)(stderr,"Looking for dead windows\r\n");
X#endif
X
X   for(win=active;win != (WINDOW *) 0;win=W(next)) {
X      if (kill(W(pid),0) != 0 && !(W(flags)&W_NOKILL)) {
X         W(flags) |= W_DIED;
X#ifdef DEBUG
X         dprintf(d)(stderr, "%s-%d DIED\r\n",W(tty),W(num));
X#endif
X         }
X      }
X   }
X
X/* process mouse */
X
Xint
Xproc_mouse(mouse)
Xint mouse;
X   {
X   int dx, dy;
X   static int still_down = 0;
X   register int button, done = 0;
X
X   do {
X      button = mouse_get(mouse,&dx,&dy);
X      MOUSE_OFF(mousex,mousey);
X      mousex += 2*dx;
X      mousey -= 2*dy;
X      mousex = BETWEEN(0,mousex,BIT_WIDE(screen)-1);
X      mousey = BETWEEN(0,mousey,BIT_HIGH(screen)-1);
X      if (button != button_state) {
X         do_button( button );
X         done++;
X         }
X      MOUSE_ON(mousex,mousey);
X      } while (mouse_count() && !done);
X   return(done);
X   }
X
X/* reopen the mouse after suspend */
X      
Xint
Xmouse_reopen()
X   {
X   int m = open(mouse_dev,2);
X   set_mouseio(m);
X   return(m);
X   }
X
X/* return bitmap type */
X
Xint
Xget_bm_type()
X   {
X   return (bitmaptype);
X   }
END_OF_FILE
# end of 'src/mgr.c'
fi
echo shar: End of archive 37 \(of 61\).
cp /dev/null ark37isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
	21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 \
	38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 \
	55 56 57 58 59 60 61 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 61 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.