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. ΐ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 Κά•NewlineDelimiter –(cedarcode) style˜codešœ™Kšœ Οeœ=™HKšœ1™1K™.K™—šΟk ˜ Kšœ ˜ K˜Kšœ˜Kšœ ˜ K˜K˜Kšœ ˜ K˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ˜—K˜šΟn œžœž˜Kšžœž˜₯Kšžœ˜—šž˜K˜—K˜BK˜šŸ œ˜#Kšœ žœ ˜Kšœ˜—K˜Kšœžœ˜"K˜Kšœ žœžœ ˜!šœ žœžœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜K˜—K˜šŸ œ˜$K˜UKšœ˜K˜—šŸœ,˜