Annotation of 43BSDTahoe/new/X/xdemo/menulife.clu, revision 1.1.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.