⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meter.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)meter.c 1.1 92/07/30 Copyr 1985, 1986, 1987 Sun Micro";#endif/* *	Copyright (c) 1986 by Sun Microsystems Inc. */#include <stdio.h>#include <sys/param.h>#include <sys/time.h>#include <suntool/sunview.h>#include <sunwindow/rect.h>#include <sunwindow/win_input.h>#include <sunwindow/pixwin.h>#include <suntool/icon.h>#include <suntool/frame.h>#include "meter.h"#include "clockhands.h"extern Frame	frame;extern Icon	metericon;/*  * icons for the meters */static unsigned short ricon_data[] = {#include <images/rspeedometer.icon>};static unsigned short icon_data[] = {#include <images/speedometer.icon>};static unsigned short dead_data[] = {#include <images/dead.icon>};static unsigned short sick_data[] = {#include <images/sick.icon>};mpr_static(base_mpr, ICONWIDTH, ICONHEIGHT, 1, icon_data);mpr_static(rbase_mpr, ICONWIDTH, RICONHEIGHT, 1, ricon_data);mpr_static(dbase_mpr, ICONWIDTH, ICONHEIGHT, 1, dead_data);mpr_static(sbase_mpr, ICONWIDTH, ICONHEIGHT, 1, sick_data);char	*sprintf();/* * Repaint the entire meter. * Paint the icon if iconic, otherwise paint the graph. */meter_paint(){	register int i, j, left, right;	register struct meter *mp = &meters[visible];	register int numchars, len;	char name[MAXCHARS];	char host[MAXCHARS];	int iconic;	if (iconic = (int)window_get(frame, FRAME_CLOSED)) {		numchars = NUMCHARS;	} else {		numchars = (width - 1) / PIXELSPERCHAR;		if (numchars >= MAXCHARS)			numchars = MAXCHARS-1;	}	/* 	 * Combine name (left justified) and curmax (right justified).	 */	(void)sprintf(name, "%-*s%d", numchars - ndigits(mp->m_curmax),	    mp->m_name, mp->m_curmax);	if (remote) {		if ((len = strlen(hostname)) > numchars)			len = numchars;		(void)sprintf(host, "%.*s%.*s", (numchars - len)/2,		    "                    ", numchars, hostname);	} 	if (iconic) {		struct pr_prpos where;				/* Set entire icon picture */		if (remote)			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, RICONHEIGHT,			    PIX_SRC, &rbase_mpr, 0, 0);		else			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, ICONHEIGHT,			    PIX_SRC, &base_mpr, 0, 0);		/* Draw dynamic portion */		meter_update();		/* Draw text portion */		where.pr = ic_mpr;		where.pos.x = 2;		where.pos.y = 44; /* baseline of string */		(void)pf_text(where, PIX_SRC, pfont, name);		if (remote) {			where.pos.y = 55; /* baseline of string */			(void)pf_text(where, PIX_SRC|PIX_DST, pfont, host);		}		/* Redraw icon */		tool_display(frame);	} else {		struct rect r;		(void)win_getsize(window_get(frame, WIN_FD), &r);		(void)pw_writebackground(pw, BORDER, BORDER, width, height, PIX_CLR);		(void)pw_text(pw, BORDER, height + BORDER + 7,		    PIX_SRC, pfont, name);		if (remote)			(void)pw_text(pw, BORDER, height + BORDER + NAMEHEIGHT + 7,			    PIX_SRC, pfont, host);		right = scaletograph(save_access(visible, saveptr));		if (right == -1)			goto out;		mp->m_lastval = right;		if ((j = saveptr - 1) < 0)			j = MAXSAVE - 1;		for (i = width - 1; (i > 0) && (j != saveptr); i--) {			left = scaletograph(save_access(visible, j));			if (left == -1)				goto out;			(void)pw_vector(pw, i - 1 + BORDER, left + BORDER,			    i + BORDER, right + BORDER, PIX_SRC, 1);			right = left;			if (--j < 0)				j = MAXSAVE - 1;		}	out:		if (dead)			(void)pw_write(pw, BORDER, BORDER, width, height,				PIX_SRC|PIX_DST, &dbase_mpr, 0, 0);		if (sick)			(void)pw_write(pw, BORDER, BORDER, width, height,				PIX_SRC|PIX_DST, &sbase_mpr, 0, 0);	}}/* * Update the display with the current data points. * If iconic, paint in a new set of hands, otherwise * scroll the graph to the left and add the new data * point. */meter_update(){	register int minutedata, hourdata;	register struct meter *mp = &meters[visible];	register int curmax = mp->m_curmax;	minutedata = getminutedata();	hourdata = gethourdata();	/*	 * If data is off scale, increase max, up to limit of maxmax.	 */	if (minutedata > curmax*FSCALE) {		while (curmax*FSCALE < minutedata && 2*curmax <= mp->m_maxmax)			curmax *= 2;		mp->m_curmax = curmax;		meter_paint();		return;	}	/*	 * If all data on graph is under 1/3 of max, decrease max,	 * to limit of minmax.	 */	if (minutedata < curmax*FSCALE/3)		mp->m_undercnt++;	else		mp->m_undercnt = 0;	if (mp->m_undercnt >= width) {		if (curmax/2 >= mp->m_minmax) {			mp->m_undercnt = 0;			mp->m_curmax /= 2;			meter_paint();			return;		}	}		if ((int)window_get(frame, FRAME_CLOSED)) {		register struct hands *hand;		register int trunc, datatometer;		if (remote)			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, 36,			    PIX_SRC, &rbase_mpr, 0, 0);		else			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, 36,			    PIX_SRC, &base_mpr, 0, 0);		datatometer = curmax*FSCALE/30;		/* short hand displays short average */		trunc = ((hourdata > curmax*FSCALE) ? curmax*FSCALE : hourdata);		hand = &hand_points[(trunc/datatometer + 45) % 60];		(void)pr_vector(ic_mpr, hand->x1, hand->y1,		    hand->hour_x, hand->hour_y, PIX_SET, 1);		(void)pr_vector(ic_mpr, hand->x2, hand->y2,		    hand->hour_x, hand->hour_y, PIX_SET, 1);		/* long hand displays long average */		trunc = ((minutedata > curmax*FSCALE) ? curmax*FSCALE : minutedata);		hand = &hand_points[(trunc/datatometer + 45) % 60];		(void)pr_vector(ic_mpr, hand->x1, hand->y1, hand->min_x, hand->min_y,		    PIX_SET, 1);		(void)pr_vector(ic_mpr, hand->x2, hand->y2, hand->min_x, hand->min_y,		    PIX_SET, 1);		if (dead)			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, 35,				PIX_SRC|PIX_DST, &dbase_mpr, 0, 0);		if (sick)			(void)pr_rop(ic_mpr, 0, 0, ICONWIDTH, 35,				PIX_SRC|PIX_DST, &sbase_mpr, 0, 0);		tool_display(frame);	} else {		register int graphdata;		struct rect r;				if (dead || sick)			return;		graphdata = scaletograph(minutedata);		if (mp->m_lastval == -1)			mp->m_lastval = graphdata;		rect_construct(&r, BORDER, BORDER, width, height);		(void)pw_copy(pw, BORDER, BORDER, width, height,		    PIX_SRC, pw, BORDER+1, BORDER);		/* 		 * Check to see if the source of the copy was obscured.		 */		if (!rl_empty(&pw->pw_fixup)) {			m_set_clipping_equal_fixup();			meter_paint();			(void)pw_exposed(pw);		}		(void)pw_writebackground(pw, width-1+BORDER, BORDER, 1, height,		    PIX_CLR);		(void)pw_vector(pw, width-2+BORDER, BORDER+mp->m_lastval,		    width-1+BORDER, graphdata+BORDER, PIX_SRC, 1);		mp->m_lastval = graphdata;	}}/* * Hack to set the clipping area for the pixwin to be the fixup * area so that later repaint will paint only the area that needs * to be fixed up. * * XXX - there should be a standard way to do this. */m_set_clipping_equal_fixup(){	int screenX, screenY;	struct rect screenrect;	(void)win_getsize(window_get(frame, WIN_FD), &screenrect);	(void)win_getscreenposition(pw->pw_clipdata->pwcd_windowfd,	    &screenX, &screenY);	screenrect.r_left = screenX;	screenrect.r_top = screenY;	(void)rl_free(&pw->pw_clipdata->pwcd_clipping);	pw->pw_clipdata->pwcd_clipping = pw->pw_fixup;	pw->pw_fixup = rl_null;	(void)_pw_setclippers(pw, &screenrect);}/* * Scale data value to graph value. */scaletograph(x)	int x;{		if (x == -1)		/* to detect end of data */		return (-1);	if (x > meters[visible].m_curmax*FSCALE)		return (0);	else {		/* should round */		return ((height-1) - (x*(height-1)) /		    (FSCALE * meters[visible].m_curmax));	}}/* * How many digits are required to display n? */ndigits(n)	register int n;{	register int cnt = 1;		if (n < 0) {		n = -n;		cnt++;	}	while (n >= 10) {		n /= 10;		cnt++;	}	return (cnt);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -