rsalz@uunet.uu.net (Rich Salz) (01/26/89)
Submitted-by: Stephen A. Uhler <sau@bellcore.com> Posting-number: Volume 17, Issue 36 Archive-name: mgr/part35 #! /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 35 (of 61)." # Contents: demo/misc/hpmgr.c font-16/Uoldeng22x30r lib/term.c # src/get_menus.c # Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:43 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'demo/misc/hpmgr.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'demo/misc/hpmgr.c'\" else echo shar: Extracting \"'demo/misc/hpmgr.c'\" \(12178 characters\) sed "s/^X//" >'demo/misc/hpmgr.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/* X** hp2621 terminal emulator X*/ X#ifndef lint Xstatic char rcsid[] = "$Header: hpmgr.c,v 4.2 88/06/22 14:37:42 bianchi Exp $"; X#endif X X#include "term.h" X#include <ctype.h> X X#define MAX_ROW 24 X#define MAX_COL 80 X X#define C_X (MAX_COL*f_w) /* width of the screen */ X#define C_Y (MAX_ROW*f_h) /* height of the screen */ X/* XFILE *outfile; X*/ X Xextern int more_out; Xstatic char *m_fields[16]; X Xint cur_x = 0; /* cursor location */ Xint cur_y = 0; X Xextern char *shiftline(); Xextern char *del_line(); Xint banner_space; Xint x,y,w,h,f_w,f_h; X Xint in_mode = 0; /* insert mode flag */ X X#define min(a,b) ((a)<(b)?(a):(b)) X#define max(a,b) ((a)>(b)?(a):(b)) X Xint margin; X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X extern int verboseflag; X int dummy; X X ckmgrterm( *argv ); X X if (argc > 1 && !(strcmp(argv[1],"-v"))) X { X verboseflag = 1; X } X X/* X if ((outfile = fopen("hpmgr.out","w+")) == NULL) X { X printf("can't create logfile\n"); X exit(1); X } X*/ X X m_termin = stdin; X m_termout = stdout; X X m_push(P_MENU|P_POSITION|P_EVENT|P_FLAGS); X m_setmode(M_ABS); X get_size(&x,&y,&w,&h); X get_font(&f_w,&f_h); X get_margin(&margin); X X banner_space = f_h+2; X X m_setmode(M_BACKGROUND); X X if ((w != C_X ) || ((C_Y + banner_space )!= h)) X { X m_shapewindow(x,y,C_X+(2*margin), X C_Y + banner_space + (2*margin)); X } X X get_size(&x,&y,&w,&h); X m_clear(); X X /* print the banner line */ X m_printstr(" HP2621 EMULATOR"); X m_flush(); X m_func(B_INVERT); X m_bitwrite(0,0,w,banner_space-1); X m_flush(); X m_func(B_OR); X X m_textregion(0,banner_space,C_X,C_Y); X m_clear(); X m_flush(); X X do_env("TERM=","h2"); X do_env("TERMCAP=",""); X getpty((char**)0); X printf("\n\rPANIC -- getpty failed!! something is wrong!!\n\r"); X} X X X Xint Xget_margin(x) Xint *x; X X { X register int count; X X if ((count = get_info(G_SYSTEM,m_fields)) >= 4) { X *x = atoi(m_fields[3]); X return(1); X } X else X return(-count); X } X Xinmassage(ptr,cnt) Xchar *ptr; int cnt; X{ X return(cnt); X} X Xoutmassage(ptr,cnt) Xchar *ptr; int cnt; X{ X char *start = ptr; X char *to, *sptr, *shiftptr; X int newcnt = 0; X char newbuf[1024]; X char smallb[1024]; X static char holdb[1024]; X X static int gotesc = 0; X static int gotamp = 0; X static int gota = 0; X static int gotc = 0; X static int goty = 0; X static int gotr = 0; X static int gotd = 0; X static int gotj = 0; X X static int xval = 0; X static int yval = 0; X X/* Xfprintf(outfile,"outmassage -- more = %d cnt = %d\n",more_out,cnt); Xfflush(outfile); X*/ X /* X ** check to see if we have more data on hold X */ X if (cnt == -2) X { X if (more_out) X { X to = ptr; X mystrncpy(&to,holdb,more_out); X cnt = more_out; X more_out = 0; X } X else X { X printf("panic -- outmassage got cnt = %d and more_out = %d\n", X cnt,more_out); X exit(1); X } X } X else X { X if (cnt <= 0) X return(cnt); X } X X for(to = newbuf;(cnt > 0) && (newcnt < (1024-100));ptr++,cnt--) X { X X *ptr &= 0177; X/* Xfputc(*ptr,outfile); X*/ X X if (gotesc) X { X switch (*ptr) X { X case '\000': X goto out; X case ESC : X gotamp = gota = gotc = gotj = gotd = X goty = gotr = 0; X goto out; X case '&' : X gotamp = 1; X goto out; X case 'a' : X gota = 1; X goto out; X case 'y' : X goty = 1; X goto out; X case 'r' : X gotr = 1; X goto out; X case 'c' : X gotc = 1; X goto out; X X case 'd' : X gotd = 1; X goto out; X case '1' : X case '2' : X case '3' : X /* X ** skip tabs for now X */ X if (!gotamp) X { X gotesc = 0; X goto out; X } X case '0' : X case '4' : X case '5' : X case '6' : X case '7' : X case '8' : X case '9' : X if (gotc || goty || gotr) X { X yval *=10; X yval += (*ptr) - '0'; X } X else X { X xval *=10; X xval += (*ptr) - '0'; X } X goto out; X case 'j' : X gotj = 1; X goto out; X /* X ** begin standout mode X */ X case 'D' : X if (gotamp && gotd) X { X *to++ = ESC; X *to++ = 'i'; X newcnt += 2; X } X gotesc = gotamp = gotj = gotd = 0; X goto out; X /* X ** skip keyboard mode for now X ** but handle end of standout mode X */ X case '@' : X if (gotamp && gotd) X { X *to++ = ESC; X *to++ = 'n'; X newcnt += 2; X } X gotesc = gotamp = gotj = gotd = 0; X goto out; X case 'B' : X if (gotamp) X { X gotesc = gotamp = gotj = 0; X goto out; X } X goto parsepanic; X X /* X ** clear screen X */ X case 'J' : X *to++ = ESC; X *to++ = 'C'; X newcnt += 2; X gotesc = 0; X goto out; X X /* X ** home cursor X */ X case 'H' : X sprintf(smallb,"%c%d,%dM",ESC,0,0); X mystrncpy(&to,smallb,strlen(smallb)); X newcnt += strlen(smallb); X cur_x = cur_y = gotesc = 0; X goto out; X X /* X ** clear to eol X */ X case 'K' : X *to++ = ESC; X *to++ = 'c'; X newcnt += 2; X gotesc =0; X goto out; X X /* X ** delete line X */ X case 'M' : X *to++ = ESC; X *to++ = 'd'; X newcnt += 2; X gotesc = 0; X goto out; X X /* X ** end insert mode X */ X case 'R' : X if (gota && gotamp) X { X goto vertaddr; X } X in_mode = 0; X gotesc = 0; X goto out; X /* X ** start insert mode X */ X case 'Q' : X in_mode = 1; X gotesc = 0; X goto out; X X /* X ** open line X */ X case 'L' : X *to++ = ESC; X *to++ = 'a'; X newcnt += 2; X gotesc=0; X goto out; X X /* X ** up line X */ X case 'A' : X *to++ = ESC; X *to++ = 'u'; X newcnt += 2; X gotesc=0; X goup(); X goto out; X X case 'i' : X cur_x -= (cur_x%8?cur_x%8:8); X sprintf(smallb,"%c%d,%dM", ESC,cur_x,cur_y); X mystrncpy(&to,smallb,strlen(smallb)); X newcnt += strlen(smallb); X gotesc = 0; X goto out; X X /* X ** delete char X */ X case 'P' : X shiftptr = del_line(); X mystrncpy(&to,shiftptr,strlen(shiftptr)); X newcnt += strlen(shiftptr); X gotesc=0; X goto out; X X /* X ** non destructive space X ** and horizontal motion X */ X case 'C' : X if (gotamp) X { X if (gota) X { X if(gotr||goty) X { X goto fulladdr; X } X sprintf(smallb, X "%c%d,%dM",ESC,xval,cur_y); X mystrncpy(&to,smallb,strlen(smallb)); X newcnt += strlen(smallb); X cur_x = xval; X gotesc = gotamp = gota = X gotc = xval = yval = 0; X } X else X { X goto parsepanic; X } X } X else X { X *to++ = ESC; X *to++ = 'r'; X newcnt += 2; X gotesc=0; X goright(); X } X goto out; X X X case 'Y' : X vertaddr: X if (gotamp && gota) X { X fulladdr: X if (goty || gotr) X { X int tmp; X tmp = xval; X xval = yval; X yval = tmp; X } X if (gotc || goty || gotr) X { X /* X ** 2-D cursor motion X */ X/* Xfprintf(outfile,"xval = %d, yval = %d",xval,yval); Xfflush(outfile); X*/ X if (yval > MAX_ROW-1) X { X fprintf(stderr, X "PANIC -- got address > 23 = %d", yval); X sleep(10); X } X sprintf(smallb,"%c%d,%dM", X ESC,xval,yval); X mystrncpy(&to,smallb,strlen(smallb)); X newcnt += strlen(smallb); X cur_x = xval; X cur_y = yval; X gotesc = gotamp = gota = gotc = X xval = yval = goty = gotr = 0; X } X else X { X /* X ** vertical motion X */ X if (xval > MAX_ROW-1) X { X fprintf(stderr, X "PANIC -- got address > 23 = %d", xval); X sleep(10); X } X sprintf(smallb, X "%c%d,%dM",ESC,cur_x,xval); X mystrncpy(&to,smallb,strlen(smallb)); X newcnt += strlen(smallb); X cur_y = xval; X gotesc = gotamp = gota = X gotr = goty = gotc = xval = yval = 0; X } X goto out; X } X else X { X goto parsepanic; X } X default : X parsepanic:; X/* X fprintf(outfile,"|BAD ESCAPE CODE esc = %d gotamp = %d gota = %d gotc = %d gotj = %d goty = %d gotr = %d code = %o|\n", X gotesc,gotamp,gota,gotc, X gotj,goty,gotr,*ptr); X*/ X printf("|BAD ESCAPE CODE esc = %d gotamp = %d gota = %d gotc = %d gotj = %d goty = %d gotr = %d code = %o|\n", X gotesc,gotamp,gota,gotc, X gotj,goty,gotr,*ptr); X sleep(10); X gotesc = gotamp = gota = gotc = xval = yval = 0; X goto out; X } X } X X switch (*ptr) X { X case '\000' : X break; X case ESC: X gotamp = gota = gotc = gotj = X goty = gotr = xval = yval = 0; X gotesc = 1; X break; X case '\010' : X goleft(); X goto dochar; X case '\012' : X godown(); X goto dochar; X case '\015' : X cur_x = 0; X goto dochar; X case '\011' : X cur_x += (8 - (cur_x%8)); X goto dochar; X default: X if (in_mode && isprint(*ptr)) X { X shiftptr = shiftline(); X mystrncpy(&to,shiftptr,strlen(shiftptr)); X newcnt += strlen(shiftptr); X } X goright(); X dochar : X *to++ = *ptr; X newcnt++; X break; X } X out:; X } X X /* X ** make sure we didn't over run the end of the buffer X */ X if ((newcnt < 0) || (newcnt >= 1024)) X { X printf("panic: newcnt = %d, out of range\n",newcnt); X } X /* X ** did we run out of buffer space before finishing the input? X */ X if (cnt) X { X to = holdb; X mystrncpy(&to,ptr,cnt); X more_out = cnt; X } X strncpy(start,newbuf,newcnt); X/* X fprintf(outfile,"newcnt = %d\n",newcnt); X if ((newcnt > 0) && (newcnt < 1024)) X fwrite(start,sizeof(char),newcnt,outfile); X*/ X return(newcnt); X} X Xgoright() X{ X if (cur_x == (MAX_COL-1)) X { X cur_x = 0; X godown(); X } X else X { X cur_x++; X } X} X Xgoleft() X{ X cur_x = max(0,cur_x - 1); X} X Xgoup() X{ X cur_y = max(0,cur_y - 1); X} X Xgodown() X{ X cur_y = min(MAX_ROW - 1, cur_y + 1); X} X Xchar * Xshiftline() X{ X static char shiftbuf[1024]; X static char buf2[1024]; X X/* Xfprintf(outfile,"cur_x = %d cur_y = %d\n\n",cur_x, cur_y); Xfflush(outfile); X*/ X X /* m_func */ X sprintf(shiftbuf,"%c%d%c",ESC,B_COPY,E_BITBLT); X X /* m_bitcopy */ X sprintf(buf2,"%c%d,%d,%d,%d,%d,%d%c", X ESC, X (cur_x+1)*f_w, /* dest x */ X banner_space + (cur_y*f_h), /* dest y */ X f_w*((MAX_COL-1)-cur_x), /* width */ X f_h, /* height */ X cur_x*f_w, /* src x */ X banner_space + (cur_y*f_h), /* src y */ X E_BITBLT); X strcat(shiftbuf,buf2); X X /* m_func */ X sprintf(buf2,"%c%d%c",ESC,B_CLEAR,E_BITBLT); X strcat(shiftbuf,buf2); X X/* X sprintf(buf2,"%c%d,%d,%d,%d%c", X ESC, X cur_x*f_w, x X banner_space + (cur_y*f_h), y X f_w, width X f_h, height X E_BITBLT); X strcat(shiftbuf,buf2); X X*/ X /* m_func */ X sprintf(buf2,"%c%d%c",ESC,B_OR,E_BITBLT); X strcat(shiftbuf,buf2); X return(shiftbuf); X} X Xchar * Xdel_line() X{ X static char shiftbuf[1024]; X static char buf2[1024]; X /* m_func */ X sprintf(shiftbuf,"%c%d%c",ESC,B_COPY,E_BITBLT); X X /* m_bitcopy */ X sprintf(buf2,"%c%d,%d,%d,%d,%d,%d%c", X ESC, X cur_x*f_w, /* dest x */ X banner_space + (cur_y*f_h), /* dest y */ X f_w*((MAX_COL-1)-cur_x), /* width */ X f_h, /* height */ X (cur_x+1)*f_w, /* src x */ X banner_space + (cur_y*f_h), /* src y */ X E_BITBLT); X strcat(shiftbuf,buf2); X X /* m_func */ X sprintf(buf2,"%c%d%c",ESC,B_CLEAR,E_BITBLT); X strcat(shiftbuf,buf2); X X sprintf(buf2,"%c%d,%d,%d,%d%c", X ESC, X C_X-f_w, /* x */ X banner_space + (cur_y*f_h), /* y */ X f_w, /* width */ X f_h, /* height */ X E_BITBLT); X strcat(shiftbuf,buf2); X X /* m_func */ X sprintf(buf2,"%c%d%c",ESC,B_OR,E_BITBLT); X strcat(shiftbuf,buf2); X return(shiftbuf); X} X Xmystrncpy(to,from,cnt) Xchar **to, *from; int cnt; X{ X while(cnt > 0) X { X **to = *from; X (*to)++; /* increment the pointer,NOT the pointer to the pointer */ X from++; X cnt--; X } X} Xcleanup() X{ X m_pop(); X m_textreset(); X m_clear(); X exit(0); X} END_OF_FILE # end of 'demo/misc/hpmgr.c' fi if test -f 'font-16/Uoldeng22x30r' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'font-16/Uoldeng22x30r'\" else echo shar: Extracting \"'font-16/Uoldeng22x30r'\" \(12277 characters\) sed "s/^X//" >'font-16/Uoldeng22x30r' <<'END_OF_FILE' Xbegin 644 oldeng22x30r.fnt XM%A8>"%L@ @ XM XM /0 XP, 1 G_P XSQ!QB( !$ XW@!D #C, XW@#C> !$@> 1 XM "& /(P A@#R. _ ?@0#$8 (C P&# 8"(.(P! XM @ $ # " " ( XM XM !P XM ?X!_@^ (O __X! XM_G_#_'X B\!_OR"R '^8!_OP'^_( #ET_ _ ./ ?KZ #CP'JW !_P __P'E XM] <OH!Y??@\#X?)Z!P 0 ! , ( XM /@ 4 4 0 XM #X XM " XM _L!_#. 1_ __\!_/_#^/X!'\!_9\&Y '\X!_1 XMY']GP -VY_!_ \7@_L< /%X/[#@"!XA__P!V. ^QP =GQQ.'P_*\!__P XM "@ < $ SP < < !P XM " @ " XM !X # #( XM !@ & . /^ (( ! P P # @\ XM!&,. R> 90>!&0.",9P#)X!&X8 [ $8X!&@^$;A@ 9\Y#B>!WCPCX< =X\( XM^#@$ _!'_@!T. /AP ?'1P.'@G,< __@ #P < XM & !QP < < !P XM $ ! $ H XM 'T 'P #Z /H . /^ ?X #_@ XM!] 'T !< #8.!F( #0. !@ "X@&80 ! XMX0 = "X !@< 'A !ITX#@(#.AP#H< SH< Z#@$ . $" !T. .AP ='1P'( XM '(< /_ #X < / !P < XM < !P < # , XM 0 XM ![X +@ ]\ #WP < ?\ !_P '_@ >^ ![X XM =. ,X.#.( '0. &@ ,X@,X@ &X = ,X &@( ;A #ITX#P( XM#.@X#H< SH. Z#@& $ (B !T. .AP ='1P'( '(< " XM !P < '@ !P < < !P XM < & 8 XM @ !PX #@ X< #AP < XM 0 !W@ _ <. !PX ^. <X.#.( '0. XM.@ <X@,Y .X = <X .@ [A #ITX#P('.@X#H<!SH. Z#@/P 9B !T XM. .AP ='1P#P '(< " @ < #P XM!P < 0 ! < !P < & XM 8 XM !PX #@ X< #AP 8 0 !P " <. !PX XM ^' <Z,&.( '8> .@ <X@8Z .Z( = <X .A XMP [A #ITX"X(&.@<#H<!CH' Z#@;^#@SB !T. .AP ='1P#P '(< $ XM < !X !P < X #@ < !P XM < . X XM !PX #@ XM X< #AP X 0 !P " <. !PX " ( "' XM \Z8&.( /7N >G \_@8\ >Z\ ] \X >FX![A 'OWX&X(..@<'O\#CH'! XMZ' 9_]PSB #W^ >_P ='1P/^ //\ ( < XM \ !P < 0 ! < !P XM < . X XM !PX #@ P< #!P T 0 !P $ XM<. !PX ' < $'!\[L..( ?0. ^OH!\_@X_@ ^ XM[<!] !\X ^XX#[A /OWX.<(..@</H<#CH'#Z< </\ACB 'T. ^AP ]_?P/^ XM ?(< 0 < >@ !^ < XM < !P ?@ . X XM XM !PX #@ < !P !L XX !P ( <. !PX /@ ^ XM '_A\^...( ?0. ^_P!\_@XZ8 ^^<!] !\X ^@<#[A /OWX.?X XM.._\/H<#CO_#[^ /!^!CB 'T. ^AP!]'1P/^ ?(< '\ XM $P =@ & O !@ !^ , <P R #( <0 !P """ (( " XM !$ @ R0 80 ?@ @@ '" <(( X2 #+( /@@ XM !PX #@ \ #@ !< XM _] !P@ ( ?^ !QX ' < /_A\Z...( ?7N XM^@@!\_@XZ, ^Z<!] !\X ^@<#[A /OWX/^(..@</H<#CH'#_. 'Y/#CB 'W XM^ ^_P!]'1P!X ?(< '\ /] ?Z /P '' 'P XM!\ R0 =Z !\ 'P =X !P '//@<^ / #^ #P !_P !_@ ? !QP ' XMO0 >\]!\^ 'WP ?_ XM !PX #@ #\ ' "< Y^ !WT 8 /\ "^X " ( XM /_P<Z...( '8> .@@ <X@X[\ .[\ = <X .@ XM8 [A #ITX".(..@<#O\#CH' ^. #_##CB !T. .AP!]_?P"< '(< '\ XM &^ =\ !_P '' \P !P '#P >< "X #@ >< !P XM /WW _< !SH 'G0 <Z "[P '? < !SX #S@ //.!/\ +C@ G^ XM ^ !PX #@ XM '\ #H $< @> !XX P ?^ 0X (! XMP<[^..( '0. .@@ <X@XZ. .Z< = <X .AP [A #ITX"'(.._\#H<#CO_ XMZ' _[#CB !T. .AP ='1P"< '/\ " ". << XM !Y@ '' <X !P '#@ << X #@ <, !P ''' << !QP #C@ << Y@ XM'& < !QP #C@ ... .8 #C@ , XM !\ !PX #@ , !P /_@ . !PX P XM<. X 0!P<Z...( '0. .@@ <X@XZ. . XM[\ = <X .GP [A #ITX"'(&.@8#H<!CH& Z' '_#CB !T. .AP ='1P$. XM '(< " #. << !P '' << !P '#@ << XMX #@ <8 !P ''' << !QP #C@ << X '$ < !QP #C@ ... ' #C XM@ P #X XM !PX #@ ( !P < . !PX !P <. X XM 0 X8[^',) '0. .@@ <X@8S\ .Z< = <X .XX [! #ITX"#H XM',@8#H<!S(& Z' $_!S"0!T. .AP ='1P$. '(< $ XM &N << !P '' <8 !P '#@ << X #@ =X !P ''' << !QP XM #C@ << X '^ < !QP #C@ ... ' #C@ ! XM !PX #@ 0 !P < XM . !PX !@ <. X @ X1R.'() &0. XM,@@ 8X@<B, ,R< = 8X ,@X R! #ITX"#H# @P#H< P(, Z#@ $;!R"0!T XM. .AP ='1P(' '(< ( .. << !P '' =@ XM!P '#@ << X #@ >X !P ''' << !QP #C@ << X !_@ < !QP # XMC@ ... #@ #C@ /P XM ( " !PX #@ 0 !P < . !PX #@ <. X " ( XM !P0<#".#P+ %P. /P@ 8X@,"8 .B8 9 !PX /A XM< _! #ITX'!X# @P#H< P(, \#@ (3 \"P!\. .AP ?'1P<' '(< 0 XM .. << !P '' > !P '#@ << X #@ <X !P XM ''' << !QP #C@ << X C@ < !QP #C@ ... #@ #C@ $ XM < ' !PX #@ XM 3X ]P < /N !PX #P <. >X ' < '\@ XM</R.#0^ '\. ?^B!^X@,"X ?C8#1 'XX ?R<!_Y(/)TX;QX!PC@/H< <(X! XM_+@'_" T/@!_. .!P ?G1Q_+D'(< ?@$ .. << XM !P '' < !P '#@ << X #@ <= !P ''' << !QP #C@ << X XM!C@ < !QP #C@ ... YP #C@ $ XM ^ /@ !]X #H G] !_P = ?^ !]X #V XM?> _X /@ ^ /_ <?^.!_\ /_> __\#_X@'#P _ XM^0'Q /\P _\.C__P?)TXO\X \O ?N\ /;P#_QT/_\ ?_ #_^@/_P _W_S_S XMH'(< __X '? N< "X@ +G ?$ "Y 'S@ ^< XMX #@ N> "Z /OG@^> "YP 'S@ N< Y #[@ N@ !SX #C@ ...!_R #C XM@ /\@ > ' XM "^ 'P _^ #_ ^ _X "^ !X O@ !_@ ' > XM >. ,\?P _X >/P!X/X'GP@#C !Y\0/^ >>@!XX/'@_@_RX=\<X XM .\ ?O #G 'CAX9_X /^ 'CW '@ !Y[P'CAP(_X!__P XM #F '@ ? !X /X > /_@ <8 < !P '< < ''' << > XM /\ '\ !> '^ ' #]P %\ 7]P#^\ #_@ ?_ XM * " , !@ X$ "" , XM P0 , @ # !! " * P$ %@' /( P#@# XM !P,!@@ \ # 8@(\ P' # 0&, ' C@0+@(8 #P 3L ^ ,! PPGP #R , XMB ! # 1 ,! @8'P# ?@ !$ " , @ #@ XM ( S0 (0 ( P "( ( """ (( ( +P "< , 8 " P@ XMP #C ",8 !@ ^ XM $ $ XM P !@ ( P # , @ # @( P # XM , @ #@ #H " , @@ " , # , 8 XM !P 0 X XM #@ < " XM ( XM ( @ XM! ( @ " ( @ " 0& @ " ( @ # #H " ( XM A " ( " ( 8 XM !P ( X #@ < XM "' XM XM @ ! ( @ " ( @ " XM 8!@ @ " ( 0 " #H # ( 1 " ( " ( XM 8'P P , XM 8 #@ < "/ XM@ XM XM @ ! ( @ " ( @ " < @ " ( 0 " XM #H #"( . " ( " ( /_X XM & P . 8 XM #@ < #_@ XM XM @ ! ( @ " XM " ( @ " < @ " ( ( , " #H #B( " ( XM " ( /_\ XM -A@ . 'P #@ > XM #X@ XM XM 0 @ 8 0 ! , $ !@ ! \ 0 ! XM $ P #@ ! #@ !\$ & $ ! $ 'X$ XM +7 > /@ XM # < !P@ XM XM , XM 9 X , PP # #@ P X , P ## P #0 \# XM . # P # $ XM N < / " 8 XM @ XM XM # & 0 # / P! , XM P # , \ , " 8 P $ P , P XM 8 8 XM ) $ 0 # XM P@( X @ ( @ ( __@ XM & P X 8 XM #@ !P XM#_@ XM XM ( ! @ ( " " @ " XM " < ( " @ @ # " Z #B @ " @ XM " @ #__ XM V& #@ ? . XM '@ /B XM XM XM 0 " & 0 $ P ! 8 $ #P 0 $ ! , # XM@ $ #@ 'P! 8 ! $ ! 'X$ XM "UP > XM #X P < XM <( XM XM P &0 X P , XM, # #@ , . P , ## , - / # XM #@ # , # 0 XM N !P / XM " !@ @ XM XM XM P & ! P / # $ , P P XM, #P , @ 8 # $ # , # XM XM !@ & D 0 $ X5 , X Xend END_OF_FILE # end of 'font-16/Uoldeng22x30r' fi if test -f 'lib/term.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'lib/term.c'\" else echo shar: Extracting \"'lib/term.c'\" \(12324 characters\) sed "s/^X//" >'lib/term.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: term.c,v 4.3 88/07/01 09:33:49 bianchi Exp $ X $Source: /tmp/mgrsrc/lib/RCS/term.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/lib/RCS/term.c,v $$Revision: 4.3 $"; X X/* routines for writing to mgr terminal emulator */ X X#include "term.h" X#include "restart.h" X XFILE *m_termout; XFILE *m_termin; Xint m_flags; Xint m_envcount = 0; Xint m_saveenvcount = 0; Xchar m_escchar = ESC; Xchar m_menuchar = M_DELIM; X Xjmp_buf _env; X Xstruct sgttyb sgtty__save[TTYMAX]; Xint sgtty_cnt = 0; Xchar m_linebuf[MAXLINE]; Xstatic char *m_fields[16]; X X/****************************************************************************** X * X * setup X */ X Xint Xm_setup(flags) Xint flags; X { X m_flags = flags; X X if (!(m_flags&M_DEBUG)) { X m_termout = fopen(M_DEVICEOUT,"w"); X m_termin = fopen(M_DEVICEIN,"r"); X } X X if (m_termin == NULL || m_termout == NULL) X m_flags |= M_DEBUG; X X if (m_flags&M_DEBUG) { X m_termin = stdin; X m_termout = stdout; X } X return(m_flags); X } X X/****************************************************************************** X * X * get generic window parameters X */ X Xint Xget_info(type,list) Xint type; Xchar **list; X { X if (type > G_MAX ) X return(-1); X switch( type ) { X case G_ALL: X case G_ALLMINE: X return(-1); X } X _m_ttyset(); X m_getinfo(type); X m_gets(m_linebuf); X _m_ttyreset(); X return parse(m_linebuf,list); X } X X/****************************************************************************** X * X * read window parameters off of standard input X */ X Xint Xget_windata(windatap) Xstruct window_data *windatap; X { X if( parse(m_gets(m_linebuf),m_fields) < 8 ) X return 0; X windatap->x = atoi(m_fields[0]); X windatap->y = atoi(m_fields[1]); X windatap->w = atoi(m_fields[2]); X windatap->h = atoi(m_fields[3]); X strcpy(windatap->tty,m_fields[4]); X windatap->num = atoi(m_fields[5]); X windatap->status = *m_fields[6]; X windatap->setid = atoi(m_fields[7]); X return 1; X} X X/****************************************************************************** X * X * Get window parameters, one window at a time. X * Returns 1 if window_data structure has been filled, 0 otherwise. X * It is important to call get_eachwin() in a tight loop that doesn't X * ever exit, so that all the data is picked up. X */ X Xint Xget_eachwin( windatap ) Xstruct window_data *windatap; X { X static int i = 0; X X if( !i ) { X _m_ttyset(); X m_getinfo(G_ALL); X } X i = get_windata( windatap ); X if( !i ) X _m_ttyreset(); X return(i); X } X X X/****************************************************************************** X * X * Get window parameters for the current window set, one window at a time. X * Returns 1 if window_data structure has been filled, 0 otherwise. X * It is important to call get_eachcleintwin() in a tight loop that X * doesn' tever exit, so that all the data is picked up. X */ X Xint Xget_eachclientwin( windatap ) Xstruct window_data *windatap; X { X static int i = 0; X X if( !i ) { X _m_ttyset(); X m_getinfo(G_ALLMINE); X } X i = get_windata( windatap ); X if( !i ) X _m_ttyreset(); X return(i); X } X X/****************************************************************************** X * X * Get all window parameters. X * NOTE CAREFULLY: The array of window_data structures pointed to by X * list must be more than the total number of windows on the screen; X * not a robust technique. X * get_eachwin() is recommended above this. X */ X Xint Xget_all(list) Xstruct window_data *list; X { X register int i; X X for(i=0; get_eachwin( list ); i++ ) X list++; X return(i); X } X X/****************************************************************************** X * X * Get window parameters for client windows. X * NOTE CAREFULLY: The array of window_data structures pointed to by X * list must be more than the total number of windows on the screen; X * not a robust technique. X * get_eachclientwin() is recommended above this. X */ X Xint Xget_client(list) Xstruct window_data *list; X { X register int i; X X _m_ttyset(); X m_getinfo(G_ALLMINE); X for(i=0; get_windata( list ); i++ ) X list++; X _m_ttyreset(); X return(i); X } X X/****************************************************************************** X * X * get the window size X */ X Xint Xget_size(x,y,wide,high) Xint *x, *y, *wide, *high; X X { X register int count; X X if ((count = get_info(G_COORDS,m_fields)) >= 4) { X if (x) X *x = atoi(m_fields[0]); X if (y) X *y = atoi(m_fields[1]); X if (wide) X *wide = atoi(m_fields[2]); X if (high) X *high = atoi(m_fields[3]); X return(count); X } X else return(-count); X } X X/****************************************************************************** X * X * get the mouse coords X */ X Xint Xget_mouse(x,y) Xint *x, *y; X X { X register int count; X X if ((count = get_info(G_MOUSE2,m_fields)) >= 3) { X if (x) X *x = atoi(m_fields[0]); X if (y) X *y = atoi(m_fields[1]); X return(atoi(m_fields[2])); X } X else return(-count); X } X X/****************************************************************************** X * X * get system parameters X */ X Xint Xget_param(host,xmax,ymax,border) Xchar *host; Xint *xmax, *ymax, *border; X X { X register int count; X X if ((count = get_info(G_SYSTEM,m_fields)) >= 4) { X if (host) X strcpy(host,m_fields[0]); X if (xmax) X *xmax = atoi(m_fields[1]); X if (ymax) X *ymax = atoi(m_fields[2]); X if (border) X *border = atoi(m_fields[3]); X return(count); X } X else return(-count); X } X X/****************************************************************************** X * X * get the cursor position X */ X Xint Xget_cursor(x,y) Xint *x, *y; X X { X register int count; X X if ((count = get_info(G_CURSOR,m_fields)) > 2) { X if (x) X *x = atoi(m_fields[0]); X if (y) X *y = atoi(m_fields[1]); X return(2); X } X else return(-count); X } X X/****************************************************************************** X * X * get the window size - rows and columns X */ X Xint Xget_colrow(cols,rows) Xint *cols, *rows; X X { X register int count; X X if ((count = get_info(G_WINSIZE,m_fields)) == 2) { X if (cols) X *cols = atoi(m_fields[0]); X if (rows) X *rows = atoi(m_fields[1]); X return(2); X } X else return(-count); X } X X/****************************************************************************** X * X * get the termcap entry X */ X Xchar * Xget_termcap() X { X _m_ttyset(); X m_getinfo(G_TERMCAP); X m_gets(m_linebuf); X _m_ttyreset(); X return(m_linebuf); X } X X/****************************************************************************** X * X * get the font size X */ X Xint Xget_font(wide,high) Xint *wide, *high; X X { X register int count, result; X X if ((count = get_info(G_FONT,m_fields)) >= 3) { X if (wide) X *wide = atoi(m_fields[0]); X if (high) X *high = atoi(m_fields[1]); X result = atoi(m_fields[2]); X return(result); X } X else return(-count); X } X X/****************************************************************************** X * X * make a new window X */ X Xint Xm_makewindow(x,y,wide,high) Xint x,y,wide,high; X { X register int count, result; X _m_ttyset(); X m_newwin(x,y,wide,high); X m_gets(m_linebuf); X _m_ttyreset(); X return(atoi(m_linebuf)); X } X X/****************************************************************************** X * X * see if window is active X */ X Xint Xis_active() X { X *m_linebuf = '\0'; X get_info(G_STATUS,m_fields); X return(*m_linebuf == 'a'); X } X X/****************************************************************************** X * X * return last line read X */ X Xchar * Xm_lastline() X { X return(m_linebuf); X } X X/****************************************************************************** X * X * down load a menu X */ X Xmenu_load(n,count,text) Xint n; /* menu number */ Xint count; /* number of menu items */ Xstruct menu_entry *text; /* menu choices */ X { X register int i, len; X X if (text == (struct menu_entry *) 0) X return (-1); X X /* calculate string lengths */ X X len = 2 * count + 1; X X for (i=0;i<count;i++) X len += strlen(text[i].value) + strlen(text[i].action); X X fprintf(m_termout,"%c%d,%d%c%c",m_escchar,n,len,E_MENU,m_menuchar); X X for (i=0;i<count;i++) X fprintf(m_termout,"%s%c",text[i].value,m_menuchar); X X for (i=0;i<count;i++) X fprintf(m_termout,"%s%c",text[i].action,m_menuchar); X X m_flush(); X } X X/****************************************************************************** X * X * download a bitmap X */ X Xm_bitload(x,y,w,h,data) Xint x,y; Xint w,h; Xregister char *data; X { X register int size = h * ((w+15)&~15)/8; /* round to 16 bit boundary */ X m_bitld(w,h,x,y,size); X while(size-- > 0) X fputc(*data++,m_termout); X m_flush(); X } X X/****************************************************************************** X * X * Set and save the terminal mode (if required); X */ X Xm_ttyset() X { X int code; X struct sgttyb buff; X X code = gtty(fileno(m_termout),sgtty__save + sgtty_cnt); X X if (sgtty__save[sgtty_cnt].sg_flags&(ECHO|RAW)) { X buff = sgtty__save[sgtty_cnt]; X buff.sg_flags &= ~(ECHO|RAW); X m_flush(); X stty(fileno(m_termout),&buff); X } X X if (sgtty_cnt < TTYMAX) X sgtty_cnt++; X X return(code); X } X X X/****************************************************************************** X * X * Restore the terminal mode X */ X Xm_ttyreset() X { X if (sgtty_cnt) X sgtty_cnt--; X else X return(1); X X if (sgtty__save[sgtty_cnt].sg_flags&(ECHO|RAW)) { X m_flush(); X return(stty(fileno(m_termout),sgtty__save + sgtty_cnt)); X } X else X return(0); X } X X/****************************************************************************** X * X * change the terminal modes X */ X Xm_resetflags(flags) X { X struct sgttyb buff; X gtty(fileno(m_termin),&buff); X if (buff.sg_flags & flags) { X buff.sg_flags &= ~flags; X m_flush(); X stty(fileno(m_termin),&buff); X } X } X Xm_setflags(flags) X { X struct sgttyb buff; X gtty(fileno(m_termin),&buff); X if (!( buff.sg_flags & flags)) { X buff.sg_flags |= flags; X m_flush(); X stty(fileno(m_termin),&buff); X } X } X X/** X Given a bitmap id and an icon name, X have mgr load that icon into that bitmap, returning the icon width X and height via the given integer pointers. X Return a positive number if successful. X If the icon is not loaded, set the width and height values to 0 and X return 0. X*/ Xint Xm_bitfile( bitmapid, iconname, iconwidthp, iconheightp ) Xint bitmapid; Xchar *iconname; Xint *iconwidthp, X *iconheightp; X { X *iconwidthp = *iconheightp = 0; X m_bitfromfile( bitmapid, iconname ); X m_flush(); X return( sscanf( m_get(), "%d %d", iconwidthp, iconheightp ) == 2 ); X } X X/***************************************************************************** X * parse a line into fields X */ X X#ifndef iswhite X#define iswhite(x) ((x)==' ' || (x)=='\t') X#endif X Xint Xparse(line,fields) Xregister char *line; Xregister char **fields; X { X int inword = 0; X int count = 0; X char *start; X register char c; X X for(start = line;(c = *line) && c != '\n';line++) X if (inword && iswhite(c)) { X inword = 0; X *line = '\0'; X *fields++ = start; X count++; X } X else if (!inword && !iswhite(c)) { X start = line; X inword = 1; X } X X if (inword) { X *fields++ = start; X count++; X if (c == '\n') X *line = '\0'; X } X *fields = (char *) 0; X return(count); X } X X/****************************************** X * stuff for restarting X */ X X_Catch() X { X ioctl(fileno(m_termin),TIOCFLUSH,0); X longjmp(_env,1); X } X X_Clean() X { X while(m_saveenvcount < m_envcount) X m_pop(0); X exit(1); X } END_OF_FILE # end of 'lib/term.c' fi if test -f 'src/get_menus.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'src/get_menus.c'\" else echo shar: Extracting \"'src/get_menus.c'\" \(11895 characters\) sed "s/^X//" >'src/get_menus.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: get_menus.c,v 4.1 88/06/21 13:33:43 bianchi Exp $ X $Source: /tmp/mgrsrc/src/RCS/get_menus.c,v $ X*/ Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/get_menus.c,v $$Revision: 4.1 $"; X X/****************************************************************************** X * X * low level popup menu management routines X */ X X#include <stdio.h> X#include "bitmap.h" X#include "menu.h" X#include "font.h" X X#define MAX_LIST 100 /* max number of choices */ X#define BLIP 8 /* size of cursor blip */ X X#define BETWEEN(a,x,b) (x)<(a)?a:((x)>(b)?b:x) X X#define Pr_ropall(S,f) bit_blit(S,0,0,BIT_WIDE(S),BIT_HIGH(S),f,NULL_DATA,0,0) X X#define BAR(s,z) bit_blit(s, 0, (z+1)*state->bar_sizey, \ X state->bar_sizex, state->bar_sizey, \ X BIT_NOT(BIT_DST), NULL_DATA, 0, 0); X X#ifdef NOTRACK X#define TRACKON(s,x,y) X#define TRACKOFF(s,x,y) X#else X#define TRACKON(s,x,y) { \ X bit_blit(&track,0,0,BLIP,BLIP, \ X BIT_SRC,s,(x)-BLIP/2,(y)-BLIP/2); \ X bit_blit(s,(x)-BLIP/2,(y)-BLIP/2,BLIP,BLIP, \ X BIT_NOT(BIT_SRC) & BIT_DST,&mouse_bull,0,0); \ X bit_blit(s,(x)-BLIP/2,(y)-BLIP/2,BLIP,BLIP, \ X BIT_SRC | BIT_DST,&mouse_bull2,0,0); \ X } X#define TRACKOFF(s,x,y) \ X bit_blit(s,(x)-BLIP/2,(y)-BLIP/2,BLIP,BLIP, \ X BIT_SRC,&track,0,0) X#endif X X#ifndef Min X#define Min(x,y) ((x)>(y)?(y):(x)) X#endif X#ifndef Max X#define Max(x,y) ((x)>(y)?(x):(y)) X#endif X#define LIMIT(x,max) (x)>(max)?1:(-(x)>(max)?-1:0) X#define Abs(x) ((x)>0?(x):-(x)) X#define MENU struct menu_state X X/* The height of each selection area (i.e. word) in the pop-up menu. X The 2 extra pixels create a 1-pixel boarder above and below each word. X*/ X#define HIGH (font->head.high+2) X Xextern BITMAP mouse_bull, mouse_bull2; Xstatic unsigned short save_bits[BLIP]; Xstatic bit_static(track,BLIP,BLIP,save_bits,DEPTH); X X/* allocate space for and initialize menu */ X Xstruct menu_state * Xmenu_define(font,list,values,max,fg,bg) Xstruct font *font; /* which font to use for menu */ Xchar *list[]; /* list of menu items */ Xchar *values[]; /* list of return values */ Xint max; /* max number of menu items */ Xint fg,bg; /* clt values for menu color */ X { X register int i, incr, count; /* counters */ X int size_x=0, size_y=0; X struct menu_state *state; /* menu state */ X char *malloc(), *save_line(); X BITMAP *menu, /* menu image */ X *box, /* menu pix_rect */ X *inside, /* box - border */ X *save; /* part of screen covered by menu */ X int box_x, box_y; /* dimensions of menu box */ X X /* find size of box */ X X for(count=0;list[count]!=(char *) 0 && count<(max>0?max:MAX_LIST); count++) { X size_x = Max(size_x,strlen(list[count])); X } X X /* The 2 extra pixels are to allow a 1-pixel border to the left and right X of each word. X */ X size_x = size_x * font->head.wide + 2; X size_y = count * HIGH; X box_x =size_x+2*MENU_BORDER; X box_y =size_y+2*MENU_BORDER; X X /* build box */ X X menu = bit_alloc(box_x,box_y,NULL_DATA,DEPTH); X inside = bit_create(menu,MENU_BORDER,MENU_BORDER,size_x,size_y); X X /* paint text into box */ X X#ifdef COLOR X Pr_ropall(menu,BIT_SRC|GETCOLOR(fg)); X Pr_ropall(inside,BIT_SRC|GETCOLOR(bg)); X#else X Pr_ropall(menu,BIT_SET); X Pr_ropall(inside,BIT_CLR); X#endif X for(i=0,incr=HIGH-1;i<count;i++,incr+=HIGH) { X#ifdef COLOR X /* do local color here */ X put_str(inside,1,incr,font, X BIT_SRC^BIT_DST | GETCOLOR(bg)^GETCOLOR(fg),list[i]); X#else X put_str(inside,1,incr,font,BIT_SRC,list[i]); X#endif X } X X /* save the menu state */ X X if ((state = (MENU *) malloc(sizeof(struct menu_state))) == (MENU *) 0) { X bit_destroy(inside); X bit_destroy(menu); X return(state); X } X X /* get the values */ X X if (values != (char **) 0) { X state -> action = (struct menu_action *) X malloc(count * sizeof(struct menu_action)); X if (state->action) for(i=0;i<count;i++) { X state->action[i].value = save_line(values[i]); X state->action[i].next_menu = -1; X } X X } X else X state->action = (struct menu_action *) 0; X X state -> menu = menu; X state -> bar_sizex = size_x; X state -> bar_sizey = HIGH; X state -> count = count; X state -> current = 0; X state -> next = -1; X state->flags = 0; X state -> screen = (BITMAP *) 0; X state -> save = (BITMAP *) 0; X X bit_destroy(inside); X return(state); X } X X/* put the menu on the display */ X Xstruct menu_state * Xmenu_setup(state,screen,x,y,start) Xstruct menu_state *state; /* existing menu state */ XBITMAP *screen; /* where to put the menu */ Xint x,y; /* current offset of mouse on screen */ Xint start; /* preselected item */ X { X register int i, incr, count; /* counters */ X char *malloc(); X X /* position the box on the screen */ X X if (state->BIT_WIDE(menu)>BIT_WIDE(screen) || X state->BIT_WIDE(menu)>BIT_WIDE(screen) || X state->save) X return((MENU *) 0); X X x = Min(x,BIT_WIDE(screen) - state->BIT_WIDE(menu)); X y = Min(y,BIT_HIGH(screen) - X state->BIT_HIGH(menu) - state->bar_sizey); X y = Max(y,state->bar_sizey+BLIP); X X state->save = bit_alloc(state->BIT_WIDE(menu),state->BIT_HIGH(menu), X NULL_DATA,DEPTH); X bit_blit(state->save,0,0,state->BIT_WIDE(menu), X state->BIT_HIGH(menu),BIT_SRC,screen,x,y); X X /* initialize the menu */ X X state -> screen = screen; X state -> current = start; X state -> menu_startx = x; X state -> menu_starty = y; X state -> x_pos = state-> bar_sizex/2; X X bit_blit(screen,x,y,state->BIT_WIDE(menu),state->BIT_HIGH(menu),BIT_SRC, X state->menu,0,0); X X if (start>=0 && start<state->count) { X BITMAP *inside = bit_create(screen,state->menu_startx+MENU_BORDER, X state->menu_starty+MENU_BORDER, X state->bar_sizex,state->bar_sizey*state->count); X BAR(inside,start-1); X bit_destroy(inside); X } X X return(state); X } X X X/****************************************************************************** X Xallow user to select an item X X */ X Xint menu_get(state,mouse,button,exit) Xstruct menu_state *state; Xint mouse; /* fd to read mouse data from */ Xint button; /* button termination condition (not yet)*/ Xint exit; /* off-menu exit codes */ X { X register BITMAP *inside; /* the menu */ X register int y_position; X register int x_position; X int push; X int x_mouse, y_mouse; /* mouse delta's */ X int done=0; X int inverse; /* selected item */ X int count; /* number of items */ X int old; X X if (state == (MENU *) 0) X return(-1); X X old = inverse = state -> current; X count = state -> count; X state->exit=0; X X /* set up text region */ X X inside = bit_create(state->screen,state->menu_startx+MENU_BORDER, X state->menu_starty+MENU_BORDER - state->bar_sizey, X state->bar_sizex,state->bar_sizey*(count+2)); X X /* make sure we aren't already exited */ X X if (exit&EXIT_BOTTOM && inverse >= count) { X old = inverse = count-1; X BAR(inside,inverse); /* on */ X } X X /* set initial blip position */ X X x_position = state->x_pos; X y_position = state->bar_sizey*(inverse+1) + state->bar_sizey/2; X X /* track the mouse */ X X TRACKON(inside,x_position,y_position); /* on */ X do { X push = mouse_get(mouse,&x_mouse,&y_mouse); X TRACKOFF(inside,x_position,y_position); /* off */ X x_position += x_mouse; X y_position -= y_mouse; X y_position = BETWEEN(BLIP, y_position, (2+count)*state->bar_sizey-BLIP); X X if (x_position <= 0 && (exit&EXIT_LEFT)) { X state->exit = EXIT_LEFT; X done++; X } X else if (x_position >= BIT_WIDE(inside) && (exit&EXIT_RIGHT)) { X state->exit = EXIT_RIGHT; X done++; X } X X x_position = BETWEEN(BLIP/2, x_position, BIT_WIDE(inside) - BLIP/2); X X TRACKON(inside,x_position,y_position); /* on */ X X if (done) X break; X X /* fix bar */ X X inverse = (2+count) * y_position / BIT_HIGH(inside) - 1; X if (inverse != old) { X TRACKOFF(inside,x_position,y_position); /* off */ X if (old >=0 && old < count) X BAR(inside,old); /* off */ X if (inverse >=0 && inverse < count) X BAR(inside,inverse); /* on */ X old = inverse; X X if (inverse < 0 && exit&EXIT_TOP) { X state->exit = EXIT_TOP; X done++; X } X else if (inverse >= count && exit&EXIT_BOTTOM) { X state->exit = EXIT_BOTTOM; X done++; X } X TRACKON(inside,x_position,y_position); /* on */ X } X } X while (push != button && !done); X state->current = inverse; X state->x_pos = x_position; X TRACKOFF(inside,x_position,y_position); /* off */ X bit_destroy(inside); X return(0); X } X X/****************************************************************************** X Xremove the menu drom the screen, restore previous screen contents X X */ X Xstruct menu_state * Xmenu_remove(state) Xstruct menu_state *state; X { X if (state == (MENU *) 0) return(state); X if (state->save != (BITMAP *) 0) { X bit_blit(state->screen,state->menu_startx,state->menu_starty, X state->BIT_WIDE(save),state->BIT_HIGH(save),BIT_SRC,state->save,0,0); X bit_destroy(state->save); X state->save = (BITMAP *) 0; X } X return(state); X } X X/* free space associated with a menu */ X Xint Xmenu_destroy(state) Xstruct menu_state *state; X { X register int i; X X menu_remove(state); X X if (state->menu != (BITMAP *)0) X bit_destroy(state->menu); X X if (state->action != (struct menu_action *) 0) { X for(i=0;i<state->count;i++) X if (state->action[i].value) X free(state->action[i].value); X free(state->action); X } X X free(state); X return(0); X } X X/* put a character string into a bitmap - only used for menus */ X Xint Xput_str(map,x,y,font,op,str) XBITMAP *map; Xregister int x; Xint y; Xstruct font *font; Xint op; Xregister char *str; X { X register char c; X register int wide = font->head.wide; X register int high = font->head.high; X X while (c = *str++) { X bit_blit(map,x,y-high,wide,high,op,font->glyph[c],0,0); X x+=wide; X } X } X X/* copy a menu - for environment stacks */ X Xstruct menu_state * Xmenu_copy(menu) Xregister struct menu_state *menu; X { X register struct menu_state *tmp; X register int i; X char *alloc(), *malloc(), *save_line(); X X if (menu == (struct menu_state *) 0) X return(menu); X X if ((tmp = (struct menu_state *) malloc(sizeof(struct menu_state))) X == (struct menu_state *) 0) X return((struct menu_state *) 0); X X bcopy((char *) menu,(char *)tmp,sizeof(struct menu_state)); X X /* copy menu image */ X X if (menu->menu) { X tmp->menu = bit_alloc(BIT_WIDE(menu->menu), X BIT_HIGH(menu->menu),NULL_DATA,DEPTH); X bit_blit(tmp->menu,0,0,BIT_WIDE(tmp->menu),BIT_HIGH(tmp->menu), X BIT_SRC,menu->menu,0,0); X } X X /* copy menu values */ X X if (menu->action != (struct menu_action *) 0) { X tmp->action = (struct menu_action *) X malloc(sizeof(struct menu_action)*menu->count); X if (tmp->action) X for(i=0;i<menu->count;i++) { X tmp->action[i].value = save_line(menu->action[i].value); X tmp->action[i].next_menu = menu->action[i].next_menu; X } X } X X return(tmp); X } END_OF_FILE # end of 'src/get_menus.c' fi echo shar: End of archive 35 \(of 61\). cp /dev/null ark35isdone 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.