DIRECTORY Commander, Imager, ImagerBackdoor, ImagerFont, ImagerSample, ImagerTransformation, Process, Random, Rope, SF, Xl, XTkBitmapWidgets, XTkWidgets; X11TextDemo: CEDAR MONITOR IMPORTS Commander, Imager, ImagerBackdoor, ImagerFont, ImagerTransformation, Process, Random, Xl, XTkBitmapWidgets, XTkWidgets = BEGIN Widget: TYPE = XTkWidgets.Widget; debuggingInstance: Instance ¬ NIL; Instance: TYPE = REF InstanceRec; InstanceRec: TYPE = RECORD [ doWait: REF ¬ $yield, key: REF ANY ¬ NIL, count: INT ¬ 0, bitmap: Widget ¬ NIL ]; MoreHit: XTkWidgets.ButtonHitProcType = { i: Instance ¬ NARROW[registerData]; i.count ¬ i.count + 1; TRUSTED {Process.Detach[FORK RunOneText[i]]} }; ResetHit: XTkWidgets.ButtonHitProcType = { i: Instance ¬ NARROW[registerData]; i.count ¬ 0; i.key ¬ NEW[INT]; }; SetWaitHit: XTkWidgets.ButtonHitProcType = { i: Instance ¬ NARROW[registerData]; i.doWait ¬ callData; }; CreateDemoWidget: Commander.CommandProc = { i: Instance ¬ debuggingInstance ¬ NEW[InstanceRec]; shell: Widget ¬ XTkWidgets.CreateShell[className: $X11TextDemo, windowHeader: "X11 text demo tool", standardMigration: TRUE]; bitmap: Widget ¬ i.bitmap ¬ XTkBitmapWidgets.CreateBitmapWidget[ widgetSpec: [geometry: [size: [220, 320], borderWidth: 1]], notify: BitmapChanged, data: i ]; toggle: Widget ¬ XTkWidgets.CreateChoices[ choices: LIST [ ["wait-mode: ", NIL], ["yield", $yield], ["local", $local], ["remote", $remote] ], hitProc: SetWaitHit, registerData: i ]; more: Widget ¬ XTkWidgets.CreateButton[ text: "add moving word", hitProc: MoreHit, registerData: i ]; reset: Widget ¬ XTkWidgets.CreateButton[ text: "stop moving", hitProc: ResetHit, registerData: i ]; contents: Widget ¬ XTkWidgets.CreateYStack[[], LIST[toggle, more, reset, bitmap]]; XTkWidgets.SetShellChild[shell, contents]; XTkWidgets.RealizeShell[shell]; }; fontNum: INT = 193; Fonts: TYPE = REF ARRAY [0..fontNum) OF Imager.Font; fonts: Fonts; InitFonts: PROC [] RETURNS [f: Fonts] = { font: Imager.Font ¬ ImagerFont.FindScaled["Xerox/XC1-2-2/Modern", 26]; f ¬ NEW[ARRAY [0..fontNum) OF Imager.Font]; FOR i: INT IN [0..fontNum) DO angle: REAL ¬ (360.0 / fontNum)*i; f[i] ¬ ImagerFont.Modify[font, ImagerTransformation.Rotate[angle]]; ENDLOOP; }; RotateFont: PROC [f: Fonts, a: INT] RETURNS [Imager.Font] = INLINE { RETURN [f[a MOD fontNum]] }; RunOneText: PROC [i: Instance] = { key: REF ¬ i.key; rope: Rope.ROPE ¬ "abcd"; bitmap: Widget ¬ i.bitmap; ct: Imager.Context ¬ XTkBitmapWidgets.CreateContext[bitmap]; font: Imager.Font ¬ ImagerFont.FindScaled["Xerox/XC1-2-2/Modern", 20]; dx: REAL ¬ Random.ChooseInt[min: -100, max: 100]; dy: REAL ¬ Random.ChooseInt[min: -100, max: 100]; a: INT ¬ 0; da: INT ¬ Random.ChooseInt[min: 0, max: 2] + 1; oldx, oldy: REAL ¬ 0; dx ¬ dx/20.0; dy ¬ dy/20.0; IF fonts=NIL THEN fonts ¬ InitFonts[]; IF ct#NIL THEN { r: Imager.Rectangle ¬ ImagerBackdoor.GetBounds[ct]; x: REAL ¬ r.w/2; y: REAL ¬ r.h/2; Process.SetPriority[Process.priorityBackground]; WHILE key=i.key AND Xl.Alive[bitmap.connection] AND bitmap.fastAccessAllowed=ok DO x ¬ x + dx; IF dx>0 THEN {IF x>r.w THEN {dx¬-dx; x ¬ x+2*dx}} ELSE {IF x<0 THEN {dx¬-dx; x ¬ x+2*dx}}; y ¬ y+dy; IF dy>0 THEN {IF y>r.h THEN {dy¬-dy; y ¬ y+2*dy}} ELSE {IF y<0 THEN {dy¬-dy; y ¬ y+2*dy}}; BEGIN Imager.SetColor[ct, Imager.white]; Imager.SetXY[ct, [oldx, oldy]]; Imager.SetFont[ct, RotateFont[fonts, a]]; Imager.ShowRope[ct, rope]; a ¬ (a + da) MOD fontNum; Imager.SetColor[ct, Imager.black]; Imager.SetXY[ct, [x, y]]; oldx ¬ x; oldy ¬ y; Imager.SetFont[ct, RotateFont[fonts, a]]; Imager.ShowRope[ct, rope]; END; SELECT i.doWait FROM $yield => Process.Yield[]; $local => XTkBitmapWidgets.Wait[bitmap, FALSE]; $remote => XTkBitmapWidgets.Wait[bitmap, TRUE]; ENDCASE => XTkBitmapWidgets.Wait[bitmap, FALSE]; ENDLOOP }; }; BitmapChanged: XTkBitmapWidgets.BitmapEventProc = { i: Instance ¬ NARROW[data]; i.key ¬ NEW[INT]; IF reason=createWindow OR reason=resize OR reason=map THEN { XTkBitmapWidgets.CreateAndSetBitmap[widget: widget, size: [widget.actual.size.height, widget.actual.size.width], bpp: 1]; FOR n: INT IN [0..i.count) DO TRUSTED {Process.Detach[FORK RunOneText[i]]} ENDLOOP; }; }; Commander.Register["X11TextDemo", CreateDemoWidget, "Create X11 text rotation demo widget"]; END. ΞX11TextDemo.mesa Copyright Σ 1988, 1989, 1990, 1991 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, May 2, 1988 4:50:57 pm PDT Christian Jacobi, October 1, 1992 9:51 pm PDT ΚΒ–(cedarcode) style•NewlineDelimiter ˜code™Kšœ ΟeœC™NK™7K™-K™—šΟk ˜ K˜ K˜K˜K˜ K˜ K˜K˜K˜K˜Kšžœ˜Kšœ˜K˜K˜ —K˜šΟn œžœž˜Kšžœz˜—Kšž˜K˜Kšœžœ˜!Kšœžœ˜$K˜Kšœ žœžœ ˜!šœ žœžœ˜Kšœžœ ˜Kšœžœžœžœ˜Kšœžœ˜Kšœž˜K˜—K˜šŸœ"˜)Kšœžœ˜#K˜Kšžœžœ˜,K˜K˜—šŸœ"˜*Kšœžœ˜#Kšœžœžœ˜K˜—K˜šŸ œ"˜,Kšœžœ˜#K˜K˜—K˜šŸœ˜+Kšœ"žœ˜3Kšœwžœ˜}˜@K˜ZK˜—˜*šœ žœ˜Kšœžœ˜K˜K˜K˜K˜—K˜$K˜—˜'K˜:K˜—˜(K˜7K˜—Kšœ/žœ˜RK˜*K˜K˜—K˜Kšœ žœ˜Kš œžœžœžœžœ ˜4K˜ K˜šŸ œžœžœ˜)K˜FKšœžœžœžœ˜+šžœžœžœž˜Kšœžœ˜"K˜CKšžœ˜—˜K˜——š Ÿ œžœžœžœžœ˜DKšžœžœ ˜K˜—K˜šŸ œžœ˜"Kšœžœ ˜Kšœ žœ ˜K˜K˜