X386MON part 05/06

Warren Tucker wht at n4hgf.Mt-Park.GA.US
Sun Feb 17 06:35:54 AEST 1991


Submitted-by: wht at n4hgf
Archive-name: x386monx100/part05

#!/bin/sh
# This is part 05 of x386monx100
# ============= x386mon/tune.c ==============
if test ! -d 'x386mon'; then
    echo 'x - creating directory x386mon'
    mkdir 'x386mon'
fi
if test -f 'x386mon/tune.c' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/tune.c (File already exists)'
else
echo 'x - extracting x386mon/tune.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/tune.c' &&
X/*+-------------------------------------------------------------------------
X	tune.c - X386MON tune struct display
X	wht at n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	draw_Tune(x,y)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include "unixincs.h"
X#if defined(mips)
X#define t_gpgsmsk  t_gpgslmsk
X#endif
X#define WANT_MON_EXTERNS
X#include "x386mon.h"
X#include "buttons.h"
X#include "utoa.h"
X#include "disp_info.h"
X
Xstatic int line_style = LineSolid;
Xstatic int cap_style = CapButt;
Xstatic int join_style = JoinMiter;
X
X/*+-------------------------------------------------------------------------
X	draw_Tune(x,y)
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_Tune(x,y)
Xint x;
Xint y;
X{
Xregister itmp;
Xchar *cptr;
Xchar s32[32];
Xint fwidth = FWIDTH;
Xint fheight = FHEIGHT;
Xint len;
Xint x2 = x;
Xint yl1 = y + (FASCENT / 2);
Xint yl2 = y + (fheight / 2) - 1;
Xint ys  = y + FASCENT;
X
X	switch(current_display_mode)
X	{
X		case BUTTON_main:
X			break;
X		default:
X			return;
X	}
X
X	if(DrawAreaXYWH.height < (y + (fheight * 2)))
X		return;
X
X	cptr = "---Tune----------";
X	len = strlen(cptr);
X	/* the "background" bar */
X	XSetForeground(display,gc,colorSlate.pixel);
X	XSetLineAttributes(display,gc,fheight,line_style,cap_style,join_style);
X	XDrawLine(display,window,gc, x,yl1, x + (len * fwidth),yl1);
X
X	/* draw the black line before "Tune" */
X	XSetForeground(display,gc,foreground);
X	XSetLineAttributes(display,gc,FASCENT / 2,line_style,cap_style,join_style);
X	XDrawLine(display,window,gc,
X		x2,yl1,
X		x2 + (len = (fwidth * 3)) - FGAP,yl1);
X	x2 += len;
X
X	/* draw "Tune" */
X	cptr = "Tune";
X	XDrawString(display,window,gc, x2,  ys, cptr,len = strlen(cptr));
X	XDrawString(display,window,gc, x2+1,ys, cptr,len);
X	x2 += fwidth * len;
X
X	/* draw the black line after "Tune" */
X	XDrawLine(display,window,gc,
X		x2 + FGAP + 1,yl1,
X		x2 + (len = (fwidth * 10)),yl1);
X	y += fheight;
X
X#ifdef	SVR32
X	disp_static_int(x,y,"t_ageintvl  ",5,tune.t_ageinterval);
X	y += fheight;
X#endif
X	disp_static_int(x,y,"t_bdflushr  ",5,tune.t_bdflushr);
X	y += fheight;
X	disp_static_int(x,y,"t_gpgshi    ",5,tune.t_gpgshi);
X	y += fheight;
X	disp_static_int(x,y,"t_gpgslo    ",5,tune.t_gpgslo);
X	y += fheight;
X	strcpy(s32,"t_gpgsmsk   0x");
X	ultoxa(s32 + strlen(s32),3,tune.t_gpgsmsk);
X	disp_static_text(x,y,s32);
X	y += fheight;
X	disp_static_int(x,y,"t_maxfc     ",5,tune.t_maxfc);
X	y += fheight;
X	disp_static_int(x,y,"t_maxsc     ",5,tune.t_maxsc);
X	y += fheight;
X	disp_static_int(x,y,"t_maxumem   ",5,tune.t_maxumem);
X	y += fheight;
X	disp_static_int(x,y,"t_minarmem  ",5,tune.t_minarmem);
X	y += fheight;
X	disp_static_int(x,y,"t_minasmem  ",5,tune.t_minasmem);
X	y += fheight;
X
X}	/* end of draw_Tune */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of tune.c */
SHAR_EOF
chmod 0644 x386mon/tune.c ||
echo 'restore of x386mon/tune.c failed'
Wc_c="`wc -c < 'x386mon/tune.c'`"
test 2851 -eq "$Wc_c" ||
	echo 'x386mon/tune.c: original size 2851, current size' "$Wc_c"
fi
# ============= x386mon/unixincs.h ==============
if test -f 'x386mon/unixincs.h' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/unixincs.h (File already exists)'
else
echo 'x - extracting x386mon/unixincs.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/unixincs.h' &&
X
X/*+-------------------------------------------------------------------------
X	unixincs.h
X	wht at n4hgf.Mt-Park.GA.US
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include <stdio.h>
X#include <ctype.h>
X#include <signal.h>
X#include <string.h>
X#include <malloc.h>
X#include <fcntl.h>
X#include <nlist.h>
X#include <time.h>
X#include <sys/errno.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X#include <sys/lock.h>
X#include <sys/utsname.h>
X#include <sys/stat.h>
X#include <sys/ascii.h>
X#undef NGROUPS_MAX
X#undef NULL
X#include <sys/param.h>
X#include <sys/bootinfo.h>
X#include <sys/tuneable.h>
X#include <sys/sysinfo.h>
X#include <sys/sysmacros.h>
X#include <sys/immu.h>
X#include <sys/region.h>
X#include <sys/proc.h>
X#include <sys/var.h>
X#include <sys/sysi86.h>
X#include <sys/swap.h>
X#include <sys/trap.h>
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of unixincs.h */
SHAR_EOF
chmod 0644 x386mon/unixincs.h ||
echo 'restore of x386mon/unixincs.h failed'
Wc_c="`wc -c < 'x386mon/unixincs.h'`"
test 961 -eq "$Wc_c" ||
	echo 'x386mon/unixincs.h: original size 961, current size' "$Wc_c"
fi
# ============= x386mon/util.c ==============
if test -f 'x386mon/util.c' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/util.c (File already exists)'
else
echo 'x - extracting x386mon/util.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/util.c' &&
X/*+-------------------------------------------------------------------------
X	util.c - X386MON utility functions
X	wht at n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	basename(fullname)
X	get_elapsed_time(elapsed_seconds)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include <sys/types.h>
X
X/*+-------------------------------------------------------------------------
X	basename(fullname) - strip directory name from filename
X
Xreturns address of static string
X--------------------------------------------------------------------------*/
Xchar *
Xbasename(fullname)
Xchar *fullname;
X{
Xregister char *start;
Xstatic char outstr[256];
Xchar *strrchr();
X
X	start = strrchr(fullname,'/'); /* find last slash */
X	if(!start)
X		return(fullname);
X	start++;
X	strcpy(outstr,start);
X	return(outstr);
X}	/* end of basename */
X
X/*+-----------------------------------------------------------------------
X	char *get_elapsed_time(elapsed_seconds) - "ddd+hh:mm:ss" returned
X  static string address is returned
X------------------------------------------------------------------------*/
Xchar *
Xget_elapsed_time(elapsed_seconds)
Xtime_t elapsed_seconds;
X{
Xstatic char elapsed_time_str[32];
Xtime_t dd,hh,mm,ss;
X
X	dd = 0;
X	hh = elapsed_seconds / 3600;
X	if(hh > 24)
X	{
X		dd = hh / 24;
X		elapsed_seconds -= dd * 3600 * 24;
X		hh %= 24;
X	}
X	elapsed_seconds -= hh * 3600;
X	mm = elapsed_seconds / 60L;
X	elapsed_seconds -= mm * 60L;
X	ss = elapsed_seconds;
X
X	if(dd)
X		(void)sprintf(elapsed_time_str,"%3ld+%02ld:%02ld:%02ld",dd,hh,mm,ss);
X	else
X		(void)sprintf(elapsed_time_str,"    %2ld:%02ld:%02ld",hh,mm,ss);
X	return(elapsed_time_str);
X}	/* end of get_elapsed_time */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of util.c */
SHAR_EOF
chmod 0644 x386mon/util.c ||
echo 'restore of x386mon/util.c failed'
Wc_c="`wc -c < 'x386mon/util.c'`"
test 1791 -eq "$Wc_c" ||
	echo 'x386mon/util.c: original size 1791, current size' "$Wc_c"
fi
# ============= x386mon/utoa.c ==============
if test -f 'x386mon/utoa.c' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/utoa.c (File already exists)'
else
echo 'x - extracting x386mon/utoa.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/utoa.c' &&
X/* CHK=0xDD15 */
X/*+-------------------------------------------------------------------------
X	utoa.c - fast substitutes for most sprintf needs
X	wht at n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	utoda_common(buf,width,n,leading)
X	utoxa_common(buf,width,n,leading)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include "utoa.h"
X
X/*+-------------------------------------------------------------------------
X	utoda_common(buf,width,n,leading) unsigned to decimal ascii
X--------------------------------------------------------------------------*/
Xvoid
Xutoda_common(buf,width,n,leading)
Xchar *buf;
Xint width;
Xunsigned long n;
Xchar leading;
X{
X	register unsigned div;
X	register char *ep = &buf[width];
X
X	*ep = '\0';
X	if(n == 0)
X		*--ep = '0';
X	while(ep-- > buf)
X	{
X		if(n <= 0)
X			*ep = leading;
X		else
X		{
X			div = n / 10;
X			*ep = n - 10*div + '0';
X			n = div;
X		}
X	}
X}	/* end of utoda_common */
X
X/*+-------------------------------------------------------------------------
X	utoxa_common(buf,width,n,leading) unsigned to octal ascii
X--------------------------------------------------------------------------*/
Xvoid
Xutoxa_common(buf,width,n,leading)
Xchar *buf;
Xint width;
Xunsigned long n;
Xchar leading;
X{
Xregister unsigned div;
Xregister char *ep = &buf[width];
Xstatic char hexchars[] = "0123456789ABCDEF";
X
X	*ep = '\0';
X	if(n == 0)
X		*--ep = '0';
X	while(ep-- > buf)
X	{
X		if(n <= 0)
X			*ep = leading;
X		else
X		{
X			div = n >> 4;
X			*ep = hexchars[n - (div << 4)];
X			n = div;
X		}
X	}
X}	/* end of utoxa_common */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of utoa.c */
SHAR_EOF
chmod 0644 x386mon/utoa.c ||
echo 'restore of x386mon/utoa.c failed'
Wc_c="`wc -c < 'x386mon/utoa.c'`"
test 1669 -eq "$Wc_c" ||
	echo 'x386mon/utoa.c: original size 1669, current size' "$Wc_c"
fi
# ============= x386mon/utoa.h ==============
if test -f 'x386mon/utoa.h' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/utoa.h (File already exists)'
else
echo 'x - extracting x386mon/utoa.h (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/utoa.h' &&
X/* CHK=0x3B34 */
X/*+-----------------------------------------------------------------------
X	utoa.h
X	wht at n4hgf.Mt-Park.GA.US
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X/* unsigned to decimal ascii w/ leading spaces */
X#define utoda(b,w,n) utoda_common((b),(w),(unsigned long)(n),' ')
X#define ultoda(b,w,n)  utoda_common((b),(w),n,' ')
X
X/* unsigned to decimal ascii w/leading zeroes */
X#define utoda_lz(b,w,n)  utoda_common((b),(w),(unsigned long)(n),'0')
X#define ultoda_lz(b,w,n)  utoda_common((b),(w),(n),'0')
X
X/* unsigned to hexadecimal ascii w/ leading spaces */
X#define utoxa(b,w,n)  utoxa_common((b),(w),(unsigned long)(n),' ')
X#define ultoxa(b,w,n)  utoxa_common((b),(w),(n),' ')
X
X/* unsigned to hexadecimal ascii w/leading zeroes */
X#define utoxa_lz(b,w,n)  utoxa_common((b),(w),(unsigned long)(n),'0')
X#define ultoxa_lz(b,w,n)  utoxa_common((b),(w),(n),'0')
X
X#ifndef BUILDING_PROTOTYPES
X#ifdef __STDC__
X/* utoa.c */
Xvoid utoda_common(char *,int ,unsigned long ,char );
Xvoid utoxa_common(char *,int ,unsigned long ,char );
X#else		/* compiler doesn't know about prototyping */
X/* utoa.c */
Xvoid utoda_common();
Xvoid utoxa_common();
X#endif /* __STDC__ */
X#endif /* BUILDING_PROTOTYPES */
X
X/* end of utoa.h */
SHAR_EOF
chmod 0644 x386mon/utoa.h ||
echo 'restore of x386mon/utoa.h failed'
Wc_c="`wc -c < 'x386mon/utoa.h'`"
test 1322 -eq "$Wc_c" ||
	echo 'x386mon/utoa.h: original size 1322, current size' "$Wc_c"
fi
# ============= x386mon/var.c ==============
if test -f 'x386mon/var.c' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/var.c (File already exists)'
else
echo 'x - extracting x386mon/var.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/var.c' &&
X/*+-------------------------------------------------------------------------
X	var.c - X386MON var struct handler
X	wht at n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	draw_Var(x,y)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include "unixincs.h"
X#define WANT_MON_EXTERNS
X#include "x386mon.h"
X#include "buttons.h"
X#include "disp_info.h"
X
Xstatic int line_style = LineSolid;
Xstatic int cap_style = CapButt;
Xstatic int join_style = JoinMiter;
X
X/*+-------------------------------------------------------------------------
X	draw_Var(x,y)
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_Var(x,y)
Xint y;
Xint x;
X{
Xregister itmp;
Xchar *cptr;
Xchar s80[80];
Xint fwidth = FWIDTH;
Xint fheight = FHEIGHT;
Xint len;
Xint x2 = x;
Xint yl1 = y + (FASCENT / 2);
Xint yl2 = y + (FHEIGHT / 2) - 1;
Xint ys  = y + FASCENT;
X
X	switch(current_display_mode)
X	{
X		case BUTTON_main:
X			break;
X		default:
X			return;
X	}
X
X	if(DrawAreaXYWH.height < (y + (fheight * 2)))
X		return;
X
X	cptr = "---Var----------";
X	len = strlen(cptr);
X	/* the "background" bar */
X	XSetForeground(display,gc,colorSlate.pixel);
X	XSetLineAttributes(display,gc,fheight,line_style,cap_style,join_style);
X	XDrawLine(display,window,gc, x,yl1, x + (len * fwidth),yl1);
X
X	/* draw the black line before "Var" */
X	XSetForeground(display,gc,foreground);
X	XSetLineAttributes(display,gc,FASCENT / 2,line_style,cap_style,join_style);
X	XDrawLine(display,window,gc,
X		x2,yl1,
X		x2 + (len = (fwidth * 3)) - FGAP,yl1);
X	x2 += len;
X
X	/* draw "Var" */
X	cptr = "Var";
X	XDrawString(display,window,gc, x2,  ys, cptr,len = strlen(cptr));
X	XDrawString(display,window,gc, x2+1,ys, cptr,len = strlen(cptr));
X	x2 += fwidth * len;
X
X	/* draw the black line after "Var" */
X	XDrawLine(display,window,gc,
X		x2 + FGAP + 1,yl1,
X		x2 + (len = (fwidth * 10)),yl1);
X	y += fheight;
X
X	disp_static_int(x,y,"v_autoup   ",5,v.v_autoup);
X	y += fheight;
X	disp_static_int(x,y,"v_buf      ",5,v.v_buf);
X	y += fheight;
X	disp_static_int(x,y,"v_clist    ",5,v.v_clist);
X	y += fheight;
X	disp_static_int(x,y,"v_file     ",5,v.v_file);
X	y += fheight;
X	disp_static_int(x,y,"v_hbuf     ",5,v.v_hbuf);
X	y += fheight;
X	disp_static_int(x,y,"v_inode    ",5,v.v_inode);
X	y += fheight;
X	disp_static_int(x,y,"v_maxpmem  ",5,v.v_maxpmem);
X	y += fheight;
X	disp_static_int(x,y,"v_maxup    ",5,v.v_maxup);
X	y += fheight;
X	disp_static_int(x,y,"v_mount    ",5,v.v_mount);
X	y += fheight;
X	disp_static_int(x,y,"v_pbuf     ",5,v.v_pbuf);
X	y += fheight;
X	disp_static_int(x,y,"v_proc     ",5,v.v_proc);
X	y += fheight;
X	disp_static_int(x,y,"v_region   ",5,v.v_region);
X	y += fheight;
X	disp_static_int(x,y,"v_vhndfrac ",5,v.v_vhndfrac);
X
X}	/* end of draw_Var */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of var.c */
SHAR_EOF
chmod 0644 x386mon/var.c ||
echo 'restore of x386mon/var.c failed'
Wc_c="`wc -c < 'x386mon/var.c'`"
test 2829 -eq "$Wc_c" ||
	echo 'x386mon/var.c: original size 2829, current size' "$Wc_c"
fi
# ============= x386mon/x386mon.c ==============
if test -f 'x386mon/x386mon.c' -a X"$1" != X"-c"; then
	echo 'x - skipping x386mon/x386mon.c (File already exists)'
else
echo 'x - extracting x386mon/x386mon.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'x386mon/x386mon.c' &&
Xchar *revision = "x1.00";
X/*+-------------------------------------------------------------------------
X	x386mon.c - SCO ODT (UNIX 386) system watcher
X	wht at n4hgf.Mt-Park.GA.US
X
X  Defined functions:
X	calc_cpu_avg(per_state)
X	calc_wait_avg(per_state)
X	delta_StatCycle(delta_msec)
X	draw_display()
X	draw_lower_main_statics()
X	entry_callback(widget,client_data,call_data)
X	expose_callback(widget,client_data,call_data)
X	get_cpu_avg(cpu_ticks,period)
X	get_wait_avg(wait_ticks,period)
X	input_callback(widget,client_data,call_data)
X	input_callback_key_event(widget,client_data,call_data)
X	main(argc,argv)
X	quit_now()
X	read_sysinfo_and_minfo()
X	resize_callback(widget,client_data,call_data)
X	set_display_mode(new_mode)
X	set_update_timer()
X	update_StatCycle()
X	update_StatPeriod()
X	update_Tod()
X	update_display(read_new_kernel_data)
X	update_timer_proc(client_data)
X
XAll of the Motif dependencies appear in this module; the rest of
Xthe code is Xlib or {private widget,conservative use of Xt} only
XSome hacking will be necessary on the Button widget to un-Motifize
Xit, like changing 'Primitive' to 'Simple' or the like
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:01-12-1991-04:35-wht at n4hgf-x1.00 (flush old edit notes) */
X
X#include "unixincs.h"
X#define WANT_MON_EXTERNS
X#include "x386mon.h"
X#include <X11/StringDefs.h>
X#include <X11/Shell.h>
X#include <Xm/DrawingA.h>
X#include "nlsym.h"
X#include "libkmem.h"
X#include "libmem.h"
X#include "libswap.h"
X#include "libnlsym.h"
X#include "scales.h"
X#include "buttons.h"
X#include "utoa.h"
X
Xchar *basename();
Xvoid quit_now();
X
Xextern XtWorkProcId ps_WorkProc_ID;
X
XXtAppContext appcon;
XWidget AppShellW;
XWidget DrawAreaW;
XXWindowAttributes DrawAreaXYWH;
XDisplay *display;
XWindow window = 0;
Xint screen;
Xint display_width;
Xint display_height;
XGC gc;
XColormap cmap;
Xint redrawing_entire_DrawArea = 1;
Xchar DrawArea_title[128];
XXtIntervalId update_timer_ID = (XtIntervalId)0;
Xchar *make_taller_to_restore_Ps = "make taller to restore PS";
Xchar *make_taller_for_Ps        = "make taller for PS display";
X
XMyResources res;
X
Xchar preferred_geom[64] = "";
X
X#define offset(field) XtOffset(MyResources *, field)
Xstatic XtResource appResources[] = 
X{
X  {"geometry",         "Geometry",              XtRString,    sizeof(char *),
X                       offset(geometry),        XtRString,    preferred_geom },
X
X  {"font",             "Font",                  XtRString,    sizeof(char *),
X                       offset(font),            XtRString,    "6x10" },
X
X  {"background",       "Background",            XtRString,    sizeof(char *),
X                       offset(background),      XtRString,    "black" },
X
X  {"foreground",       "Foreground",            XtRString,    sizeof(char *),
X                       offset(foreground),      XtRString,    "black" },
X
X  {"busyWarningThreshhold","WarningThreshhold", XtRInt,       sizeof(int),
X              offset(busyWarningThreshhold),    XtRString,    "70" },
X
X  {"busyAlarmThreshhold","AlarmThreshhold",     XtRInt,       sizeof(int),
X              offset(busyAlarmThreshhold),      XtRString,    "90" },
X
X  {"breakWarningThreshhold","WarningThreshhold",XtRInt,       sizeof(int),
X              offset(breakWarningThreshhold),   XtRString,    "2" },
X
X  {"breakAlarmThreshhold","AlarmThreshhold",    XtRInt,       sizeof(int),
X              offset(breakAlarmThreshhold),     XtRString,    "5" },
X
X  {"waitWarningThreshhold","WarningThreshhold", XtRInt,       sizeof(int),
X              offset(waitWarningThreshhold),    XtRString,    "20" },
X
X  {"waitAlarmThreshhold","AlarmThreshhold",     XtRInt,       sizeof(int),
X              offset(waitAlarmThreshhold),      XtRString,    "50" },
X
X  {"swapWarningThreshhold","WarningThreshhold", XtRInt,       sizeof(int),
X               offset(swapWarningThreshhold),   XtRString,    "10" },
X
X  {"swapAlarmThreshhold","AlarmThreshhold",     XtRInt,       sizeof(int),
X               offset(swapAlarmThreshhold),     XtRString,    "20" },
X
X};
X#undef offset
X
Xstatic XrmOptionDescRec optionDescList[] = 
X{
X/* geometry must be first record */
X  {"-geometry", "*geometry",               XrmoptionSepArg,  (caddr_t)0},
X  {"-fg",       "*foreground",             XrmoptionSepArg,  (caddr_t)0},
X  {"-bg",       "*background",             XrmoptionSepArg,  (caddr_t)0},
X  {"-fn",       "*font",                   XrmoptionSepArg,  (caddr_t)0},
X  {"-ms",       "*pointerColor",           XrmoptionSepArg,  (caddr_t)0},
X  {"-bwt",      "*busyWarningThreshhold",  XrmoptionSepArg,  (caddr_t)0},
X  {"-bat",      "*busyAlarmThreshhold",    XrmoptionSepArg,  (caddr_t)0},
X  {"-Bwt",      "*breakWarningThreshhold", XrmoptionSepArg,  (caddr_t)0},
X  {"-Bat",      "*breakAlarmThreshhold",   XrmoptionSepArg,  (caddr_t)0},
X  {"-wwt",      "*waitWarningThreshhold",  XrmoptionSepArg,  (caddr_t)0},
X  {"-wat",      "*waitAlarmThreshhold",    XrmoptionSepArg,  (caddr_t)0},
X  {"-swt",      "*swapWarningThreshhold",  XrmoptionSepArg,  (caddr_t)0},
X  {"-sat",      "*swapAlarmThreshhold",    XrmoptionSepArg,  (caddr_t)0},
X};
X
Xtypedef struct myusagelist
X{
X  char *opt;
X  char *desc;
X} MyUsageList;
X
Xstatic MyUsageList usage_list[] =
X{
X  { "-help",                 "print out this message" },
X  { "-display displayname",  "X server to contact" },
X  { "-geometry geom",        "size (in characters) and position" },
X  { "-bg color",             "background color" },
X  { "-fg color",             "foreground color" },
X  { "-iconic",               "start iconic" },
X  { "-bd color",             "border color" },
X  { "-bw number",            "border width in pixels" },
X  { "-fn fontname",          "normal text font" },
X  { "-uc color",             "user CPU percentage scale color" },
X  { "-kc color",             "kernel CPU percentage scale color" },
X  { "-bc color",             "break CPU percentage scale color" },
X  { "-ic color",             "(block) I/O wait percentage scale color" },
X  { "-pc color",             "physical I/O wait percentage scale color" },
X  { "-sc color",             "swap I/O wait percentage scale color" },
X  { (char *)0, (char *)0 }
X};
X/* "our" stuff */
X
X#define delta_msec(t,t0) ((( t.time * 1000L) +  t.millitm) - \
X                          ((t0.time * 1000L) + t0.millitm))
X
X#define StatCycle_msecDef 2000L
X#define StatCycle_msecMin 1000L
X#define StatCycle_msecMax 4000L
X
Xunsigned long StatCycle_msec = StatCycle_msecDef;
X
Xstruct sysinfo sysinfo;
Xstruct sysinfo sysinfo_last;
X
Xstruct minfo minfo;
Xstruct minfo minfo_last;
X
X#if defined(HAS_BOOTINFO)
Xstruct bootinfo bootinfo;
X#endif
X
Xswpt_t swaptab [MSFILES];
Xswpi_t swapint = {SI_LIST, (char *)swaptab};
Xstruct tune tune;
Xstruct utsname utsname;
Xstruct var v;
X
Xstruct timeb timeb_cycle_start;
Xstruct timeb timeb_cycle_end;
Xstruct timeb timeb_info_read;
Xstruct timeb timeb_last_info_read;
X
Xint hz;
Xint nswap;	/* seems to be in units of NBPSCTR bytes */
Xint maxmem;
Xint freemem;
Xdaddr_t myreadlen = 0L;
Xint myreadcnt = 0;
Xlong StatPeriod_msec;
Xint current_display_mode = -1;
X
Xint cpu_avg_init = 0;
Xtime_t *cpu_avg[CPU_AVG_MAX];
Xtime_t cpu_ticks[5];
X
Xint wait_avg_init = 0;
Xtime_t *wait_avg[WAIT_AVG_MAX];
Xtime_t wait_ticks[5];
Xint ps_procs_to_display = 0;
X#define PS_X_TOO_BIG  99999
Xint ps_x,ps_y;
Xint fresh_Ps_paint = 1;
X
Xvoid caught_signal();
X
X/*+-------------------------------------------------------------------------
X	update_Tod() - show current time
X--------------------------------------------------------------------------*/
Xvoid
Xupdate_Tod()
X{
Xtime_t now;
Xstruct tm *lt;
Xchar tod[12];
Xchar *cptr = tod;
X
X	if(DrawAreaXYWH.width < (DispMsg_tlx + Tod_WIDTH + (FWIDTH * 2)))
X		return;
X
X	(void)time(&now);
X	lt = localtime(&now);
X	utoda_lz(cptr,2,lt->tm_hour);
X	cptr += 2;
X	*cptr++ = ':';
X	utoda_lz(cptr,2,lt->tm_min);
X	cptr += 2;
X	*cptr++ = ':';
X	utoda_lz(cptr,2,lt->tm_sec);
X	cptr += 2;
X	*cptr = 0;
X	XClearArea(display,window,Tod_TLX,Tod_TLY,FWIDTH * 8,FHEIGHT,0);
X	XSetForeground(display,gc,colorCyan.pixel);
X	XDrawString(display,window,gc,Tod_TLX,Tod_TLY + FASCENT,tod,8);
X
X}	/* end of update_Tod */
X
X/*+-------------------------------------------------------------------------
X	update_StatPeriod() - show time since last update
X--------------------------------------------------------------------------*/
Xvoid
Xupdate_StatPeriod()
X{
Xunsigned long pixel = colorGreen.pixel;
Xchar msecstr[32];
Xint pct = (StatPeriod_msec * 100) / StatCycle_msec;
X
X	if(DrawAreaXYWH.width <
X		(DispMsg_tlx + StatPeriod_WIDTH + Tod_WIDTH + (FWIDTH * 2)))
X	{
X		return;
X	}
X
X	if(StatPeriod_msec < 50)
X		strcpy(msecstr,"--------");
X	else
X	{
X		ultoda(msecstr,7,StatPeriod_msec);
X		strcat(msecstr,"ms");
X	}
X
X	XClearArea(display,window,
X		StatPeriod_TLX,StatPeriod_TLY,FWIDTH * 8,FHEIGHT,0);
X	if(pct < 20)
X		pixel = colorSlate.pixel;
X	else if(pct < 80)
X		pixel = colorOrange.pixel;
X	else if((pct > 200) || ((StatPeriod_msec - StatCycle_msec) > 3000L))
X		pixel = colorRed.pixel;
X	else if((pct > 150) || ((StatPeriod_msec - StatCycle_msec) > 2000L))
X		pixel = colorYellow.pixel;
X	XSetForeground(display,gc,pixel);
X	XDrawString(display,window,gc,
X		StatPeriod_TLX,StatPeriod_TLY + FASCENT,msecstr,strlen(msecstr));
X
X}	/* end of update_StatPeriod */
X
X/*+-------------------------------------------------------------------------
X	update_StatCycle() - show planned time between updates
X--------------------------------------------------------------------------*/
Xvoid
Xupdate_StatCycle()
X{
Xchar msecstr[32];
Xint pct = (StatCycle_msec * 100) / StatCycle_msec;
X
X	if(DrawAreaXYWH.width <
X		(DispMsg_tlx + StatCycle_WIDTH + StatPeriod_WIDTH +
X		 Tod_WIDTH + (FWIDTH * 4)))
X	{
X		return;
X	}
X
X	ultoda(msecstr,6,StatCycle_msec);
X	strcat(msecstr,"ms");
X	XClearArea(display,window,
X		StatCycle_TLX,StatCycle_TLY,FWIDTH * 8,FHEIGHT,0);
X	XSetForeground(display,gc,colorBlue.pixel);
X	XDrawString(display,window,gc,
X		StatCycle_TLX,StatCycle_TLY + FASCENT,msecstr,strlen(msecstr));
X
X}	/* end of update_StatCycle */
X
X/*+-------------------------------------------------------------------------
X	calc_cpu_avg(per_state) - add per_state array to avg array
X--------------------------------------------------------------------------*/
Xvoid
Xcalc_cpu_avg(per_state)
Xtime_t per_state[];
X{
Xregister itmp;
X
X	if(!cpu_avg_init)
X	{
X		for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
X			(void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
X		cpu_avg_init = 1;
X	}
X	else
X	{
X		for(itmp = 0; itmp < CPU_AVG_MAX - 1; itmp++)
X			(void)memcpy(cpu_avg[itmp],cpu_avg[itmp + 1],sizeof(time_t) * 5);
X		(void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
X	}
X
X}	/* end of calc_cpu_avg */
X
X/*+-------------------------------------------------------------------------
X	get_cpu_avg(cpu_ticks,period)
X--------------------------------------------------------------------------*/
Xget_cpu_avg(cpu_ticks,period)
Xtime_t cpu_ticks[];
Xint period;
X{
Xregister iperiod = CPU_AVG_MAX;
Xregister istate;
Xregister count = period;
X
X	for(istate = 0; istate < 5; istate++)
X		cpu_ticks[istate] = 0;
X
X	while(count--)
X	{
X		iperiod--;
X		for(istate = 0; istate < 5; istate++)
X			cpu_ticks[istate] += (cpu_avg[iperiod])[istate];
X	}
X
X	for(istate = 0; istate < 5; istate++)
X		cpu_ticks[istate] /= period;
X
X}	/* end of get_cpu_avg */
X
X/*+-------------------------------------------------------------------------
X	calc_wait_avg(per_state) - add per_state array to avg array
X--------------------------------------------------------------------------*/
Xvoid
Xcalc_wait_avg(per_state)
Xtime_t per_state[];
X{
Xregister itmp;
X
X	if(!wait_avg_init)
X	{
X		for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
X			(void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
X		wait_avg_init = 1;
X	}
X	else
X	{
X		for(itmp = 0; itmp < WAIT_AVG_MAX - 1; itmp++)
X			(void)memcpy(wait_avg[itmp],wait_avg[itmp + 1],sizeof(time_t) * 3);
X		(void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
X	}
X
X}	/* end of calc_wait_avg */
X
X/*+-------------------------------------------------------------------------
X	get_wait_avg(wait_ticks,period)
X--------------------------------------------------------------------------*/
Xget_wait_avg(wait_ticks,period)
Xtime_t wait_ticks[];
Xint period;
X{
Xregister iperiod = WAIT_AVG_MAX;
Xregister istate;
Xregister count = period;
X
X	for(istate = 0; istate < 3; istate++)
X		wait_ticks[istate] = 0;
X
X	while(count--)
X	{
X		iperiod--;
X		for(istate = 0; istate < 3; istate++)
X		{
X			wait_ticks[istate] += (wait_avg[iperiod])[istate];
X		}
X	}
X
X	for(istate = 0; istate < 3; istate++)
X		wait_ticks[istate] /= period;
X
X}	/* end of get_wait_avg */
X
X/*+-------------------------------------------------------------------------
X	draw_lower_main_statics() - draw lower main static portion
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_lower_main_statics()
X{
X
X	draw_Var(Var_TLX,Var_TLY);
X#if defined(HAS_BOOTINFO)
X	draw_Bootinfo(Bootinfo_TLX,Bootinfo_TLY);
X#endif
X	draw_Tune(Tune_TLX,Tune_TLY);
X}	/* end of draw_lower_main_statics */
X
X/*+-------------------------------------------------------------------------
X	read_sysinfo_and_minfo() - rattle kmem for sysinfo/minfo data
X--------------------------------------------------------------------------*/
Xvoid
Xread_sysinfo_and_minfo()
X{
X	timeb_last_info_read = timeb_info_read;
X	(void)ftime(&timeb_info_read);
X	kread((caddr_t)&sysinfo,sysinfoaddr,sizeof(sysinfo));
X	kread((caddr_t)&minfo,minfoaddr,sizeof(minfo));
X}	/* end of read_sysinfo_and_minfo */
X
X/*+-------------------------------------------------------------------------
X	update_display(read_new_kernel_data) - update dynamic display
X--------------------------------------------------------------------------*/
Xvoid
Xupdate_display(read_new_kernel_data)
Xint read_new_kernel_data;
X{
Xint itmp;
Xtime_t total_ticks;
X
X	update_Tod();
X
X	if(read_new_kernel_data)
X	{
X		ftime(&timeb_cycle_start);
X		StatPeriod_msec = delta_msec(timeb_info_read,timeb_last_info_read);
X		kread((caddr_t)&freemem,freememaddr,sizeof(freemem));
X		read_sysinfo_and_minfo();
X
X		for (itmp = 0; itmp < 5; itmp++)
X		{
X			if(itmp != CPU_WAIT)
X				cpu_ticks[itmp] = sysidelta(cpu[itmp]);
X		}
X		cpu_ticks[CPU_WAIT] = 0;
X		for (itmp = 0; itmp < 3; itmp++)
X			cpu_ticks[CPU_WAIT] += (wait_ticks[itmp] = sysidelta(wait[itmp]));
X	}
X
X	update_StatPeriod();
X	update_StatCycle();
X
X	total_ticks = update_CpuScale(CpuScale_TLX,
X		CpuScale_TLY + (FHEIGHT * 1),cpu_ticks);
X	update_WaitScale(WaitScale_TLX,
X		WaitScale_TLY + (FHEIGHT * 1),wait_ticks,total_ticks);
X
X	if(read_new_kernel_data)
X	{
X		calc_cpu_avg(cpu_ticks);
X		calc_wait_avg(wait_ticks);
X	}
X
X	get_cpu_avg(cpu_ticks,5);
X	total_ticks = update_CpuScale(CpuScale_TLX,
X		CpuScale_TLY + (FHEIGHT * 2),cpu_ticks);
X	get_wait_avg(wait_ticks,5);
X	update_WaitScale(WaitScale_TLX,
X		WaitScale_TLY + (FHEIGHT * 2),wait_ticks,total_ticks);
X
X	get_cpu_avg(cpu_ticks,10);
X	total_ticks = update_CpuScale(CpuScale_TLX,
X		CpuScale_TLY + (FHEIGHT * 3),cpu_ticks);
X	get_wait_avg(wait_ticks,10);
X	update_WaitScale(WaitScale_TLX,
X		WaitScale_TLY + (FHEIGHT * 3),wait_ticks,total_ticks);
X
X	switch(current_display_mode)
X	{
X		case BUTTON_main:
X			update_Sysinfo();
X			draw_Proc(Proc_TLX,Proc_TLY,redrawing_entire_DrawArea);
X			break;
X
X		case BUTTON_ps:
X			update_Sysinfo();
X			/* fall through */
X
X		case BUTTON_Ps:
X			if(DrawAreaXYWH.height < (ps_y + (FHEIGHT * 2)))
X			{
X				if(ps_y != PS_X_TOO_BIG)
X				{
X					turn_on_MyButton(current_display_mode,colorYellow.pixel);
X					disp_msg(colorOrange.pixel,make_taller_to_restore_Ps);
X					ps_y = PS_X_TOO_BIG;
X				}
X				fresh_Ps_paint = 1;
X				break;
X			}
X			if(fresh_Ps_paint)
X				turn_on_MyButton(current_display_mode,colorCyan.pixel);
X			draw_Ps(ps_x,ps_y,ps_procs_to_display,fresh_Ps_paint);
X			fresh_Ps_paint = 0;
X			break;
X	}
X	redrawing_entire_DrawArea = 0;
X
X	sysinfo_last = sysinfo;
X	minfo_last = minfo;
X
X}	/* end of update_display */
X
X/*+-------------------------------------------------------------------------
X	set_display_mode(new_mode) - select main/ps/Ps
XThis krock betrays the Kludgosity of Affairs
X--------------------------------------------------------------------------*/
Xvoid
Xset_display_mode(new_mode)
Xint new_mode;
X{
Xvoid expose_callback();
Xint old_display_mode = current_display_mode;
Xint clear_y = -1;
X
X	if(new_mode == BUTTON_quit)
X		quit_now();
X
X	if(current_display_mode == new_mode)
X		return;
X
X	switch(old_display_mode)
X	{
X		case BUTTON_main:
X			ps_procs_to_display = 0;
X			switch(new_mode)
X			{
X				case BUTTON_ps:
X					draw_Ps_stop_work_proc();
X					clear_y = ps_y = EXTRA_TLY;
X					break;
X				case BUTTON_Ps:
X					draw_Ps_stop_work_proc();
X					clear_y = Sysinfo_TLY;
X					break;
X			}
X			if(DrawAreaXYWH.height < (clear_y + (FHEIGHT * 3)))
X			{
X				disp_msg(colorRed.pixel,make_taller_for_Ps);
X				return;
X			}
X			ps_y = clear_y;
X			ps_x = 0;
X			ps_procs_to_display = (DrawAreaXYWH.height - ps_y) / FHEIGHT;
X			fresh_Ps_paint = 1;
X			break;
X
X		case BUTTON_ps:
X			draw_Ps_stop_work_proc();
X			switch(new_mode)
X			{
X				case BUTTON_main:
X					clear_y = EXTRA_TLY;
X					break;
X				case BUTTON_Ps:
X					clear_y = Sysinfo_TLY;
X					ps_y = clear_y;
X					fresh_Ps_paint = 1;
X					if(DrawAreaXYWH.height < (ps_y + (FHEIGHT * 2)))
X					{
X						current_display_mode = new_mode;
X						turn_off_MyButton(old_display_mode);
X						turn_on_MyButton(current_display_mode,
X							colorOrange.pixel);
X						disp_msg(colorOrange.pixel,make_taller_to_restore_Ps);
X						ps_y = PS_X_TOO_BIG;
X						return;
X					}
X					break;
X			}
X			break;
X
X		case BUTTON_Ps:
X			draw_Ps_stop_work_proc();
X			clear_y = Sysinfo_TLY;
X			switch(new_mode)
X			{
X				case BUTTON_main:
X					clear_y = Sysinfo_TLY;
X					break;
X				case BUTTON_ps:
X					ps_y = EXTRA_TLY;
X					fresh_Ps_paint = 1;
X					if(DrawAreaXYWH.height < (ps_y + (FHEIGHT * 2)))
X					{
X						current_display_mode = new_mode;
X						turn_off_MyButton(old_display_mode);
X						turn_on_MyButton(current_display_mode,
X							colorOrange.pixel);
X						disp_msg(colorOrange.pixel,make_taller_to_restore_Ps);
X						ps_y = PS_X_TOO_BIG;
X						if(clear_y < DrawAreaXYWH.height)
X						{
X							XClearArea(display,window,0,clear_y,
X								DrawAreaXYWH.width,
X								DrawAreaXYWH.height - clear_y,0);
X							draw_Sysinfo_literals(Sysinfo_TLX,Sysinfo_TLY);
X							redrawing_entire_DrawArea = 1;
X						}
X						return;
X					}
X					break;
X			}
X			break;
X	}
X
X	current_display_mode = new_mode;
X	disp_msg(background,"");
X	if((clear_y > 0) && (clear_y < DrawAreaXYWH.height))
X	{
X		XClearArea(display,window,0,clear_y,
X			DrawAreaXYWH.width,DrawAreaXYWH.height - clear_y,0);
X		expose_callback(DrawAreaW,(caddr_t)0,(caddr_t)0);
X	}
X	else
X	{
X		turn_off_MyButton(old_display_mode);
X		turn_on_MyButton(current_display_mode,colorCyan.pixel);
X	}
X
X}	/* end of set_display_mode */
X
X/*+-------------------------------------------------------------------------
X	draw_display() - draw display literals
X--------------------------------------------------------------------------*/
Xvoid
Xdraw_display()
X{
Xchar *cptr;
X
X	place_MyButtons_all_off();
X	turn_on_MyButton(current_display_mode,colorCyan.pixel);
X	disp_msg(colorBlack.pixel,"");
X
X	XClearArea(display,window,
X		DispMsg_tlx,0,DrawAreaXYWH.width - DispMsg_tlx,FHEIGHT,0);
X#ifdef LABELLED_STAT_TIMES
X	cptr = "sleep:";
X	XSetForeground(display,gc,colorBlue.pixel);
X	XDrawString(display,window,gc,
X		StatCycleL_TLX,StatCycleL_TLY + FASCENT,cptr,strlen(cptr));
X	cptr = "last:";
X	XDrawString(display,window,gc,
X		StatPeriodL_TLX,StatPeriodL_TLY + FASCENT,cptr,strlen(cptr));
X#endif
X
X	draw_CpuScale_literals(CpuScale_TLX,CpuScale_TLY);
X	draw_WaitScale_literals(WaitScale_TLX,WaitScale_TLY);
X
X	ps_y = PS_X_TOO_BIG;	/* shud be MAXPOS or something */
X	ps_procs_to_display = 0;
X
X	switch(current_display_mode)
X	{
X		case BUTTON_main:
X			draw_Sysinfo_literals(Sysinfo_TLX,Sysinfo_TLY);
X			draw_lower_main_statics();
X			break;
X
X		case BUTTON_ps:
X			draw_Sysinfo_literals(Sysinfo_TLX,Sysinfo_TLY);
X			ps_y = EXTRA_TLY;
X			ps_x = 0;
X			fresh_Ps_paint = 1;
X			break;
X
X		case BUTTON_Ps:
X			ps_y = Sysinfo_TLY;
X			ps_x = 0;
X			fresh_Ps_paint = 1;
X			break;
X	}
X
X	if(DrawAreaXYWH.height > (ps_y + (FHEIGHT * 2)))
X	{
X		ps_procs_to_display = (DrawAreaXYWH.height - ps_y) / FHEIGHT;
X		draw_Ps(ps_x,ps_y,ps_procs_to_display,fresh_Ps_paint);
X		fresh_Ps_paint = 0;
X	}
X
X}	/* end of draw_display */
X
X/*+-------------------------------------------------------------------------
X	update_timer_proc(client_data) - "callback" for application timeout
X--------------------------------------------------------------------------*/
Xvoid
Xupdate_timer_proc(client_data)
Xcaddr_t client_data;
X{
Xvoid set_update_timer();
X
X	update_timer_ID = (XtIntervalId)0;
X	if(!ps_WorkProc_ID)
X	{
X		update_display(1);
X		if(!ps_WorkProc_ID)
X			set_update_timer();
X	}
X
X}	/* end of update_timer_proc */
X
X/*+-------------------------------------------------------------------------
X	set_update_timer() - start application timeout for display cycle
X--------------------------------------------------------------------------*/
Xvoid
Xset_update_timer()
X{
X	update_timer_ID = XtAddTimeOut(StatCycle_msec,update_timer_proc,
X		(caddr_t)0);
X}	/* end of set_update_timer */
X
X/*+-------------------------------------------------------------------------
X	expose_callback(widget,client_data,call_data)
X--------------------------------------------------------------------------*/
Xvoid
Xexpose_callback(widget,client_data,call_data)
XWidget widget;
Xcaddr_t client_data;
XXmDrawingAreaCallbackStruct *call_data;
X{
XXExposeEvent *event = (XExposeEvent *)0;
Xstatic int first_expose = 1;
X
X	if(!XtIsRealized(widget))
X		return;
X	if(call_data)
X		event = (XExposeEvent *)call_data->event;
X	if(event && (event->count != 0))
X		return;
X
X	XGetWindowAttributes(display,window,&DrawAreaXYWH);
X
X	choose_MyFont();
X
X	draw_Ps_stop_work_proc();
X	redrawing_entire_DrawArea = 1;
X	draw_display();
X	update_display(1);
X	redrawing_entire_DrawArea = 0;
X	if(first_expose)
X		set_update_timer();
X	first_expose = 0;
X
X}	/* end of expose_callback */
X
X/*+-------------------------------------------------------------------------
X	resize_callback(widget,client_data,call_data)
X--------------------------------------------------------------------------*/
Xvoid
Xresize_callback(widget,client_data,call_data)
XWidget widget;
Xcaddr_t client_data;
XXmDrawingAreaCallbackStruct *call_data;
X{
X
X	XGetWindowAttributes(display,window,&DrawAreaXYWH);
X	invalidate_last_DispMsg();
X
X}	/* end of resize_callback */
X
X/*+-------------------------------------------------------------------------
X	quit_now() - good bye
X--------------------------------------------------------------------------*/
Xvoid
Xquit_now()
X{
X	turn_off_all_MyButtons();
X	turn_on_MyButton(BUTTON_quit,colorRed.pixel);
X	XSync(display,False);
X	sleep(1);
X	leave(0);
X}	/* end of quit_now */
X
X/*+-------------------------------------------------------------------------
X	delta_StatCycle(delta_msec) - user has changed display cycle period
X--------------------------------------------------------------------------*/
Xvoid
Xdelta_StatCycle(delta_msec)
Xunsigned long delta_msec;
X{
Xunsigned long new_msec = StatCycle_msec + delta_msec;
X
X	if((new_msec < StatCycle_msecMin) || (new_msec > StatCycle_msecMax))
X	{
X		fputc(7,stderr);
X		return;
X	}
X	StatCycle_msec = new_msec;
X	update_StatCycle();
X	draw_CpuScale_literals(CpuScale_TLX,CpuScale_TLY);
X	draw_WaitScale_literals(WaitScale_TLX,WaitScale_TLY);
X
X}	/* end of delta_StatCycle */
X
X/*+-------------------------------------------------------------------------
X	input_callback_key_event(widget,client_data,call_data)
X--------------------------------------------------------------------------*/
Xvoid
Xinput_callback_key_event(widget,client_data,call_data)
XWidget widget;
Xcaddr_t client_data;
XXmDrawingAreaCallbackStruct *call_data;
X{
XXKeyEvent *event = (XKeyEvent *)(call_data->event);
Xint numkeys;
XKeySym keysym;
Xunsigned char kbuf[8];
X
X	numkeys = XLookupString(event,kbuf,sizeof(kbuf),
X		&keysym,(XComposeStatus *)0);
X
X	if((event->type == KeyPress) && (numkeys == 1))
X	{
X		switch(kbuf[0])
X		{
X			case 'm': set_display_mode(BUTTON_main); break;
X			case 'p': set_display_mode(BUTTON_ps); break;
X			case 'P': set_display_mode(BUTTON_Ps); break;
X			case '+': delta_StatCycle(+1000L); break;
X			case '-': delta_StatCycle(-1000L); break;
X			case 'q': quit_now();
X				/*NOTREACHED*/
X			default: fputs("\7",stderr);	/* Ackkkkk -- lazy */
X		}
X	}
X
X}	/* end of input_callback_key_event */
X
X/*+-------------------------------------------------------------------------
X	input_callback(widget,client_data,call_data)
X--------------------------------------------------------------------------*/
Xvoid
Xinput_callback(widget,client_data,call_data)
XWidget widget;
Xcaddr_t client_data;
XXmDrawingAreaCallbackStruct *call_data;
X{
X
X	switch (call_data->event->type)
X	{
X		case KeyPress:
X		case KeyRelease:
X			input_callback_key_event(widget,client_data,call_data);
X			break;
X	}
X
X}  /* end of input_callback */
X
X/*+-------------------------------------------------------------------------
X	entry_callback(widget,client_data,call_data)
X--------------------------------------------------------------------------*/
Xvoid
Xentry_callback(widget,client_data,call_data)
XWidget widget;
Xcaddr_t client_data;
XXmDrawingAreaCallbackStruct *call_data;
X{
X
X/*
X	switch(call_data->event->type)
X	{
X	default:
X		return;
X	}
X*/
Xprintf("entry callback evtype=%d\n",call_data->event->type);
X
X}  /* end of entry_callback */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv)
X--------------------------------------------------------------------------*/
Xmain(argc,argv)
Xint argc;
Xchar **argv;
X{
Xint itmp;
Xchar *cptr;
Xint plock_indicator = 0;
XArg args[32];
Xint argcount;
XPosition x = 0;
XPosition y = 0;
XDimension width = DrawArea_DEFAULT_WIDTH;
XDimension height = DrawArea_DEFAULT_HEIGHT;
Xchar *progname = strdup(basename(argv[0]));
Xchar *basename();
X
X/*
X * set default geometry
X */
X	sprintf(preferred_geom,"%dx%d-0-0",width,height);
X
X/*
X * if man wants to plock() try it; fail silently if non-root
X */
X	if(plock_indicator && plock(PROCLOCK))
X	{
X		nice(-5);
X		plock_indicator = 0;
X	}
X
X/*
X * Real(tm) performance watcher users will have done a kernel link
X * and won't need to rely on /etc/systemid
X */
X	if(uname(&utsname))
X	{
X		leave_text("uname failed",255);
X		exit(1);
X	}
X
X/*
X * allocate memory for cpu time array averaging buckets
X */
X	for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
X	{
X		if(!(cpu_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 5)))
X			leave_text("cannot alloc memory for cpu avg arrays",1);
X	}
X
X/*
X * allocate memory for wait time array averaging buckets
X */
X	for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
X	{
X		if(!(wait_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 3)))
X			leave_text("cannot alloc memory for wait avg arrays",1);
X	}
X
X/*
X * read nlist symbols, open /dev/kmem, /dev/mem, /dev/swap,
X * initialize detail environment
X * drop euid and egid (after opening privileged mem/devices)
X * initialize process status uid->name hasher
X */
X	nlsym_read();
X	kinit(0);	/* /dev/kmem, read access only */
X	minit(0);	/* /dev/mem,  read access only */
X	sinit();	/* /dev/swap, only read access available */
X	(void)setuid(getuid());	/* some people run us setuid, so clen that up */
X	(void)setgid(getgid());	/* now that we have the fds open, drop egid */
X
X/*
X * make initial kmem readings
X */
X	hz = (cptr = getenv("HZ")) ? atoi(cptr) : HZ;
X	kread((caddr_t)&maxmem,maxmemaddr,sizeof(maxmem));
X	kread((caddr_t)&tune,tuneaddr,sizeof(tune));
X	kread((caddr_t)&v,vaddr,sizeof(v));
X
X	kread((caddr_t)&nswap,nswapaddr,sizeof(nswap));
X	itmp = -1;
X#if defined(S3BSWPI)	/* 68000 handled here, not AT&T 3B */
X	itmp = _sysm68k (S3BSWPI,&swapint);	/* per nba at sysware.sysware.dk */
X#endif
X#if defined(SI86SWPI)
X	itmp = sysi86(SI86SWPI,&swapint);
X#endif
X#if defined(SMIPSSWPI)
X	itmp = sysmips(SMIPSSWPI,&swapint);
X#endif
X	if(!itmp)
X	{
X		nswap = 0;
X		for (itmp = 0; itmp < MSFILES; itmp++)
X			nswap += swaptab[itmp].st_npgs * NBPP / NBPSCTR;
X	}
X
X#if defined(HAS_BOOTINFO)
X	kread((caddr_t)&bootinfo,bootinfoaddr,sizeof(bootinfo));
X#endif
X	read_sysinfo_and_minfo();
X	sysinfo_last = sysinfo;
X	minfo_last = minfo;
X	timeb_last_info_read = timeb_info_read;
X
X/*
X * XForeplay
X */
X
X	/*
X	 * initialize
X	 */
X	AppShellW = XtInitialize("x386mon","X386mon",
X		optionDescList, XtNumber(optionDescList), &argc, argv);
X
X	XtGetApplicationResources(AppShellW,&res,
X		appResources,XtNumber(appResources),NULL,0);
X
X	appcon = XtWidgetToApplicationContext(AppShellW);
X	display = XtDisplay(AppShellW);
X	screen = DefaultScreen(display);
X	cmap = DefaultColormap(display,screen);
X	gc = DefaultGC(display,screen);
X	display_width  = XDisplayWidth(display,screen);
X	display_height = XDisplayHeight(display,screen);
X
X	itmp = XParseGeometry(res.geometry,
X		&x,&y,&width,&height);
X   /*
X    * Adjust user request to limits
X    */
X
X	if(width < DrawArea_MIN_WIDTH)
X		width = DrawArea_MIN_WIDTH;
X	else if (width > display_width)
X		width = display_width;
X
X	if(height < DrawArea_MIN_HEIGHT)
X		height = DrawArea_MIN_HEIGHT;
X	else if (height > display_height)
X		height = display_height;
X
X   /*
X    * Create the drawing area widget (DrawAreaW)
X    */
X
X	init_MyFonts();
X	init_color();
X
X	argcount = 0;
X	XtSetArg(args[argcount],XmNforeground,(XtArgVal)foreground);
X	argcount++;
X	XtSetArg(args[argcount],XmNbackground,(XtArgVal)background);
X	argcount++;
X	XtSetArg(args[argcount],XmNwidth,(XtArgVal)width);
X	argcount++;
X	XtSetArg(args[argcount],XmNheight,(XtArgVal)height);
X	argcount++;
X	XtSetArg(args[argcount],XmNmarginWidth,(XtArgVal)0);
X	argcount++;
X	XtSetArg(args[argcount],XmNmarginHeight,(XtArgVal)0);
X	argcount++;
X	XtSetArg(args[argcount],XmNresizePolicy,(XtArgVal)XmRESIZE_NONE);
X	argcount++;
X
X	DrawAreaW = XmCreateDrawingArea(AppShellW,"x386mon-draw",
X		args,(Cardinal)argcount);
X	XtManageChild(DrawAreaW);
X
X   /*
X    * Toolkit phone home
X    */
X
X	XtAddCallback(DrawAreaW,XmNexposeCallback,expose_callback,(caddr_t)0);
X	XtAddCallback(DrawAreaW,XmNresizeCallback,resize_callback,(caddr_t)1);
X	XtAddCallback(DrawAreaW,XmNinputCallback,input_callback,(caddr_t)0);
X
X   /*
X    * set title 
X    */
X
X	sprintf(DrawArea_title,
X		"x386mon   %s   (%s)  '+'/'-' change interval  wht at n4hgf",
X		revision,utsname.nodename);
X    XtSetArg(args[0],XtNtitle,DrawArea_title);
X    XtSetValues(AppShellW,args,1);
X
X	/*
X	 * BlapBlit - disturb display
X	 */
X
X	XtRealizeWidget(AppShellW);
X
X	/*
X	 * set up for simple XLib calls for the duration
X	 */
X
X	window = XtWindow(DrawAreaW);
X	XGetWindowAttributes(display,window,&DrawAreaXYWH);
X
X/*
X * nlsym read, first sysinfo/minfo/other-structs read
X * and X started:  init Proc and Ps "objects"
X */
X	initialize_Proc();
X	initialize_Ps();
X
X/*
X * main loop
X */
X	XSynchronize(display,0);  /* <<<<<<<============== */
X	current_display_mode = BUTTON_main;
X
X	XtMainLoop();
X	/*NOTREACHED*/
X
X} /* end of main */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of x386mon.c */
SHAR_EOF
chmod 0644 x386mon/x386mon.c ||
echo 'restore of x386mon/x386mon.c failed'
Wc_c="`wc -c < 'x386mon/x386mon.c'`"
test 30634 -eq "$Wc_c" ||
	echo 'x386mon/x386mon.c: original size 30634, current size' "$Wc_c"
fi
true || echo 'restore of x386mon/x386mon.h failed'
echo End of part 5, continue with part 6
exit 0
 
-----------------------------------------------------------------------
Warren Tucker, TuckerWare   gatech!n4hgf!wht or wht at n4hgf.Mt-Park.GA.US
Many [Nobel physics] prizes  have been given  to people for  telling us
the universe is not as simple as we thought it was. -Stephen Hawking in
A Brief History of Time     In computing, there are no such prizes. -me



More information about the Alt.sources mailing list