DIRECTORY GGState, Commander, FileNames, GGBoundBox, GGInterfaceTypes, GGModelTypes, GGRefresh, GGRefreshTypes, GGScene, GGUserInput, GGWindow, GGWindowExtras, Imager, ImagerColor, ImagerTransformation, IO, Rope, SimpleFeedback, TIPTypes, TIPUser, Xl, XTk, XTkBitmapWidgets, XTkTIP, XTkWidgets; GGInXImpl: CEDAR PROGRAM IMPORTS GGState, Commander, FileNames, GGBoundBox, GGRefresh, GGScene, GGUserInput, GGWindow, GGWindowExtras, Imager, ImagerColor, SimpleFeedback, TIPUser, XTkBitmapWidgets, XTkTIP, XTkWidgets EXPORTS GGInterfaceTypes = BEGIN RefreshDataObj: PUBLIC TYPE = GGRefreshTypes.RefreshDataObj; -- exports to GGInterfaceTypes BoundBox: TYPE = GGBoundBox.BoundBox; Context: TYPE = Imager.Context; Event: TYPE = Xl.Event; EventRep: TYPE = Xl.EventRep; GGData: TYPE = GGInterfaceTypes.GGData; ROPE: TYPE = Rope.ROPE; Scene: TYPE = GGModelTypes.Scene; TIPTable: TYPE = TIPTypes.TIPTable; Transformation: TYPE = ImagerTransformation.Transformation; Widget: TYPE = XTk.Widget; Slope0: XTk.WidgetNotifyProc = { i: Instance ~ NARROW[registerData]; SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "Slope0 pressed"]; }; Slope90: XTk.WidgetNotifyProc = { i: Instance ~ NARROW[registerData]; SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "Slope90 pressed"]; }; Paint: XTk.WidgetNotifyProc = { i: Instance ~ NARROW[registerData]; clientFrame, frameClient: Transformation; DoPaint: PROC = { bounds: BoundBox ¬ GGBoundBox.CreateBoundBox[0,0,200,100]; SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "Paint pressed"]; Imager.ConcatT[i.context, clientFrame]; -- mimic what BiScrollers does GGRefresh.RepaintArea[i.context, i.ggData, $PaintEntireScene, bounds, FALSE, FALSE]; Imager.SetColor[i.context, ImagerColor.ColorFromRGB[[1,0,0]]]; Imager.MaskRectangle[i.context, [0,0,100,50]]; }; [clientFrame, frameClient] ¬ GGState.GetBiScrollersTransforms[i.ggData]; Imager.DoSaveAll[i.context, DoPaint]; }; XInputNotify: Xl.EventProcType = { i: Instance ¬ NARROW[clientData]; WITH event SELECT FROM input: REF READONLY tipEvent EventRep => { IF input.results = NIL THEN SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "NIL TIP results"] ELSE WITH input.results.first SELECT FROM a: ATOM => { SimpleFeedback.PutF[$Gargoyle, oneLiner, $Feedback, "TIP results: %g", [atom[a]] ]; GGUserInput.BiScrollerInputNotify[i.ggData, input.results]; }; ENDCASE => SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "TIP results: not an atom"]; }; ENDCASE => SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "Not a TIP result"]; }; WindowEventNotify: XTkBitmapWidgets.BitmapEventProc = { }; Instance: TYPE = REF InstanceObj; InstanceObj: TYPE = RECORD [ ggData: GGData, context: Context ]; XGargoyleCommand: Commander.CommandProc ~ { scene: Scene ¬ GGScene.CreateScene[]; workingDirectory: ROPE ¬ FileNames.CurrentWorkingDirectory[]; ggData: GGData ¬ GGWindow.CreateGGData[scene, workingDirectory]; widgetStream: IO.STREAM ¬ XTkWidgets.CreateStream[]; i: Instance ~ NEW[InstanceObj ¬ [ggData: ggData]]; slope0: Widget ¬ XTkWidgets.CreateButton[text: "Slope 0", hitProc: Slope0, registerData: i]; slope90: Widget ¬ XTkWidgets.CreateButton[text: "Slope 90", hitProc: Slope90, registerData: i]; paint: Widget ¬ XTkWidgets.CreateButton[text: "Paint", hitProc: Paint, registerData: i]; menus: Widget ¬ XTkWidgets.CreateXStack[stack: LIST[slope0, XTkWidgets.VRule[], slope90, XTkWidgets.VRule[], paint]]; action: Widget ¬ XTkBitmapWidgets.CreateBitmapWidget[widgetSpec: [geometry: [size: [350, 200]]], notify: WindowEventNotify, data: NIL]; container: Widget ¬ XTkWidgets.CreateYStack[stack: LIST[menus, XTkWidgets.HRule[], action]]; shell: Widget ¬ XTkWidgets.CreateShell[child: container, windowHeader: "XGargoyle"]; BEGIN table: TIPTable ¬ TIPUser.InstantiateNewTIPTable["/Cedar/Gargoyle/Gargoyle.tip"]; XTkTIP.Bind[widget: action, tipTable: table, eventProc: XInputNotify, eventData: i, yup: TRUE, pseudoHeight: 200]; END; XTkBitmapWidgets.CreateAndSetBitmap[widget: action, size: [s: 200, f: 350], bpp: 0, origin: [0,0]]; i.context ¬ XTkBitmapWidgets.CreateContext[action]; XTkWidgets.RealizeShell[shell]; GGRefresh.RegisterPaintProc[ggData, XPaint, i]; GGWindowExtras.SetBeingBorn[ggData, FALSE]; BEGIN filename: ROPE = "/net/brazil/brazil-12/gargoyle10/figs/Worm.gargoyle"; GGUserInput.BiScrollerInputNotify[i.ggData, LIST[$Get, filename]]; END; }; XPaint: GGRefresh.PaintProc = { i: Instance ~ NARROW[clientData]; clientFrame, frameClient: Transformation; DoPaint: PROC = { whatHasChanged: ATOM; SimpleFeedback.Append[$Gargoyle, oneLiner, $Feedback, "Painting..."]; whatHasChanged ¬ IF ggData.refresh.paintAction=NIL THEN $PaintAllPlanes ELSE ggData.refresh.paintAction; Imager.ConcatT[i.context, clientFrame]; -- mimic what BiScrollers does GGRefresh.RepaintArea[i.context, i.ggData, whatHasChanged, bounds, FALSE, FALSE]; ggData.refresh.paintAction ¬ $PaintAllPlanes; }; [clientFrame, frameClient] ¬ GGState.GetBiScrollersTransforms[ggData]; Imager.DoSaveAll[i.context, DoPaint]; }; Commander.Register["XGargoyle", XGargoyleCommand, "Creates a Gargoyle X window"]; END. μ GGInXImpl.mesa Copyright c 1993 by Xerox Corporation. All rights reserved. Bier, August 23, 1993 10:36 am PDT Contents: Like GGWindowImpl or MMMEditorGGImpl, but connects Gargoyle to an X Window instead of a Viewer or an MMM editor. PROC [event: Event, clientData: REF, tq: TQ]; out: Widget ¬ XTkWidgets.CreateStreamWidget[widgetSpec: [geometry: [size: [350, 200]]], widgetStream: widgetStream]; PROC [ggData: GGData, request: REF ¬ NIL, bounds: BoundBox, clientData: REF ¬ NIL]; Κ†•NewlineDelimiter ™Icode™Kšœ Οmœ1™J˜.J˜—Kšœ‘œ‘œ/˜HJ˜%K˜K˜—š  œ˜"Kšžœžœžœ™.Kšœžœ ˜!šžœžœž˜šœžœžœ˜*KšžœžœžœI˜dšžœžœžœž˜)šœžœ˜ K˜SK˜;K˜—KšžœV˜]—K˜—KšžœN˜U—K˜K˜—˜7K˜K˜—Kšœ žœžœ ˜!šœ žœžœ˜K˜K˜K˜K˜—š œ˜+K˜%Kšœžœ'˜=K˜@K˜Kšœžœžœ˜4Kšœžœ!˜2K˜\K˜_K˜XKšœ/žœB˜uK™tKšœ‚žœ˜‡Kšœ3žœ%˜\K˜Tšž˜K˜QKšœYžœ˜rKšžœ˜—K˜K˜cK˜3K˜K˜/Kšœ$žœ˜+šž˜K• CharPropsK8 ButtonLSFileName3/net/brazil/brazil-12/gargoyle10/figs/Worm.gargoylešœ žœ9˜GKšœ,žœ˜BKšžœ˜—K˜K˜—š œ˜Kš žœžœžœ žœžœ™SJšœžœ ˜!Kšœ‘œ‘œ˜)š œžœ˜Jšœžœ˜J˜EKš œžœžœžœžœ˜hKšœ ‘œŸ˜FJšœCžœžœ˜QK˜-J˜—Kšœ‘œ‘œ-˜FJ˜%K˜K˜—K˜QK˜Kšžœ˜K˜—…—μ^