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

📄 lifetool.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic  char sccsid[] = "@(#)lifetool.c 1.1 92/07/30 Copyr 1986 Sun Micro";#endif/* * Copyright (c) 1986 by Sun Microsystems Inc. */#include <stdio.h>#include <suntool/sunview.h>#include <suntool/panel.h>#include <suntool/canvas.h>#include <suntool/scrollbar.h>#include <sunwindow/cms.h>#include <suntool/walkmenu.h>#include "life.h"#define abs(x) (((x) > 0) ? (x) : -(x))#ifndef max#define max(x,y) (((x) > (y)) ? (x) : (y))#endif#define ROWPAD 10		/* extra space between rows in panel *//* tool and sunwindows-specific data */static	Frame	frame;static	Panel	panel;static	Canvas	canvas;static struct pixwin		*board_pixwin;static int			gencnt;static	Panel_item mode_item, zoom_item, gen_item, speed_item, grid_item;static	mode_choice(), grid_toggle(), speed_slider(),  zoom_slider();int	cmdpanel_event();int	clear_button(), quit_button(), reset_button(), find_button();static	board_repaint(), board_event();Notify_value clock_notify();struct pixrect *mem_create();int life_spacing;			/* distance between 2 lines */static	struct pixrect *piecepix;static short grid_array[] = {	0x2480,0x2480,0xFFE0,0x2480,0x2480,0xFFE0,0x2480,0x2480,	0xFFE0,0x2480,0x2480,0x0000,0x0000,0x0000,0x0000,0x0000};mpr_static(grid_pr, 11, 11, 1, grid_array);static	int	runmode;		/* am I in run mode? */static	int	gridon;			/* is grid visible? */static	int	speed = 1;static	int	client;int	leftoffset, upoffset;static short icon_image[] ={#include <images/life.icon>};DEFINE_ICON_FROM_IMAGE(life_icon, icon_image);#define MAXLENGTH 64extern charcirclearr[MAXLENGTH][MAXLENGTH]; /* where drawcircle puts its ouput */#define SPACING 15		/* diameter = 12 */static	int ozoom = SPACING;int amicolor;static	int toolfd;static	Menu	panelmenu;static	Menu	menu;static	Scrollbar vertsb, horizsb;static	char cmsname[CMS_NAMESIZE];static	u_char	red[CMSIZE];static	u_char	green[CMSIZE];static	u_char	blue[CMSIZE];static char tool_name[] = "life";/* command line args */static	int	genlim;static	int	initpattern;FILE *debugfp;#ifdef STANDALONEmain(argc, argv)#elseint life_main(argc, argv)#endif	char **argv;{	int k;	struct itimerval nextupdate;	frame = window_create(NULL, FRAME,		FRAME_ARGC_PTR_ARGV, &argc, argv,		FRAME_LABEL, tool_name,		FRAME_ICON, &life_icon,		0);	if (frame == 0) {		fprintf(stderr, "life: couldn't create window\n");		exit(1);	}	toolfd = (int)window_get(frame, WIN_FD);	life_spacing = SPACING;	debugfp = stdout;	while (argc > 1) {		if (argv[1][0] == '-') {			if (argc < 3)				life_usage();			switch(argv[1][1]) {			case 'p': /* pattern */				initpattern = atoi(argv[2]);				break;			case 'm': /* pattern */				runmode = atoi(argv[2]);				break;			case 'g': /* generations */				genlim = atoi(argv[2]);				break;			case 'i': /* interval */				speed = atoi(argv[2]);				if (speed < 1 || speed > 200) {					fprintf(stderr, "%d Illegal speed\n",					    atoi(argv[2]));					exit(1);				}				break;			case 's': /* spacing */				life_spacing = atoi(argv[2]);				if (life_spacing < 4 || life_spacing > 40) {					fprintf(stderr, "%d Illegal spacing\n",					    atoi(argv[2]));					exit(1);				}				break;			default:				life_usage();			}			argc--;			argv++;		} else			life_usage();		argc--;		argv++;	}	/* create and initialize the option subwindow */	panel = window_create(frame, PANEL, 0);	init_panel();	/* create and initialize the board subwindow */	vertsb = scrollbar_create(0);	horizsb = scrollbar_create(0);	canvas = window_create(frame, CANVAS,		CANVAS_AUTO_SHRINK, 0,		CANVAS_RETAINED, 0,		CANVAS_FIXED_IMAGE, 0,		CANVAS_REPAINT_PROC, board_repaint,		WIN_VERTICAL_SCROLLBAR, vertsb,		WIN_HORIZONTAL_SCROLLBAR, horizsb,		WIN_EVENT_PROC, board_event,		CANVAS_HEIGHT, 2*CANVAS_ORIGIN,		CANVAS_WIDTH, 2*CANVAS_ORIGIN,		0);	scrollbar_scroll_to(vertsb, CANVAS_ORIGIN);	scrollbar_scroll_to(horizsb, CANVAS_ORIGIN);	board_pixwin = (Pixwin *)window_get(canvas, CANVAS_PIXWIN);	menu =  menu_create(		MENU_STRING_ITEM, "Glider", (char *)GLIDER,		MENU_STRING_ITEM, "8", (char *)EIGHT,		MENU_STRING_ITEM, "Pulsar", (char *)PULSAR,		MENU_STRING_ITEM, "Gun", (char *)GUN,		MENU_STRING_ITEM, "Escort", (char *)ESCORT,		MENU_STRING_ITEM, "Barber", (char *)BARBER,		MENU_STRING_ITEM, "Puffer", (char *)PUFFER,		MENU_STRING_ITEM, "Hertz", (char *)HERTZ,		MENU_STRING_ITEM, "Tumbler", (char *)TUMBLER,		MENU_STRING_ITEM, "Muchnick", (char *)MUCHNICK,            0);             	circle();	/* set up color map */	amicolor = board_pixwin->pw_pixrect->pr_depth > 1;	if (amicolor) {		sprintf(cmsname, "lifetool%d", getpid());		pw_setcmsname(board_pixwin, cmsname);		red[0] = 255;		blue[0] = 255;		green[0] = 255;		red[CMSIZE-1] = 0;		blue[CMSIZE-1] = 0;		green[CMSIZE-1] = 0;		for(k = 1; k <= CMSIZE-1; k++) {			red[k] = (k-1)*(256/CMSIZE);			green[k] = 0;			blue[k] = 255 - red[k];		}		pw_putcolormap(board_pixwin, 0, CMSIZE, red, green, blue);	}	loaditimerval(speed, &nextupdate);	notify_set_itimer_func(&client, clock_notify, ITIMER_REAL,	    &nextupdate, 0);	if (initpattern)		showit(initpattern);	initstack();		window_main_loop(frame);}staticinit_panel(){	panel_create_item(panel, PANEL_MESSAGE,		PANEL_LABEL_STRING, " ", 0);	grid_item = panel_create_item(panel, PANEL_TOGGLE,		PANEL_CHOICE_IMAGES, &grid_pr, 0,		PANEL_NOTIFY_PROC, grid_toggle, 0);	setupmenu(grid_item, "Turn Grid On");	panel_create_item(panel, PANEL_MESSAGE,		PANEL_LABEL_STRING, "   ", 0);	mode_item = panel_create_item(panel, PANEL_CHOICE,		PANEL_ITEM_Y, ATTR_ROW(0) - 3,		PANEL_VALUE, !runmode,		PANEL_CHOICE_STRINGS, "Run", "Step", 0,		PANEL_NOTIFY_PROC, mode_choice, 0);	panel_create_item(panel, PANEL_MESSAGE,		PANEL_ITEM_Y, ATTR_ROW(0) + 2,		PANEL_LABEL_STRING, "    Gen", 0);	gen_item = panel_create_item(panel, PANEL_MESSAGE,		PANEL_ITEM_Y, ATTR_ROW(0) + 2,		PANEL_LABEL_STRING, "     0", 0);		panel_create_item(panel, PANEL_MESSAGE,		PANEL_LABEL_STRING, "    ", 0);	panel_create_item(panel, PANEL_BUTTON,		PANEL_LABEL_IMAGE, panel_button_image(panel, "Find", 0, 0),		PANEL_NOTIFY_PROC, find_button, 0);	panel_create_item(panel, PANEL_BUTTON,		PANEL_LABEL_IMAGE, panel_button_image(panel, "Clear", 0, 0),		PANEL_NOTIFY_PROC, clear_button, 0);	panel_create_item(panel, PANEL_BUTTON,		PANEL_LABEL_IMAGE, panel_button_image(panel, "Reset", 0, 0),		PANEL_NOTIFY_PROC, reset_button, 0);	panel_create_item(panel, PANEL_BUTTON,		PANEL_LABEL_IMAGE, panel_button_image(panel, "Quit", 0, 0),		PANEL_NOTIFY_PROC, quit_button, 0);	panel_create_item(panel, PANEL_MESSAGE,		PANEL_LABEL_STRING, "Fast",		PANEL_ITEM_X, ATTR_COL(0),		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD, 0);		speed_item = panel_create_item(panel, PANEL_SLIDER,		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD,		PANEL_MIN_VALUE, 1,		PANEL_MAX_VALUE, 200,/* hundredths of a sec */		PANEL_VALUE, speed,		PANEL_NOTIFY_LEVEL, PANEL_DONE,		PANEL_SHOW_VALUE, FALSE,		PANEL_SHOW_RANGE, FALSE,		PANEL_NOTIFY_PROC, speed_slider, 0);	panel_create_item(panel, PANEL_MESSAGE,		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD,		PANEL_LABEL_STRING, "Slow", 0);		panel_create_item(panel, PANEL_MESSAGE,		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD,		PANEL_LABEL_STRING, "     Zoom Out", 0);		zoom_item = panel_create_item(panel, PANEL_SLIDER,		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD,		PANEL_MIN_VALUE, 4, /* minimum that circle() can deal with */		PANEL_MAX_VALUE, 40,		PANEL_VALUE, life_spacing,		PANEL_SHOW_VALUE, FALSE,		PANEL_SHOW_RANGE, FALSE,		PANEL_NOTIFY_LEVEL, PANEL_DONE,		PANEL_NOTIFY_PROC, zoom_slider, 0);	panel_create_item(panel, PANEL_MESSAGE,		PANEL_ITEM_Y, ATTR_ROW(1) + ROWPAD,		PANEL_LABEL_STRING, "Zoom In", 0);	window_fit_height(panel);	}lock(){	struct rect rect;	rect_construct(&rect, 0, 0, 2*CANVAS_ORIGIN, 2*CANVAS_ORIGIN);	pw_lock(board_pixwin, &rect);}unlock(){	pw_unlock(board_pixwin);}/* VARARGS *//* ARGSUSED *//* also called from zoom_slider */staticboard_repaint(canv, pw, repaint_area)	Canvas canv;	Pixwin *pw;	Rectlist *repaint_area;{	pw_writebackground(board_pixwin, 0, 0, 2*CANVAS_ORIGIN,	    2*CANVAS_ORIGIN, PIX_CLR);	if (gridon)		drawgrid();	paint_board();}drawgrid(){	int	j;		lock();	for (j = 0; j <= 2*CANVAS_ORIGIN; j+=life_spacing)		pw_vector(board_pixwin, 0, j, 2*CANVAS_ORIGIN, j,		    PIX_SRC^PIX_DST, 1);	for (j = 0; j <= 2*CANVAS_ORIGIN; j+=life_spacing)		pw_vector(board_pixwin, j, 0, j, 2*CANVAS_ORIGIN,		    PIX_SRC^PIX_DST, 1);	unlock();}

⌨️ 快捷键说明

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