<> DIRECTORY Icons USING [NewIconFromFile, IconFlavor], InputFocus USING [SetInputFocus], Process USING [Ticks, Pause, SecondsToTicks, Detach], RandomCard USING [Choose], Rope USING [Find], UserProfile USING [Boolean], ViewerClasses USING [Viewer], ViewerEvents USING [EventProc, RegisterEventProc, UnRegisterEventProc, EventRegistration], ViewerOps USING [PaintViewer], ViewerTools USING [GetSelectedViewer] ; DebugHack: CEDAR PROGRAM IMPORTS InputFocus, RandomCard, Rope, ViewerEvents, UserProfile, ViewerTools, ViewerOps, Icons, Process = BEGIN v: ViewerClasses.Viewer; icon1, icon2, icon3, icon4, prev: Icons.IconFlavor; delta0: Process.Ticks _ Process.SecondsToTicks[30]; delta1: Process.Ticks _ Process.SecondsToTicks[30]; delta2: Process.Ticks _ Process.SecondsToTicks[30]; delta3: Process.Ticks _ Process.SecondsToTicks[5]; min1: Process.Ticks _ Process.SecondsToTicks[1]; max1: Process.Ticks _ Process.SecondsToTicks[5]; -- how long to wait between movements. min2: CARDINAL _ 2; -- how many movements before dormant max2: CARDINAL _ 5; min3: CARDINAL _ 2; -- number of movements (there are three positions) max3: CARDINAL _ 10; Squashed: SIGNAL [moving: BOOL] = CODE; IconOpened: SIGNAL = CODE; WatchForIcon: ViewerEvents.EventProc = { IF Rope.Find[viewer.name, "Debug"] = 0 THEN TRUSTED { v _ viewer; Process.Detach[FORK DoIt[]]; }; }; DoIt: PROC [] = { ENABLE { Squashed => { InputFocus.SetInputFocus[NIL]; -- IF NOT moving THEN RESUME; v.icon _ icon4; ViewerOps.PaintViewer[v, all]; Process.Pause[delta3]; v.icon _ tool; ViewerEvents.UnRegisterEventProc[proc: reg, event: close]; CONTINUE; }; IconOpened => { v.icon _ tool; CONTINUE; }; }; -- Process.Pause[RandomCard.Choose[delta1, delta0 + delta1]]; first activity occurs between delta1 and delta1 + delta0 after user first closes debug tool DO -- this loop twiddles the antenna between min2 and max2 times and waits a whle before doing it again. exit if viewer made iconic or destroyed, or if selected while moving. ChangeIcon[]; FOR i: CARDINAL IN [0..RandomCard.Choose[min2, max2]) DO Process.Pause[RandomCard.Choose[min1, max1]]; IF ViewerTools.GetSelectedViewer[] = v THEN SIGNAL Squashed[TRUE]; IF v.destroyed OR NOT v.iconic THEN SIGNAL IconOpened; MoveAntenna[RandomCard.Choose[min3, max3]]; ENDLOOP; <> <> <> Process.Pause[RandomCard.Choose[delta2/2, delta2]]; IF ViewerTools.GetSelectedViewer[] = v THEN SIGNAL Squashed[FALSE]; IF v.destroyed OR NOT v.iconic THEN SIGNAL IconOpened; ENDLOOP; }; MoveAntenna: PROC [n: CARDINAL] = { FOR i: CARDINAL IN [0..n) DO ChangeIcon[]; Process.Pause[-- RandomCard.Choose[1, 2]-- 1]; IF ViewerTools.GetSelectedViewer[] = v THEN SIGNAL Squashed[TRUE]; IF v.destroyed OR NOT v.iconic THEN SIGNAL IconOpened; ENDLOOP; }; ChangeIcon: PROC = { icon: Icons.IconFlavor = v.icon; v.icon _ SELECT v.icon FROM icon1 => icon2, icon2 => IF prev = icon1 THEN icon3 ELSE icon1, icon3 => icon2, ENDCASE => icon1; prev _ icon; ViewerOps.PaintViewer[v, all]; }; Init: PROC = { ENABLE ANY => CONTINUE; icon1 _ Icons.NewIconFromFile["UserExec.icons", 4]; icon2 _ Icons.NewIconFromFile["UserExec.icons", 5]; icon3 _ Icons.NewIconFromFile["UserExec.icons", 6]; icon4 _ Icons.NewIconFromFile["UserExec.icons", 7]; IF UserProfile.Boolean["RoachIconGag", TRUE] THEN reg _ ViewerEvents.RegisterEventProc[proc: WatchForIcon, before: FALSE, event: close, filter: $Container]; }; reg: ViewerEvents.EventRegistration; Init[]; END. -- of DebugHack <<>> <<>> <<>> <<>> <<>> <<>>