[comp.sources.unix] v17i029: MGR, Bellcore window manager, Part28/61

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

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




#! /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 28 (of 61)."
# Contents:  demo/icon/snap.c font-16/Ucmr15x25r misc/hp_raster.c
#   src/defs.h src/new_window.c src/update.c
# Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:33 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'demo/icon/snap.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'demo/icon/snap.c'\"
else
echo shar: Extracting \"'demo/icon/snap.c'\" \(8035 characters\)
sed "s/^X//" >'demo/icon/snap.c' <<'END_OF_FILE'
X/*                        Copyright (c) 1988 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: snap.c,v 4.5 88/08/23 10:47:42 bianchi Exp $
X	$Source: /tmp/mgrsrc/demo/icon/RCS/snap.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/snap.c,v $$Revision: 4.5 $";
X
X/* snap a piece of the screen -- only works locally */
X
X#include <signal.h>
X#include <sys/file.h>
X#include "term.h"
X#include "bitmap.h"
X#include "dump.h"
X
X#define ICON   "easel"
X#define SCREEN   "/dev/bwtwo0"
X#define min(x,y)      ((x)>(y)?(y):(x))
X#define dprintf   if(debug)fprintf
X#define PRINTER   "lp"         /* default printer name */
X#define CANCEL      10            /* time after which REVIEW is canceled */
X
Xstatic char buff[100];         /* mgr input buffer */
Xstatic char cmd[100];            /* lpr command buffer */
Xstatic char *name;               /* file name */
Xstatic char my_host[32];            /* my-host */
Xstatic char mgr_host[32];            /* mgr host */
X
Xstatic int debug=0;
Xstatic int review=0;            /* review more set */
Xstatic int func = BIT_SRC;
X
X#define MENU_COUNT      (sizeof(menu)/sizeof(struct menu_entry))
X
Xstatic struct menu_entry menu[] = {
X   "print","Print\r",
X   "file","File\r",
X   "review =>","View\r",
X   "quit","Quit\r",
X};
Xstatic struct menu_entry rop[] = {
X   "set","-Set\r",
X   "paint","-Paint\r",
X   "xor","-Xor\r",
X   "mask","-Mask\r",
X};
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   BITMAP *screen , *tmp = (BITMAP *) 0;
X   char *printer, *getenv();
X
X   FILE *fp;      /* file to write */
X   int w,h;
X   int wide,high;   /* picture size */
X   int x,y;      /* window pos */
X   int x1,y1;   /* sweep coords */
X   int xmax, ymax;      /* display size */
X   int n;
X   int snapping = 0;      /* ready to snap */
X   int format = OLD_BHDR;			/* new format */
X   int cancel(),clean();
X
X   FILE *pf;
X   
X   ckmgrterm();
X
X   debug = (int) getenv("DEBUG");
X
X   if (argc > 1 && strcmp("-n",argv[1])==0) {
X      format=NEW_BHDR;
X      argc--;
X      argv++;
X		}
X
X   if (argc != 2) {
X      fprintf(stderr,"Usage: snap [-n] <file>\n");
X      exit(1);
X      }
X
X   name = argv[1];
X
X   if ((screen = bit_open(SCREEN)) == (BITMAP *) 0) {
X      fprintf(stderr,"%s: Can't find %s\n",*argv,SCREEN);
X      exit(1);
X      }
X
X   if ((fp = fopen(name, "w")) == NULL) {
X      perror("fopen");
X      fprintf(stderr,"%s: Can't fopen %s\n",*argv,name);
X      exit(1);
X      }
X
X   if ((printer = getenv("PRINTER")) == (char *) 0)
X      printer = PRINTER;
X   sprintf(cmd,"lpr -P%s -J%s -v",printer,name);
X
X   /* setup mgr library */
X
X   m_setup(0);
X
X   get_param(mgr_host,&xmax,&ymax,0);
X   gethostname(my_host,sizeof(my_host));
X
X   if (strcmp(my_host,mgr_host) != 0) {
X      fprintf(stderr,"%s only works on host: %s\n",
X               argv[0],mgr_host);
X      exit(1);
X       }
X
X   m_push(P_FONT|P_FLAGS|P_MENU|P_POSITION);
X   m_ttyset();
X   signal(SIGALRM,cancel);
X   signal(SIGTERM,clean);
X   signal(SIGINT,clean);
X   signal(SIGHUP,clean);
X
X   m_setmode(M_NOWRAP);
X   m_setmode(M_ABS);
X   m_func(B_COPY);
X   m_bitfromfile(1,ICON);
X   m_flush();
X   m_gets(buff);
X   n = sscanf(buff,"%d %d",&w,&h);
X   if (n < 2) {
X      fprintf(stderr,"%s: Can't find %s\n",*argv,ICON);
X      clean(1);
X      }
X   setup(1,w,h);
X   m_setevent(BUTTON_1,"S%R\r");   /* get coords */
X   m_setevent(REDRAW,"Redraw\r");	/* get coords */
X   m_setevent(RESHAPE,"Reshape\r");	/* get coords */
X   menu_load(1,MENU_COUNT,menu);
X   menu_load(2,MENU_COUNT,rop);
X   m_selectmenu(1);
X   m_linkmenu(1,2,2,6);
X   m_clearmode(M_ACTIVATE);
X
X   m_flush();
X   while(m_gets(buff)) {
X      dprintf(stderr,"got %s\n",buff);
X      switch (*buff) {
X      case 'R':            /* redraw */
X         setup(1,w,h);
X         m_clearmode(M_ACTIVATE);
X         break;
X      case 'S':            /* set up to snap a picture */
X         n = sscanf(buff+1,"%d %d %d %d",&x,&y,&x1,&y1);
X         if (n < 4)
X            break;;
X         m_setmode(M_WOB);
X         wide = abs(x1-x);
X         high = abs(y1-y);
X         x = min(x,x1);
X         y = min(y,y1);
X         m_push(P_MOUSE);
X         if (x > 16 || y > 16)
X            m_movemouse(0,0);         /* get mouse out of the picture */
X         else 
X            m_movemouse(xmax-17,ymax-17);
X         if (review) {
X            alarm(0);
X            m_sendme("B review\r");                     /* synchronize review */
X            }
X         else {
X            m_sendme("E snap\r");                     /* synchronize snap */
X            snapping = 1;
X            if (tmp) {
X               bit_destroy(tmp);
X               tmp = NULL;
X               }
X            tmp = bit_alloc(wide,high,BIT_NULL,1);
X            }
X         break;
X      case 'B':               /* review the picture */
X         if (review && tmp && !snapping) {
X            review = 0;
X            if (wide < 20 && high < 20) {
X               wide = BIT_WIDE(tmp);
X               high = BIT_HIGH(tmp);
X               }
X            bit_blit(screen,x,y,wide,high,func,tmp,0,0);
X            dprintf(stderr,"review %d,%d by %d,%d\n",x,y,wide,high);
X            m_pop();
X            }
X         m_clearmode(M_WOB);
X         m_clearmode(M_ACTIVATE);
X         break;
X      case 'E':               /* get the picture */
X         if (snapping && x!=16 && y!=16) {
X            bit_blit(tmp,0,0,wide,high,BIT_SRC,screen,x,y);
X            m_pop();
X            m_clearmode(M_WOB);
X            m_clearmode(M_ACTIVATE);
X            }
X         snapping = 0;
X         break;
X      case 'F':                  /* file it */
X         if (tmp && !snapping) {
X            fseek(fp,0L,0);
X            ftruncate(fileno(fp),0);
X	    if (!bitmapwrite(fp,tmp,format) ) {
X               m_push(P_ALL);
X               m_font(0);
X               m_size(27,3);
X               m_clear();
X               m_printstr("unable to write file\n");
X               m_printstr(name);
X               m_flush();
X               sleep(3);
X               m_pop();
X               m_clearmode(M_ACTIVATE);
X               m_flush();
X               }
X            dprintf(stderr,"filing\n");
X            }
X	 fflush(fp);
X         m_clearmode(M_ACTIVATE);
X         break;
X      case 'Q':                  /* quit */
X         clean(0);
X         break;
X      case 'P':                  /* print */
X         if (tmp && !snapping && (pf = popen(cmd,"w"))) {
X				bitmapwrite(pf,tmp,format);
X            dprintf(stderr,"printing [%s]\n",cmd);
X            pclose(pf);
X            }
X         m_clearmode(M_ACTIVATE);
X         break;
X      case '-':                  /* set review mode*/
X         if (review) 
X            switch (*(buff+1)) {
X               case 'S':         /* set */
X                  func = BIT_SRC;
X                  break;
X               case 'P':         /* paint */
X                  func = BIT_SRC | BIT_DST;
X                  break;
X               case 'X':         /* XOR */
X                  func = BIT_SRC ^ BIT_DST;
X                  break;
X               case 'M':         /* MASK */
X                  func = BIT_SRC & BIT_DST;
X                  break;
X               }
X      case 'V':                  /* review */
X         if (tmp && !snapping) {
X            alarm(CANCEL);
X            review++;
X            m_setmode(M_WOB);
X            }
X         break;
X         }
X      m_flush();
X      }
X   
X   clean(0);
X   }
X
Xint clean(n)
Xint n;
X   {
X   m_ttyreset();
X   m_popall();
X   exit(n);
X   }
X
Xsetup(where,w,h)
Xint where;      /* bitmap # */
Xint w,h;         /* window size */
X   {
X   int wx,wy;	/* window position */
X
X   get_size(&wx,&wy,0,0);
X   m_shapewindow(wx,wy,w+10,h+10);
X   m_clear();
X   m_bitcopyto(0,0,w,h,0,0,0,where);
X   m_movecursor(w+20,h/2);
X   }
X
Xint
Xcancel()
X   {
X   review = 0;
X   m_putchar('\007');
X   m_clearmode(M_WOB);
X   m_flush();
X   }
END_OF_FILE
# end of 'demo/icon/snap.c'
fi
if test -f 'font-16/Ucmr15x25r' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'font-16/Ucmr15x25r'\"
else
echo shar: Extracting \"'font-16/Ucmr15x25r'\" \(8306 characters\)
sed "s/^X//" >'font-16/Ucmr15x25r' <<'END_OF_FILE'
Xbegin 644 cmr15x25r.fnt
XM%@\9!8  __@&    !P                  &         /           P 
XMW_^                            & &, ,&#,  , \ <  '!P        
XM       <#\ < '\ _@ P'_X'\'_\#X _@             ?@   $ _X _@_\
XM'_\__@_@P!@_  !F ,P & ,X!@_@_\ _@_\ _@?_F ,P!F ,P!B $__@#\< 
XM#\  0    $                                                  
XM                 < P#@     \__@&    'X                  /  P
XM      ?P          P W_\                            & &, ,&#,
XM!P,#N ^  . X               8'^ \ ?_#_X!P'_X?_'_\/^#_X       
XM      _P   . __#_X__'_\__C_XP!@_  !F <P ' <X!C_X__#_X__#_X?_
XMF ,P!F ,P!B $__@#\, #\  X    ,                     .       P
XM                                     P P P    !^__@&    /\  
XM        >       ?@ P      88          8!@ ,             $   
XM           & &, ,&'^#X8#' ^  , 8               X.'1L 8## 8!@
XM&  8#  <,&# 8            !PX   . P## 8P#&  P # 8P!@,  !F XP 
XM'@\\!C 8P## 8P## 8 P& ,8#& ,8## , #@# .  , !\    8         !
XM@   /   8  .  <#   P                   P                !@ P
XM 8    #F__@&    <<          _   $#\ ?@ P       ,     !P# 88!
XM@ ,             $              & &, 8,/_&,8&# >  8 ,        
XM       P<#S, P!F ,# &  P!@ 88#& ,            #@<   ? P!F ,P!
XMF  P & ,P!@,  !F!PP 'Q\\!F ,P!F ,P!F , P& ,8#& ,8## , # # & 
XM , #N    X   8     !@   ?   8  .  <#   P                   P
XM                !@ P 8    #F__@&    X,          C@& ,/_ VP P
XM       ,     '\# 88!@ ,             .  !C          & &, 8,?/
XMF,P&# .  8 ,              !P8#P, P!F ,# &  P!@ 88#& ,       
XM     # ,   ; P!F ,P!F  P & ,P!@,  !F#@P &[LV!F ,P!F ,P!F , P
XM& ,8#& ,,&!@8 & # '  , ''    \   8     !@   P   8     <#   P
XM                   P                 P P P    # __@&    P,  
XM        A@' <<'!VX P /     ,     ..# 8,#  ,             .  '
XMCP         & &,#_^;-F,P'& ,  8 ,  P           !@8#@,  !@ ,& 
XM&  P   P8#& ,              ,   ; P!F  P!F  P &  P!@,  !F' P 
XM&;,V!F ,P!F ,P!F   P& ,,&& ,,&!@8 . # #  , .#@   ^   8     !
XM@   P   8      #   P                   P                 P P
XM P    # __@&   Q@8           P#@X8!!F8 P _P    ,     <'# 8,#
XM  ,             ?  > \         & &,#_^;,#Y@#N 8  8 , !X &   
XM      #@8'@,  !@ 8& &  P   P,&& ,              ,#\ Q@P!F  P!
XMF  P &  P!@,  !F. P &.,S!F ,P!F ,P!F   P& ,,&& ,&, PP , # #@
XM , <!P   ^ ?P8     !@   P   8      #   P#       8          P
XM                 P P P    # __@& 'AA@8 P    ^!^& P!QP< #F<__
XMQF8    ,!_W_ 8## 8/_  ,!X         !@[@!X /   $ "   & &, P8?,
XM!Q@!X 0  X . PPP&         # 8/@,  #  8,,&  P  !@/># <#@    !
XM@  8   </_ Q@P!F  P!F  P &  P!@,  !F< P &$,S!F ,P!F ,P!F   P
XM& ,,&& ,&, PP 8 # !@ , X X   < _X8\ ?P#Q@?@ P >,8\ &   #!P P
XM#<X9^ ?@8\ >,8X ?P'_# ,8!C ,0 C ,?_@ P P P    ' __@& /QC P!X
XM   #P'_^ 8 [@/ #&,__S&,    ,'_W_P8## 8'^  ,'^ 0@#  !@ #!QP'@
XM #P?_F &   &    P8/, # 'P    X . XQP&         ' 8=@,  &  P,,
XM&  P  !@#X#Q\'P <  '@  >   X8#@Q@P#&  P!F  P &  P!@,  !FX P 
XM&$,QAF ,P#& ,P##   P& ,&,& ,#8 9@ X # !P ,        !@,;_!_X/]
XMA_X'_!_L;_ &  ,##@ P#]\;_!_X;_!_L;^ _X'_# ,8!C ,8!C ,?_@!@ P
XM 8    & __@& 8;#!@#,   ' &9X 8 ? #P"&$ P"&$.' ?,.   X8## 8&&
XM /\,# PP&   P &#@X>   \?_F &   &    P8'\ # /P    X . \SP&   
XM      & 8Y@,  , /@8,'_@QP # !P _L'P ^  >   '@ !PP!Q@P__&  P!
XMG_P_^&  __@,  !GP P & ,QAF ,__& ,__#_P P& ,&,& ,#X ?@ P #  P
XM ,        !@,>#!@,,'A@8'_!@\?# &  ,#'  P#&,>#A@8>#!@\?'!@, P
XM# ,<#C ,<#C , # #@ P <    & __B&$0/##@#,'_^& $8P 8 . #\ &  P
XM&&&?/@_\<   <8## 8&& /\>'A@8,   8?_G@\>   \  # ,   &   !@P#^
XM & <X    X . /_ &         . 9Q@,  8 /@8,'_XW\ # '\ .,'P ^ !X
XM#_\!X #@QXQ@P__&  P!G_P_^&  __@,  !G@ P & ,PQF ,_\& ,_\ _X P
XM& ,&,& ,#X / !@ #  X ,          ,<!C ,8#C , P# <<!@&  ,#.  P
XM#&,<!C ,<!C <<#!@, P# ,,## ,.'# , & #@ P < ' 0& __C&,P.#!X&&
XM'_^,  8P \ . /^ &  P'_^QXQ@<X   .8## 8#,  ,3,C ,8   ,?_C@X'@
XM #P  # ,   &   !@P#/ & X<    X . '^ &         , ;A@,  P  PP,
XM  8^/ & >/  ,#@ ^ '@#_\ > ' S^Q@PP#&  P!F  P &!\P!@,  !GP P 
XM& ,PQF ,P & ,P&  8 P& ,#8&$,#8 & #@ #  8 ,          \8!C  8!
XMC , P# ,8!@&  ,#<  P#&,8!C ,8!C ,8 !@  P# ,.'# ,'.# , , !@ P
XM 8 /@0& __CF<P&' <&&  &,  PP!\ . <' &  P'_^PPS ,P   &8## 8#,
XM  ,QXW_^__W_^ 8!QP!X / ?_A@8   &   !@P#/@, X<P   X . #\'_^  
XM#_\   < ?!@, !@  8P,  ,X# & 8#  ,   < >     '@. S&S_XP!F  P!
XMF  P &!\P!@,  !FX P & ,P9F ,P & ,P&  , P& ,#8&$,&, & #  #  <
XM ,         /\8!C  8!C_\ P# ,8!@&  ,#\  P#&,8!C ,8!C ,8 !_P P
XM# ,&&# ,#\# , 8  P P P ?PP& __AF8P&' .,#  &/X PP#L / P# &  P
XM&&&PPS ,P   &8## 8#,  ,PPW_^__W_^ P [@ > \ ?_A@8   &   '_\#-
XM@,XX.P   8 , '^'_^  #_\   8 >!@, #   8__@ ,P!@, P!@ ,     > 
XM    '@, S&S_XP!F  P!F  P & ,P!@,  !F< P & ,P9F ,P & ,P#  , P
XM& ,#8&.,&, & &  #  , ,        !_,8!C  8!C_\ P# ,8!@&  ,#^  P
XM#&,8!C ,8!C ,8  _X P# ,'.# ,!X# , P  P P P 9Y@. __AVXP&' .,#
XM  &,  PP'& + P# &  P"&$PPS ,P   &8## 8!X  ,QXS ,8   ,?_@?  '
XMCP    PP       '_\;-@9\X.P   8 , /_ &         X <!@, &   ,__
XM@ ,P!@, P!@ ,     '@#_\ > , S_C 8P!F  P!F  P & ,P!@,  !F. P 
XM& ,P-F ,P & ,P#  , P& ,!P&?,,& & .  #  . ,        #@,8!C  8!
XMC   P# ,8!@&  ,#G  P#&,8!C ,8!C ,8   , P# ,#,#&,#\# ,!@  P P
XM P P_@, __@VPP.' .8!@ &,  P8.& + P# &   #&,QXS ,X   .8## 8!X
XM  ,3,A@8,   8?_@.  !C     PP       #!@?/@;&X'@   8 , \SP&   
XM   #@ P \!@, , & , ,& ,P!@8 P!F ,#@   !X#_\!X   Q_# 8P!F ,P!
XMF  P & ,P!@, P!F' P & ,P-F ,P &!LP#& , P& ,!P&[L,& & ,  #  &
XM ,        # ,8!C  8!C   P# ,8!@&  ,##@ P#&,8!C ,8!C ,8   , P
XM# ,#\#/,'.# ,#   P P P @? , __@?@0/' .8!@  & !@8<# + X' &   
XM!F8?/C 8<   <8##@X!X  ,>'@PP&   P&  .      ?_@9@       #!@/_
XM S&<'@   8 , XQP& #@   'P!P \#@, 8 & , ,& ,P!@8 P!F ,'P <  >
XM   '@   X ' <P!F ,P!F  P & ,P!@, P!F#@P & ,P'F ,P &!\P#& , P
XM& ,!P'Q\8# & 8  #  ' ,        # <<!C ,8#C , P# <8!@&  ,#!P P
XM#&,8!C ,<!C <8 !@, P# <!X#9L.'# <&  !@ P 8 @. , __@?@8;'P<P 
XMP  ' !@88# / >. & __P_P.'!AP.   X8#!QP P  ,,# 0@#  !@,  $   
XM   ?_@9@   &   &# '^ S&>/P   , 8 PPP& 'P   'P!@ N' , P # 8 ,
XM# 88# P 8## 8'P ^  '@  >  . <!V ,P## 8P#&  P # 8P!@, 8#&!PP 
XM& ,P'C 8P # XP## 8 P# 8 @'@\8# & X  #  # ,        # \>#!@,,'
XMA@, P!@\8!@&  ,# X P#&,8!C ,>#!@\8 !@, P!A\!X#P\<#AA\,  !@ P
XM 8    , __@/ /QW_XP P  #P!@,P!@& ?^ & __P/   !_@'_W_P8# _@ P
XM'_\'^        8  $ ?_C_\   /    &   &# #,!A\/\P   . X !X & 'P
XM   'P#@ '^#_P__C_X ,#_X?_ P ?_#_X'P ^  !@  8  . /_F ,__#_X__
XM'_\P #_XP!@_ ?_& X__F ,P#C_XP #_\P!C_X P#_X @' <P!@& __@#\ #
XMC\        !_L;_!_X/]A_X P!_L8!@&  ,# < P#&,8!A@8;_!_L8  _X ?
XM!_L P#@<8!A_L?_@ P P P    , __@& '@6?P@ 0   ^!@,P!P  'X &   
XM      ? !_W_ 8# .  P'_^!X             ?_C_\   &    &   &# #,
XM!@X#X    '!P  P & #P   #@#  #\#_P__@_@ , _@'\ P '\ _@#@ >   
XM      . #^& ,_X _@_\'_\P  _@P!@_ '\& 8__F ,P#@_@P  _NP!@_@ P
XM _@ @& ,P!@& __@#\ !C\         _,8\ ?P#Q@?P P >,8!@&  ,# , P
XM#&,8!A_X8\ >,8  ?P / >, P# ,0 @>,?_@ < P#@    , __@    &    
XM                                                            
XM                                      !P                    
XM                .                                           
XM            &                                               
XM       ,      ,           _@8   ,                   ,      P
XM     &8 __@    &                                            
XM                                                          !@
XM                                    ,                       
XM                                                            
XM                           ,      ,             8   ,       
XM            ,      P     &8 __@    &                        
XM                                                            
XM                  #                                     8   
XM                                                            
XM                         '__@                !@8      ,     
XM        8   ,                 !@8      P     &8 __@    &    
XM                                                            
XM                                      "                     
XM                0                                           
XM                                             '__@           
XM     !_X     #X             8   ,                 !_X      P
XM     #X __@    &                                            
XM                                                            
XM                                                            
XM                                                            
XM                          _@     #P             8   ,       
X5           _@      P     !P 
X 
Xend
END_OF_FILE
# end of 'font-16/Ucmr15x25r'
fi
if test -f 'misc/hp_raster.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'misc/hp_raster.c'\"
else
echo shar: Extracting \"'misc/hp_raster.c'\" \(8273 characters\)
sed "s/^X//" >'misc/hp_raster.c' <<'END_OF_FILE'
X/*                        Copyright (c) 1988 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/* Raster print filter for hp laser printer */
X
X/***********************************************************************
X * $Header: hp_raster.c,v 1.3 88/07/15 14:34:13 sau Exp $
X * $Locker:  $
X * $Source: /tmp/mgrsrc/misc/RCS/hp_raster.c,v $
X * $Log:	hp_raster.c,v $
X * Revision 1.3  88/07/15  14:34:13  sau
X * Add new bitmap format (handles both formats now )
X * 
X * Revision 1.1  88/07/15  14:32:21  sau
X * Initial revision
X * 
X * Revision 1.2  88/07/08  08:25:43  sau
X * 
X * 
X * Revision 1.1  88/07/08  08:16:57  sau
X * Initial revision
X * 
X * Revision 1.1  88/07/08  08:14:22  sau
X * Initial revision
X * 
X * Revision 1.5  87/07/14  20:10:40  sau
X * Eliminate training white space on a line by line basis
X * 
X * Revision 1.4  87/06/25  11:03:29  sau
X * Auto scaling, lpr version
X * 
X ***********************************************************************/
X
X/* avoid complaints from "lint" */
X
X#ifndef lint
Xstatic char     RCS_Id[] = "$Header: hp_raster.c,v 1.3 88/07/15 14:34:13 sau Exp $";
X#endif
X#include <stdio.h>
X#include "dump.h"
X
X#define GET_OPT(i)	\
X	strlen(argv[i])>2 ? argv[i]+2 : argv[++i]
X#define WIDTH16(w)	((((w)+15)&~0xf)>>3)		/* old bitmap format */
X#define WIDTH8(w)	((w)>>3)							/* new bitmap format */
X#define Min(x,y)	((x)<(y)?(x):(y))
X
X#define DOTS_WIDE	(8*300)		/* dots across page */
X#define DOTS_HIGH	(10*300+150)	/* dots down page */
X#define WIDE		1152		/* default # pixels/row */
X#define HIGH		900		/* default # rows/screen */
X#define HI_RES		300		/* dots per inch */
X#define MED_RES		150		/* dots per inch */
X#define LOW_RES		100		/* dots per inch */
X#define MIN_RES		75		/* dots per inch */
X#define MAX		4000		/* maximum row size */
X#define BORDER		3		/* default size of border */
X#define STRIP		3		/* white strip for viewgrqaphs */
X
X/* printer macros */
X
X#define set_pos(xp,yp) \
X	printf("\033*p%dy%dX",yp,xp)	/* set cursor position (dots) */
X#define set_res(res) \
X	printf("\033*t%dR",res)		/* set dots/inch */
X#define reset() \
X	printf("\033E")			/* reset the printer */
X#define manual_feed() \
X	printf("\033&l2H")		/* select manual feed */
X#define start_graphics() \
X	printf("\033*r1A")		/* set raster mode */
X#define set_row(wide) \
X	(printf("\033*b%dW",wide), fflush(stdout))
X#define end_graphics() \
X	printf("\033*rB")		/* end graphics mode */
X#define set_copies(n) \
X	printf("\033&l%dX",Min(n,99))	/* set copy count */
X#define set_rule(w,h) \
X	printf("\033*c%da%dB",w,h)	/* set rule size */
X#define print_rule(type) \
X	printf("\033*c%dP",type)	/* print 'type' rule */
X
Xunion {
X	struct b_header new;
X	struct old_b_header old;
X	char type[2];
X	} h_buff, *head = &h_buff;
X
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X   {
X   register int k,i,j=0;
X   int n;				/* last non-white space */
X   unsigned char buff[MAX/8];		/* graphics line buffer */
X   int wide = WIDE, high = HIGH;	/* raster size */
X   int no_head=0;			/* no raster header found */
X   int reverse=0;			/* reverse bits */
X   int pause = 0;			/* for vgrafs */
X   int manual = 0;			/* select manual feed */
X   int copies = 0;			/* set copy count */
X   int border = 0;			/* draw border around picture */
X   int res = MED_RES;			/* resolution dots/in */
X   int force_res=0;			/* force resolution */
X   int x0,y0;				/* starting raster coord */
X   int x=0,y=0;					/* user supplied coords */
X   int bytes;				/* raster line size */
X	int depth=1;			/* bitmap depth */
X	char type[2];			/* bitmap type */
X
X   /* check arguments */
X
X   for(i=1;i<argc;i++) {
X      if (*argv[i] == '-')
X         switch (argv[i][1]) {
X            case 'X':				/* x coord */
X               x = atoi(GET_OPT(i));
X               break;
X            case 'Y':				/* y coord */
X               y = atoi(GET_OPT(i));
X               break;
X            case 'r':				/* reverse bits */
X               force_res = atoi(GET_OPT(i));
X               break;
X            case 'm':				/* set manual feed */
X               manual++;
X               break;
X            case 'n':				/* login (from lpd )*/
X               GET_OPT(i);
X               break;
X            case 'h':				/*  host (from lpd) */
X               GET_OPT(i);
X               break;
X            case 'y':				/* specify border- for lpd */
X               border = Min(32,atoi(GET_OPT(i)));
X               break;
X            case 'b':				/* set border size */
X               if (argv[i][2])
X                  border = atoi(&argv[i][2]);
X               else
X                  border = BORDER;
X               break;
X            case 'c':				/* set copies */
X               copies = atoi(GET_OPT(i));
X               break;
X            case 'p':				/* set pause */
X            case 'x':				/* for lpd */
X               pause = atoi(GET_OPT(i));
X               break;
X            default:
X               fprintf(stderr,"%s: bad flag %c ignored\n",argv[0],argv[i][1]);
X            }
X      }
X
X   /* get header */
X
X   if (!no_head) {
X      read(0,head->type,2);				/* get magic number */
X      if (B_ISHDR16(&head->old)) {		/* old style header */
X         read(0,head->type+2,B_OHSIZE-2);
X         B_GETOLDHDR(&head->old,wide,high);
X   		bytes = WIDTH16(wide);
X			}
X		else if (B_ISHDR8(&head->new)) {		/* new style header */
X         read(0,head->type+2,B_HSIZE-2);
X         B_GETHDR8(&head->new,wide,high,depth);
X   		bytes = WIDTH8(wide);
X			}
X      else {		/* assume 16 bit alignment , no header */
X         wide=WIDE,high=HIGH-1;
X         Read(0,buff,WIDTH16(wide)-2);		/* oops ! lose 1st line */
X   		bytes = WIDTH16(wide);
X         }
X      }
X
X	if (depth != 1) {
X		fprintf(stderr,"Sorry, Can\'t handle 8-bit pixels\n");
X		exit(0);
X		}
X
X   /* compute appropriate resolution */
X
X   switch(Min(DOTS_WIDE/(border+wide),DOTS_HIGH/(border+high))) {
X      case 0:		/* picture too big, use hi-res and go */
X         /* no break - for now */
X      case 1:
X         res = HI_RES;
X         break;
X      case 2:
X         res = MED_RES;
X         break;
X      case 3:
X         res = LOW_RES;
X         break;
X      default:
X         res = MIN_RES;
X         break;
X      }
X
X   if (force_res)
X      res = force_res;
X
X   /* center picture */
X
X   if (pause>1) 			/* skip white strip for viewgraphs */
X      x0 = (DOTS_WIDE-HI_RES*wide/res);
X   else
X      x0 = (DOTS_WIDE-HI_RES*wide/res)/2;
X   y0 = (DOTS_HIGH-HI_RES*high/res)/2;
X
X   if (x>0)
X      x0 = x;
X   if (y>0)
X      y0 = y;
X
X   fprintf(stderr,"printing raster %dx%d at %d,%d - %d dots/in%s\n",
X            wide,high,x0,y0,res,border ? " (bordered)":"");
X
X   /* setup printer */
X
X   reset();					/* reset the printer */
X   if (pause || manual) 
X		manual_feed();				/* select manual feed */
X   if (copies)
X		set_copies(copies);			/* set copy count */
X   set_pos(x0,y0);				/* set starting position */
X   set_res(res);				/* set resolution */
X   start_graphics();				/* start graphics */
X
X   for (i=0;i<high;i++) {
X      Read(0,buff,bytes);
X      for(j=bytes;j>0 && buff[j-1]==0;j--); 
X      set_row(j);
X      write(1,buff,j);
X      }
X   end_graphics();
X
X   /* draw borders */
X
X   if (border) {
X      set_rule(border,2*border+high*HI_RES/res);
X      set_pos(x0-border,y0-border);
X      print_rule(0);				/* left edge */
X      set_pos(x0+wide*HI_RES/res,y0-border);
X      print_rule(0);				/* right edge */
X
X      set_rule(wide*HI_RES/res,border);
X      set_pos(x0,y0-border);
X      print_rule(0);				/* top edge */
X      set_pos(x0,y0+high*HI_RES/res);
X      print_rule(0);				/* bottom edge */
X      }
X
X   printf("\n\f");
X   exit(0);
X   }
X
X/* do multiple passes for read */
X
XRead(fd,buff,count)
Xint fd,count;
Xregister char *buff;
X   {
X   register int sum=0,current=0;
X
X   while((current = read(0,buff+sum,count-sum))>0)
X      sum += current;
X   return(sum);
X   }
X
X/* return index of 1st non zero byte, or bytes if entirely blank */
X
Xint
Xfirst(buff,bytes)
Xregister char *buff;
Xregister int bytes;
X   {
X   char *start = buff+1;
X   while(bytes-- > 0)
X      if (*buff++) 
X         break;
X   return(buff-start);
X   }
END_OF_FILE
# end of 'misc/hp_raster.c'
fi
if test -f 'src/defs.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/defs.h'\"
else
echo shar: Extracting \"'src/defs.h'\" \(8116 characters\)
sed "s/^X//" >'src/defs.h' <<'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: defs.h,v 4.2 88/08/12 07:40:25 sau Exp $
X	$Source: /tmp/mgrsrc/src/RCS/defs.h,v $
X*/
Xstatic char	h_defs_[] = "$Source: /tmp/mgrsrc/src/RCS/defs.h,v $$Revision: 4.2 $";
X
X/* defines for mgr */
X
X/* configurable parameters */
X#include "defines.h"
X
X#ifdef SYSV
X#define index		strchr
X#define rindex		strrchr
X#endif
X
X#ifdef DEBUG
Xextern char debug_level[];
Xchar *index();
X#define dprintf(x) \
X	if (debug && index(debug_level,'x')) fprintf
X#endif
X
X/* macros -- for speed */
X
X#ifdef FASTMOUSE
X#define MoUSE(a,b)     bit_blit(screen, a, b, 16,16, \
X                               BIT_SRC^BIT_DST, m_rop,0,0)
X#define MOUSE_ON(a,b)	(!mouse_on && (mouse_on=1, MoUSE(a,b)) )
X#define MOUSE_OFF(a,b)	( mouse_on && (mouse_on=0, MoUSE(a,b)) )
X#else
X/* turn on the mouse only if it is off */
X#define MOUSE_ON(a,b)     (!mouse_on && ( \
X				  mouse_on=1, \
X			          bit_blit(&mouse_save,0,0,16,16, \
X					BIT_SRC,screen,a,b), \
X				  bit_blit(screen,a,b,16,16, \
X					BIT_SRC|BIT_DST,m_rop,0,0), \
X				  bit_blit(screen,a,b,16,16, \
X				      BIT_NOT(BIT_SRC)&BIT_DST,m_rop,0,16) \
X				  ))
X/* turn off the mouse only if it is on */
X#define MOUSE_OFF(a,b)     (mouse_on && ( \
X			          mouse_on=0, \
X			          bit_blit(screen,a,b,16,16, \
X					BIT_SRC,&mouse_save,0,0) \
X			          ))
X#endif
X
X#define CLEAR(s,op)	bit_blit((s),0,0,BIT_WIDE(s),BIT_HIGH(s), \
X			op,0,0,0);
X
X#define ACTIVE_ON() \
X			border(active,SUM_BDR-1,1), \
X			last_active = active!=last_active ? \
X			  ( \
X			  do_event(EVENT_DEACTIVATED,last_active,E_MAIN), \
X			  do_event(EVENT_ACTIVATED,active,E_MAIN), \
X			  active ) \
X			: \
X			  last_active
X 			  	
X#define ACTIVE_OFF() \
X			border(active,BLK_BDR,WH_BDR)
X
X#define SETMOUSEICON(x)	(m_rop = x)
X
X/* short hand */
X
X#define W(x)		(win->x)
X#define BETWEEN(a,x,b)	(x)<(a)?a:((x)>(b)?b:x)
X#define ACTIVE(x)	(active->x)
X#define ABS(x)		((x)>0 ? (x) : -(x))
X
X/* mouse buttons */
X
X#define BUTTON_SYS	4		/* system menu */
X#define BUTTON_2	2		/* middle button (unused) */
X#define BUTTON_1	1		/* right button (vi?) */
X
X/* Window table flags */
X
X#define W_ACTIVE	0x000001L	/* Window is non_occluded */
X#define W_ESCAPE	0x000002L	/* An escape sequence is in progress */
X#define W_STOPPED	0x000004L	/* Window is stopped ( unused ) */
X#define W_REVERSE	0x000008L	/* window is white on black */
X#define W_STANDOUT	0x000010L	/* window is in standout mode */
X#define W_DIED		0x000020L	/* window has died */
X#define W_EXPOSE	0x000040L	/* expose window upon shell output */
X#define W_BACKGROUND	0x000080L	/* permit obscured window to update */
X#define W_NOKILL	0x000100L	/* don't kill window upon exit */
X#define W_VI		0x000200L	/* temporary vi hack -- */
X#define W_TEXT		0x000400L	/* downloading text */
X#define W_NOINPUT	0x000800L	/* don't accept keyboard input */
X#define W_NOWRAP	0x001000L	/* don't auto wrap */
X#define W_OVER		0x002000L	/* overstrike mode */
X#define W_ABSCOORDS	0x004000L	/* use absolute coordinates */
X#define W_MINUS		0x008000L	/* negative coord value */
X#define W_SNARFABLE	0x000004L	/* ok to gather data into cut buffer */
X#define W_SNARFLINES	0x010000L	/* snarf only lines */
X#define W_SNARFTABS	0x020000L	/* change spaces to tabs in snarf */
X#define W_SNARFHARD	0x040000L	/* snarf even if errors */
X#define W_SNARFLAGS	(W_SNARFTABS | W_SNARFHARD | W_SNARFLINES)
X#define W_INHERIT	0x080000L	/* inherit menus and bitmaps */
X#define W_DUPKEY	0x100000L	/* duplicate key mode */
X#define W_NOBUCKEY	0x200000L	/* Buckey keys (i.e. "Left-<char>" and
X					"Right-<char>") have no effect */
X#define W_CLIPDONE	0x400000L	/* clip list for background update valid
X					*/
X
X#define W_LOOK \
X	(W_EXPOSE | W_BACKGROUND)	/* Window ready to accept data */
X
X#define W_STATE \
X	(W_ESCAPE | W_TEXT)		/* terminal emulator states */
X
X#ifdef CUT
X#define W_SAVE \
X	(W_REVERSE | W_STANDOUT | W_EXPOSE | W_BACKGROUND | \
X	 W_VI | W_NOINPUT | W_NOWRAP | \
X	 W_SNARFLAGS | \
X	 W_OVER | W_ABSCOORDS)		/* savable flags */
X#else
X#define W_SAVE \
X	(W_REVERSE | W_STANDOUT | W_EXPOSE | W_BACKGROUND | \
X	 W_VI | W_NOINPUT | W_NOWRAP | \
X	 W_OVER | W_ABSCOORDS)		/* savable flags */
X#endif
X
X#define INIT_FLAGS	W_BACKGROUND	/* default window creation flags */
X
X/* Structure definitions */
X
Xtypedef struct {	/* used for text regions */
X  int x,y,wide,high;
X  } rectangle;
X
Xtypedef struct  {	/* some day */
X  int x,y;
X  } point;
X
Xtypedef struct window {		/* primary window structure */
X  struct window *next;	/* next window */
X  struct window *prev;	/* previous window */
X  struct window *stack;	/* stack of saved window environments */
X  struct window *main;	/* main window (or 0 if main window ) */
X  struct window *alt;	/* alternate window ( 0 if none) */
X  BITMAP *border;	/* window + border */
X  BITMAP *window;	/* This is the window */
X  BITMAP *save;		/* pointer to window bit-image if inactive */
X  BITMAP *bitmap;	/* for use when downloading bitmaps */
X  BITMAP *bitmaps[MAXBITMAPS];	/* scratchpad space */
X  BITMAP *cursor;	/* bitmap of cursor (future; unused just now) */
X  struct font *font;	/* this is the font */
X  char *clip_list;	/* pointer to clip list for BG updates */
X
X  rectangle text;	/* location of text region within window */
X  int x0,y0;		/* origin of window on screen */
X  int x,y;		/* cursor character position */
X  int gx,gy;		/* graphics cursor */
X  int op;		/* raster op function (see bitmap.h)  */
X  int style;		/* character style normal/inverse video */
X  int background;	/* background color WOB or BOW */
X  int curs_type;	/* cursor type */
X
X  int esc_cnt;		/* # of escape digits entered */
X  int esc[MAXESC];	/* escape array (as in ESCnn,nnm) */
X  int code;		/* code for text function */
X  char dup;		/* char to duplicate from keyboard */
X
X  struct menu_state *menus[MAXMENU];	/* menus */
X  short menu[2];	/* index into menus for current button 1&2 menu */
X  long event_mask;	/* event mask  (see event.h) */
X  char *events[MAXEVENTS];	/* place for event strings */
X  char *snarf;			/* temporary snarf buffer */
X
X  unsigned long flags;		/* misc. window flags (see defines above) */
X
X  char buff[MAXSHELL];	/* shell input buffer */
X  int  max;		/* the # of chars in buff */
X  int  current;		/* the current char in buff */
X  int  to_fd;		/* file descriptor to shell */
X  int  from_fd;		/* file descriptor from shell */
X  int  pid;		/* process number of the shell */
X  int  setid;		/* window set id, 1..N, one per pid */
X  int  num;		/* window number ( for multiple window/proc) */
X			/* The window set id and the window number together
X			uniquely identify a window. */
X
X  char tty[MAXTTY];	/* name of shell's tty */
X  } WINDOW;
X
Xtypedef int (*function)();
Xint new_window(), move_window(), destroy_window(), quit();
Xint redraw();
Xint sig_child(), catch();
X
X/* static data items (described in data.c) */
X
Xextern short c_arrow1[];
Xextern short c_box[];
Xextern short pat_data[];
Xextern char *full_menu[];
Xextern char *main_menu[];
Xextern char *active_menu[];
Xextern char *test_menu[];
Xchar *quit_menu[];
Xextern function full_functions[];
Xextern function main_functions[];
Xextern function active_functions[];
X
Xextern BITMAP *m_rop;
Xextern int next_window;
Xextern BITMAP pattern, mouse_box, mouse_arrow, mouse_cup, mouse_cross,mouse_cut;
Xextern BITMAP mouse_save, mouse_not;
Xextern struct font *font;
Xextern BITMAP *screen;
Xextern int mask;
Xextern int poll;
Xextern int rev_ops[];
Xextern WINDOW *active;
Xextern WINDOW *last_active;
Xextern int button_state;
Xextern mouse, mousex, mousey, mouse_on;
Xextern int debug;
Xextern char *fontlist[], *font_dir;
Xextern char *icon_dir;
Xextern char *snarf;
Xextern char *message;
Xextern char *start_command;
Xextern char *init_command;
Xextern int id_message;
Xextern short buckey_map;
Xextern unsigned int init_flags;
Xextern char *version[];
END_OF_FILE
# end of 'src/defs.h'
fi
if test -f 'src/new_window.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/new_window.c'\"
else
echo shar: Extracting \"'src/new_window.c'\" \(7968 characters\)
sed "s/^X//" >'src/new_window.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: new_window.c,v 4.2 88/08/12 07:41:02 sau Exp $
X	$Source: /tmp/mgrsrc/src/RCS/new_window.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/new_window.c,v $$Revision: 4.2 $";
X
X/* Create a new window */
X
X#include "bitmap.h"
X#include <fcntl.h>
X#include <stdio.h>
X#include "defs.h"
X#include "window.h"
X#include "font.h"
X#include "menu.h"
X
X/* sweep out a new window */
X
Xint new_window()
X   {
X   register WINDOW *win;
X   int dx=16,dy=16;
X   char *malloc();
X   WINDOW * insert_win();
X
X   if (next_window >= MAXWIN)
X       return(-1);
X   SETMOUSEICON(&mouse_box);
X   move_mouse(screen,mouse,&mousex,&mousey,0);
X   SETMOUSEICON(&mouse_arrow);
X   get_rect(screen,mouse,mousex,mousey,&dx,&dy,0);
X   do_button(0);
X
X   return( create_window( mousex, mousey, dx, dy, -1, 0 ) );
X   }
X
X/* insert a new window into the window list */
X
XWINDOW *
Xinsert_win(win)
XWINDOW *win;
X   {
X   char *malloc();
X
X   if (win == (WINDOW *) 0 &&
X           (win = (WINDOW *) malloc(sizeof(WINDOW))) == (WINDOW *) 0) {
X      if( debug )
X	 fprintf(stderr,"Can't malloc window space\n");
X      return(win);
X      }
X
X   if (active) {
X      W(prev) = ACTIVE(prev);
X      ACTIVE(prev) = win;
X      W(next) = active;
X      }
X   else {
X      W(prev) = win;
X      W(next) = (WINDOW *) 0;
X      }
X   return(win);
X   }
X
X/* create a new window given coords */
X
Xint
Xcreate_window(x,y,dx,dy,font_num,argv)
Xint x,y,dx,dy;
Xint font_num;
Xchar **argv;
X   {
X   register WINDOW * win;
X   WINDOW * insert_win();
X
X   if (next_window >= MAXWIN)
X       return(-1);
X   if (check_window(x,y,dx,dy,font_num) == 0)
X      return(-1);
X
X   /* alloc window space */
X
X   if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == (WINDOW *) 0) {
X      fprintf(stderr,"Can't malloc window space\n");
X      return(-1);
X      }
X      
X   if ((W(pid) = get_command(argv,&W(from_fd))) < 0) {
X      free(win);
X      fprintf(stderr,"Can't get a pty\n");
X      return(-1);
X      }
X   W(to_fd) = W(from_fd);
X   W(setid) = next_windowset_id();
X
X   active = insert_win(win);
X
X   make_window(screen,x,y,dx,dy,font_num,"");
X   return(0);
X   }
X
X/* create a new window given coords , with only 1/2 a ptty */
X
Xchar *
Xhalf_window(x,y,dx,dy,font_num)
Xint x,y,dx,dy;
Xint font_num;
X   {
X   register WINDOW * win;
X   WINDOW * insert_win();
X   char *half_open();
X   char *tty;
X
X   if (next_window >= MAXWIN)
X       return(NULL);
X   if (check_window(x,y,dx,dy,font_num) == 0)
X      return(NULL);
X
X   /* alloc window space */
X
X   if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == (WINDOW *) 0) {
X      fprintf(stderr,"Can't malloc window space\n");
X      return(NULL);
X      }
X      
X   if ((tty = half_open(&W(from_fd))) == NULL) {
X      free(win);
X      fprintf(stderr,"Can't get a pty\n");
X      return(NULL);
X      }
X
X   W(setid) = next_windowset_id();
X   active = insert_win(win);
X
X   W(to_fd) = W(from_fd);
X   make_window(screen,x,y,dx,dy,font_num,"");
X   W(pid) = 1;
X   W(flags) |= W_NOKILL;
X
X   return(tty);
X   }
X
X/* check window size */
X
Xint
Xcheck_window(x,y,dx,dy,fnt)
Xint x, y, dx, dy;
Xint fnt;
X   {
X   struct font *curr_font, *Get_font();
X
X   if (dx<0)
X      x += dx, dx = -dx;
X   if (dy<0)
X      y += dy, dy = -dy;
X   
X   if (x >= BIT_WIDE(screen) || y >= BIT_HIGH(screen))
X       return(0);
X
X   if (x + dx >= BIT_WIDE(screen))
X      dx = BIT_WIDE(screen)-x;
X
X   if (y + dy >= BIT_HIGH(screen))
X      dy = BIT_HIGH(screen)-y;
X
X   curr_font = Get_font(fnt);
X
X#ifdef DEBUG
X   dprintf(n)(stderr,"starting: (%d,%d)  %d x %d\r\n",x,y,dx,dy);
X#endif
X
X   if (dx < SUM_BDR + curr_font->head.wide*MIN_X +1 ||
X              dy < SUM_BDR + curr_font->head.high*MIN_Y +1)
X      return(0);
X   else
X      return(1);
X   }
X
X/* draw the window on the screen */
X
Xmake_window(screen,x,y,dx,dy,fnt,start)
XBITMAP *screen;
Xint x, y, dx, dy;
Xint fnt;
Xchar *start;
X   {
X   register WINDOW *win = active;
X   register int i;
X   struct font *curr_font, *Get_font();
X   char *last_tty();
X
X   if (dx<0)
X      x += dx, dx = -dx;
X   if (dy<0)
X      y += dy, dy = -dy;
X   
X   if (x < 0) x = 0;
X
X   if (x + dx >= BIT_WIDE(screen))
X      dx = BIT_WIDE(screen)-x;
X
X   if (y + dy >= BIT_HIGH(screen))
X      dy = BIT_HIGH(screen)-y;
X
X   curr_font = Get_font(fnt);
X   if (curr_font == font) {
X#ifdef DEBUG
X      dprintf(n)(stderr,"Can't find font %d, using default\r\n", fnt);
X#endif
X      }
X
X#ifdef DEBUG
X   dprintf(n)(stderr,"starting window: (%d,%d)  %d x %d font (%d,%d)\r\n",
X             x,y,dx,dy,curr_font->head.wide, curr_font->head.high);
X   dprintf(n)(stderr,"min size: %d x %d\r\n",
X           SUM_BDR + curr_font->head.wide*MIN_X +1,
X           SUM_BDR + curr_font->head.high*MIN_Y +1);
X#endif
X
X   if (dx < SUM_BDR + curr_font->head.wide*MIN_X +1 ||
X       dy < SUM_BDR + curr_font->head.high*MIN_Y +1)
X       return(-1);
X
X#ifdef DEBUG
X   dprintf(n)(stderr,"adjusted to: (%d,%d)  %d x %d\r\n",x,y,dx,dy);
X#endif
X
X   if (!setup_window(win,curr_font,x,y,dx,dy)) {
X      fprintf(stderr,"Out of memory for window creation -- bye!\n");
X      quit();
X      }
X
X   next_window++;
X
X   /* make the window */
X
X   set_covered(win);
X   border(win,BLK_BDR,WH_BDR);
X   CLEAR(W(window),BIT_CLR);
X
X   /* set up file descriptor modes */
X
X   if (fcntl(W(from_fd),F_SETFL,fcntl(W(from_fd),F_GETFL,0)|FNDELAY) == -1)
X      fprintf(stderr,"%s: fcntl failed for fd %d\n",W(tty),W(from_fd));
X
X   mask |= 1<<W(to_fd);
X
X   /* send initial string (if any) */
X
X   if (start && *start) {
X#ifdef DEBUG
X      dprintf(n)(stderr,"Sending initial string: [%s]\n",start);
X#endif
X      Write(W(to_fd),start,strlen(start));
X      }
X   return(0);
X   }
X
X/* initialize window state */
X
Xint
Xsetup_window(win,curr_font,x,y,dx,dy)
Xregister WINDOW *win;
Xint x,y,dx,dy;
Xstruct font *curr_font;
X   {
X   register int i;
X
X#ifdef ALIGN
X   alignwin(screen,&x,&dx,SUM_BDR);
X#endif
X
X   W(font) = curr_font;
X   W(x) = 0;
X   W(y) = curr_font->head.high;
X   W(esc_cnt) = 0;
X   W(esc[0]) = 0;
X   W(flags) = W_ACTIVE | init_flags;
X#ifdef CUT
X   W(flags) |= W_SNARFABLE;
X#endif
X#ifdef COLOR
X   W(background) = NOCOLOR&BIT_SRC | GETCOLOR(WHITE);
X   W(style) = NOCOLOR&BIT_SRC | GETCOLOR(BLACK);
X#else
X   W(style) = OPCODE(BIT_SRC);
X   W(background) = OPCODE(BIT_CLR);
X#endif
X	W(curs_type) = CS_BLOCK;
X   W(x0) = x;
X   W(y0) = y;
X   W(border) = bit_create(screen,x,y,dx,dy);
X   W(window) = bit_create(W(border),SUM_BDR,SUM_BDR,dx-SUM_BDR*2,dy-SUM_BDR*2);
X
X   W(text.x) = 0;
X   W(text.y) = 0;
X   W(text.wide) = 0;
X   W(text.high) = 0;
X
X   W(bitmap) = (BITMAP *) 0;
X   for(i=0;i<MAXBITMAPS;i++)
X      W(bitmaps)[i] = (BITMAP *) 0;
X
X   W(save) = (BITMAP *) 0;
X   W(stack) = (WINDOW *) 0;
X   W(main) = win;
X   W(alt) = (WINDOW *) 0;
X   W(esc_cnt) = 0;
X   W(esc[0])=0;
X   W(clip_list) = (char *) 0;
X
X   for(i=0;i<MAXMENU;i++)
X      W(menus[i]) = (struct menu_state *) 0;
X
X   W(menu[0]) = W(menu[1]) = -1;
X   W(event_mask) = 0;
X
X   for(i=0;i<MAXEVENTS;i++)
X      W(events)[i] = (char *) 0;
X
X   W(snarf) = (char *) 0;
X   W(gx) = 0;
X   W(gy) = 0;
X   W(op) = OPCODE(BIT_SET);
X   W(max) = 0;
X   W(current) = 0;
X   strcpy(W(tty), last_tty());
X   W(num) = 0;
X   clip_bad(win);	/* invalidate clip lists */
X   return(W(border) && W(window));
X   }
X
X/*
X	Look through all the windows for the next available window set id.
X*/
X
Xint
Xnext_windowset_id()
X   {
X      char		list[ MAXWIN + 2 ];
X      register char	*cp;
X      register WINDOW	*win;
X
X      for( cp = list;  cp < &list[ MAXWIN + 2 ];  cp++ )
X	 *cp = 0;
X
X      for( win = active;  win != (WINDOW *)0;  win = W(next) )
X	 list[ W(setid) ] = 1;
X
X      /*	There is no window set ID zero.
X      */
X      for( cp = list + 1;  *cp;  cp++ )
X	 ;
X
X      return cp - list;
X   }
END_OF_FILE
# end of 'src/new_window.c'
fi
if test -f 'src/update.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/update.c'\"
else
echo shar: Extracting \"'src/update.c'\" \(7972 characters\)
sed "s/^X//" >'src/update.c' <<'END_OF_FILE'
X/*                        Copyright (c) 1988 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: update.c,v 4.1 88/06/21 13:34:49 bianchi Exp $
X	$Source: /tmp/mgrsrc/src/RCS/update.c,v $
X*/
Xstatic char	RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/update.c,v $$Revision: 4.1 $";
X
X/* update a background window */
X
X/*
X *	   build a clip list
X *	1) find all window edges that intersect with the current window 
X *	2) sort all tops+bottoms then left+rights into increasing order
X *	3) for each rectangular patch, see if it is visible on target window
X *	4) if visible, coellesce patch and keep on a list
X *    update window against clip list
X * 5) run through list, and update each rext that intersects with
X *    the clip region
X */
X
X#include "bitmap.h"
X#include "defs.h"
X#include "clip.h"
X#include <stdio.h>
X
X#define MAX_COORDS	((MAXWIN+1)  * 5)	/* educated guess (stab in the dark?) */
X
Xstruct rect_list {				/* list of visible "patches" of obscured window */
X	rectangle rect;				/* clipping rectangle */
X	struct rect_list *next;		/* next clipping rectangle */
X	};
X
Xstatic int x[MAX_COORDS];		/* left/right edges of covering windows */
Xstatic int y[MAX_COORDS];		/* top/bottom edges of covering windows */
X
X/* update an obscured window */
X
Xupdate(win, clipp)
Xregister WINDOW *win;
Xrect	*clipp;
X	{
X	/* generate clip list */
X
X	if (!(W(flags)&W_CLIPDONE)) {
X		if (W(clip_list) != NULL) /* free old list (we could reuse it) */
X			zap_cliplist(win);
X		gen_list(win);
X		W(flags) |= W_CLIPDONE;
X		}
X
X	/* update the window */
X
X   do_update(win,clipp);			/* do the update */
X	}
X
X/* free window's clip list */
X
Xint
Xzap_cliplist(win)
XWINDOW *win;
X	{
X	register struct rect_list *list = (struct rect_list *) W(clip_list);
X	register struct rect_list *next;
X
X#ifdef DEBUG
X	dprintf(U)(stderr,"Zapping clip list\r\n");
X#endif
X	for(;list;list=next) {
X		next = list->next;
X		free(list);
X		}	
X	W(clip_list) = NULL;
X	}
X
X/* generate a clip list */
X
Xint
Xgen_list(window)
Xregister WINDOW *window;
X   {
X
X   register WINDOW *win = window;
X   register struct rect_list *list, *prev = (struct rect_list *)0;
X   register int x_cnt = 2, y_cnt = 2;
X   register int i, j;
X   int count = 0;
X   int skip;		/* covered by another window - skip patch */
X   int hold;		/* hold for coellessing */
X
X   int cmp();		/* compare for qsort */
X
X   /* build arrays of window coordinates: intersecting win's above win */
X
X   x[0] = SUM_BDR + W(x0);
X   y[0] = SUM_BDR + W(y0);
X   x[1] = SUM_BDR + W(x0) + BIT_WIDE(W(window));
X   y[1] = SUM_BDR + W(y0) + BIT_HIGH(W(window));
X
X   for(win = active; win != window; win=W(next)) {
X      if (!(in_win(win,x[0],y[0],x[1],y[1])))
X         continue;
X
X      if (W(x0) >= x[0] && W(x0) <= x[1])
X         x[x_cnt++] = W(x0);
X
X      if (W(y0) >= y[0] && W(y0) <= y[1])
X         y[y_cnt++] = W(y0);
X
X      if (W(x0) + BIT_WIDE(W(border)) >= x[0] &&
X               W(x0) + BIT_WIDE(W(border)) <= x[1])
X         x[x_cnt++] = W(x0) + BIT_WIDE(W(border));
X
X      if (W(y0) + BIT_HIGH(W(border)) >= y[0] &&
X               W(y0) + BIT_HIGH(W(border)) <= y[1])
X         y[y_cnt++] = W(y0) + BIT_HIGH(W(border));
X      
X      if (y_cnt >= MAX_COORDS || x_cnt >= MAX_COORDS)
X         break;
X      }
X
X   /* sort window coordinate lists */
X
X   qsort(x,x_cnt,sizeof(int),cmp);
X   qsort(y,y_cnt,sizeof(int),cmp);
X
X   x_cnt--;
X   y_cnt--;
X
X   /* build list of covering rectangles */
X
X   for(j=0; j<y_cnt; j++) {
X
X      if (y[j] == y[j+1])	/* avoid zero-height patches */
X         continue;
X
X      for(hold=x_cnt,i=0; i<x_cnt; i++) {
X
X         if (x[i] == x[i+1])	/* avoid zero-width patches */
X            continue;
X
X			/* see if patch is visible */
X
X         for(skip=0,win=active; win!=window; win=W(next))
X            if (in_win(win, x[i], y[j], x[i+1], y[j+1])) {
X               skip++;
X               break;
X               }
X
X			/* visible, add patch to list, or append to previous patch */
X
X         if (!skip)  {
X				if (i == hold) {		/* coel. across */
X					list->rect.wide += x[i+1] - x[i];
X					hold++;
X					}
X				else {	/* flush held rect */
X					count++;		/* only for debugging */
X					list = (struct rect_list *) alloc(sizeof(struct rect_list));
X					list->rect.x = x[i] - W(x0);
X					list->rect.y = y[j] - W(y0);
X					list->rect.wide = x[i+1] - x[i];
X					list->rect.high = y[j+1] - y[j];
X					list -> next = NULL;
X					if (prev)
X						prev -> next = list;
X					if (!W(clip_list))	/* set initial rectangle */
X						W(clip_list) = (char *) list;
X					prev = list;
X					hold = i+1;				/* next 'i' to check for coell. */
X					}
X            }
X         }
X      }
X
X/* look at rect list	DEBUG code, commented out!
X
X	for(list=(struct rect_list *) W(clip_list);list;list = list->next) {
X		int	x = list->rect.x,
X			y = list->rect.y,
X			wide = list->rect.wide,
X			high = list->rect.high;
X		in_mouseoff( x, y, wide, high );
X		bit_blit(W(border), x, y, wide, high, BIT_NOT(BIT_DST),0L,0,0);
X		dprintf(U)(stderr,"  Rect %d,%d  %dx%d\n", x, y, wide, high );
X		getchar();
X		bit_blit(W(border), x, y, wide, high, BIT_NOT(BIT_DST),0L,0,0);
X		MOUSE_ON(mousex,mousey);
X		}
XDEBUG code, commented out! */
X
X#ifdef DEBUG
X	dprintf(U)(stderr,"%s: Built clip list (%d)\r\n",W(tty),count);
X#endif
X
X	return(0);	/* I'll think of something */
X   }
X
X/* update obscured window */
X
Xint
Xdo_update(win,clipp)	
Xregister WINDOW *win;	/* window to update */
Xrect *clipp;      	/* region of window to update (window coords) */
X	{
X   register struct rect_list *list;	/* list of rectangle to clip to */
X   register rectangle *got;		/* intersecting region */
X   rectangle *got_int();		/* finds intersecting rectangle */
X
X#ifdef DEBUG
X	dprintf(*)(stderr,"Updating background window to %d,%d => %d,%d\r\n",
X		clipp->x1,clipp->y1,clipp->x2,clipp->y2);
X#endif
X
X	for(list=(struct rect_list *)W(clip_list);list;list = list->next) {
X		if (got = got_int(&(list->rect),clipp)) {
X			register int	x = got->x,
X					y = got->y,
X					wide = got->wide,
X					high = got->high;
X			in_mouseoff( x + W(x0), y + W(y0), wide, high );
X			bit_blit(W(border),x,y,wide,high,BIT_SRC,W(save),x,y);
X			MOUSE_ON(mousex,mousey);
X			}
X		}
X	}
X
X/* find the intersection of 2 rectangles */
X
Xrectangle *
Xgot_int(r1,r2)
Xregister rectangle *r1;		/* rect 1 */
Xregister rect *r2;			/* other rect   (should both be same struct) */
X	{
X	static rectangle result;
X
X	result.x = Max(r1->x,r2->x1+SUM_BDR);
X	result.y = Max(r1->y,r2->y1+SUM_BDR);
X	result.wide = Min(r1->x + r1->wide, r2->x2+SUM_BDR) - result.x;
X	result.high = Min(r1->y + r1->high, r2->y2+SUM_BDR) - result.y;
X
X	if (result.wide > 0 && result.high > 0 )
X      return(&result);
X	else
X		return((rectangle *) 0);
X	}
X
X/* see if mouse in rectangle, if so turn the mouse off */
X
Xin_mouseoff(x0,y0,wide,high)
Xregister int x0,y0,wide,high;
X   {
X   if( !( x0 > mousex+16 || y0 > mousey+16 ||
X        x0+wide < mousex || y0+high < mousey))
X	MOUSE_OFF(mousex,mousey);
X   }
X         
X/* see if rectangle in window */
X
Xint
Xin_win(win,x0,y0,x1,y1)
Xregister WINDOW *win;
Xregister x0,y0,x1,y1;
X   {
X   return(
X      W(x0) + BIT_WIDE(W(border)) <= x0 ||
X      x1 <= W(x0) ||
X      W(y0) + BIT_HIGH(W(border)) <= y0 ||
X      y1 <= W(y0)
X   ?  0  :  1);
X   }
X
X/* compare for qsort */
X
Xint
Xcmp(x,y)
Xint *x, *y;
X   {
X   return( *x - *y);
X   }
X
X/* invalidate clip list for all windows affected by 'window' */
X
Xclip_bad(window)
Xregister WINDOW *window;		/* this window has changed */
X	{
X	register WINDOW *win;		/* working window */
X
X	/* invalidate all intersecting window clip lists below this one */
X
X	window->flags &= ~W_CLIPDONE;		/* invalidate clip list */
X   for(win=window->next;win != (WINDOW *) 0;win=W(next))
X		if (intersect(win,window)) 
X			W(flags) &= ~W_CLIPDONE;		/* invalidate clip list */
X	}
END_OF_FILE
# end of 'src/update.c'
fi
echo shar: End of archive 28 \(of 61\).
cp /dev/null ark28isdone
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.