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

📄 lifetool.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* VARARGS *//* ARGSUSED *//* also called from reset_button */staticgrid_toggle(item, value, event)	Panel_item item;	struct inputevent event;{	static Menu_item menu_on, menu_off;		if (menu_on == NULL) {		menu_on = menu_create_item(MENU_STRING, "Turn Grid On", 0);		menu_off = menu_create_item(MENU_STRING, "Turn Grid Off", 0);	}	gridon ^= 1;	if (gridon)		menu_set(panelmenu, MENU_REPLACE, 1, menu_off, 0);	else		menu_set(panelmenu, MENU_REPLACE, 1, menu_on, 0);	panel_set_value(grid_item, gridon);	drawgrid();}/* ARGSUSED */staticmode_choice(item, value, event)	Panel_item item;	struct inputevent event;{	struct itimerval nextupdate;	if (value == 0) {		loaditimerval(speed, &nextupdate);		notify_set_itimer_func(&client, clock_notify, ITIMER_REAL,		    &nextupdate, 0);		runmode = 1;	}	else {		runmode = 0;		newgen();		updategen();		loaditimerval(0, &nextupdate);		notify_set_itimer_func(&client, clock_notify, ITIMER_REAL,		    &nextupdate, 0);	}}/* ARGSUSED */staticspeed_slider(item, value, event)	Panel_item item;	int value;	Event	*event;{	struct itimerval nextupdate;	speed = value;	loaditimerval(speed, &nextupdate);	notify_set_itimer_func(&client, clock_notify, ITIMER_REAL,	    &nextupdate, 0);}/* ARGSUSED */staticzoom_slider(item, zoom, event)	Panel_item item;	int zoom;	Event	*event;{	int	off, ht, wd;		life_spacing = zoom;	canvassize(&ht, &wd);	off = getvoff() + ht/2;	upoffset += (off/zoom) - (off/ozoom);	off = gethoff() + wd/2;	leftoffset += (off/zoom) - (off/ozoom);	circle();	board_repaint();	ozoom = zoom;}/* ARGSUSED */quit_button(item, event)	Panel_item item;	struct inputevent *event;{		fullscreen_prompt("\Press the left mouse button\n\to confirm Quit.  To cancel,\n\press the right mouse button.", "Really Quit", "Cancel Quit", event, toolfd);	if (event_id(event) == MS_LEFT)		exit(0);}/* ARGSUSED */clear_button(item, event)	Panel_item	item;	Event		*event;{	zerolist();	runmode = 0;	gencnt = 0;	panel_set_value(mode_item, 1);	panel_paint(mode_item, PANEL_CLEAR);	panel_set(gen_item, PANEL_LABEL_STRING, "     0", 0);	board_repaint();}/* ARGSUSED */find_button(item, event)	Panel_item	item;	Event		*event;{	int	x, y, ht, wd;		if (life_getpoint(&x, &y) == 0)		return;	canvassize(&ht, &wd);	scrollbar_scroll_to(vertsb, (y+upoffset)*life_spacing - ht/2);	scrollbar_scroll_to(horizsb, (x+leftoffset)*life_spacing - wd/2);}/* ARGSUSED */reset_button(item, event)	Panel_item	item;	Event		*event;{	Panel_item	dummyitem;	Event		*dummyevent;	if (gridon)		grid_toggle();		runmode = 0;	gencnt = 0;	panel_set_value(mode_item, 1);	panel_paint(mode_item, PANEL_CLEAR);	panel_set(gen_item, PANEL_LABEL_STRING, "     0", 0);	speed_slider(dummyitem, 1, dummyevent);	panel_set_value(speed_item, 1);	zoom_slider(dummyitem, SPACING, dummyevent);	panel_set_value(zoom_item, SPACING);	leftoffset = 0;	upoffset = 0;	scrollbar_scroll_to(vertsb, CANVAS_ORIGIN);	scrollbar_scroll_to(horizsb, CANVAS_ORIGIN);}staticboard_event(canv, event)	Canvas canv;	Event *event;{	int	x, y;	int	cur_x, cur_y;	static int erasing, painting;	if (event_is_down(event) && event_id(event) == MS_RIGHT) {	    /* translate the event to window space,	     * then show the menu.	     */	    showit(menu_show(menu, canv,		canvas_window_event(canv, event), 0));	    return;	}		x = event->ie_locx; y = event->ie_locy;	cur_x = (x/life_spacing)*life_spacing;	cur_y = (y/life_spacing)*life_spacing;	if (event_is_up(event)) {		erasing = 0;		painting = 0;		return;	}	if (event->ie_code == MS_MIDDLE ||	    (event->ie_code == LOC_MOVE && erasing)) {		erasing = 1;		if (life_get(cur_x/life_spacing,cur_y/life_spacing)== 0)			return;		deletepoint(cur_x/life_spacing - leftoffset,		    cur_y/life_spacing - upoffset);		erase_stone(cur_x/life_spacing, cur_y/life_spacing);	}	else if (event->ie_code == MS_LEFT ||	    (event->ie_code == LOC_MOVE && painting)) {		painting = 1;		addpoint(cur_x/life_spacing - leftoffset,		    cur_y/life_spacing - upoffset);		paint_stone(cur_x/life_spacing, cur_y/life_spacing, INITCOLOR);	}}paint_stone(i, j, color){ 	int diameter;		diameter = life_spacing - 3;	if (amicolor)		pw_write(board_pixwin, i*life_spacing+2, j*life_spacing+2, diameter,		    diameter, (PIX_COLOR(color)|PIX_SRC), piecepix, 0, 0);	else		pw_write(board_pixwin, i*life_spacing+2, j*life_spacing+2, diameter,		    diameter, PIX_SRC, piecepix, 0, 0);} erase_stone(i, j){ 	int diameter, z;		diameter = life_spacing - 3;	pw_writebackground(board_pixwin, i*life_spacing+2, j*life_spacing+2,	    diameter, diameter, PIX_CLR);} circle(){	int i,j, diameter;		diameter = life_spacing - 3;	if (diameter >= MAXLENGTH) {	    fprintf(stderr, "help!\n");	    exit(1);	}	drawcircle(diameter, 0, 1);	if (piecepix != NULL)		pr_destroy(piecepix);	piecepix = mem_create(diameter, diameter, 1);	for (j = 0; j < diameter; j++) {		for (i = 0;  i < diameter;   i++)			pr_put(piecepix, i, j, circlearr[i][j]);	}}/*  * 1 sec timer: If in runmode, advance one cycle *//* ARGSUSED */static Notify_valueclock_notify(clnt, which)	Notify_client clnt;	int which;{	if (runmode) {		newgen();		updategen();	}	return (NOTIFY_DONE);}updategen(){	char buf[7];		gencnt++;	sprintf(buf, "%6d", gencnt);	panel_set(gen_item, PANEL_LABEL_STRING, buf, 0);	if (genlim && gencnt > genlim)		exit(0);}loaditimerval(val, it)	int	val;	struct	itimerval *it;{	it->it_interval.tv_sec = val/100;	it->it_interval.tv_usec = (val%100)*10000;	it->it_value.tv_sec = val/100;	it->it_value.tv_usec = (val%100)*10000;}setupmenu(item, str)	Panel_item	item;	char	*str;{	panelmenu = menu_create(MENU_CLIENT_DATA, item,	    MENU_NOTIFY_PROC, menu_return_item, 	    0);	menu_set(panelmenu, MENU_STRING_ITEM, str, 0, 0);	panel_set(item,	    PANEL_EVENT_PROC, cmdpanel_event,	    PANEL_CLIENT_DATA, panelmenu,	    0);}/* * Handle input events when over panel items. * Menu request gives menu of possible options. */cmdpanel_event(item, ie)	Panel_item item;	Event *ie;{	Menu_item mi;	typedef int (*func)();	func proc;	if (event_id(ie) == MENU_BUT && event_is_down(ie)) {		mi = (Menu_item)menu_show(		    (Menu)panel_get(item, PANEL_CLIENT_DATA), panel,		  	panel_window_event(panel, ie) , 0);		if (mi != NULL) {			event_set_shiftmask(ie, (int)menu_get(mi, MENU_VALUE));			proc = (func)panel_get(item, PANEL_NOTIFY_PROC);			(*proc)(item, ie);		}	} else		panel_default_handle_event(item, ie);}canvassize(htp, wdp)	int	*htp, *wdp;{	*htp = (int)window_get(canvas, WIN_HEIGHT);	*wdp = (int)window_get(canvas, WIN_WIDTH);}getvoff(){	return ((int)scrollbar_get(vertsb, SCROLL_VIEW_START));}gethoff(){	return ((int)scrollbar_get(horizsb, SCROLL_VIEW_START));}life_usage(){	fprintf(stderr,    "life [-p pattern] [-g gens] [-i interval] [-m mode] [-s spacing]\n");	exit(1);}

⌨️ 快捷键说明

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