DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T b

⟦a83ad0e10⟧ TextFile

    Length: 27328 (0x6ac0)
    Types: TextFile
    Names: »bops.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Src/MTAconsole/bops.c« 

TextFile

/* bops.c: various buttons routines */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/bops.c,v 5.0 90/09/20 16:19:31 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Src/MTAconsole/RCS/bops.c,v 5.0 90/09/20 16:19:31 pp Exp Locker: pp $
 *
 * $Log:	bops.c,v $
 * Revision 5.0  90/09/20  16:19:31  pp
 * rcsforce : 5.0 public release
 * 
 */



#include	"console.h"
extern int	autoReconnect,
		userConnected;
extern State	connectState;
extern struct chan_struct	*find_channel();
extern struct mta_struct	*find_mta();
extern struct msg_struct	*find_msg();
extern Widget	top;

void		SetAuthDisplay();

/* ARGSUSED */ 
void Refresh(w, client_data, call_data)
Widget	w;
caddr_t	client_data;	/* unused */
caddr_t call_data;	/* unused */
{
/*	StartWait();*/
	if (connectState == connected)
		my_invoke(chanread, (char **) NULL);
	else if (autoReconnect == TRUE && userConnected == TRUE) {
		TermConnectTimeOut();
		ConnectTimeOut((caddr_t) NULL,(XtIntervalId *) NULL);
	}
	ResetInactiveTimeout();
/*	EndWait();*/
}

extern time_t	parsetime();
Operations			currentop;
extern struct chan_struct	*currentchan;
extern struct mta_struct	*currentmta;
extern struct msg_struct	*currentmsg;
extern int			confirm, read_currentchan;
extern char			*hostname;
extern Popup_menu		*yesno,
				*one,
				*two,
				*three;
int				forceDown = FALSE;

/* ARGSUSED */
void Command(w, op, call_data)
Widget	w;
Operations	op;	
caddr_t	call_data;	/* unused */
{
	char		*title;
	int		x, y;
	Popup_menu	*popup = NULL;
	Window		r_child;

	ResetInactiveTimeout();
	WidgetGet(w,
		  XtNlabel, &title,
		  NULL);

	if (strcmp(title, "all") == 0) {
		if (op == chaninfo)
			chan_display_all();
		else if (op == mtainfo)
			mta_display_all();
		else if (op = msginfo) 
			msg_display_all();
		return;
	}

	currentop = op;
/*	StartWait();	*/
	/* should pop up template hereabouts */
	switch (op) {
	    case quit:
		if (confirm == TRUE) {
			popup = yesno;
		} else {
			Quit();
		}
		break;
	    case connect:
	    case disconnect:
		if (strcmp(title, "connect") == 0) {
			currentop = connect;
			popup = one;
			textdisplay(&(one->tuple[0]), 
			    (hostname == NULL) ? "" : hostname);
			WidgetSet(one->tuple[0].label,
				  XtNlabel, "Connect to ",
				  NULL);
		} else {
			currentop = disconnect;
			if (confirm == TRUE) {
				popup = yesno;
			} else {
				Disconnect();
			}
		}
		break;
	    case chanstart:
		if (currentchan == NULL) {
			textdisplay(&(one->tuple[0]), "");
			WidgetSet(one->tuple[0].label, 
				  XtNlabel, "Enable channel",
				  NULL);
			popup = one;
		} else 
			ChanControl(currentop, currentchan->channelname, 
				    (char *) NULL);
		break;
	    case chanstop:
		if (currentchan == NULL) {
			textdisplay(&(one->tuple[0]), "");
			WidgetSet(one->tuple[0].label, 
				  XtNlabel, "Disable channel",
				  NULL);
			popup = one;
		} else 
			ChanControl(currentop, currentchan->channelname, 
				    (char *) NULL);
		break;
	    case chanclear:
		if (currentchan == NULL) {
			textdisplay(&(one->tuple[0]), "");
			WidgetSet(one->tuple[0].label, 
				  XtNlabel, "Remove delay on channel",
				  NULL);
			popup = one;
		} else 
			ChanControl(currentop, currentchan->channelname, 
				    (char *) NULL);
		break;
	    case chancacheadd:
		popup = two;
		WidgetSet(two->tuple[0].label,
			  XtNlabel, "Add delay (in s m h d and/or w)",
			  NULL);
		WidgetSet(two->tuple[1].label,
			  XtNlabel, "On channel",
			  NULL);
		textdisplay(&(two->tuple[1]),
			    (currentchan == NULL) ? "" : currentchan->channelname);
		textdisplay(&(two->tuple[0]), "");
		break;
			
	    case chaninfo:
		if (currentchan == NULL) {
			textdisplay(&(one->tuple[0]), "");
			WidgetSet(one->tuple[0].label, 
				  XtNlabel, "Info on channel",
				  NULL);
			popup = one;
		} else
			ChanInfo(currentchan->channelname);
		break;

	    case chandownforce:
		if (currentchan == NULL) {
			textdisplay (&(one->tuple[0]), "");
			WidgetSet(one->tuple[0].label,
				  XtNlabel, "Downward force attempt on channel",
				  NULL);
			popup = one;
		} else {
			forceDown = TRUE;
			ChanDownForce (currentchan);
			forceDown = FALSE;
		}
		break;

	    case mtastart:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Enable mta  ",
				  NULL);  
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  (char *) NULL);
			popup = two;
		} else 
			MtaControl(currentop, 
				   currentmta->mta,
				   currentchan->channelname,
				   (char *) NULL);
		break;

	    case mtastop:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Disable mta  ",
				  NULL);
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  NULL);
			popup = two;
		} else 
			MtaControl(currentop, 
				   currentmta->mta,
				   currentchan->channelname,
				   (char *) NULL);
		break;
	    case mtaclear:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Remove delay on mta",
				  NULL);
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  NULL);
			popup = two;
		} else 
			MtaControl(currentop, 
				   currentmta->mta,
				   currentchan->channelname,
				   (char *) NULL);

		break;
	    case mtaforce:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Force attempt of mta",
				  NULL);
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  NULL);
			popup = two;
		} else 
			MtaForce(currentmta,
				 currentchan);

		break;

	    case mtadownforce:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Downward force attempt of mta",
				  NULL);
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  NULL);
			popup = two;
		} else {
			forceDown = TRUE;
			MtaDownForce(currentchan,
				 currentmta);
			forceDown = FALSE;
		}
		break;
	    case mtacacheadd:
		popup = three;
		WidgetSet(three->tuple[0].label,
			  XtNlabel, "Add delay (in s m h d and/or w)",
			  NULL);
		textdisplay(&(three->tuple[0]), "");
		WidgetSet(three->tuple[1].label,
			  XtNlabel, "For mta",
			  NULL);
		textdisplay(&(three->tuple[1]),
			    (currentmta == NULL) ? "" : currentmta->mta);
		WidgetSet(three->tuple[2].label,
			  XtNlabel,"On channel",
			  NULL);
		textdisplay(&(three->tuple[2]),
			    (currentchan == NULL) ? "" : currentchan->channelname);
		break;
	    case mtainfo:
		if (currentmta == NULL
		    || currentchan == NULL) {
			textdisplay(&(two->tuple[0]), 
				    (currentmta == NULL) ? "" : currentmta->mta);
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Info on mta",
				  NULL);
			textdisplay(&(two->tuple[1]),
				    (currentchan == NULL) ? "" : currentchan->channelname);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "On channel",
				  NULL);
			popup = two;
		} else 
			MtaInfo(currentmta->mta,
				currentchan->channelname);
		break;
	    case msgstart:
		popup = two;
		WidgetSet(two->tuple[0].label,
			  XtNlabel, "Thaw message",
			  NULL);
		textdisplay(&(two->tuple[0]),
			    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
		textdisplay(&(two->tuple[1]), "");
		WidgetSet(two->tuple[1].label,
			  XtNlabel, "User list (,) *=all",
			  NULL);
		break;
	    case msgstop:
		popup = two;
		WidgetSet(two->tuple[0].label,
			  XtNlabel, "Freeze message  ",
			  NULL);
		textdisplay(&(two->tuple[0]),
			    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
		textdisplay(&(two->tuple[1]), "");
		WidgetSet(two->tuple[1].label,
			  XtNlabel, "User list (,) *=all",
			  NULL);
		break;
	    case msgclear:
		popup = two;
		WidgetSet(two->tuple[0].label,
			  XtNlabel, "Remove delay on message",
			  NULL);
		textdisplay(&(two->tuple[0]),
			    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
		textdisplay(&(two->tuple[1]), "");
		WidgetSet(two->tuple[1].label,
			  XtNlabel, "User list (,) *=all",
			  NULL);
		break;
	    case msgforce:
		if (currentmta == NULL) {
			popup = three;
			WidgetSet(three->tuple[0].label,
				  XtNlabel, "Force Attempt on Message",
				  NULL);
			textdisplay(&(three->tuple[0]),
				    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
			WidgetSet(three->tuple[1].label,
				  XtNlabel, "User list (,) *=all",
				  NULL);
			textdisplay(&(three->tuple[1]),"");
			WidgetSet(three->tuple[2].label,
				  XtNlabel, "On Mta",
				  NULL);
			textdisplay(&(three->tuple[2]),"");
		} else {
			/* know what mta is */
			popup = two;
			WidgetSet(two->tuple[0].label,
				  XtNlabel, "Force Attempt on Message",
				  NULL);
			textdisplay(&(two->tuple[0]),
				    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
			WidgetSet(two->tuple[1].label,
				  XtNlabel, "User list (,) *=all",
				  NULL);
			textdisplay(&(two->tuple[1]),"");
		}
		break;
	    case msginfo:
		if (currentmsg == NULL) {
			popup = one;
			WidgetSet(one->tuple[0].label,
				  XtNlabel, "Info on message",
				  NULL);
			textdisplay(&(one->tuple[0]), "");
		} else 
			MsgInfo(currentmsg->msginfo->queueid);
			
		break;
	    case msgcacheadd:
		popup = three;
		WidgetSet(three->tuple[0].label,
			  XtNlabel, "Add delay (in s m h d and/or w)",
			  NULL);
		textdisplay(&(three->tuple[0]), "");
		WidgetSet(three->tuple[1].label,
			  XtNlabel, "To message",
			  NULL);
		textdisplay(&(three->tuple[1]),
			    (currentmsg == NULL) ? "" : currentmsg->msginfo->queueid);
		WidgetSet(three->tuple[2].label,
			  XtNlabel, "User list (,) *=all",
			  NULL);
		textdisplay(&(three->tuple[2]), "");
		break;
	    default:
		popup = one;
		WidgetSet(one->tuple[0].label,
			  XtNlabel, "WHAT ????????",
			  NULL);
		break;
	}
/*	EndWait();*/
	if (popup != NULL) {
		XTranslateCoordinates(XtDisplay(w),XtWindow(w),
				      XDefaultRootWindow(XtDisplay(w)),0,0,
				      &x,&y,
				      &r_child);
		Popup(popup,currentop,x,y);
	}
	
}

extern Popup_menu	*connectpopup;
extern int		newauth,
			auth;
extern char		password[],
			username[],
			tailorfile[];

/* ARGSUSED */
void Connectbutton(w, op, call_data)
Widget	w;
Operations	op;	
caddr_t	call_data;	/* unused */
{
	char		*title;
	int		x, y;
	Popup_menu	*popup = NULL;
	Window		r_child;
	
	WidgetGet(w,
		  XtNlabel, &title,
		  NULL);

	currentop = op;
	if (strcmp(title, "connect") == 0) {
		currentop = connect;
		newauth = auth;
		SetAuthDisplay(newauth);
		popup = connectpopup;
		textdisplay(&(connectpopup->tuple[0]), 
			    (hostname == NULL) ? "" : hostname);
		textdisplay(&(connectpopup->tuple[1]),
			    (tailorfile[0] == '\0') ? "" : tailorfile);
	} else {
		currentop = disconnect;
		if (confirm == TRUE) {
			popup = yesno;
		} else {
			Disconnect();
		}
	}
	if (popup != NULL) {
		XTranslateCoordinates(XtDisplay(w),XtWindow(w),
				      XDefaultRootWindow(XtDisplay(w)),0,0,
				      &x,&y,
				      &r_child);
		Popup(popup,currentop,x,y);
	}
}

Mode	mode = monitor;
extern Widget	mode_command, channel_label, qcontrol_command;
extern Authentication authentication;
extern void ChanToggle();

/* ARGSUSED */
void	ChangeMode(w, client_data, call_data)
Widget	w;
caddr_t	client_data;
caddr_t call_data;
{
	extern Widget	channel_form,
			monitor_viewport,
			control_form;
/*	StartWait();*/
	if (mode == monitor) {
		WidgetSet(mode_command,
			XtNlabel, "monitor",
			NULL);
		mode = control;
		toggle_info_displays();
		reset_label(channel_label);
		XtSetMappedWhenManaged(monitor_viewport, False);
		XtSetMappedWhenManaged(control_form, True);
		XtSetMappedWhenManaged(channel_form, True);
		if (authentication == full && connectState == connected)
			XtSetMappedWhenManaged(qcontrol_command, True);
		if (currentchan != NULL && read_currentchan != 0) {
			clear_mta_refresh_list();
			add_mta_refresh_list(currentchan->channelname);
			construct_event(mtaread);
		}
	} else {
		WidgetSet(mode_command, 
			  XtNlabel, "control", 
			  NULL);
		mode = monitor;
		ChanToggle();
		XtSetMappedWhenManaged(monitor_viewport, True);
		XtSetMappedWhenManaged(control_form, False);
		XtSetMappedWhenManaged(channel_form, False);
		if (authentication == full)
			XtSetMappedWhenManaged(qcontrol_command, False);
		if (connectState == connected)
			my_invoke(chanread,(char **) NULL);
	}
/*	EndWait();*/
	ResetInactiveTimeout();
}

extern unsigned long 	timeoutFor,
			inactiveFor,
			connectInit,
			connectInc,
			connectMax;
extern char	*unparsetime();
extern Popup_menu	*config;
extern Widget		refresh_toggle,
			reconnect_toggle,
			backoff_toggle,
			confirm_toggle,
			heur_toggle;
extern int	autoRefresh,
		autoReconnect,
		backoff,
		percent,
		lower_bound_mtas,
		max_vert_lines;
extern Heuristic heuristic,
		newheur;
extern int	newautoRefresh,
		newautoReconnect,
		newbackoff,
		newconfirm;
int		newint;
unsigned long	newTimes;
extern XColor	white, black;
extern Pixel	bg, fg;

/* ARGSUSED */
void Configure(w, client_data, call_data)
Widget	w;
caddr_t	client_data;	/* unused */
caddr_t call_data;	/* unused */
{
	int	x,y,i;
	Window	r_child;
	char	number[BUFSIZ], *str;

	newautoRefresh = autoRefresh;
	newautoReconnect = autoReconnect;
	newbackoff = backoff;
	newconfirm = confirm;
	newheur = heuristic;

	textdisplay(&(config->tuple[REFRESH]), 
		    unparsetime(timeoutFor / 1000 ));
	textdisplay(&(config->tuple[INACTIVE]),
		    unparsetime(inactiveFor / 1000));
	textdisplay(&(config->tuple[START]), 
		    unparsetime(connectInit / 1000 ));
	textdisplay(&(config->tuple[BACKOFF]), 	
		    unparsetime(connectInc / 1000 ));
	textdisplay(&(config->tuple[CONNECTMAX]), 
		    unparsetime(connectMax / 1000 ));
	sprintf(number, "%d", percent);
	textdisplay(&(config->tuple[PERCENT]),number);
	sprintf(number, "%d", lower_bound_mtas);
	textdisplay(&(config->tuple[MINBADMTA]), number);
	sprintf(number, "%d", max_vert_lines);
	textdisplay(&(config->tuple[LINEMAX]), number);

	XtSetKeyboardFocus(config->form, config->tuple[REFRESH].text);
	WidgetSet(config->tuple[REFRESH].text,
		  XtNborderColor, fg,
		  NULL);
	WidgetSet (refresh_toggle,
		   XtNlabel, (autoRefresh == TRUE) ? "enabled" : "disabled",
		   NULL);
	WidgetSet (reconnect_toggle,
		   XtNlabel, (autoReconnect == TRUE) ? "enabled" : "disabled",
		   NULL);
	WidgetSet (backoff_toggle,
		   XtNlabel, (backoff == TRUE) ? "enabled" : "disabled",
		   NULL);
	WidgetSet (confirm_toggle,
		   XtNlabel, (confirm == TRUE) ? "enabled" : "disabled",
		   NULL);

	switch (heuristic) {
	    case percentage:
		str = PERCENT_BASED;
		break;
	    case all:
		str = ALL_BASED;
		break;
	    default:
		heuristic = line;
	    case line:
		str = LINE_BASED;
		break;
	}
	WidgetSet (heur_toggle,
		   XtNlabel,	str,
		   NULL);

	for (i = 1; i < config->numberOftuples; i++) 
		WidgetSet(config->tuple[i].text,
			  XtNborderColor, bg,
			  NULL);
	XTranslateCoordinates(XtDisplay(w),XtWindow(w),
			      XDefaultRootWindow(XtDisplay(w)),0,0,&x,&y,
			      &r_child);
	Popup(config, unknown, x, y);
}

/* ARGSUSED */
void popup_NOTOK(w, op, call_data)
Widget	w;
Operations	*op;
caddr_t call_data;
{
	Popup_menu	*popup;
	
	switch(*op) {
	    case quit:
	    case disconnect:
		popup = yesno;
		break;
	    case connect:
		popup = connectpopup;
		break;
	    case chanread:
	    case chanstop:
	    case chanstart:
	    case chanclear:
	    case chaninfo:
	    case chandownforce:
	    case msginfo:
		popup = one;
		break;
	    case chancacheadd:
	    case mtaread:
	    case mtastop:
	    case mtastart:
	    case mtaclear:
	    case msgstop:
	    case msgstart:
	    case msgclear:
	    case mtainfo:
	    case mtaforce:
	    case mtadownforce:
		popup = two;
		break;
	    case mtacacheadd:
	    case msgcacheadd:
		popup = three;
		break;
	    case msgforce:
		if (currentmta == NULL)
			popup = three;
		else 
			popup = two;
		break;
	    default:
		popup = config;
		break;
	}
	ResetInactiveTimeout();
	if (popup != NULL)
		Popdown(popup);
}

/* ARGSUSED */
void popup_OK(w, op, call_data)
Widget	w;
Operations	*op;
caddr_t 	call_data;
{
	Popup_menu	*popup = NULL;
	struct chan_struct	*chan;

	XSync(XtDisplay(w), 0);
	switch(*op) {
	    case quit:
		Quit();
		popup = yesno;
		break;
	    case disconnect:
		Disconnect();
		popup = yesno;
		break;
	    case chanstop:
	    case chanstart:
	    case chanclear:
		if (one->tuple[0].str[0] != '\0') {
			ChanControl(*op, one->tuple[0].str, (char *) NULL);
			popup = one;
		}
		break;
	    case chancacheadd:
		if (two->tuple[0].str[0] != '\0' 
		    && two->tuple[1].str[0] != '\0') {
			ChanControl(*op, two->tuple[1].str, 
				    two->tuple[0].str);
			popup = two;
		}
		break;
	    case chaninfo:
		if (one->tuple[0].str[0] != '\0') {
			ChanInfo(one->tuple[0].str);
			popup = one;
		}
		break;
	    case chandownforce:
		if (one->tuple[0].str[0] != '\0') {
			if ((chan = find_channel(one->tuple[0].str)) != NULL){
				ChanDownForce(chan);
				popup = one;
			}
		}
		break;
	    case msgstop:
	    case msgstart:
	    case msgclear:
		if (two->tuple[0].str[0] != '\0'
		    && two->tuple[1].str[0] != '\0') {
			MsgControl(*op, two->tuple[0].str, 
				   two->tuple[1].str, (char *) NULL);
			popup = two;
		}
		break;
	    case msgforce:
		if (currentchan == NULL)
			break;
		if (currentmta == NULL) {
			if (three->tuple[0].str[0] != '\0'
			    && three->tuple[1].str[0] != '\0'
			    && three->tuple[2].str[0] != '\0') {
				struct mta_struct	*mta;
				struct msg_struct	*msg;
				if ((mta = find_mta(currentchan,
						    three->tuple[2].str)) != NULL
				    && (msg = find_msg(three->tuple[0].str)) != NULL) {
					MsgForce(msg, three->tuple[1].str,
						 mta, currentchan);
					popup = three;
				}
			} 
		} else {
			if (two->tuple[0].str[0] != '\0'
			    && two->tuple[1].str[0] != '\0') {
				struct msg_struct	*msg;
				if ((msg = find_msg(two->tuple[0].str)) != NULL) {
					MsgForce(msg, two->tuple[1].str,
						 currentmta, currentchan);
					popup = two;
				}
			}
		}
		break;
	    case msgcacheadd:
		if (three->tuple[0].str[0] != '\0'
		    && three->tuple[1].str[0] != '\0'
		    && three->tuple[2].str[0] != '\0') {
			MsgControl(*op, three->tuple[1].str,
				   three->tuple[2].str, three->tuple[0].str);
			popup = three;
		}
		break;
	      
	    case msginfo:
		if (one->tuple[0].str[0] != '\0') {
			MsgInfo(one->tuple[0].str);
			popup = one;
		}
		break;
	    case mtaclear:
	    case mtastop:
	    case mtastart:
		if (two->tuple[0].str[0] != '\0'
		    && two->tuple[1].str[0] != '\0') {
			MtaControl(*op, two->tuple[0].str, 
				   two->tuple[1].str, (char *) NULL);
			popup = two;
		}
		break;
	    case mtaforce:
		if (two->tuple[0].str[0] != '\0'
		    && two->tuple[1].str[0] != '\0') {
			struct mta_struct	*mta;
			struct chan_struct	*chan;
			if ((chan = find_channel(two->tuple[1].str)) != NULL
			    && (mta = find_mta(chan,
					       two->tuple[0].str)) != NULL) {
				MtaForce(mta, chan);
				popup = two;
			}
		}
		break;

	    case mtadownforce:
		if (two->tuple[0].str[0] != '\0'
		    && two->tuple[1].str[0] != '\0') {
			struct mta_struct	*mta;
			struct chan_struct	*chan;
			if ((chan = find_channel(two->tuple[1].str)) != NULL
			    && (mta = find_mta(chan,
					       two->tuple[0].str)) != NULL) {
				MtaDownForce(chan, mta);
				popup = two;
			}
		}
		break;

	    case mtainfo:
		if (two->tuple[0].str[0] != '\0'
		    && two->tuple[1].str[0] != '\0') {
			MtaInfo(two->tuple[0].str, two->tuple[1].str);
			popup = two;
		}
		break;
	    case mtacacheadd:
		if (three->tuple[0].str[0] != '\0'
		    && three->tuple[1].str[0] != '\0'
		    && three->tuple[2].str[0] != '\0') {
			MtaControl(*op, three->tuple[1].str, 
				   three->tuple[2].str, three->tuple[0].str);
			popup = three;
		}
		
	    default:
		break;
	}
	ResetInactiveTimeout();
	if (popup != NULL)
		Popdown(popup);
	else 
		XBell(XtDisplay(w), 50);
}


/* configure buttons */
#define MINTIMEOUT	30000	/* 1/2 min */

extern Widget	load1_sc, load2_sc;

settimeoutFor(str)
char	*str;
{
	newTimes = (unsigned long) (parsetime(str) * 1000);
	if (newTimes > MINTIMEOUT) 
		timeoutFor = newTimes;
}
		
/* ARGSUSED */
void config_OK(w, client_data, call_data)
Widget	w;
caddr_t client_data;
caddr_t call_data;
{
	int	ok = TRUE,
		do_reset_refresh = FALSE,
		do_reset_reconnect = FALSE;
	
	if (newautoRefresh != autoRefresh) {
		autoRefresh = newautoRefresh;
		do_reset_refresh = TRUE;
	}

	newTimes = (unsigned long) (parsetime(config->tuple[REFRESH].str) * 1000);
	
	if (newTimes != timeoutFor) {
		if (newTimes < MINTIMEOUT) {
			/* BEEP */
			timeoutFor = MINTIMEOUT;
			textdisplay(&(config->tuple[REFRESH]), 	
				    unparsetime(timeoutFor / 1000));
			ok = FALSE;
		} else {
			timeoutFor = newTimes;
			do_reset_refresh = TRUE;
		}
		WidgetSet(load1_sc,
			  XtNupdate, (int) (timeoutFor / 2000),
			  NULL);
		WidgetSet(load2_sc,
			  XtNupdate, (int) (timeoutFor / 2000),
			  NULL);

	}
			
	newTimes = (unsigned long) (parsetime(config->tuple[INACTIVE].str) * 1000);
	
	if (newTimes != inactiveFor) 
		inactiveFor = newTimes;
			
	newTimes = (unsigned long) (parsetime(config->tuple[START].str) * 1000);
	
	if (newTimes != connectInit) {
		connectInit = newTimes;
		do_reset_reconnect = TRUE;
	}

	newTimes = (unsigned long) (parsetime(config->tuple[BACKOFF].str) * 1000);
	
	if (newTimes != connectInc) {
		connectInc = newTimes;
		do_reset_reconnect = TRUE;
	}

	newTimes = (unsigned long) (parsetime(config->tuple[CONNECTMAX].str) * 1000);
	
	if (newTimes != connectMax) {
		connectMax = newTimes;
		do_reset_reconnect = TRUE;
	}


	if (newautoReconnect != autoReconnect) {
		autoReconnect = newautoReconnect;
		do_reset_reconnect = TRUE;
	}

	if (newbackoff != backoff) {
		backoff = newbackoff;
		do_reset_reconnect = TRUE;
	}

	if (newconfirm != confirm)
		confirm = newconfirm;
	if (newheur != heuristic)
		heuristic = newheur;
	switch (heuristic) {
	    case percentage:
		if ((newint = atoi(config->tuple[PERCENT].str)) != 0)
			percent = newint;
		if ((newint = atoi(config->tuple[MINBADMTA].str)) != 0)
			lower_bound_mtas = newint;
		break;
	    case line:
		if ((newint = atoi(config->tuple[LINEMAX].str)) != 0)
			max_vert_lines = newint;
		break;
	    default:
		break;
	}
	if (do_reset_refresh == TRUE
	    && connectState == connected) 
		InitRefreshTimeOut((unsigned long) 500);
	if (do_reset_reconnect == TRUE
	    && connectState != connected
	    && userConnected == TRUE) InitConnectTimeOut();
	ResetInactiveTimeout();
	if (ok == TRUE) 
		Popdown(config);
	else
		XBell(XtDisplay(w), 50);

}

extern Popup_menu	*currentpopup,
			*qcontrol;

extern Widget	line_form, percent_form;

/* ARGSUSED */
void heurToggle (w, pheur, call_data)
Widget	w;
Heuristic	*pheur;
caddr_t	call_data;
{
	if (currentpopup != config)
		return;
	switch (*pheur) {
	    case percentage:
		*pheur = line;
		WidgetSet(w,
			  XtNlabel, LINE_BASED,
			  NULL);
		XtSetMappedWhenManaged (line_form, True);
		XtSetMappedWhenManaged (percent_form, False);
		break;

	    case line:
		*pheur = all;
		WidgetSet(w,
			  XtNlabel, ALL_BASED,
			  NULL);
		XtSetMappedWhenManaged (line_form, False);
		XtSetMappedWhenManaged (percent_form, False);
		break;

	    case all:
		*pheur = percentage;
		WidgetSet(w,
			  XtNlabel, PERCENT_BASED,
			  NULL);
		XtSetMappedWhenManaged (line_form, False);
		XtSetMappedWhenManaged (percent_form, True);
		break;
	}
}

extern Widget	auth_toggle;

/* ARGSUSED */
void configToggle(w, pint, call_data)
Widget	w;
int	*pint;
caddr_t	call_data;
{
	if (currentpopup == NULL)
		return;
	if (*pint == TRUE) {
		/* enabled -> disabled */
		*pint = FALSE;	
		WidgetSet(w,
			  XtNlabel, "disabled",
			  NULL);
		if (w == auth_toggle
		    && currentpopup->selected != 0) {

			XtSetKeyboardFocus(top,
					   currentpopup->tuple[0].text);
			XtSetKeyboardFocus(currentpopup->form, 
					   currentpopup->tuple[0].text);
			WidgetSet(currentpopup->tuple[0].text,
				  XtNborderColor, fg,
				  NULL);
			WidgetSet(currentpopup->tuple[currentpopup->selected].text,
				  XtNborderColor, bg,
				  NULL);
			currentpopup->selected = 0;
		}

	} else {
		/* disabled -> enabled */
		*pint = TRUE;
		WidgetSet(w,
			  XtNlabel, "enabled",
			  NULL);
	}
	if (w == auth_toggle)
		SetAuthDisplay(*pint);
	ResetInactiveTimeout();
}

void SetAuthDisplay(bool)
int	bool;
{
	XtSetMappedWhenManaged(connectpopup->tuple[2].label, bool);
	XtSetMappedWhenManaged(connectpopup->tuple[3].label, bool);
	XtSetMappedWhenManaged(connectpopup->tuple[2].text, bool);
	XtSetMappedWhenManaged(connectpopup->tuple[3].text, bool);
	if (bool == TRUE) {
		textdisplay(&(connectpopup->tuple[2]),
			    (username == NULL) ? "" : username);
		password[0] = '\0';
		textdisplay(&(connectpopup->tuple[3]),"");
	}		
}

/* ARGSUSED */
void connectpopup_OK(w, client_data, call_data)
Widget	w;
caddr_t client_data;
caddr_t call_data;
{
	if (newauth != auth) 
		auth = newauth;

	if (connectpopup->tuple[0].str[0] == '\0'
	    || (auth == TRUE && (connectpopup->tuple[2].str[0] == '\0'))) {
		XBell(XtDisplay(w), 50);
		return;
	}

	if (connectpopup->tuple[1].str[0] == '\0')
		tailorfile[0] = '\0';
	else
		strcpy(tailorfile, connectpopup->tuple[1].str);

	if (connectpopup->tuple[2].str[0] != '\0')
		strcpy(username, connectpopup->tuple[2].str);
	fillin_passwdpep(username, password, auth);
	StartWait();
	Connect(connectpopup->tuple[0].str);
	EndWait();
	ResetInactiveTimeout();
	Popdown(connectpopup);
}

/* ARGSUSED */
void QControlPopup(w, op, call_data)
Widget	w;
int	op;
caddr_t	call_data;
{
	int	x,y;
	Window	r_child;
	
	XTranslateCoordinates(XtDisplay(w),XtWindow(w),
			      XDefaultRootWindow(XtDisplay(w)),0,0,&x,&y,
			      &r_child);
	ResetInactiveTimeout();
	Popup(qcontrol, unknown, x, y);
	
}
extern int	msgs_ub;
/* ARGSUSED */
void MsgsShowAll (w, client_data, call_data)
Widget	w;
caddr_t	client_data,
	call_data;
{
	msgs_ub = False;
	control_display_msgs();
	msgs_ub = True;
}

/* ARGSUSED */
void QControl(w, op, call_data)
Widget	w;
int	op;
caddr_t	call_data;
{
	my_invoke(quecontrol, (char **) op);
	ResetInactiveTimeout();
	Popdown(qcontrol);
}

/* \f

 */
extern Widget	channel_commands,
		mta_commands,
		msg_commands,
		qcontrol_command;

SensitizeButtons(bool)
int	bool;
{
	XtSetSensitive(qcontrol_command,bool);
	XtSetSensitive(channel_commands,bool);
	XtSetSensitive(mta_commands,bool);
	XtSetSensitive(msg_commands,bool);
}