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

📄 panel.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)panel.c 1.1 92/07/30 Copyr 1985 Sun Micro";#endif#endif/* * Copyright (c) 1985 by Sun Microsystems, Inc. */#include <stdio.h>#include <netdb.h>#include <sys/types.h>#include <suntool/alert.h>#include <suntool/frame.h>#include <suntool/sunview.h>#include <suntool/panel.h>#include <suntool/canvas.h>#include <suntool/tool_struct.h>	/* TOOL_BORDERWIDTH */#include <sys/socket.h>#include <netinet/in.h>#include <rpcsvc/ether.h>#include "traffic.h"#define HASHNAMESIZE 256struct hnamemem {	int ht_addr;	char *ht_name;	struct hnamemem *ht_nxt;};/*  *  global variables */static struct hnamemem	*htable[HASHNAMESIZE];static int		oldaddrs[MAXSPLIT][NUMNAMES];static char *protoname[NPROTOS] = {		"nd",		"icmp",		"udp",		"tcp",		"arp",		"other"};/*  *  procedure variables */char *getname();/*  *  pixrects */DEFINE_CURSOR(leftbutton, 7, 7, PIX_SRC | PIX_DST,	0x1FF8,0x3FFC,0x336C,0x336C,0x336C,0x336C,0x336C,0x336C,	0x3FFC,0x3FFC,0x3FFC,0x3FFC,0x3FFC,0x3E3C,0x3FFC,0x1FF8);DEFINE_CURSOR(oldcursor, 0, 0, 0,	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);/* ARGSUSED */slider_cycle(item, value, event)	Panel_item item;	struct inputevent *event;{	int j, v;	char buf[20];	j = getpanelnum(horizpanel, item);	if (value == 0) {		panel_set(speed_item1[j], PANEL_SHOW_ITEM, 0, 0);		panel_set(speed_item[j], PANEL_SHOW_ITEM, 1, 0);		v = (int)panel_get_value(speed_item[j]);		sprintf(buf, "  %d.%01d secs", v/10, v%10);		panel_set(speedvalue_item[j], PANEL_LABEL_STRING, buf, 0);	}	else {		panel_set(speed_item[j], PANEL_SHOW_ITEM, 0, 0);		panel_set(speed_item1[j], PANEL_SHOW_ITEM, 1, 0);		sprintf(buf, "  %d secs", panel_get_value(speed_item1[j]));		panel_set(speedvalue_item[j], PANEL_LABEL_STRING, buf, 0);	}}/* ARGSUSED */scale_cycle(item, value, event)	Panel_item item;	struct inputevent *event;{	int j;	j = getpanelnum(horizpanel, item);	traf_absolute[j] = value;	traf_board_init(j);}/* ARGSUSED */speed_slider(item, speed, event)	Panel_item item;	int speed;	struct inputevent *event;{	int j;	char buf[20];		j = getpanelnum(horizpanel, item);	if (win_inputnegevent(event)) {		timeout[j].it_interval.tv_sec = speed/10;		timeout[j].it_interval.tv_usec = (speed%10) * 100000;		timeout[j].it_value.tv_sec = speed/10;		timeout[j].it_value.tv_usec = (speed%10) * 100000;		notify_set_itimer_func(canvas[j], timeout_notify, ITIMER_REAL,		    &timeout[j], 0);	}	sprintf(buf, "  %d.%01d secs", speed/10, speed%10);	panel_set(speedvalue_item[j], PANEL_LABEL_STRING, buf, 0);}/* ARGSUSED */speed1_slider(item, speed, event)	Panel_item item;	int speed;	struct inputevent *event;{	int j;	char buf[20];		j = getpanelnum(horizpanel, item);	if (win_inputnegevent(event))		timeout1[j] = speed;	sprintf(buf, "  %d secs", speed);	panel_set(speedvalue_item[j], PANEL_LABEL_STRING, buf, 0);}/* ARGSUSED */mode_choice(item, value, event)	Panel_item item;	int value;	struct inputevent *event;{	int j;		j = getpanelnum(vertpanel, item);	if (mode[j] == value)		return;	mode[j] = value;	traf_board_init(j);}/* ARGSUSED */grid_toggle(item, value, event)	Panel_item item;	struct inputevent *event;{	int j;		j = getpanelnum(horizpanel, item);	gridon[j] ^= 1;#if 0	if (mode[j] == DISPLAY_LOAD && gridon[j] == 0)		traf_board_init(j);	else#endif		drawgrid(j);}/* ARGSUSED */quit_button(item, event)	Panel_item item;	struct inputevent *event;{	int x, y, result;	struct inputevent ie;	Event	alert_event;		result = alert_prompt(	    (Frame)0,	    &alert_event,	    ALERT_NO_BEEPING,	1,	    ALERT_MESSAGE_STRINGS,		"Are you sure you want to Quit?",		0,	    ALERT_BUTTON_YES,	"Confirm",	    ALERT_OPTIONAL,	1,	    ALERT_BUTTON_NO,	"Cancel",	    0);	if (result == ALERT_YES) quit();}quit(){	deinitdevice();	exit(0);}voidtraf_box(buf)char	*buf;{	Event	alert_event;		(void) alert_prompt(		(Frame)0,		&alert_event,		ALERT_MESSAGE_STRINGS,			buf,			0,		ALERT_BUTTON_YES,	"Continue",		ALERT_TRIGGER,		ACTION_STOP,		0);}/* ARGSUSED */split_button(item, event)	Panel_item item;	struct inputevent *event;{	int i;		if (splitcnt < MAXSPLIT-1) {		splitcnt++;		if (vertpanel[splitcnt] == NULL)			makesubwindows(splitcnt);		/* 		 * initialize timeout to something?		 */		/*tsw[splitcnt]->ts_io.tio_timer = &timeout[splitcnt]; */		placesubwindows();		for (i = 0; i < (splitcnt+1); i++)			traf_board_init(i);	}}/* ARGSUSED */delete_button(item, event)	Panel_item item;	struct inputevent *event;{	int i, j;		j = getpanelnum(horizpanel, item);	for (i = j+1; i < MAXSPLIT; i++) {		if (vertpanel[i]) {			gridon[i-1] = gridon[i];			mode[i-1] = mode[i];			timeout[i-1] =timeout[i];			timeout1[i-1] =timeout1[i];			panel_set_value(speed_item[i-1],			    panel_get_value(speed_item[i]));			panel_set_value(grid_item[i-1],			    panel_get_value(grid_item[i]));			panel_set_value(mode_item[i-1],			    panel_get_value(mode_item[i]));		}	}	if (splitcnt > 0) {		notify_set_itimer_func(canvas[splitcnt], timeout_notify,		    ITIMER_REAL, NULL, 0);		splitcnt--;		placesubwindows();		for (i = 0; i < (splitcnt+1); i++)			traf_board_init(i);	}}lock(i){        struct  rect    rect;        	rect.r_top = 0;	rect.r_left = 0;	rect.r_width = (int)window_get(canvas[i], CANVAS_WIDTH);	rect.r_height = (int)window_get(canvas[i], CANVAS_HEIGHT);	pw_lock(pixwin[i], &rect);}unlock(i){	pw_unlock(pixwin[i]);}/*  * draw names on bottom margin, and also copy rank1[] to rank[] * in correct order */drawnames(k, rank, rank1)	struct rank rank[];	struct rank rank1[];{	int wd, charwd, charht, i, j, l, off, left;	int put[NUMNAMES];	/* put[i] is where to put rank[i] */	int taken[NUMNAMES];	/* taken[i] true if put points to it */	struct pr_size sz;	char *p;	char save;	int maxlen;		left = LEFTMARGIN*marginfontwd;	wd = (tswrect[k].r_width - left)/NUMNAMES;	sz = pf_textwidth(1, fonts[0], "A");	charwd = sz.x;	charht = sz.y;	maxlen = wd/charwd;	bzero(taken, sizeof(taken));	for (i = 0; i < NUMNAMES; i++) {		for (j = 0; j < NUMNAMES; j++) {			if (rank1[i].addr == oldaddrs[k][j]) {				put[i] = j;				taken[j] = 1;				break;			}		}		if (j == NUMNAMES)			put[i] = -1;	}	j = 0;	for (i = 0; i < NUMNAMES; i++) {		if ((l = put[i]) != -1) {			rank[l] = rank1[i];			continue;		}		while(taken[j])			j++;		p = getname(rank1[i].addr);		off = (wd - strlen(p)*charwd)/2;		if (off < 0)			off = 0;		pw_writebackground(pixwin[k], left + j*wd,		    tswrect[k].r_height - 3 - charht,		    wd, charht+1, PIX_CLR);		/* 		 * truncate p to avoid overlap		 */		save = p[maxlen];		p[maxlen] = 0;		pw_text(pixwin[k], left + j*wd + off, tswrect[k].r_height - 3,		    PIX_SRC, fonts[0], p);		p[maxlen] = save;		oldaddrs[k][j] = rank1[i].addr;		rank[j] = rank1[i];		j++;	}}zerooldaddrs(i){	bzero(oldaddrs[i], sizeof(oldaddrs[i]));}	drawleftmargin(k){	int ht, i, j, delta;	char buf[4];		if (traf_absolute[k]) {		delta = maxabs[k]/10;		j = maxabs[k];	}	else{		delta = 10;		j = 100;	}	for (i = 0; i < 11; i++) {		sprintf(buf, "%3d", j);		if ((ht = TOPGAP + marginfontht/2 + (i*curht[k])/10) >=		    tswrect[k].r_height)			break;		pw_text(pixwin[k], marginfontwd/2, ht, PIX_SRC, fonts[0], buf);		j -= delta;	}}drawprototext(k){	int wd, charwd, i, j, off, left;	struct pr_size sz;		left = LEFTMARGIN*marginfontwd;	wd = (tswrect[k].r_width - left)/NPROTOS;	for (i = NFONTS-1; i >= 0; i--) {		sz = pf_textwidth(1, fonts[i], "A");		charwd = sz.x;		for (j = 0; j < NPROTOS; j++) {			if (charwd*(strlen(protoname[j])+2) > wd)				break;		}		if (j == NPROTOS)			break;	}	if (i == -1)		i = 0;	for (j = 0; j < NPROTOS; j++) {		off = (wd - strlen(protoname[j])*charwd)/2;		pw_text(pixwin[k], left + j*wd + off, tswrect[k].r_height - 3,		    PIX_SRC, fonts[i], protoname[j]);	}}drawsizetext(k){	int wd, charwd, i, j, off, left;	struct pr_size sz;	char buf[100];		left = LEFTMARGIN*marginfontwd;	wd = (tswrect[k].r_width - left)/(NBUCKETS/2);	for (i = NFONTS-1; i >= 0; i--) {		sz = pf_textwidth(1, fonts[i], "A");		charwd = sz.x;		for (j = 0; j < NBUCKETS/2; j++) {			sprintf(buf, "%d-%d", j*2*BUCKETLNTH + 60,			    (j+1)*2*BUCKETLNTH + 60 - 1);			if (charwd*(strlen(buf)+2) > wd)				break;		}		if (j == NBUCKETS/2)			break;	}	if (i == -1)		i = 0;	for (j = 0; j < NBUCKETS/2; j++) {		sprintf(buf, "%d-%d", j*2*BUCKETLNTH + 60,		    (j==NBUCKETS/2-1) ? MAXPACKETLEN:(j+1)*2*BUCKETLNTH+60-1);		off = (wd - strlen(buf)*charwd)/2;		pw_text(pixwin[k], left + j*wd + off, tswrect[k].r_height - 3,		    PIX_SRC, fonts[i], buf);	}}drawgrid(k){	int i, j, ht, wd, spacing, left;		ht = curht[k];	wd = tswrect[k].r_width;	spacing = ht/10;	lock(k);	left = LEFTMARGIN*marginfontwd;	for (i = 0, j = TOPGAP + ht; i <= 10; i++, j-=spacing)		pw_vector(pixwin[k], left, j, wd, j, PIX_SRC^PIX_DST, 1);	unlock(k);}/*  * XXX this routine should go away */drawgridstub(k, step){	int i, j, ht, wd, spacing;		ht = curht[k];	wd = tswrect[k].r_width;	spacing = ht/10;	lock(k);	for (i = 0, j = TOPGAP + ht; i <= 10; i++, j-=spacing)		pw_vector(pixwin[k], wd-step, j, wd, j, PIX_SRC^PIX_DST, 1);	unlock(k);}placesubwindows(){	int	vertwd, horizht, toolwd;	int	perwindowht, i;		/* Get the numbers computed by fit_height() */	vertwd = (int)window_get(vertpanel[0], WIN_WIDTH);	horizht = (int)window_get(horizpanel[0], WIN_HEIGHT);	toolwd = (int)window_get(frame, WIN_WIDTH);	perwindowht = ((int)window_get(frame, WIN_HEIGHT)	    - (int)window_get(frame, WIN_TOP_MARGIN)	    - (int)window_get(toppanel, WIN_HEIGHT)	    - (splitcnt+1)*TOOL_BORDERWIDTH)/(splitcnt+1);	for (i = 0; i < splitcnt+1; i++) {		window_set(horizpanel[i],		    WIN_SHOW, 1,		    WIN_BELOW, i ? canvas[i-1] : toppanel,		    WIN_X, 0,		    WIN_HEIGHT, horizht,		    WIN_WIDTH, toolwd - vertwd - 3*TOOL_BORDERWIDTH, 0);		window_set(vertpanel[i],		    WIN_SHOW, 1,		    WIN_BELOW, i ? vertpanel[i-1] : toppanel,		    WIN_RIGHT_OF, horizpanel[i], 		    WIN_HEIGHT, i == splitcnt ? -1 : perwindowht,		    WIN_WIDTH, vertwd, 0);		window_set(canvas[i], WIN_BELOW, horizpanel[i],		    WIN_SHOW, 1,		    WIN_X, 0,		    WIN_HEIGHT, i == splitcnt ? -1 :			perwindowht - horizht - TOOL_BORDERWIDTH,		    WIN_WIDTH, toolwd - vertwd - 3*TOOL_BORDERWIDTH, 0);		/* shouldn't cache here */		tswrect[i] = *(struct rect *)window_get(canvas[i], WIN_RECT);	}	for(i = splitcnt + 1; i < MAXSPLIT; i++) {		if (vertpanel[i]) {			window_set(vertpanel[i], WIN_SHOW, 0, 0);			window_set(horizpanel[i], WIN_SHOW, 0, 0);			window_set(canvas[i], WIN_SHOW, 0, 0);		}	}}getpanelnum(panelarr, item)	Panel panelarr[];	Panel_item item;{	Panel panel;	int j;		panel = (Panel) panel_get(item, PANEL_PARENT_PANEL);	for (j = 0; j < MAXSPLIT; j++)		if (panelarr[j] == panel)			break;	if (j == MAXSPLIT) {		fprintf(stderr, "can't find panel\n");		exit(1);	}	return (j);}char *getname(addr){	int x;	struct hostent *hp;	struct hnamemem *p;	struct in_addr in_addr;	char buf[20];		in_addr.s_addr = addr;	x = addr & 0xff;	for (p = htable[x]; p != NULL; p = p->ht_nxt) {		if (p->ht_addr == addr)			return (p->ht_name);	}	p = (struct hnamemem *)malloc(sizeof(struct hnamemem));	p->ht_addr = addr;	p->ht_nxt = htable[x];	htable[x] = p;	if (inet_lnaof(in_addr) == INADDR_ANY) {		p->ht_name = "broadcast";		return (p->ht_name);	}	hp = gethostbyaddr(&addr, sizeof(int), AF_INET);	if (hp) {		p->ht_name = (char *)malloc(strlen(hp->h_name) + 1);		strcpy(p->ht_name, hp->h_name);	}	else {		sprintf(buf, "0x%x", addr);		p->ht_name = (char *)malloc((strlen(buf)) + 1);		strcpy(p->ht_name, buf);	}	return (p->ht_name);}traf_compar(a,b)	struct rank *a, *b;{	return (a->cnt < b->cnt);}

⌨️ 快捷键说明

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