ScreenSpy.mesa
Copyright Ó 1991, 1992, 1993 by Xerox Corporation. All rights reserved.
Christian Jacobi, February 18, 1991 10:30 am PST
Christian Jacobi, August 16, 1993 12:37 pm PDT
DIRECTORY
Commander,
Identification,
Imager,
ImagerSample,
Rope,
Xl,
XlBitmap,
XlColorAccess,
XlCursor,
XTk,
XTkBitmapScroller,
XTkNotification,
XTkWidgets,
X11Viewers,
X11ViewersInstance;
ScreenSpy: CEDAR MONITOR
IMPORTS Commander, Identification, ImagerSample, Rope, Xl, XlBitmap, XlColorAccess, XlCursor, XTkBitmapScroller, XTk, XTkNotification, XTkWidgets, X11ViewersInstance
SHARES X11Viewers =
BEGIN
lastData: X11Viewers.ScreenServerData ¬ X11ViewersInstance.Last[];
NewBitmap: XTk.WidgetNotifyProc = {
lastData ¬ NARROW[callData];
};
debugLastInstance: Instance ¬ NIL;
Instance: TYPE = REF InstanceRec;
InstanceRec: TYPE = RECORD [
bitmapScroller: XTk.Widget,
errorLabel: XTk.Widget,
realBitmap: XTk.Widget,
bitmap: XlBitmap.Bitmap
];
BindScreen: XTk.WidgetNotifyProc = {
widget.attributes.cursor ¬ XlCursor.SharedStandardCursor[widget.connection, rtlLogo];
};
ScrolledCallBack: XTkBitmapScroller.ScrolledCallBackProc = {
i: Instance ¬ NARROW[data];
};
SetBitmap: PROC [i: Instance] = {
ok: BOOL ¬ TRUE;
bpp: INT ¬ 0;
bm: XlBitmap.Bitmap ¬ GetBitmap[];
IF bm=NIL
THEN ok ¬ FALSE
ELSE bpp ¬ ImagerSample.GetBitsPerSample[XlBitmap.GetSM[bm]];
IF ok THEN {
SELECT bpp FROM
1 => {};
8 => {
sd: Xl.ScreenDepth ¬ i.bitmapScroller.screenDepth;
ok ¬ sd#NIL AND XlColorAccess.FindVisualType[sd.screen, 8, Xl.VisualClass.pseudoColor]#NIL;
};
ENDCASE => ok ¬ FALSE
};
IF ok
THEN {
i.bitmap ¬ bm;
XTkBitmapScroller.SetBitmap[i.bitmapScroller, i.bitmap];
XTk.NoteMappingChange[widget: i.bitmapScroller, mapping: mapped];
XTk.NoteMappingChange[widget: i.errorLabel, mapping: unmapped];
}
ELSE {
XTk.NoteMappingChange[widget: i.bitmapScroller, mapping: unmapped];
XTk.NoteMappingChange[widget: i.errorLabel, mapping: mapped];
};
};
ResetBitmap: XTkWidgets.ButtonHitProcType = {
i: Instance ¬ NARROW[registerData];
SetBitmap[i];
XTk.StartReconfigureChildren[i.errorLabel.parent];
Xl.Flush[i.errorLabel.connection];
};
GetBitmap: PROC [] RETURNS [bm: XlBitmap.Bitmap ¬ NIL] = {
IF lastData#NIL AND lastData.useBitmap THEN bm ¬ lastData.bm;
};
CreateTopWidget: PROC [connection: Xl.Connection] = {
i: Instance ¬ debugLastInstance ¬ NEW[InstanceRec];
tq: Xl.TQ ¬ Xl.CreateTQ[order: XTk.rootLockingOrder];
shell: XTk.Widget ¬ XTkWidgets.CreateShell[
rootTQ: tq,
className: $ScreenSpy,
windowHeader: Rope.Concat["Screen-Spy ", Identification.Self[]]
];
newBm: XTk.Widget ¬ XTkWidgets.CreateButton[
text: "Use new bitmap", hitProc: ResetBitmap, registerData: i
];
ruler0: XTk.Widget ¬ XTkWidgets.CreateRuler[widgetSpec: [geometry: [size: [200, 1]]]];
errorLabel: XTk.Widget ¬ i.errorLabel ¬ XTkWidgets.CreateLabel[text: "bitmap or bits per pixel error"];
bitmapScroller: XTk.Widget ¬ i.bitmapScroller ¬ XTkBitmapScroller.CreateBitmapScroller[
scrollTQ: tq, scrollData: i, scrolledCallBack: ScrolledCallBack
];
contents: XTk.Widget ¬ XTkWidgets.CreateYStack[[], LIST[newBm, ruler0, errorLabel, bitmapScroller]];
XTk.RegisterNotifier[bitmapScroller, XTk.bindScreenKey, BindScreen];
XTkWidgets.SetShellChild[shell, contents];
i.realBitmap ¬ XTkBitmapScroller.GetImplWidget[bitmapScroller];
SetBitmap[i];
XTkWidgets.BindScreenShell[shell, connection];
XTkWidgets.RealizeShell[shell];
};
CreateTopWidgetCommand: Commander.CommandProc = {
CreateTopWidget[NIL];
msg ¬ "ok\n";
};
Commander.Register["ScreenSpy", CreateTopWidgetCommand, "Create X remote cedar window"];
XTkNotification.RegisterGlobal[X11Viewers.bitmapReplaced, NewBitmap, NIL, FALSE];
END.