Annotation of 43BSDTahoe/new/X/xdemo/menulife.clu, revision 1.1

1.1     ! root        1: 
        !             2: %% Events of interest:
        !             3: %%
        !             4: %%  Clear_All  Clear the board
        !             5: %%  Set_All    Set all cells in the board
        !             6: %%  Randomize  Randomly set cells (within randomize area)
        !             7: %%  Stop       Stop generating
        !             8: %%  Go         Continue generating
        !             9: %%  Mutate     Set mutation on or off
        !            10: %%  Single_Step        Generate once
        !            11: %%  New_Rules  Change rules of generation
        !            12: %%  Set_Cells  Set cells alive or dead
        !            13: %%  Expose     Expose a region of the board
        !            14: %%  ReSize     Resize the board
        !            15: %%  Quit       Done
        !            16: 
        !            17: %%  Event      Caused by
        !            18: %%  None       nothing
        !            19: %%  Clear      'c'
        !            20: %%  Randomize  'r'
        !            21: %%  Stop       ' '
        !            22: %%  Go         '<cr>'
        !            23: %%  Mutate     'm'
        !            24: %%  Single_Step        ' ' or middle button
        !            25: %%  New_Rules  not-implemented yet
        !            26: %%  Set_Cells  left button
        !            27: %%  Expose     windowUp (same size)
        !            28: %%  ReSize     windowUp (new size)
        !            29: %%  Quit       'q'
        !            30: 
        !            31: %%  Clear then Randomize       right button
        !            32: 
        !            33: xevent = oneof[
        !            34:            None:         null,
        !            35:            Clear_All:    null,
        !            36:            Set_All:      null,
        !            37:            Randomize:    null,
        !            38:            Stop:         null,
        !            39:            Go:           null,
        !            40:            Mutate:       null,
        !            41:            Single_Step:  null,
        !            42:            New_Rules:    null,
        !            43:            Start_Setting:null,
        !            44:            Set_Cell:     null,
        !            45:            Stop_Setting: null,
        !            46:            Expose:       null,
        !            47:            ReSize:       null,
        !            48:            Select:       sel_event,
        !            49:            Quit:         null
        !            50:              ]
        !            51: 
        !            52: sel_event = struct[ 
        !            53:                Menu:   menu,
        !            54:                Item:   menu_item
        !            55:                   ]
        !            56: 
        !            57: eNone           = xevent$Make_None(nil)
        !            58: eClear_All      = xevent$Make_Clear_All(nil)
        !            59: eSet_All        = xevent$Make_Set_All(nil)
        !            60: eRandomize      = xevent$Make_Randomize(nil)
        !            61: eStop           = xevent$Make_Stop(nil)
        !            62: eGo             = xevent$Make_Go(nil)
        !            63: eMutate                 = xevent$Make_Mutate(nil)
        !            64: eSingle_Step    = xevent$Make_Single_Step(nil)
        !            65: eNew_Rules      = xevent$Make_New_Rules(nil)
        !            66: eStart_Setting  = xevent$Make_Start_Setting(nil)
        !            67: eSet_Cell       = xevent$Make_Set_Cell(nil)
        !            68: eStop_Setting   = xevent$Make_Stop_Setting(nil)
        !            69: eExpose                 = xevent$Make_Expose(nil)
        !            70: eReSize                 = xevent$Make_ReSize(nil)
        !            71: eQuit           = xevent$Make_Quit(nil)
        !            72: 
        !            73: qi = sequence[int]
        !            74: ai = array[int]
        !            75: ab = array[bool]
        !            76: ae = array[xevent]
        !            77: gapsize = 1
        !            78: pwidth = 8
        !            79: cwidth = pwidth - gapsize
        !            80: 
        !            81: right_Arrow = "\000\002\000\003\200\003\300\003" ||
        !            82:              "\340\003\360\003\370\003\374\003" ||
        !            83:              "\376\003\377\003\360\003\260\003" ||
        !            84:              "\030\003\030\002\014\000\014\000"
        !            85: 
        !            86: ra_Width   = 10
        !            87: ra_Height  = 16
        !            88: ra_X      = 9
        !            89: ra_Y       = 0
        !            90: 
        !            91: left_Arrow = "\000\000\002\000\006\000\016\000\036\000\076\000" ||
        !            92:             "\176\000\376\000\376\001\376\003\376\007\176\000" ||
        !            93:             "\156\000\306\000\302\000\200\001\200\001\000\000"
        !            94: left_Mask  = "\003\000\007\000\017\000\037\000\077\000\177\000" ||
        !            95:             "\377\000\377\001\377\003\377\007\377\017\377\017" ||
        !            96:             "\377\000\357\001\347\001\303\003\300\003\200\001"
        !            97: 
        !            98: la_Width   = 12
        !            99: la_Height  = 18
        !           100: la_X      = 1
        !           101: la_Y       = 1
        !           102: 
        !           103: info_rec = record[
        !           104:               Arena:  field,
        !           105:               W:      x_window ]
        !           106: 
        !           107: ints = sequence[int]
        !           108: 
        !           109: vNormalHNs = ints$[ -1, -1, -1,  0,  0,  1,  1,  1 ]
        !           110: vNormalWNs = ints$[ -1,  0,  1, -1,  1, -1,  0,  1 ]
        !           111: 
        !           112: vKnightHNs = ints$[ -2, -2, -1, -1,  1,  1,  2,  2 ]
        !           113: vKnightWNs = ints$[ -1,  1, -2,  2, -2,  2, -1,  1 ]
        !           114: 
        !           115: vDiamondHNs = ints$[ -2, -1, -1,  0,  0,  1,  1,  2 ]
        !           116: vDiamondWNs = ints$[  0, -1,  1, -2,  2, -1,  1,  0 ]
        !           117: 
        !           118: vTest1HNs = ints$[ -2, -1, -1,  0,  0,  1,  1,  2 ]
        !           119: vTest1WNs = ints$[ -2, -1,  0, -1,  1,  0,  1,  2 ]
        !           120: 
        !           121: vTest2HNs = ints$[ -1, -1, -1,  0,  0,  1,  2,  2 ]
        !           122: vTest2WNs = ints$[ -1,  0,  1, -1,  1,  0, -2,  2 ]
        !           123: 
        !           124: vTest3HNs = ints$[ -1, -1, -1,  0,  0,  1,  2,  1 ]
        !           125: vTest3WNs = ints$[ -1,  0,  1, -1,  2,  0, -2,  1 ]
        !           126: 
        !           127: vTest4HNs = ints$[ -1, -1, -1,  0,  0,  1,  2,  2 ]
        !           128: vTest4WNs = ints$[ -1,  0,  1, -1,  2, -1,  0,  2 ]
        !           129: 
        !           130: rule_info = record[
        !           131:                Rule_MI: menu_item,
        !           132:                HNs:     ints,
        !           133:                WNs:     ints
        !           134:                   ]
        !           135: rules = array[rule_info]
        !           136: 
        !           137: 
        !           138: 
        !           139: MenuLifeDemo = proc ()
        !           140:     x_keymap$Load("")
        !           141:     bwidth: int := int$parse(xdemo_default("menulife", "BorderWidth"))
        !           142:        except when not_found, overflow, bad_format: bwidth := 2 end
        !           143:     back: x_pixmap := x_display$White()
        !           144:     bdr: x_pixmap := x_display$Black()
        !           145:     backpix: int := WhitePixel
        !           146:     forepix: int := BlackPixel
        !           147:     mousepix: int := BlackPixel
        !           148:     if x_display$Cells() > 2
        !           149:        then begin
        !           150:            r, g, b: int := x_parse_color(xdemo_default("menulife", "Border"))
        !           151:            bdr := x_pixmap$tile(x_display$alloc_color(r, g, b))
        !           152:            end except when not_found: end
        !           153:            begin
        !           154:            r, g, b: int := x_parse_color(xdemo_default("menulife", "Background"))
        !           155:            backpix := x_display$alloc_color(r, g, b)
        !           156:            back := x_pixmap$tile(backpix)
        !           157:            end except when not_found: end
        !           158:            begin
        !           159:            r, g, b: int := x_parse_color(xdemo_default("menulife", "Foreground"))
        !           160:            forepix := x_display$alloc_color(r, g, b)
        !           161:            mousepix := forepix
        !           162:            end except when not_found: end
        !           163:            begin
        !           164:            r, g, b: int := x_parse_color(xdemo_default("menulife", "Mouse"))
        !           165:            mousepix := x_display$alloc_color(r, g, b)
        !           166:            end except when not_found: end
        !           167:        end
        !           168:     F: x_font := x_font$Create("8x13")
        !           169:     W: x_window, XWidth, YHeight: int := x_tcons("menulife", back, bdr,
        !           170:                                                 xdemo_geometry(), "=40x40+1+1",
        !           171:                                                 F, 8, 8, 1, 3, 3, bwidth)
        !           172:     x_font$Destroy(F)
        !           173:     x_window$Set_Resize(W, 1, 8, 1, 8)
        !           174:     W.Name := "menulife"
        !           175:     x_window$Map(W)
        !           176:     x_input$Set_Squish(false)
        !           177: 
        !           178:     Cr: x_cursor := x_cursor$SCons(la_Width, la_Height,
        !           179:                                  left_Arrow, left_Mask,
        !           180:                                  mousepix, backpix,
        !           181:                                  la_X, la_Y, GXcopy)
        !           182: 
        !           183:     W.Input := keyPressed + keyReleased +
        !           184:               buttonPressed + buttonReleased +
        !           185:               exposeRegion
        !           186: 
        !           187:     MFN: string := xdemo_default("menulife", "MenuFont")
        !           188:        except when not_found: MFN := "kiltercrn" end
        !           189:     MF: x_font   := x_font$Create(MFN)
        !           190:     MenuBack: int := WhitePixel
        !           191:     MenuPlane: int := 1
        !           192:     MenuMouse: int := BlackPixel
        !           193:     if x_display$Cells() > 2
        !           194:        then begin
        !           195:            r, g, b: int := x_parse_color(xdemo_default("menulife", "MenuMouse"))
        !           196:            MenuMouse := x_display$alloc_color(r, g, b)
        !           197:            end except when not_found: end
        !           198:            cfore: string := xdemo_default("menulife", "MenuForeground")
        !           199:            cback: string := xdemo_default("menulife", "MenuBackground")
        !           200:            pixs: pixellist
        !           201:            pixs, MenuPlane := x_display$Alloc_Cells(1, 1, false)
        !           202:            MenuBack := pixs[1]
        !           203:            r, g, b: int := x_parse_color(cfore)
        !           204:            x_display$store_color(MenuBack + MenuPlane, r, g, b)
        !           205:            r, g, b := x_parse_color(cback)
        !           206:            x_display$store_color(MenuBack, r, g, b)
        !           207:        end except when not_found: end
        !           208:     MB: menu_bar := menu_bar$Init(W, MF, MenuBack, MenuPlane, MenuMouse)
        !           209:     Quit_Menu: menu := menu$New(MB, "Exit")
        !           210:     Quit_MI: menu_item := menu_item$Create(MB, "Quit", MF)
        !           211:     menu$Append(Quit_Menu, Quit_MI)
        !           212: 
        !           213:     Cntl_Menu: menu := menu$New(MB, "Control")
        !           214:     Go_MI: menu_item := menu_item$Create(MB, "Go", MF)
        !           215:     menu$Append(Cntl_Menu, Go_MI)
        !           216:     menu$Append(Cntl_Menu, menu_item$Empty(MB))
        !           217:     Mutate_MI: menu_item := menu_item$Create(MB, "Mutate", MF)
        !           218:     menu$Append(Cntl_Menu, Mutate_MI)
        !           219:     menu$Append(Cntl_Menu, menu_item$Empty(MB))
        !           220:     Clear_All_MI: menu_item := menu_item$Create(MB, "Clear All", MF)
        !           221:     menu$Append(Cntl_Menu, Clear_All_MI)
        !           222:     Set_All_MI: menu_item := menu_item$Create(MB, "Set All", MF)
        !           223:     menu$Append(Cntl_Menu, Set_All_MI)
        !           224:     Randomize_MI: menu_item := menu_item$Create(MB, "Randomize", MF)
        !           225:     menu$Append(Cntl_Menu, Randomize_MI)
        !           226: 
        !           227:     Rule_List: rules := rules$[]
        !           228:     Rule_MI: menu_item := menu_item$Create(MB, "Normal", MF)
        !           229:     Rule_MI.Checked := true
        !           230:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           231:                                      HNs:     vNormalHNs,
        !           232:                                      WNs:     vNormalWNs
        !           233:                                     })
        !           234:     Rule_MI := menu_item$Create(MB, "Knight", MF)
        !           235:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           236:                                      HNs:     vKnightHNs,
        !           237:                                      WNs:     vKnightWNs
        !           238:                                     })
        !           239:     Rule_MI := menu_item$Create(MB, "Diamond", MF)
        !           240:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           241:                                      HNs:     vDiamondHNs,
        !           242:                                      WNs:     vDiamondWNs
        !           243:                                     })
        !           244:     Rule_MI := menu_item$Create(MB, "Test1", MF)
        !           245:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           246:                                      HNs:     vTest1HNs,
        !           247:                                      WNs:     vTest1WNs
        !           248:                                     })
        !           249:     Rule_MI := menu_item$Create(MB, "Test2", MF)
        !           250:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           251:                                      HNs:     vTest2HNs,
        !           252:                                      WNs:     vTest2WNs
        !           253:                                     })
        !           254:     Rule_MI := menu_item$Create(MB, "Test3", MF)
        !           255:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           256:                                      HNs:     vTest3HNs,
        !           257:                                      WNs:     vTest3WNs
        !           258:                                     })
        !           259:     Rule_MI := menu_item$Create(MB, "Test4", MF)
        !           260:     rules$AddH(Rule_List, rule_info${ Rule_MI: Rule_MI,
        !           261:                                      HNs:     vTest4HNs,
        !           262:                                      WNs:     vTest4WNs
        !           263:                                     })
        !           264:     Rule_Menu: menu := menu$New(MB, "Rules")
        !           265:     for RI: rule_info in rules$Elements(Rule_List) do
        !           266:        menu$Append(Rule_Menu, RI.Rule_MI)
        !           267:        end
        !           268: 
        !           269:     menu_bar$Append(MB, Quit_Menu)
        !           270:     menu_bar$Append(MB, Cntl_Menu)
        !           271:     menu_bar$Append(MB, Rule_Menu)
        !           272: 
        !           273:     Stopped: bool := true
        !           274:     EQ: event_queue := event_queue$Create()
        !           275:     event_queue$Queue_Event(EQ, eReSize)
        !           276:     No_Changes: bool := false
        !           277:     Height: int := -1
        !           278:     Width:  int := -1
        !           279:     Last_I: int := -1
        !           280:     Last_J: int := -1
        !           281:     Setting: bool     := false
        !           282:     Set_It:  bool     := false
        !           283:     Was_Stopped: bool := true
        !           284:     Mutating: bool := false
        !           285:     Mutate_Count: int := 0
        !           286:     Next_Mutate:  int := 5
        !           287:     while (true) do
        !           288:        Arena: field
        !           289:        Info: info_rec := info_rec${ Arena: Arena,
        !           290:                                     W:     W }
        !           291:        if (Mutating)
        !           292:           then if (random$Next(100) < 2)
        !           293:                   then Mutate(Arena, W)
        !           294:                 elseif (false)
        !           295:                   then Mutate_Count := Mutate_Count + 1
        !           296:                        if (Mutate_Count >= Next_Mutate)
        !           297:                           then Mutate(Arena, W)
        !           298:                                Next_Mutate := 5 + random$Next(10) + 1
        !           299:                                Mutate_Count := 0
        !           300:                           end
        !           301:                 end
        !           302:                No_Changes := false
        !           303:           end
        !           304:        Next_Event: xevent, X, Y, Wd, Ht: int := 
        !           305:            event_queue$Next_Event[info_rec](EQ,
        !           306:                                             MB,
        !           307:                                             (Stopped cor
        !           308:                                              No_Changes),
        !           309:                                             Expose_Handler,
        !           310:                                             Info
        !           311:                                             )
        !           312:        tagcase Next_Event
        !           313:           tag ReSize:
        !           314:               if ((Width  = (X / pwidth)) cand
        !           315:                   (Height = (Y / pwidth)))
        !           316:                  then Expose_Region(X, Y, Wd, Ht, Arena, W)
        !           317:                       No_Changes := false
        !           318:                       continue
        !           319:                  end
        !           320:               Sx, Sy, Bw, Sm, Wk: int
        !           321:               IW: x_window
        !           322:               Sx, Sy, Width, Height, Bw, Sm, Wk, IW := x_window$Query(W)
        !           323:               if ((Height < pwidth) cor
        !           324:                   (Width < pwidth))
        !           325:                  then x_window$Destroy(W)
        !           326:                       return
        !           327:                  end
        !           328:               if (((Height // pwidth) ~= gapsize) cor
        !           329:                   ((Width  // pwidth) ~= gapsize))
        !           330:                  then Height := pwidth * (Height / pwidth) + gapsize
        !           331:                       Width  := pwidth * (Width  / pwidth) + gapsize
        !           332:                       x_window$Change(W, Width, Height)
        !           333:                  end
        !           334:               x_window$Clear(W)
        !           335:               W.Cursor := x_cursor$None()
        !           336:               x_flush()
        !           337:               Width := Width / pwidth
        !           338:               Height := Height / pwidth
        !           339:               for RI: rule_info in rules$Elements(Rule_List) do
        !           340:                   if (RI.Rule_MI.Checked)
        !           341:                      then %% First through away old field so GC can reclaim it.
        !           342:                           Arena := _cvt[null, field](nil)
        !           343:                           Arena := field$Create(Height, Width, pwidth, gapsize,
        !           344:                                                 RI.HNs, RI.WNs, forepix, backpix)
        !           345:                           break
        !           346:                      end
        !           347:                   end
        !           348:               Span: int := Width * Height
        !           349:               Span := Span - Width
        !           350:               W.Cursor := Cr
        !           351:               No_Changes := false
        !           352:           tag None:
        !           353:               if (~ Stopped)
        !           354:                  then No_Changes := ~ field$Display_Changes(Arena,
        !           355:                                                             W, cwidth)
        !           356:                  end
        !           357:           tag Clear_All:
        !           358:               x_window$Clear(W)
        !           359:               field$Clear(Arena)
        !           360:               No_Changes := false
        !           361:           tag Set_All:
        !           362:               Set_All(Arena, W)
        !           363:               No_Changes := false
        !           364:           tag Randomize:
        !           365:               Randomize(Arena, W)
        !           366:               No_Changes := false
        !           367:           tag Stop:
        !           368:               Stopped := true
        !           369:               No_Changes := false
        !           370:               Go_MI.Text := "Go"
        !           371:               menu$Item_Changed(Cntl_Menu, Go_MI)
        !           372:           tag Go:
        !           373:               Stopped := false
        !           374:               No_Changes := ~ field$Display_Changes(Arena,
        !           375:                                                     W, cwidth)
        !           376:               Go_MI.Text := "Stop"
        !           377:               menu$Item_Changed(Cntl_Menu, Go_MI)
        !           378:           tag Mutate:
        !           379:               Mutating := ~ Mutating
        !           380:               Mutate_MI.Checked := ~ Mutate_MI.Checked
        !           381:           tag Single_Step:
        !           382:               if (Stopped)
        !           383:                  then event_queue$Queue_Event(EQ, eGo)
        !           384:                       event_queue$Queue_Event(EQ, eStop)
        !           385:                  else event_queue$Queue_Event(EQ, eStop)
        !           386:                  end
        !           387:               No_Changes := false
        !           388:               continue
        !           389:           tag New_Rules:
        !           390:           tag Start_Setting:
        !           391:               W.Input := keyPressed + keyReleased +
        !           392:                          buttonPressed + buttonReleased +
        !           393:                          exposeRegion + mouseMoved
        !           394:               Last_I, Last_J, Set_It := Set_Cell(X, Y,
        !           395:                                                  -1, -1,
        !           396:                                                  true,
        !           397:                                                  Arena, W)
        !           398:               Setting := true
        !           399:               Was_Stopped := Stopped
        !           400:               Stopped := true
        !           401:           tag Set_Cell:
        !           402:               if (Setting)
        !           403:                  then Dummy_Set_It: bool
        !           404:                       Last_I, Last_J, Dummy_Set_It := Set_Cell(X, Y,
        !           405:                                                                Last_I, Last_J,
        !           406:                                                                Set_It,
        !           407:                                                                Arena, W)
        !           408:                       No_Changes := false
        !           409:                  end
        !           410:           tag Stop_Setting:
        !           411:               W.Input := keyPressed + keyReleased +
        !           412:                          buttonPressed + buttonReleased +
        !           413:                          exposeRegion
        !           414:               Setting := false
        !           415:               Stopped := Was_Stopped
        !           416:           tag Expose:
        !           417:               Expose_Region(X, Y, Wd, Ht, Arena, W)
        !           418:               No_Changes := false
        !           419:           tag Quit:
        !           420:               x_window$Destroy(W)
        !           421:               return
        !           422:           tag Select (SE: sel_event):
        !           423:               if (SE.Menu = Quit_Menu)
        !           424:                  then if (SE.Item = Quit_MI)
        !           425:                          then x_window$Destroy(W)
        !           426:                               return
        !           427:                          end
        !           428:                elseif (SE.Menu = Cntl_Menu)
        !           429:                  then if (SE.Item = Go_MI)
        !           430:                          then if (Stopped)
        !           431:                                  then event_queue$Queue_Event(EQ, eGo)
        !           432:                                  else event_queue$Queue_Event(EQ, eStop)
        !           433:                                  end
        !           434:                        elseif (SE.Item = Mutate_MI)
        !           435:                          then event_queue$Queue_Event(EQ, eMutate)
        !           436:                        elseif (SE.Item = Clear_All_MI)
        !           437:                          then event_queue$Queue_Event(EQ, eClear_All)
        !           438:                        elseif (SE.Item = Set_All_MI)
        !           439:                          then event_queue$Queue_Event(EQ, eSet_All)
        !           440:                        elseif (SE.Item = Randomize_MI)
        !           441:                          then event_queue$Queue_Event(EQ, eRandomize)
        !           442:                        end
        !           443:                elseif (SE.Menu = Rule_Menu)
        !           444:                  then for RI: rule_info in rules$Elements(Rule_List) do
        !           445:                           if (RI.Rule_MI.Checked)
        !           446:                              then if (RI.Rule_MI ~= SE.Item)
        !           447:                                      then RI.Rule_MI.Checked := false
        !           448:                                      end
        !           449:                              else if (RI.Rule_MI = SE.Item)
        !           450:                                      then RI.Rule_MI.Checked := true
        !           451:                                           event_queue$Queue_Event(EQ, eReSize)
        !           452:                                      end
        !           453:                              end
        !           454:                           end
        !           455:                end
        !           456:           end
        !           457:        end
        !           458:     end MenuLifeDemo
        !           459: 
        !           460: Expose_Handler = proc (W: x_window, X: int, Y: int, Width: int, Height: int,
        !           461:                       Sub_W: x_window, Info: info_rec)
        !           462:     if (W = Info.W)
        !           463:        then Expose_Region(X, Y, Width, Height, Info.Arena, Info.W)
        !           464:        end
        !           465:     end Expose_Handler
        !           466:        
        !           467: 
        !           468: Randomize = proc (Arena: field, W: x_window)
        !           469:     for I: int, J: int, Is_Set: bool in field$Random_Changes(Arena) do
        !           470:        XC: int := (I - 1) * pwidth + gapsize
        !           471:        YC: int := (J - 1) * pwidth + gapsize
        !           472:        if (Is_Set)
        !           473:           then %% Set a cell
        !           474:                x_window$Pix_Set(W, Arena.SetPix, YC, XC, cwidth, cwidth)
        !           475:           else %% Clear a cell
        !           476:                x_window$Pix_Set(W, Arena.ClearPix, YC, XC, cwidth, cwidth)
        !           477:           end
        !           478:        end
        !           479:     end Randomize
        !           480: 
        !           481: Mutate = proc (Arena: field, W: x_window)
        !           482:     Num_Cells: int := field$Size(Arena)
        !           483:     Height: int, Width: int := field$Dimensions(Arena)
        !           484:     %% Num_Mutates: int := ((Num_Cells * (random$Next(5) + 1)) / 1000) + 1
        !           485:     Num_Mutates: int := 1
        !           486:     for N: int in int$From_To(1, Num_Mutates) do
        !           487:        I: int := random$Next(Height) + 1
        !           488:        J: int := random$Next(Width)  + 1
        !           489:        field$Set_Alive(Arena, I, J, 
        !           490:                        (~ field$Is_Alive(Arena, I, J)))
        !           491:        field$Display_Cell(Arena, I, J,
        !           492:                           W, cwidth )
        !           493:        end
        !           494:     end Mutate
        !           495: 
        !           496: Expose_Region = proc (X1: int, Y1: int, Width: int, Height: int, 
        !           497:                      Arena: field, W: x_window)
        !           498:     Width  := (X1 + Width - 1) / pwidth
        !           499:     Height := (Y1 + Height - 1) / pwidth
        !           500:     X1 := X1 / pwidth
        !           501:     Y1 := Y1 / pwidth
        !           502:     for I: int in int$From_To(Y1, Height) do
        !           503:        for J: int in int$From_To(X1, Width) do
        !           504:            if (field$Is_Alive(Arena, I+1, J+1))
        !           505:               then x_window$Pix_Set(W, Arena.SetPix,
        !           506:                                     ((J * pwidth) + gapsize),
        !           507:                                     ((I * pwidth) + gapsize),
        !           508:                                     cwidth, cwidth)
        !           509:               end
        !           510:               except when bounds:
        !           511:                      end
        !           512:            end
        !           513:        end
        !           514:     end Expose_Region
        !           515: 
        !           516: Set_All = proc (Arena: field, W: x_window)
        !           517:     Height: int, Width: int := field$Dimensions(Arena)
        !           518:     for X: int in int$From_To(1, Height) do
        !           519:        for Y: int in int$From_To(1, Width) do
        !           520:            if (~ field$Is_Alive(Arena, X, Y))
        !           521:               then field$Set_Alive(Arena, X, Y, true)
        !           522:                    field$Display_Cell(Arena, X, Y, W, cwidth)
        !           523:               end
        !           524:            end
        !           525:        end
        !           526:     end Set_All
        !           527: 
        !           528: Set_Cell = proc (X: int, Y: int, Last_I: int, Last_J: int, Set_It: bool,
        !           529:                 Arena: field, W: x_window)
        !           530:             returns (int, int, bool)
        !           531:     J: int := int$Max(0, (X - gapsize)) / pwidth + 1
        !           532:     I: int := int$Max(0, (Y - gapsize)) / pwidth + 1
        !           533:     if (Last_I = -1)
        !           534:        then Set_It := ~ field$Is_Alive(Arena, I, J)
        !           535:      elseif ((Last_I = I) cand (Last_J = J))
        !           536:        then return (I, J, Set_It)
        !           537:      end
        !           538:     field$Set_Alive(Arena, I, J, Set_It)
        !           539:        except when Bounds:
        !           540:                   return (Last_I, Last_J, Set_It)
        !           541:              end
        !           542:     field$Display_Cell(Arena, I, J,
        !           543:                       W, cwidth)
        !           544:     return (I, J, Set_It)
        !           545:     end Set_Cell
        !           546: 
        !           547: 
        !           548: 
        !           549: event_queue = cluster is create, queue_event, next_event
        !           550: 
        !           551:     full_event = struct[ E:   xevent,
        !           552:                         X:   int,
        !           553:                         Y:   int,
        !           554:                         X0:  int,
        !           555:                         Y0:  int ]
        !           556:     queue = array[full_event]
        !           557:     rep = record[event: event,
        !           558:                 queue: queue]
        !           559: 
        !           560:     Create = proc () returns (cvt)
        !           561:        return (rep${event: x_input$Empty_Event(),
        !           562:                     queue: queue$New()})
        !           563:        end Create
        !           564: 
        !           565:     Queue_Event = proc (EQ: cvt, E: xevent)
        !           566:        queue$AddH(EQ.Queue, full_event${ E:   E,
        !           567:                                          X:   0,
        !           568:                                          Y:   0,
        !           569:                                          X0:  0,
        !           570:                                          Y0:  0 })
        !           571:        end Queue_Event
        !           572: 
        !           573:     Next_Event = proc [evt: type] (EQ: cvt, MB: menu_bar, Wait: bool,
        !           574:                                   Exp_Handler: ehproc, EHArg: evt) 
        !           575:                   returns (xevent, int, int, int, int)
        !           576:        ehproc = proctype(x_window, int, int, int, int, x_window, evt)
        !           577: 
        !           578:        while (true) do
        !           579:            if (queue$Empty(EQ.Queue))
        !           580:               then if (Wait cor
        !           581:                        x_input$Pending())
        !           582:                       then x_input$DeQ(EQ.Event)
        !           583:                            if (EQ.Event.Kind = KeyPressed)
        !           584:                               then Ch: char := Lower(x_keymap$GetC(
        !           585:                                                          EQ.Event.Value,
        !           586:                                                          EQ.Event.Mask))
        !           587:                                       except when none, multi (*): continue end
        !           588:                                    %% Interpret char
        !           589:                                    if      (Ch = 'c')
        !           590:                                       then return (eClear_All,
        !           591:                                                    EQ.Event.X, EQ.Event.Y,
        !           592:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           593:                                     elseif (Ch = 's')
        !           594:                                       then return (eSet_All,
        !           595:                                                    EQ.Event.X, EQ.Event.Y,
        !           596:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           597:                                     elseif (Ch = ' ')
        !           598:                                       then return (eSingle_Step,
        !           599:                                                    EQ.Event.X, EQ.Event.Y,
        !           600:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           601:                                     elseif (Ch = 'r')
        !           602:                                       then return (eRandomize,
        !           603:                                                    EQ.Event.X, EQ.Event.Y,
        !           604:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           605:                                     elseif (Ch = 'm')
        !           606:                                       then return (eMutate,
        !           607:                                                    EQ.Event.X, EQ.Event.Y,
        !           608:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           609:                                     elseif (Ch = '\r')
        !           610:                                       then return (eGo,
        !           611:                                                    EQ.Event.X, EQ.Event.Y,
        !           612:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           613:                                     elseif (Ch = 'q')
        !           614:                                       then return (eQuit,
        !           615:                                                    EQ.Event.X, EQ.Event.Y,
        !           616:                                                    EQ.Event.X0, EQ.Event.Y0)
        !           617:                                     end
        !           618:                             elseif (EQ.Event.Kind = ButtonPressed  cand
        !           619:                                     EQ.Event.Value = LeftButton)
        !           620:                               then %% Start setting cells
        !           621:                                    return (eStart_Setting,
        !           622:                                            EQ.Event.X, EQ.Event.Y,
        !           623:                                            EQ.Event.X0, EQ.Event.Y0)
        !           624:                             elseif (EQ.Event.Kind = ButtonReleased  cand
        !           625:                                     EQ.Event.Value = LeftButton)
        !           626:                               then %% Stop setting cells
        !           627:                                    return (eStop_Setting,
        !           628:                                            EQ.Event.X, EQ.Event.Y,
        !           629:                                            EQ.Event.X0, EQ.Event.Y0)
        !           630:                             elseif (EQ.Event.Kind = ButtonPressed  cand
        !           631:                                     EQ.Event.Value = RightButton)
        !           632:                               then return (eSingle_Step,
        !           633:                                            EQ.Event.X, EQ.Event.Y,
        !           634:                                            EQ.Event.X0, EQ.Event.Y0)
        !           635:                             elseif (EQ.Event.Kind = ButtonReleased  cand
        !           636:                                     EQ.Event.Value = RightButton)
        !           637:                               then %% Ignore
        !           638:                                    continue
        !           639:                             elseif (EQ.Event.Kind = ButtonPressed  cand
        !           640:                                     EQ.Event.Value = MiddleButton)
        !           641:                               then M: menu, MI: menu_item :=
        !           642:                                        menu_bar$Select[evt](MB, EQ.Event.X, EQ.Event.Y, Exp_Handler, EHArg)
        !           643:                                       except when None:
        !           644:                                                   continue
        !           645:                                              end
        !           646:                                    return (xevent$Make_Select(
        !           647:                                                sel_event${
        !           648:                                                    Menu: M,
        !           649:                                                    Item: MI }),
        !           650:                                            EQ.Event.X, EQ.Event.Y,
        !           651:                                            EQ.Event.X0, EQ.Event.Y0)
        !           652:                             elseif (EQ.Event.Kind = ButtonReleased  cand
        !           653:                                     EQ.Event.Value = MiddleButton)
        !           654:                               then %% Ignore
        !           655:                                    %                               continue
        !           656:                             elseif (EQ.Event.Kind = mouseMoved)
        !           657:                               then %% Mouse has moved
        !           658:                                    return (eSet_Cell,
        !           659:                                            EQ.Event.X, EQ.Event.Y,
        !           660:                                            EQ.Event.X0, EQ.Event.Y0)
        !           661:                             elseif (EQ.Event.Kind = ExposeWindow)
        !           662:                               then return (eReSize,
        !           663:                                            EQ.Event.X, EQ.Event.Y,
        !           664:                                            EQ.Event.X0, EQ.Event.Y0)
        !           665:                             else return (eExpose,
        !           666:                                          EQ.Event.X, EQ.Event.Y,
        !           667:                                          EQ.Event.X0, EQ.Event.Y0)
        !           668:                             end
        !           669:                       else return (eNone, 0, 0, 0, 0)
        !           670:                       end
        !           671:               else EQ.Queue.Low := 1
        !           672:                    FE: full_Event := queue$RemL(EQ.Queue)
        !           673:                    return (FE.E, FE.X, FE.Y, FE.X0, FE.Y0)
        !           674:               end
        !           675:            end
        !           676:        end Next_Event
        !           677: 
        !           678:     end event_queue

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.