📄 lifetool.c
字号:
#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 + -