DIRECTORY Xl, XlCursor, XlPrivateResources, CardTab, Rope; XlCursorImpl: CEDAR MONITOR IMPORTS Xl, XlPrivateResources, CardTab EXPORTS XlCursor = BEGIN OPEN Xl, XlCursor; myPropKey: REF ATOM ฌ NEW[ATOM ฌ $XlCursorImpl]; cache: ConnectionCache ฌ NEW[ConnectionCacheRec]; --never NIL; caching is valuable because we will allways have lots of operation on very few connections ConnectionCache: TYPE = REF ConnectionCacheRec; ConnectionCacheRec: TYPE = RECORD [ connection: Connection ฌ NIL, cursorFont: Font ฌ nullFont, sharedStandardCursors: CardTab.Ref ฌ NIL ]; GetConnectionData: PROC [c: Connection] RETURNS [ca: ConnectionCache] = { ca ฌ cache; --local, immutable copy IF ca.connection#c THEN { ca ฌ NARROW[Xl.GetConnectionPropAndInit[c, myPropKey, InitConnection]]; cache ฌ ca; --atomic }; }; InitConnection: InitializeProcType = { ca: ConnectionCache ฌ NEW[ConnectionCacheRec ฌ [ connection: c, cursorFont: Xl.OpenFont[c, "cursor"], sharedStandardCursors: CardTab.Create[] ]]; RETURN [ca] }; StandardCursorFont: PUBLIC PROC [c: Connection] RETURNS [Font] = { data: ConnectionCache ฌ GetConnectionData[c]; RETURN [data.cursorFont]; }; SharedStandardCursor: PUBLIC PROC [c: Connection, source: StandardFontCursors] RETURNS [cursor: Cursor] = { data: ConnectionCache ฌ GetConnectionData[c]; WITH CardTab.Fetch[data.sharedStandardCursors, ORD[source]].val SELECT FROM cc: REF Cursor => RETURN [ccญ]; ENDCASE => { cursor ฌ MutableStandardCursor[c, source]; XlPrivateResources.Attach[c, cursor, $immutableCursor]; [] ฌ CardTab.Store[data.sharedStandardCursors, ORD[source], NEW[Cursor ฌ cursor]] }; }; MutableStandardCursor: PUBLIC PROC [c: Xl.Connection, source: StandardFontCursors] RETURNS [cursor: Xl.Cursor] = { data: ConnectionCache ฌ GetConnectionData[c]; cursor ฌ CreateGlyphCursor[c: data.connection, sourceFont: data.cursorFont, sourceChar: ORD[source], maskFont: data.cursorFont, maskChar: ORD[source]+1]; }; END. าXlCursorImpl.mesa Copyright ำ 1988, 1989, 1990, 1991 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, October 11, 1988 12:16:16 pm PDT Christian Jacobi, March 7, 1991 5:48 pm PST สฌ–(cedarcode) style•NewlineDelimiter ˜codešœ™Kšœ ฯeœC™NKšœ=™=Kšœ+™+—K˜šฯk œ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ˜Kšœ˜K˜—šฯn œžœžœ˜Kšžœ ˜'Kšžœ ˜—šžœžœ˜K˜—Kš œ žœžœžœžœ˜0K˜Kšœžœฯcg˜™K˜Kšœžœžœ˜/šœžœžœ˜#Kšœžœ˜K˜Kšœ%ž˜(K˜K˜—šŸœžœžœ˜IKšœ  ˜#šžœžœ˜Kšœžœ<˜GKšœ  ˜K˜—K˜—K˜šŸœ˜&šœžœ˜0Kšœ˜Kšœ%˜%Kšœ'˜'Kšœ˜—Kšžœ˜ Kšœ˜—K˜šŸœžœžœžœ ˜BKšœ-˜-Kšžœ˜Kšœ˜K˜—šŸœžœžœ.žœ˜kKšœ-˜-šžœ+žœžœž˜KKšœžœ žœ˜šžœ˜ Kšœ*˜*Kšœ7˜7Kšœ/žœ žœ˜QKšœ˜——Kšœ˜—K˜šŸœžœžœ1žœ˜rKšœ-˜-KšœXžœ/žœ ˜™K˜K™—Kšžœ˜K˜—…—”