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