home *** CD-ROM | disk | FTP | other *** search
- Subject: v17i031: MGR, Bellcore window manager, Part30/61
- Newsgroups: comp.sources.unix
- Approved: rsalz@uunet.UU.NET
-
- Submitted-by: Stephen A. Uhler <sau@bellcore.com>
- Posting-number: Volume 17, Issue 31
- Archive-name: mgr/part30
-
-
-
-
- #! /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 30 (of 61)."
- # Contents: demo/icon/browse.c demo/icon/iconmail.c lib/window.h
- # src/do_button.c src/do_menu.c
- # Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:05:37 1988
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'demo/icon/browse.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'demo/icon/browse.c'\"
- else
- echo shar: Extracting \"'demo/icon/browse.c'\" \(9077 characters\)
- sed "s/^X//" >'demo/icon/browse.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: browse.c,v 4.2 88/07/19 14:12:58 sau Exp $
- X $Source: /tmp/mgrsrc/demo/icon/RCS/browse.c,v $
- X*/
- Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/browse.c,v $$Revision: 4.2 $";
- X
- X/* display bitmap files on window */
- X
- X#include "term.h"
- X#include <signal.h>
- X
- X#define GAP 3 /* space between icons */
- X#define MAXICONS 500 /* max number of icons */
- X#define SAVE 2 /* temp bitmap # */
- X
- X#define dprintf if(debug)fprintf
- X
- Xstruct icon_pos {
- X int x,y; /* position on window */
- X int w,h; /* size of icon */
- X char *name; /* name of icon */
- X };
- X
- Xstruct icon_pos icons[MAXICONS];
- Xchar line[MAXLINE]; /* input buffer */
- Xchar cwd[MAXLINE];
- Xint win_x, win_y; /* window position */
- Xint win_high, win_wide; /* window size */
- Xint f_wide, f_high; /* font size */
- Xint debug;
- Xchar **first; /* pntr to first icon */
- Xint invert = 0;
- X
- Xstruct menu_entry menu1[] = {
- X "reread","r\r","next","n\r", "prev","p\r", "quit","q\r",
- X };
- X
- Xstruct menu_entry menu2[] = {
- X "reread","r\r","next","n\r", "quit","q\r"
- X };
- X
- Xstruct menu_entry menu3[] = {
- X "reread","r\r","prev","p\r", "quit","q\r"
- X };
- X
- Xstruct menu_entry menu4[] = {
- X "reread","r\r","quit","q\r"
- X };
- X
- Xmain(argc,argv)
- Xchar **argv;
- X {
- X int page = 1; /* current page number */
- X int count; /* number of icons on page */
- X int x,y; /* mouse position */
- X int n = -1; /* current icon */
- X int clean();
- X char *getenv();
- X FILE *popen(), *fd = popen("/bin/pwd","r");
- X
- X ckmgrterm( *argv );
- X
- X debug = (int) getenv("DEBUG");
- X
- X if (fd) {
- X fgets(cwd,sizeof(cwd),fd);
- X *(cwd + strlen(cwd) - 1) = '\0'; /* blah */
- X dprintf(stderr,"Got cwd: [%s]\n",cwd);
- X pclose(fd);
- X }
- X else {
- X fprintf(stderr,"%s: can't get current directory\n",*argv);
- X exit(2);
- X }
- X
- X if (argc <2 || argc > MAXICONS) {
- X fprintf(stderr,"usage: %s icons... (up to %d)\n",*argv,MAXICONS);
- X exit(1);
- X }
- X
- X if (strcmp(argv[1],"-r")==0) {
- X invert++;
- X argv++;
- X argc--;
- X }
- X
- X first = ++argv;
- X argc--;
- X
- X m_setup(M_FLUSH);
- X m_push(P_BITMAP|P_MENU|P_EVENT|P_FLAGS);
- X m_ttyset();
- X
- X menu_load(1,4,menu1);
- X menu_load(2,3,menu2);
- X menu_load(3,3,menu3);
- X menu_load(4,2,menu4);
- X
- X signal(SIGINT,clean);
- X signal(SIGTERM,clean);
- X
- X m_setmode(M_ABS);
- X m_setmode(M_NOWRAP);
- X get_size(&win_x,&win_y,&win_wide, &win_high);
- X get_font(&f_wide, &f_high);
- X
- X m_setevent(BUTTON_1,"^%p\r");
- X m_setevent(BUTTON_1U,"$\r");
- X m_setevent(MOVE,"M\r");
- X m_setevent(RESHAPED,"R\r");
- X m_setevent(REDRAW,"r\r");
- X
- X count = fill_page(first,icons);
- X
- X if (count == 0) {
- X fprintf(stderr,"%s: no files in icon format\n",*--argv);
- X clean(3);
- X }
- X
- X set_menu(first-argv,argc-count-(first-argv)-1);
- X
- X dprintf(stderr,"Got %d,%d %dx%d [%dx%d]\n",
- X win_x, win_y, win_wide, win_high, f_wide, f_high);
- X
- X while(m_gets(line) != NULL) {
- X dprintf(stderr,"Got [%s]\n",line);
- X switch(*line) {
- X case 'q':
- X clean(0);
- X break;
- X case ':': /* got a message - send current icon back */
- X sscanf(line+1,"%d",&x);
- X if (n >= 0) {
- X m_sendto(x,icons[n].name);
- X dprintf(stderr,"sent [%s] to %d\n",
- X icons[n].name,x);
- X }
- X break;
- X case '^': /* button down */
- X sscanf(line+1,"%d %d",&x,&y);
- X n = find_icon(icons,x,y);
- X if (n >= 0) {
- X border(icons[n],B_SET);
- X sprintf(line,"%s/%s",cwd,icons[n].name);
- X m_setevent(NOTIFY,line);
- X sprintf(line,"%s (%d x %d)", icons[n].name,
- X icons[n].w, icons[n].h);
- X pop_text(line, icons[n].x+icons[n].w/2,
- X icons[n].y+icons[n].h + GAP);
- X border(icons[n],B_CLEAR);
- X }
- X break;
- X case 'n': /* next icons */
- X if ((first-argv) + count >= argc)
- X break;
- X first += 2*count/3 + 1;
- X count = fill_page(first,icons);
- X set_menu(first-argv,argc-count-(first-argv)-1);
- X break;
- X case 'p': /* previous icons */
- X if (first == argv)
- X break;
- X first -= 2*count/3 + 1 ;
- X if (first < argv)
- X first = argv;
- X count = fill_page(first,icons);
- X set_menu(first-argv,argc-count-(first-argv)-1);
- X break;
- X case 'M': /* window moved */
- X get_size(&win_x,&win_y,&win_wide, &win_high);
- X break;
- X case 'r': /* window redrawn */
- X count = fill_page(first,icons);
- X set_menu(first-argv,argc-count-(first-argv)-1);
- X break;
- X case 'R': /* window shaped*/
- X dprintf(stderr,"Got %d,%d %dx%d [%dx%d]\n",
- X win_x, win_y, win_wide, win_high, f_wide, f_high);
- X x = win_wide;
- X y = win_high;
- X get_size(&win_x,&win_y,&win_wide, &win_high);
- X if (y != win_high || x>win_wide) {
- X count = fill_page(first,icons);
- X set_menu(first-argv,argc-count-(first-argv)-1);
- X }
- X break;
- X default: /* button up (let go of button too fast) */
- X break;
- X }
- X }
- X clean(0);
- X }
- X
- Xint
- Xfill_page(names,icon)
- Xchar **names;
- Xstruct icon_pos *icon;
- X {
- X register int count = 0;
- X int x=GAP, y=GAP; /* current icon position */
- X int w,h; /* current icon size */
- X int maxh = 0; /* max y extent of icons */
- X
- X if (invert)
- X m_func(B_COPYINVERTED);
- X else
- X m_func(B_COPY);
- X m_clear();
- X for(;*names;names++) {
- X if (**names == '/')
- X m_bitfile(1,*names, &w, &h);
- X else {
- X m_bitfile(1,sprintf(line,"%s/%s",cwd,*names), &w, &h);
- X }
- X dprintf(stderr,"getting %s -> %s",*names,line);
- X if (w==0 || h == 0)
- X continue;
- X
- X if (w + x + 2*GAP > win_wide) {
- X x = GAP;
- X y += maxh + GAP;
- X maxh = 0;
- X }
- X
- X if (y + h + GAP > win_high) {
- X dprintf(stderr,"%s won't fit\n",*names);
- X break;
- X }
- X
- X m_movecursor(x,y);
- X m_bitcopyto(x,y,w,h,0,0,0,1);
- X count++;
- X icon->x = x;
- X icon->y = y;
- X icon->w = w;
- X icon->h = h;
- X icon->name = *names;
- X
- X icon++;
- X x += w + GAP;
- X maxh = h>maxh ? h : maxh;
- X }
- X icon->x = -1;
- X m_movecursor(0,win_high-f_high-GAP);
- X return(count);
- X }
- X
- Xclean(code)
- Xint code;
- X {
- X m_bitdestroy(1);
- X m_pop();
- X m_ttyreset();
- X exit(code);
- X }
- X
- X/* border an icon */
- X
- Xborder(icon,how)
- Xstruct icon_pos icon;
- Xint how;
- X {
- X int x=icon.x, y=icon.y, w=icon.w, h=icon.h;
- X dprintf(stderr,"border: %d,%d %dx%d\n",x,y,w,h);
- X
- X m_func(how);
- X m_bitwrite(x-GAP,y-GAP,w+2*GAP,GAP);
- X m_bitwrite(x-GAP,y+h,w+2*GAP,GAP);
- X m_bitwrite(x-GAP,y,GAP,h);
- X m_bitwrite(x+w,y,GAP,h);
- X }
- X
- X/* find an icon */
- X
- Xint
- Xfind_icon(icon,x,y)
- Xregister struct icon_pos *icon;
- Xregister int x,y;
- X {
- X register int i = 0;
- X
- X dprintf(stderr,"Looking for: %d %d [%d]\n",x,y);
- X
- X for(;icon->x != -1;i++,icon++) {
- X if (y>icon->y && x>icon->x &&
- X y < icon->y + icon->h &&
- X x < icon->x + icon->w) {
- X dprintf(stderr,"found %d\n",i);
- X return(i);
- X }
- X }
- X return(-1);
- X }
- X
- Xpop_text(s,x,y)
- Xchar *s; /* text to display */
- Xint x,y; /* center of window */
- X {
- X int wide = (strlen(s)<5?5:strlen(s)) * f_wide + 10;
- X int high = f_high + 4*GAP;
- X int x0 = x - wide/2;
- X int y0 = y + f_high;
- X
- X if (x0<0)
- X x0 = GAP;
- X if (x0+wide > win_wide)
- X x0 = win_wide-wide-GAP;
- X if (y0+high > win_high - f_wide)
- X y0 = GAP;
- X
- X if (x0 < 0 || y0 + high > win_high - f_wide-GAP < 0) {
- X m_gets(line);
- X return(1);
- X }
- X
- X /* save current window text */
- X
- X m_func(B_SRC);
- X m_bitcopyto(0,0,wide,high,x0,y0,SAVE,0);
- X
- X /* draw border */
- X
- X m_func(B_SET);
- X m_bitwrite(x0,y0,wide,high);
- X m_func(B_CLEAR);
- X m_bitwrite(x0+GAP,y0+GAP,wide-2*GAP,high-2*GAP);
- X m_moveprint(x0+2*GAP,y0+(high-f_high)/2+GAP+f_high,s);
- X m_movecursor(win_wide,y);
- X
- X m_gets(line);
- X
- X /* restore data */
- X
- X m_func(B_SRC);
- X m_bitcopyto(x0,y0,wide,high,0,0,0,SAVE);
- X m_bitdestroy(SAVE);
- X }
- X
- Xint
- Xset_menu(front,back)
- Xint front;
- Xint back;
- X {
- X register int i;
- X if (front>0 && back>0)
- X i = 1;
- X else if (front > 0)
- X i = 3;
- X else if (back > 0)
- X i = 2;
- X else
- X i = 4;
- X
- X m_selectmenu(i);
- X dprintf(stderr,"set menu %d (%d,%d)\n",i,front,back);
- X return(i);
- X }
- END_OF_FILE
- # end of 'demo/icon/browse.c'
- fi
- if test -f 'demo/icon/iconmail.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'demo/icon/iconmail.c'\"
- else
- echo shar: Extracting \"'demo/icon/iconmail.c'\" \(8565 characters\)
- sed "s/^X//" >'demo/icon/iconmail.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: iconmail.c,v 4.2 88/06/30 16:21:42 bianchi Exp $
- X $Source: /tmp/mgrsrc/demo/icon/RCS/iconmail.c,v $
- X*/
- Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/demo/icon/RCS/iconmail.c,v $$Revision: 4.2 $";
- X
- X/* check for new mail (icon version) */
- X
- X#include <sys/types.h>
- X#include <sys/stat.h>
- X#include <sys/time.h> /* for fsleep */
- X#include <signal.h>
- X#include <sgtty.h>
- X#include <stdio.h>
- X
- X#include <term.h>
- X#include "mail_icons.h"
- X
- X#define MSG_READING "\freading mail ...\r"
- X#define MSG_CHECKING "\rChecking for new mail..."
- X
- X#define MAILF "/usr/spool/mail" /* spool file */
- X#define MAIL "mail" /* name of mail command */
- X#define POLL 60 /* polling interval */
- X#define XPOS 240 /* x start of mail window */
- X#define YPOS 190 /* y start of mail window */
- X#define W_WIDE 80 /* width of mail window */
- X#define W_HIGH 24 /* height of mail window */
- X#define MAX_ICON 64 /* max icon size */
- X
- X#define PROCESSED 2 /* new mail already processed */
- X
- X#define S(x) statb.x
- X#define Isflag(arg,flag) (!strncmp(arg,flag,strlen(flag)))
- X#define Max(x,y) ((x)>(y)?(x):(y))
- X#define dprintf if(debug) fprintf
- X
- X#define fsleep() \
- X { \
- X struct timeval time; \
- X time.tv_sec = 0; \
- X time.tv_usec = 330000; \
- X select(0,0,0,0,&time); \
- X }
- X
- X#define MENU_COUNT (sizeof(menu)/sizeof(struct menu_entry))
- X
- Xstruct menu_entry menu[] = {
- X "print","t\r",
- X "delete","dt\r",
- X "next","n\r",
- X "quit","q\r",
- X "help","?\r",
- X "headers","h *\r",
- X "abort","x\r",
- X};
- X
- Xstatic struct stat statb; /* spool file status */
- Xstatic char mail[255]; /* spool file path name */
- Xstatic long omtime=0l; /* previous file mod. time */
- Xstatic int state = 0; /* mail & window state */
- Xstatic int poll = POLL; /* poll interval */
- Xstatic int debug=0; /* for mgrmail -d >& /dev/tty?? */
- Xstatic int x,y; /* window position */
- Xstatic int w,h; /* window size */
- Xstatic int border; /* size of mgr border */
- Xstatic int local=0; /* use local icon only */
- Xstatic int local_mode = -1;/* local mode bits for tty */
- Xstatic int cwide, chigh; /* width and height of font characters */
- Xstatic char *termcap;
- X
- Xmain(argc,argv)
- X char **argv;
- X{
- X register int i;
- X int xpos = XPOS; /* screen position of mail subwindow */
- X int ypos = YPOS;
- X int font = -1; /* font to use for mail subwindow */
- X int shape = 1; /* initially reshape window */
- X char *command = MAIL; /* name of readmail command */
- X
- X char *getenv();
- X char *user = getenv("USER");
- X char line[MAXLINE]; /* event input buffer */
- X
- X int clean(), update();
- X
- X /* make sure environment is ok */
- X
- X ckmgrterm( *argv );
- X
- X if (user==NULL || *user=='\0') {
- X fprintf(stderr, "%s: No USER environment variable value.\n",
- X argv[0]);
- X exit(2);
- X }
- X
- X /* process arguments */
- X
- X for(i=1;i<argc;i++) {
- X if (Isflag(argv[i],"-s"))
- X shape = 0;
- X else if (Isflag(argv[i],"-d"))
- X debug = 1;
- X else if (Isflag(argv[i],"-l"))
- X local = 1;
- X else if (Isflag(argv[i],"-x"))
- X xpos = atoi(argv[i]+2);
- X else if (Isflag(argv[i],"-y"))
- X ypos = atoi(argv[i]+2);
- X else if (Isflag(argv[i],"-f"))
- X font = atoi(argv[i]+2);
- X else if (Isflag(argv[i],"-p"))
- X poll = Max(atoi(argv[i]+2),10);
- X else if (Isflag(argv[i],"-M"))
- X command = argv[i]+2;
- X else
- X usage(argv[0],argv[i]);
- X }
- X sprintf(mail,"%s/%s",MAILF,user);
- X
- X /* set up window environment */
- X
- X m_setup(M_FLUSH);
- X m_push(P_MENU|P_BITMAP|P_FONT|P_EVENT|P_FLAGS|P_POSITION);
- X if (font < 0)
- X font = 0;
- X m_font(font);
- X get_font( &cwide, &chigh );
- X
- X signal(SIGHUP,clean);
- X signal(SIGTERM,clean);
- X signal(SIGINT,clean);
- X signal(SIGALRM,update);
- X
- X dprintf(stderr,"pushing environment\n"); fflush(stderr);
- X m_ttyset();
- X m_setmode(M_NOWRAP);
- X m_setmode(M_ABS);
- X m_func(B_COPY);
- X
- X download_icon(&mbox_closed,1);
- X download_icon(&mbox_full,2);
- X download_icon(&mbox_zip,5);
- X download_icon(&mbox_open,6);
- X
- X get_size(&x,&y,&w,&h);
- X get_param(0,0,0,&border);
- X m_movecursor(x+30,0);
- X
- X m_setmode(M_ACTIVATE);
- X if (shape) {
- X m_shapewindow(x,y,2*border+MAX_ICON, 2*border+MAX_ICON);
- X get_size(&x,&y,&w,&h);
- X }
- X
- X m_setevent(ACTIVATE,"A\r");
- X m_setevent(REDRAW,"R\r");
- X
- X m_clearmode(M_ACTIVATE);
- X set_icon(mbox_closed);
- X
- X dprintf(stderr,"Starting state 0x%x\n",state); fflush(stderr);
- X
- X update();
- X
- X termcap = getenv("TERMCAP");
- X if( termcap )
- X *termcap = '\0';
- X
- X /* wait for an event */
- X
- X while(1) {
- X if( m_gets(line) == NULL ) {
- X clearerr( m_termin );
- X continue;
- X }
- X dprintf(stderr,"state 0x%x line : %c\n",state,*line);
- X fflush(stderr);
- X switch(*line) {
- X case 'A': /* window is activated */
- X if (!stat(mail,&statb) && S(st_size))
- X do_mail(command,font,xpos,ypos);
- X else {
- X set_icon(mbox_open);
- X sleep(2);
- X m_clearmode(M_ACTIVATE);
- X }
- X state &= ~PROCESSED;
- X update();
- X break;
- X case 'R': /* screen is redrawn */
- X state &= ~PROCESSED;
- X get_size(&x,&y,&w,&h);
- X m_movecursor(x+30,0);
- X update();
- X break;
- X }
- X }
- X}
- X
- X/* run readmail in a subwindow */
- X
- Xdo_mail(command,font,xpos,ypos)
- Xchar *command;
- Xint font,xpos,ypos;
- X {
- X int code;
- X int n;
- X
- X alarm(0);
- X m_push(P_EVENT | P_FONT);
- X dprintf(stderr,"doing mail\n"); fflush(stderr);
- X n = m_makewindow(xpos, ypos, W_WIDE*cwide + 2*border,
- X W_HIGH*chigh + 2*border);
- X if (n==0) { /* can't make window */
- X m_printstr("\007\fCan't open mail window, sorry");
- X m_pop();
- X return(0);
- X }
- X /*
- X if( *termcap && newtermcap[0] == '\0' ) {
- X strcpy( newtermcap, get_termcap() );
- X termcap = newtermcap;
- X }
- X */
- X set_icon(mbox_zip);
- X m_selectwin(n);
- X m_font(font);
- X menu_load(1,MENU_COUNT,menu);
- X m_selectmenu(1);
- X m_printstr(MSG_READING);
- X m_ttyreset();
- X code = system(command);
- X m_printstr(MSG_CHECKING);
- X sleep(1); /* for "New mail arrived" message */
- X dprintf(stderr,"Readmail completed code %d\n",code); fflush(stderr);
- X m_ttyset();
- X m_selectwin(0);
- X m_destroywin(n);
- X m_pop();
- X m_clearmode(M_ACTIVATE);
- X dprintf(stderr,"window deactivated\n"); fflush(stderr);
- X }
- X
- X/* check the spool file for new mail and update message */
- X
- Xint
- Xupdate()
- X{
- X alarm(0);
- X dprintf(stderr,"checking mail state 0x%x\n",state); fflush(stderr);
- X if (!stat(mail,&statb) && S(st_mtime)>S(st_atime) && S(st_size)) {
- X state &= ~PROCESSED;
- X if (S(st_mtime) != omtime) {
- X dprintf(stderr," First time New mail\n"); fflush(stderr);
- X m_printstr("\007");
- X set_icon(mbox_full);
- X omtime = S(st_mtime);
- X }
- X }
- X else if (!(state&PROCESSED)) {
- X dprintf(stderr," Clearing new mail\n"); fflush(stderr);
- X set_icon(mbox_closed);
- X state |= PROCESSED;
- X }
- X alarm(poll);
- X}
- X
- X/* Clean up and exit */
- X
- Xclean(n)
- Xint n;
- X{
- X m_ttyreset();
- X m_selectwin(0);
- X m_popall();
- X exit(n);
- X}
- X
- Xusage(name,error)
- Xchar *name, *error;
- X{
- X fprintf(stderr,"Invalid flag: %s\n",error);
- X fprintf(stderr,
- X "usage: %s -[s|x<pos>|y<pos>|f<font>|p<poll>|M<mail_program>]\n"
- X ,name);
- X exit(1);
- X}
- X
- X/* down load an icon */
- X
- Xdownload_icon(icon,where)
- Xregister struct icon *icon; /* name of icon to download */
- Xint where; /* bitmap to download icon to */
- X {
- X
- X int size;
- X int w_in=0, h_in=0;
- X
- X if (!local) {
- X /* first try the local machine */
- X dprintf(stderr,"looking for %s\n",icon->name);
- X m_bitfile(where, icon->name, &w_in, &h_in );
- X }
- X
- X if (h_in==0 || w_in==0) { /* can't find icon */
- X dprintf(stderr,"Couldn't find %s, downloading\n",icon->name);
- X if (local_mode == -1)
- X ioctl(fileno(m_termout),TIOCLGET,&local_mode);
- X local_mode |= LLITOUT;
- X ioctl(fileno(m_termout),TIOCLSET,&local_mode);
- X
- X size = icon->h * (((icon->w+15)&~15)>>3);
- X m_bitldto(icon->w,icon->h,0,0,where,size);
- X m_flush();
- X write(fileno(m_termout),icon->data,size);
- X local_mode &= ~LLITOUT;
- X ioctl(fileno(m_termout),TIOCLSET,&local_mode);
- X }
- X else {
- X dprintf(stderr,"Found %s (%d x %d) expected %d x %d\n",
- X icon->name,w_in,h_in,icon->w,icon->h);
- X icon->w = w_in;
- X icon->h = h_in;
- X }
- X icon->type = where;
- X }
- X
- Xset_icon(name)
- Xstruct icon name; /* name of icon */
- X {
- X int x0 = (w-name.w)/2;
- X int y0 = (h-name.h)/2;
- X
- X m_clear();
- X m_bitcopyto(x0,y0,name.w,name.h,0,0,0,name.type);
- X dprintf(stderr,"copy %s to %d,%d (%d x %d)from %d\n",
- X name.name,x0,y0,name.w,name.h,name.type);
- X m_flush();
- X }
- END_OF_FILE
- # end of 'demo/icon/iconmail.c'
- fi
- if test -f 'lib/window.h' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'lib/window.h'\"
- else
- echo shar: Extracting \"'lib/window.h'\" \(8727 characters\)
- sed "s/^X//" >'lib/window.h' <<'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: window.h,v 4.2 88/08/12 07:41:26 sau Exp $
- X $Source: /tmp/mgrsrc/lib/RCS/window.h,v $
- X*/
- Xstatic char h_window_[] = "$Source: /tmp/mgrsrc/lib/RCS/window.h,v $$Revision: 4.2 $";
- X
- X/* defines for terminal emulator */
- X
- X/* text flags - for commands with text string arguments */
- X
- X#define T_INVALID 0 /* invalid command */
- X#define T_FONT 1 /* down load a new font */
- X#define T_MENU 2 /* down load a menu */
- X#define T_EVENT 3 /* down load an event string */
- X#define T_YANK 4 /* fill the yank bufffer */
- X#define T_BITMAP 5 /* down load a bit map */
- X#define T_COMMAND 6 /* start a new window & command in it */
- X#define T_GIMME 7 /* send me stuff */
- X#define T_SMAP 8 /* save a bitmap on a file */
- X#define T_GMAP 9 /* read a bitmap from a file */
- X#define T_SEND 10 /* send a message to another application */
- X#define T_GRUNCH 11 /* fast-draw, short vector mode */
- X#define T_STRING 12 /* write a text sting into an offscreen bitmap */
- X
- X/* option codes for GETMODE / SETMODE */
- X
- X#define M_STANDOUT 0 /* window is in standout mode */
- X#define M_WOB 1 /* window is white on black */
- X#define M_AUTOEXPOSE 2 /* expose window upon shell output */
- X#define M_BACKGROUND 3 /* permit obscured window to update */
- X#define M_NOINPUT 4 /* don't accept keyboard input */
- X#define M_NOWRAP 5 /* don't auto wrap */
- X#define M_OVERSTRIKE 6 /* overstrike mode */
- X#define M_ABS 7 /* use absolute coordinates */
- X#define M_ACTIVATE 8 /* activate / hide window; not a mode */
- X#define M_STACK 12 /* permit event stacking */
- X#define M_DUPKEY 13 /* set keyboard escape key */
- X#define M_NOBUCKEY 14 /* prevent mgr processing buckey keys,
- X pass them through to the application */
- X
- X/* cut/paste options */
- X
- X#define M_SNARFLINES 9 /* only snarf entire lines */
- X#define M_SNARFTABS 10 /* change spaces to tabs in snarf */
- X#define M_SNARFHARD 11 /* snarf even if errors */
- X
- X/* option codes for GETINFO */
- X
- X#define G_MOUSE 0 /* mouse coordinates */
- X#define G_TERMCAP 1 /* send back termcap entry */
- X#define G_WINSIZE 2 /* cols, lines */
- X#define G_FONT 3 /* font wide, high, # */
- X#define G_COORDS 4 /* window coords */
- X#define G_STATUS 5 /* window status */
- X#define G_ALL 6 /* complete window status */
- X#define G_SYSTEM 7 /* system status */
- X#define G_ALLFONT 8 /* font information */
- X#define G_TEXT 9 /* text region size */
- X#define G_ALLMINE 10 /* window status for client windows */
- X#define G_CURSOR 11 /* character/ graphics cursor position */
- X#define G_MOUSE2 12 /* cooked mouse coordinates */
- X#define G_NOTIFY 13 /* gimme info re notify windows */
- X#define G_ID 14 /* my client window number */
- X#define G_FLAGS 15 /* current window flags */
- X#define G_MAX 15 /* maximum GETINFO value */
- X
- X/* option codes for stacking window environment */
- X
- X#define P_MENU 0x001 /* push menus */
- X#define P_EVENT 0x002 /* push events */
- X#define P_FONT 0x004 /* push current font */
- X#define P_CURSOR 0x008 /* push current cursor position */
- X#define P_BITMAP 0x010 /* push saved bitmaps */
- X#define P_POSITION 0x020 /* push window location */
- X#define P_WINDOW 0x040 /* push window contents */
- X#define P_FLAGS 0x080 /* push window flags */
- X#define P_MOUSE 0x100 /* push mouse position */
- X#define P_TEXT 0x200 /* push text region */
- X
- X
- X#define P_ALL 0x3ff /* push everything */
- X#define P_MAX 0x400 /* end of codes marker */
- X#define P_DEFAULT (P_MENU | P_EVENT | P_FONT | P_FLAGS | P_TEXT)
- X#define P_CLEAR 0x400 /* clear new environment */
- X
- X/* menu_flags */
- X
- X#define MF_SNIP 8 /* don't send action for parent of s/o menu */
- X#define MF_PAGE 4 /* auto-page for menus */
- X#define MF_AUTO 2 /* auto-right exit for menus */
- X#define MF_CLEAR 1 /* clear menu flags */
- X
- X/* Escape codes */
- X
- X#define ESC '\033' /* escape character */
- X
- X#define E_MINUS '-' /* set the munus flag */
- X#define E_SEP1 ',' /* primary field seperator */
- X#define E_SEP2 ';' /* secondary field seperator */
- X#define E_MOUSE '?' /* testing -- move the mouse */
- X#define E_ADDLINE 'a' /* add a new line */
- X#define E_ADDCHAR 'A' /* add a character */
- X#define E_BITBLT 'b' /* do a bit blit */
- X#define E_BITCRT 'B' /* create a bit blit */
- X#define E_CLEAREOL 'c' /* clear */
- X#define E_CLEAREOS 'C' /* clear */
- X#define E_DELETELINE 'd' /* delete a line */
- X#define E_BITLOAD 'D' /* download a bitmap */
- X#define E_EVENT 'e' /* download events */
- X#define E_DELETECHAR 'E' /* delete a char */
- X#define E_DOWN 'f' /* down 1 line */
- X#define E_FONT 'F' /* pick a new font */
- X#define E_GO 'g' /* Go; move graphics pointer */
- X#define E_MOVE 'G' /* move to x,y pixels */
- X#define E_SETCURSOR 'h' /* select cursor style */
- X#define E_BLEEP 'H' /* blink a section of the screen */
- X#define E_GETINFO 'I' /* get info from mgr */
- X#define E_STANDOUT 'i' /* start standout mode */
- X#define E_FCOLOR 'j' /* set forground color */
- X#define E_BCOLOR 'J' /* set background color */
- X#define E_LINE 'l' /* Plot a line */
- X#define E_LINK 'L' /* menu links */
- X#define E_MENU 'm' /* download menus */
- X#define E_CUP 'M' /* move to col, row (zero origin) */
- X#define E_STANDEND 'n' /* end standout mode */
- X#define E_CIRCLE 'o' /* Plot a circle or an ellipse or an arc */
- X#define E_PUSH 'P' /* push window environment */
- X#define E_POP 'p' /* pop window environment */
- X#define E_RUBBER 'R' /* rubber band a line/rect (obsolete) */
- X#define E_RIGHT 'r' /* right 1 column */
- X#define E_CLEARMODE 's' /* clear window mode */
- X#define E_SETMODE 'S' /* set a window mode */
- X#define E_TEXTREGION 't' /* set the text region */
- X#define E_UPLINE 'u' /* up 1 line */
- X#define E_BITGET 'U' /* upload a bitmap */
- X#define E_SHAPE 'W' /* reshape window, make it active */
- X#define E_SIZE 'w' /* reshape window: cols,rows */
- X#define E_GIMME 'x' /* send me data */
- X#define E_PUTSNARF 'y' /* put the snarf buffer */
- X#define E_SNARF 'Y' /* snarf text into the snarf buffer */
- X#define E_VI 'V' /* set vi mode */
- X#define E_NOVI 'v' /* turn off vi mode */
- X#define E_HALFWIN 'z' /* make a 1/2 window */
- X#define E_MAKEWIN 'Z' /* make/goto a new window */
- X#define E_NULL '$' /* do nothing, force exit */
- X#define E_SMAP '>' /* save a bitmap */
- X#define E_GMAP '<' /* get a bitmap */
- X#define E_SEND '|' /* send a message to another application */
- X#define E_CURSOR '%' /* set mouse cursor */
- X#define E_GRUNCH ':' /* graphics crunch mode (experimental) */
- X#define E_STRING '.' /* write characters in offscreen bitmap */
- X#ifdef XMENU
- X#define E_XMENU 'X' /* extended menu operations */
- X#endif
- X
- X
- X/* misc */
- X
- X#define C_NOCHAR '?' /* for character not in font */
- X#define C_EXPOSED 'e' /* window is not obscured */
- X#define C_ACTIVE 'a' /* window has input focus */
- X#define C_NOTACTIVE 'n' /* window is obscured */
- X#define C_OBSCURED 'o' /* window is obscured */
- X#define C_NAME "px|mgr|mgr teminal emulator"
- X
- X#define C_NULL '\000' /* null */
- X#define C_BS '\b' /* back space */
- X#define C_FF '\f' /* form feed */
- X#define C_BELL '\007' /* bell */
- X#define C_TAB '\t' /* tab */
- X#define C_RETURN '\r' /* return */
- X#define C_NL '\n' /* line feed */
- X
- X/* cursor styles */
- X#define CS_BLOCK 0 /* standard block cursor */
- X#define CS_LEFT 1 /* left vertical bar */
- X#define CS_RIGHT 2 /* right vertical bar */
- X#define CS_BOX 3 /* outline */
- X#define CS_UNDER 4 /* underline */
- X
- X/* some raster op functions (for bit_copy) */
- X
- X#ifndef BIT_NOT
- X#define BIT_NOT(x) (~(x)) /* from bitmap.h */
- X#endif
- X#define B_SRC (0xc)
- X#define B_DST (0xa)
- X#define B_OR (B_SRC|B_DST)
- X#define B_COPY (B_SRC)
- X#define B_COPYINVERTED ((BIT_NOT(B_SRC))&0xf)
- X#define B_XOR (B_SRC^B_DST)
- X#define B_AND (B_SRC&B_DST)
- X
- X/* raster op functions (for bit_write and bit_line) */
- X
- X#define B_SET (0xf)
- X#define B_CLEAR (0x0)
- X#define B_INVERT ((BIT_NOT(B_DST))&0xf)
- X
- X/* where to find icon directory */
- X
- X#ifndef ICONDIR
- X# define ICONDIR "/usr/mgr/icon" /* readable by all icons */
- X#endif
- X
- X/* other macros */
- X
- X#define Scalex(x) \
- X (W(flags)&W_ABSCOORDS ? (x) : (x) * (int)BIT_WIDE(W(window))/GMAX)
- X#define Scaley(y) \
- X (W(flags)&W_ABSCOORDS ? (y) : (y) * (int)BIT_HIGH(W(window))/GMAX)
- X#define Scalexy(y) \
- X (W(flags)&W_ABSCOORDS ? (y) : \
- X (y) * (int)(BIT_HIGH(W(window))+BIT_WIDE(W(window)))/(2*GMAX))
- X
- X#define FSIZE(c) ((int) (W(font)->head.c))
- X#define WIDE BIT_WIDE(window)
- X#define HIGH BIT_HIGH(window)
- X#define T_WIDE BIT_WIDE(text)
- X#define T_HIGH BIT_HIGH(text)
- END_OF_FILE
- # end of 'lib/window.h'
- fi
- if test -f 'src/do_button.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/do_button.c'\"
- else
- echo shar: Extracting \"'src/do_button.c'\" \(8518 characters\)
- sed "s/^X//" >'src/do_button.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: do_button.c,v 4.2 88/06/28 15:25:58 bianchi Exp $
- X $Source: /tmp/mgrsrc/src/RCS/do_button.c,v $
- X*/
- Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/do_button.c,v $$Revision: 4.2 $";
- X
- X/* Figure out what to do with a button push */
- X
- X#include "bitmap.h"
- X#include <stdio.h> /* temporary */
- X#include <sys/signal.h>
- X#include "menu.h"
- X#include "defs.h"
- X#include "font.h"
- X#include "event.h"
- X
- Xdo_button(button)
- Xint button;
- X {
- X register WINDOW *win; /* window of interest */
- X int choice; /* current menu choice */
- X int choice_ok; /* valid choice flag */
- X struct menu_state *state; /* place to keep menu state */
- X register int which_menu; /* which menu indicator */
- X
- X#ifdef DEBUG
- X dprintf(b)(stderr,"do button %d (button state id %d)\n",button,button_state);
- X#endif
- X
- X /* Insist on a transition before taking any action.
- X */
- X if( button == button_state )
- X return;
- X
- X /* Other button codes, such as chords, are not recognized and have no
- X effect.
- X */
- X switch( button ) {
- X case 0:
- X case BUTTON_SYS:
- X case BUTTON_2:
- X case BUTTON_1:
- X break;
- X default:
- X return;
- X }
- X
- X /* If button was down and now no button is down,
- X send the event stating the formerly down button is now up.
- X If some button is down, the same or some other,
- X do nothing.
- X Note that this creates a fundmental property of MGR: namely that
- X once a button is pressed, no other button pressings have any effect
- X until all buttons are released.
- X */
- X if( button_state ) {
- X if ( button == 0 ) {
- X int b_event = -button_state;
- X
- X /* button_state must be cleared before sending a Button_Up event to
- X prevent any event action from thinking the button is still down.
- X */
- X button_state = 0;
- X do_event( b_event, active, E_MAIN );
- X }
- X return;
- X }
- X
- X /* button_state is the global record of the current button state.
- X */
- X button_state = button;
- X
- X /* Check for events associated with this button being pushed.
- X */
- X do_event(button,active,E_MAIN);
- X switch (button) {
- X case BUTTON_1: /* temporary vi hack */
- X#ifdef VI
- X if (active && ACTIVE(flags)&W_VI) {
- X
- X int x = mousex-(ACTIVE(x0)+ACTIVE(text).x);
- X int y = mousey-(ACTIVE(y0)+ACTIVE(text).y);
- X int dx = ACTIVE(text).wide ?
- X ACTIVE(text).wide : BIT_WIDE(ACTIVE(window));
- X int dy = ACTIVE(text).wide ?
- X ACTIVE(text).high : BIT_HIGH(ACTIVE(window));
- X
- X if (x<0 || x > dx)
- X break;
- X if (y>=0 && y<=dy) {
- X char buff[10];
- X sprintf(buff,"%dH%d|",
- X y/ACTIVE(font)->head.high+1,
- X x/ACTIVE(font)->head.wide+1);
- X write(ACTIVE(to_fd),buff,strlen(buff));
- X }
- X else if (y<0)
- X write(ACTIVE(to_fd),"\025",1); /* ASCII Control-U */
- X else
- X write(ACTIVE(to_fd),"\004",1); /* ASCII Control-D */
- X }
- X#endif
- X if (active) {
- X go_menu(1);
- X }
- X break;
- X case BUTTON_2: /* for applic. menu */
- X if (active) {
- X go_menu(0);
- X }
- X break;
- X case BUTTON_SYS: /* for system operation */
- X /* see if mouse is in a window */
- X if (mousex < STRIPE)
- X win = (WINDOW *) 0;
- X else
- X for(win=active;win != (WINDOW *) 0;win=W(next))
- X if(mousein(mousex,mousey,win,1))
- X break;
- X
- X /* do a menu for no window, or active window */
- X if (win == active || win == (WINDOW *) 0) {
- X if (active && win == active) {
- X state = menu_define(font,active_menu,0,0,
- X PUTCOLOR(W(style)),
- X PUTCOLOR(W(background)));
- X which_menu = 1;
- X }
- X else if (next_window >= MAXWIN) {
- X state = menu_define(font,full_menu,0,0,MENU_FG,MENU_BG);
- X which_menu = 2;
- X }
- X else {
- X state = menu_define(font,main_menu,0,0,MENU_FG,MENU_BG);
- X which_menu = 3;
- X }
- X if (active) {
- X cursor_off();
- X if (which_menu != 1)
- X ACTIVE_OFF();
- X }
- X state = menu_setup(state,screen,mousex,mousey,0);
- X menu_get(state,mouse,0,0);
- X choice = menu_choice(state);
- X choice_ok = menu_ischoice(state);
- X menu_destroy(state);
- X if (choice_ok) {
- X switch(which_menu) {
- X case 1:
- X ACTIVE_OFF();
- X (*active_functions[choice])();
- X break;
- X case 2:
- X (*full_functions[choice])();
- X break;
- X case 3:
- X (*main_functions[choice])();
- X break;
- X }
- X }
- X if (active) {
- X ACTIVE(flags) &= ~W_NOINPUT;
- X ACTIVE_ON();
- X cursor_on();
- X }
- X do_button(0);
- X }
- X else {
- X /* bring obscured window to the top */
- X#ifdef DEBUG
- X dprintf(b)(stderr,"activating: %s\r\n",W(tty));
- X#endif
- X if (active) {
- X ACTIVE_OFF();
- X cursor_off();
- X }
- X expose(win);
- X if (active) {
- X ACTIVE(flags) &= ~W_NOINPUT;
- X ACTIVE_ON();
- X cursor_on();
- X }
- X }
- X break;
- X }
- X return;
- X }
- X
- X/* hide the active window */
- X
- Xint hide_win()
- X {
- X hide(active);
- X }
- X
- X/* quit with confirm */
- X
- Xint quit()
- X {
- X struct menu_state *state; /* place to keep menu state */
- X int confirm;
- X
- X /* confirm the quit */
- X
- X state = menu_define(font,quit_menu,0,0,MENU_BG,MENU_FG);
- X state = menu_setup(state,screen,mousex,mousey,0);
- X
- X /* The extra call to menu_get() makes the use of the mouse buttons
- X consistent on the menus; namely the action is selected by the button
- X going up.
- X */
- X menu_get(state,mouse,BUTTON_SYS,0);
- X menu_get(state,mouse,0,0);
- X
- X confirm = menu_ischoice(state) ? menu_choice(state) : 0;
- X menu_destroy(state);
- X if (confirm == M_QUIT) {
- X _quit();
- X exit(0);
- X }
- X else if (confirm == M_SUSPEND)
- X suspend();
- X }
- X
- X/* really quit */
- X
- Xint
- X_quit()
- X {
- X register WINDOW *win;
- X static int really_quit=0;
- X
- X if (really_quit++) { /* we're in bad shape */
- X perror("PANIC!! Error during _quit()!");
- X setreuid(getuid(),getuid());
- X abort();
- X }
- X
- X MOUSE_OFF(mousex,mousey);
- X
- X sleep(1); /* let the key (if any) un-press before resetting
- X the kbd */
- X set_kbd(0); /* fix up keyboard modes */
- X kbd_reset(); /* reset the keyboard */
- X reset_tty(0); /* fix up console tty modes */
- X
- X /* fix pttys */
- X if (geteuid() < 2)
- X for(win=active;win != (WINDOW *) 0;win=W(next)) {
- X chmod(W(tty),0666);
- X chown(W(tty),0,0);
- X }
- X
- X /* fix utmp file */
- X
- X#ifdef WHO
- X close(getdtablesize()-1); /* make sure there are enough fd's left */
- X for(win=active;win != (WINDOW *) 0;win=W(next))
- X if (W(tty))
- X rm_utmp(W(tty));
- X restore_utmp(0,"");
- X#endif
- X
- X CLEAR(screen,BIT_CLR);
- X do_cmd( 'q' ); /* do the quiting command */
- X }
- X
- X/* redraw the screen, restore contents of saved windows */
- X
- Xint redraw()
- X {
- X register WINDOW *win;
- X
- X#ifdef DEBUG
- X dprintf(b)(stderr,"\r\n\tREDRAW\r\n");
- X#endif
- X for(win=active;win != (WINDOW *) 0;win=W(next)) {
- X if (W(flags)&W_ACTIVE) {
- X save_win(win);
- X do_event(EVENT_REDRAW,win,E_MAIN);
- X }
- X }
- X
- X erase_win(screen,0,0);
- X if (active) {
- X for(win=ACTIVE(prev);win != active;win=W(prev)) {
- X restore_win(win);
- X border(win,BLK_BDR,WH_BDR);
- X }
- X restore_win(active);
- X border(active,BLK_BDR,WH_BDR);
- X }
- X }
- END_OF_FILE
- # end of 'src/do_button.c'
- fi
- if test -f 'src/do_menu.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/do_menu.c'\"
- else
- echo shar: Extracting \"'src/do_menu.c'\" \(8358 characters\)
- sed "s/^X//" >'src/do_menu.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: do_menu.c,v 4.1 88/06/21 13:21:47 bianchi Exp $
- X $Source: /tmp/mgrsrc/src/RCS/do_menu.c,v $
- X*/
- Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/do_menu.c,v $$Revision: 4.1 $";
- X/* high level menu manipulation routines */
- X
- X#include "bitmap.h"
- X#include <stdio.h> /* temporary */
- X#include "menu.h"
- X#include "defs.h"
- X#include "font.h"
- X
- X/* do a tree of menus */
- X
- Xstatic int x_page = 5; /* offset for paging menu */
- Xstatic int y_page = -5;
- Xstatic int x_slide = 40; /* offset for scrolling menu */
- Xstatic int y_slide = 10;
- X
- Xstruct menu_result *
- Xdo_menus(screen,mouse,x,y,font,menu_list,menu,exit_code)
- XBITMAP *screen; /* bitmap screen */
- Xint mouse; /* fd to get mouse coordinates */
- Xint x,y; /* where the menu goes on the screen */
- Xstruct font *font; /* font to use for menus */
- Xstruct menu_state *menu_list[]; /* list of available menus */
- Xint menu; /* current menu number */
- Xint exit_code; /* valid exit codes */
- X {
- X struct menu_state *state; /* 'cookie' for menu system */
- X struct menu_result *result; /* messages for nodes of menu tree chosen */
- X int done=0; /* true if ok to backup a level */
- X int first = 1; /* true upon entry */
- X int next; /* next menu # */
- X struct menu_result *add_result();
- X char *print_menu();
- X
- X /* set up menu, get menu 'cookie' */
- X
- X state = menu_list[menu]; /* fetch the menu state */
- X result = (struct menu_result *) 0;
- X state = menu_setup(state,screen,x,y,menu_choice(state));
- X
- X if (state == (struct menu_state *) 0) {
- X perror("Error setting up menu");
- X return(NULL);
- X }
- X
- X /* see if another page */
- X
- X if (state->next >= 0)
- X exit_code |= EXIT_BOTTOM;
- X else
- X exit_code &= ~EXIT_BOTTOM;
- X
- X#ifdef DEBUG
- X dprintf(m)(stderr," Setting up menu %d at %d,%d: valid states %s\n",
- X menu,x,y,print_menu(exit_code));
- X#endif
- X
- X /* get selection on current menu */
- X
- X while (!done)
- X {
- X
- X /* get menu state from user */
- X#ifdef DEBUG
- X dprintf(m)(stderr," from user ..."); fflush(stderr);
- X#endif
- X
- X /* do auto right menus */
- X
- X if (state->flags&MENU_PAGE && exit_code&EXIT_BOTTOM && first &&
- X state->current >= state->count ) {
- X first=0;
- X state->exit = EXIT_BOTTOM;
- X }
- X else if (state->flags&MENU_AUTO && exit_code&EXIT_RIGHT && first) {
- X first=0;
- X state->exit = EXIT_RIGHT;
- X }
- X else
- X menu_get(state,mouse,0,exit_code);
- X
- X /* execute appropriate state action */
- X
- X#ifdef DEBUG
- X dprintf(m)(stderr,"got menu %d (at %d,%d) selection %d (%s)\n",
- X menu,x,y,menu_choice(state),print_menu(menu_exit(state)));
- X#endif
- X
- X switch (menu_exit(state)) {
- X case EXIT_LEFT: /* slid off to the left */
- X case EXIT_TOP: /* slid of the top */
- X result = NULL;
- X done++;
- X break;
- X case EXIT_CHOICE: /* add current choice onto list */
- X result = add_result(state,result);
- X done++;
- X break;
- X case EXIT_RIGHT: /* slid off top the right */
- X if ((next = menu_next(state)) >=0 && /* link exists */
- X menu_list[next] && /* menu exists */
- X menu_list[next]->save == (BITMAP *) 0 && /* not used */
- X (result=do_menus(screen,mouse, /* choice */
- X x+x_slide,y-y_slide,font,menu_list,
- X next,exit_code|EXIT_LEFT))) {
- X done++;
- X }
- X break;
- X case EXIT_BOTTOM:
- X if ((next = menu_next(state)) >=0 && /* menu exists */
- X menu_list[next]->save == (BITMAP *) 0 && /* not used */
- X (result=do_menus(screen,mouse, /* choice */
- X x+x_page,y+y_page,font,menu_list,
- X next,exit_code|EXIT_TOP))) {
- X done++;
- X }
- X break;
- X default:
- X if( !debug )
- X break;
- X fprintf(stderr,"invalid menu state: 0%o\n",menu_exit(state));
- X result = NULL;
- X done++;
- X break;
- X }
- X }
- X
- X#ifdef DEBUG
- X dprintf(m)(stderr," Tearing down %d at %d,%d choice: %d, returning: %s\n",
- X menu,x,y,menu_choice(state),print_menu(menu_exit(state)));
- X#endif
- X
- X /* add our action onto action list */
- X
- X if (menu_exit(state) == EXIT_RIGHT && result && !(state->flags&MENU_SNIP)) {
- X result = add_result(state,result);
- X }
- X
- X /* erase menu from the screen */
- X
- X menu_remove(state);
- X return(result);
- X }
- X
- X/* add a value to list of menu values */
- X
- Xstruct menu_result *
- Xadd_result(state,list)
- Xstruct menu_state *state; /* menu to add choice to */
- Xstruct menu_result *list; /* current list of results */
- X {
- X register struct menu_result *current; /* current result */
- X char *malloc();
- X
- X /* set up list */
- X
- X if (list == (struct menu_result *) 0) {
- X list = (struct menu_result *) malloc(sizeof(struct menu_result));
- X list->next = NULL;
- X list->value = NULL;
- X }
- X else if (list->value == NULL)
- X return(list);
- X
- X /* add entry to existing list */
- X
- X if (menu_value(state) && *menu_value(state) &&
- X (current = (struct menu_result *)
- X malloc(sizeof(struct menu_result)))) {
- X current->value = menu_value(state);
- X current->next = list;
- X }
- X else
- X current = list;
- X return(current);
- X }
- X
- X/* do a tree of menus */
- X
- Xgo_menu(n)
- Xint n; /* which menu button (0 or 1) */
- X {
- X struct menu_result *result = NULL; /* result of menu selection */
- X register struct menu_result *current; /* current action */
- X int pushed;
- X int exit = EXIT_RIGHT; /* enable sliding and paging */
- X register int menu = ACTIVE(menu[n]);
- X
- X#ifdef DEBUG
- X dprintf(m)(stderr,"Starting menu %d, button %d\n",menu,n);
- X#endif
- X
- X /* go get a menu selection, return list of actions */
- X
- X if (menu>=0 /* && mousein(mousex,mousey,active,0) */) {
- X result = do_menus(screen,mouse,mousex,mousey,
- X font,ACTIVE(menus),menu,exit);
- X
- X /* send list of actions, and free action space */
- X
- X for(current=result;current;) {
- X if (current->value)
- X Write(ACTIVE(to_fd),current->value,strlen(current->value));
- X result = current;
- X current = current->next;
- X free(result);
- X }
- X
- X /* button is no longer pushed down; record that fact */
- X do_button( 0 );
- X }
- X return;
- X }
- X
- X/* define a menu from menu download string */
- X
- Xstruct menu_state *
- Xdo_menu(line,font,fg,bg)
- Xchar *line;
- Xstruct font *font;
- Xint fg,bg; /* fg and bg color */
- X {
- X register int count;
- X char *fields[MAXITEMS];
- X
- X count = get_fields(line+1,*line,fields,MAXITEMS)/2;
- X
- X#ifdef DEBUG
- X dprintf(m)(stderr,"Setting up a menu, %d items\n",count);
- X#endif
- X if (count < 1)
- X return((struct menu_state *) 0);
- X
- X return(menu_define(font,fields,fields+count,count,fg,bg));
- X }
- X
- X
- X/*******************************************************************************
- X *
- X * break a line into its component fields
- X */
- X
- Xstatic int
- Xget_fields(line,delim,fields,max)
- Xchar *line; /* line to break into fields */
- Xchar **fields; /* resultant fields */
- Xchar delim; /* field delimeter */
- Xint max; /* max # fields */
- X {
- X register char c, *start;
- X register int count;
- X
- X for(count=0,start=line; count<max && (c = *line); line++)
- X if (c == delim) {
- X fields[count++]=start;
- X *line = '\0';
- X start=line+1;
- X }
- X if (start<line)
- X fields[count++] = start;
- X fields[count]=(char *) 0;
- X return(count);
- X }
- X
- X/* set slideing defaults */
- X
- Xint
- Xset_slide(x,y)
- Xint x,y;
- X {
- X if (x || y) {
- X x_slide = x;
- X y_slide = y;
- X }
- X return(0);
- X }
- X
- X/* set paging defaults */
- X
- Xint
- Xset_page(x,y)
- Xint x,y;
- X {
- X if (x || y) {
- X x_page = x;
- X y_page = y;
- X }
- X return(0);
- X }
- END_OF_FILE
- # end of 'src/do_menu.c'
- fi
- echo shar: End of archive 30 \(of 61\).
- cp /dev/null ark30isdone
- 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
-