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
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.