1 |
greg |
1.2 |
% SCCSid "$SunId$ LBL" |
2 |
greg |
1.1 |
|
3 |
|
|
% |
4 |
|
|
% By Isaac Kuo |
5 |
|
|
% |
6 |
|
|
|
7 |
|
|
#include "newsconstants.h" |
8 |
greg |
1.2 |
|
9 |
greg |
1.1 |
cdef cps_clear() |
10 |
|
|
textbackground setcolor clippath fill |
11 |
|
|
cdef initcanvas(x,y,width,height,mb1key,mb2key,mb3key) |
12 |
greg |
1.2 |
% a couple of definitions of commands in Sun NeWS but not in |
13 |
|
|
% SiliconGraphics NeWS |
14 |
|
|
|
15 |
|
|
currentdict /createcanvas known not % check if they're defined or not |
16 |
|
|
{ |
17 |
|
|
/createcanvas |
18 |
|
|
{ |
19 |
|
|
3 2 roll newcanvas /newcan exch def |
20 |
|
|
0 0 4 2 roll newpath rectpath |
21 |
|
|
newcan reshapecanvas newpath |
22 |
|
|
newcan |
23 |
|
|
} def |
24 |
|
|
/mapcanvas |
25 |
|
|
{ |
26 |
|
|
/Mapped true put |
27 |
|
|
} def |
28 |
|
|
} if |
29 |
|
|
|
30 |
|
|
% terrific, wasn't it? |
31 |
|
|
|
32 |
greg |
1.1 |
/Can framebuffer width height createcanvas def |
33 |
|
|
Can /Retained true put |
34 |
|
|
Can setcanvas x y movecanvas currentcanvas mapcanvas |
35 |
|
|
clippath pathbbox pop pop translate |
36 |
|
|
1.0 .75 .3 setrgbcolor clippath fill |
37 |
|
|
/scrollheight textareaheight fontheight sub def |
38 |
|
|
thefont findfont fontheight scalefont setfont |
39 |
|
|
/textbackground textbackgroundRED textbackgroundGREEN |
40 |
|
|
textbackgroundBLUE rgbcolor def |
41 |
|
|
/MB1key mb1key def |
42 |
|
|
/MB2key mb2key def |
43 |
|
|
/MB3key mb3key def |
44 |
|
|
|
45 |
|
|
% scroll scrolls the text area |
46 |
|
|
/scroll |
47 |
|
|
{ |
48 |
|
|
newpath |
49 |
|
|
0 0 width scrollheight points2rect rectpath |
50 |
|
|
0 fontheight copyarea % Scroll the text area |
51 |
|
|
newpath textbackground setcolor |
52 |
|
|
0 0 width fontheight points2rect rectpath |
53 |
|
|
fill |
54 |
|
|
/textcursorposition 0 def |
55 |
|
|
} def |
56 |
|
|
scroll scroll |
57 |
|
|
|
58 |
|
|
% myshow takes a string and prints it at the current cursor location |
59 |
|
|
/myshow |
60 |
|
|
{ |
61 |
|
|
textshadowgray setgray |
62 |
|
|
textcursorposition 1 sub textbottom 1 sub moveto dup show |
63 |
|
|
0 setgray |
64 |
|
|
textcursorposition textbottom moveto show |
65 |
|
|
/textcursorposition currentpoint pop def |
66 |
|
|
} def |
67 |
|
|
|
68 |
|
|
% mydel takes a string and deletes it from the current cursor location |
69 |
|
|
/mydel |
70 |
|
|
{ |
71 |
|
|
textbackground setcolor |
72 |
|
|
dup stringwidth pop textcursorposition exch sub |
73 |
|
|
dup /textcursorposition exch def |
74 |
|
|
1 sub textbottom 1 sub moveto dup show textcursorposition % |
75 |
|
|
textbottom moveto show |
76 |
|
|
} def |
77 |
|
|
|
78 |
|
|
/normalcursor |
79 |
|
|
{ |
80 |
|
|
/xcurs /xcurs_m Can setstandardcursor |
81 |
|
|
} def |
82 |
|
|
normalcursor |
83 |
|
|
|
84 |
|
|
% get this canvas ready for input |
85 |
|
|
/buttonevent createevent def |
86 |
|
|
buttonevent /Name [/LeftMouseButton /MiddleMouseButton /RightMouseButton] put |
87 |
|
|
buttonevent /Action /UpTransition put |
88 |
|
|
buttonevent /Canvas Can put |
89 |
|
|
/keyevent Can addkbdinterests aload /EVENTS exch |
90 |
|
|
def revokeinterest revokeinterest def |
91 |
|
|
/dumevent createevent def % dumevent is used by the input checker |
92 |
|
|
dumevent /Name 32 put % to insure awaitevent returns an answer |
93 |
|
|
dumevent /Action 13 put % immediately; if it is the first one |
94 |
|
|
dumevent /Canvas Can put % returned, then no keyboard events |
95 |
|
|
dumevent expressinterest % were waiting. |
96 |
|
|
/kdevent createevent def % kdevent is used by the input checker |
97 |
|
|
kdevent /Action 666 put % to replace waiting keyboard events with |
98 |
|
|
kdevent /Canvas Can put % something which acts interchangably with |
99 |
|
|
kdevent expressinterest % a normal keyboard event. |
100 |
|
|
|
101 |
greg |
1.3 |
cdef box(x1,y1,x2,y2,r,g,b) |
102 |
greg |
1.1 |
% Draw a filled box at x,y in pixels with color r,g,b |
103 |
greg |
1.3 |
r 500 div g 500 div b 500 div setrgbcolor newpath |
104 |
greg |
1.1 |
x1 y1 x2 y2 points2rect rectpath fill |
105 |
|
|
#define tag 1990 |
106 |
|
|
cdef cps_cleanup() => tag() |
107 |
|
|
% Clean up just enough stuff so the window will die quietly |
108 |
|
|
keyevent revokeinterest |
109 |
|
|
kdevent revokeinterest |
110 |
|
|
EVENTS Can revokekbdinterests |
111 |
|
|
dumevent revokeinterest |
112 |
|
|
/Can currentcanvas def |
113 |
|
|
Can /EventsConsumed /NoEvents put |
114 |
|
|
Can /Transparent true put |
115 |
|
|
Can /Mapped false put |
116 |
|
|
Can /Retained false put |
117 |
|
|
tag tagprint |
118 |
|
|
cdef getthebox(X,Y,W,H) => tag(X,Y,W,H) |
119 |
|
|
% Get the coordinates of the box from the user |
120 |
greg |
1.2 |
|
121 |
|
|
% While Sun NeWS coordinates default to pixels, Silicon Graphics NeWS |
122 |
|
|
% defaults to "points", which are 4/3 the size of pixels in both directions. |
123 |
|
|
% Silicon Graphics NeWS does not have "createcanvas" defined, so it is |
124 |
|
|
% used to determine whether the coordinates should be translated. |
125 |
|
|
|
126 |
|
|
currentcanvas createoverlay setcanvas |
127 |
greg |
1.3 |
currentdict /SGIWindow known |
128 |
greg |
1.2 |
{ |
129 |
|
|
.75 .75 scale |
130 |
|
|
} if |
131 |
|
|
getwholerect waitprocess |
132 |
greg |
1.1 |
aload pop /y1 exch def /x1 exch def /y0 exch def /x0 exch def |
133 |
|
|
x0 x1 gt { /x x1 def /w x0 x1 sub def } |
134 |
|
|
{ /x x0 def /w x1 x0 sub def } ifelse |
135 |
|
|
y0 y1 gt { /y y1 def /h y0 y1 sub def } |
136 |
|
|
{ /y y0 def /h y1 y0 sub def } ifelse |
137 |
|
|
h w y x tag tagprint typedprint typedprint typedprint typedprint |
138 |
greg |
1.3 |
cdef sgicheck(V) => tag(V) |
139 |
|
|
% Check if this is viewed on an SGI screen |
140 |
|
|
0 |
141 |
|
|
currentdict /SGIWindow known |
142 |
|
|
{ |
143 |
|
|
pop 100 |
144 |
|
|
} if |
145 |
|
|
tag tagprint typedprint |
146 |
greg |
1.1 |
cdef printout(string message) |
147 |
|
|
% print message without scrolling the text "window" up |
148 |
|
|
message myshow |
149 |
|
|
cdef linefeed(string message) |
150 |
|
|
% print message and scroll |
151 |
|
|
message myshow scroll |
152 |
|
|
cdef getclick(x,y,key) => tag(key,y,x) |
153 |
|
|
% get a cursor position marked by click or key |
154 |
|
|
buttonevent expressinterest |
155 |
|
|
/beye_m /xhair_m Can setstandardcursor |
156 |
|
|
/theclick awaitevent def |
157 |
|
|
currentcursorlocation textareaheight sub |
158 |
|
|
normalcursor |
159 |
|
|
buttonevent revokeinterest |
160 |
|
|
|
161 |
|
|
theclick /Name get |
162 |
|
|
% Translate mouse clicks if necessary |
163 |
|
|
dup /LeftMouseButton eq |
164 |
|
|
{pop MB1key} if |
165 |
|
|
dup /MiddleMouseButton eq |
166 |
|
|
{pop MB2key} if |
167 |
|
|
dup /RightMouseButton eq |
168 |
|
|
{pop MB3key} if |
169 |
|
|
cvi |
170 |
|
|
tag tagprint typedprint typedprint typedprint |
171 |
|
|
cdef isready(keyread) => tag(keyread) |
172 |
|
|
% tells whether character input is ready |
173 |
|
|
0 % default output |
174 |
|
|
dumevent createevent copy sendevent |
175 |
|
|
{ |
176 |
|
|
/theevent awaitevent def |
177 |
|
|
theevent /Action get 13 eq |
178 |
|
|
{ exit } if |
179 |
|
|
pop 1 |
180 |
|
|
/newevent kdevent createevent copy def |
181 |
|
|
newevent /Name theevent /Name get put |
182 |
|
|
newevent sendevent |
183 |
|
|
} loop |
184 |
|
|
tag tagprint typedprint |
185 |
|
|
cdef startcomin() |
186 |
|
|
% get ready for execution of comin |
187 |
|
|
/nouse /nouse_m Can setstandardcursor |
188 |
|
|
cdef endcomin() |
189 |
|
|
% get ready for normal execution |
190 |
|
|
normalcursor |
191 |
|
|
cdef getkey(key) => tag(key) |
192 |
|
|
% get a keypress |
193 |
|
|
textcursor myshow awaitevent /Name get cvi |
194 |
|
|
textcursor mydel tag tagprint typedprint |
195 |
|
|
cdef delete(string s) |
196 |
|
|
% delete the string s |
197 |
|
|
s mydel |