|
|
1.1 root 1: % Copyright Barbara Liskov 1985, 1986
2:
3: x_tcons = proc (name: string, back, border: x_pixmap, spec, defspec: string,
4: f: x_font, fwidth, fheight: int,
5: add, minwidth, minheight, bwidth: int)
6: returns (x_window, int, int)
7: zero = char$c2i('0')
8: dcount = 2
9: vcount = 1 + (4 * 2 * dcount)
10: fcount = 1 + 4
11: root: x_window := x_display$root()
12: sw: int := x_display$width()
13: sh: int := x_display$height()
14: defwidth, defheight, defx, defy: int, defxplus, defyplus, place: bool :=
15: x_geometry(spec, defspec)
16: defwidth := int$max(defwidth, minwidth)
17: defheight := int$max(defheight, minheight)
18: if place
19: then if ~defxplus
20: then defx := sw - defx - defwidth * fwidth - 2 * bwidth - add
21: end
22: if ~defyplus
23: then defy := sh - defy - defheight * fheight - 2 * bwidth - add
24: end
25: x: x_window := x_window$create(defx, defy,
26: defwidth * fwidth + add,
27: defheight * fheight + add,
28: back, root, bwidth, border)
29: return(x, defwidth, defheight)
30: end
31: prog: string := _get_xjname()
32: pfont: x_font := x_font$create(x_default(prog, "MakeWindow.BodyFont"))
33: except when not_found: pfont := f end
34: pfore: int := WhitePixel
35: pback: int := BlackPixel
36: if x_default(prog, "MakeWindow.ReverseVideo") = "on"
37: then pfore := BlackPixel
38: pback := WhitePixel
39: end except when not_found: end
40: bpix: int := pback
41: mfore: int := pback
42: mback: int := pfore
43: pbw: int := int$parse(x_default(prog, "MakeWindow.BorderWidth"))
44: except when not_found, overflow, bad_format: pbw := 1 end
45: ibw: int := int$parse(x_default(prog, "MakeWindow.InternalBorder"))
46: except when not_found, overflow, bad_format: ibw := 1 end
47: freeze: bool := x_default(prog, "MakeWindow.Freeze") = "on"
48: except when not_found: freeze := false end
49: clip: bool := x_default(prog, "MakeWindow.ClipToScreen") = "on"
50: except when not_found: clip := false end
51: if x_display$cells() > 2
52: then begin
53: r, g, b: int := x_parse_color(
54: x_default(prog, "MakeWindow.Foreground"))
55: pfore := x_display$alloc_color(r, g, b)
56: end except others: end
57: begin
58: r, g, b: int := x_parse_color(
59: x_default(prog, "MakeWindow.Background"))
60: pback := x_display$alloc_color(r, g, b)
61: end except others: end
62: begin
63: r, g, b: int := x_parse_color(
64: x_default(prog, "MakeWindow.Border"))
65: bpix := x_display$alloc_color(r, g, b)
66: end except others: end
67: begin
68: r, g, b: int := x_parse_color(
69: x_default(prog, "MakeWindow.Mouse"))
70: mfore := x_display$alloc_color(r, g, b)
71: end except others: end
72: begin
73: r, g, b: int := x_parse_color(
74: x_default(prog, "MakeWindow.MouseMask"))
75: mback := x_display$alloc_color(r, g, b)
76: end except others: end
77: end
78: cr: x_cursor := x_cursor$scons(cross_width, cross_height,
79: cross, cross_mask, mback, mfore,
80: cross_x, cross_y, GXcopy)
81: events: int := ButtonPressed + ButtonReleased
82: if freeze
83: then events := events + MouseMoved end
84: while true do
85: x_window$grab_mouse(root, events, cr)
86: except when error (*):
87: sleep(1)
88: continue
89: end
90: break
91: end
92: fw, fh: int, fc, lc: char, bl: int, fx: bool := x_font$query(pfont)
93: nz: int := string$size(name) + 9
94: popw: int := nz * fw + 2 * ibw
95: poph: int := fh + 2 * ibw
96: count: int := vcount
97: save: x_pixmap := x_pixmap$none()
98: if freeze
99: then x_display$grab()
100: count := fcount
101: save := x_window$save_region(root, 0, 0,
102: popw + 2 * pbw, poph + 2 * pbw)
103: except when error (*): end
104: end
105: backmap: x_pixmap := x_pixmap$tile(pback)
106: bdrmap: x_pixmap := x_pixmap$tile(bpix)
107: pop: x_window := x_window$create(0, 0, popw, poph, backmap,
108: root, pbw, bdrmap)
109: x_window$map(pop)
110: xadd: int := fwidth / 2 - add
111: yadd: int := fheight / 2 - add
112: x1, y1: int, bw: x_window := x_window$query_mouse(root)
113: box: x_vlist := x_vlist$create(count)
114: but: int
115: x2: int := x1 + minwidth * fwidth + add + 2 * bwidth - 1
116: y2: int := y1 + minheight * fheight + add + 2 * bwidth - 1
117: chosen: int := -1
118: stop: bool := false
119: hsize: int := minwidth
120: vsize: int := minheight
121: text: _bytevec := _cvt[string, _bytevec](name || ": 000x000")
122: changed: bool := true
123: xa: int := -1
124: ya: int := -1
125: xb: int := -1
126: yb: int := -1
127: e: event := x_input$empty_event()
128: doit: bool := true
129: mindim: int := add + 2 * bwidth
130: while ~stop do
131: if xb ~= int$max(x1, x2) cor yb ~= int$max(y1, y2) cor
132: xa ~= int$min(x1, x2) cor ya ~= int$min(y1, y2)
133: then if freeze cand ~doit
134: then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1)
135: end
136: xa := int$min(x1, x2)
137: ya := int$min(y1, y2)
138: xb := int$max(x1, x2)
139: yb := int$max(y1, y2)
140: for i: int in int$from_to_by(1, count, 4) do
141: x_vlist$store(box, i, xa, ya, 0)
142: if i = count
143: then break end
144: x_vlist$store(box, i + 1, xb, ya, 0)
145: x_vlist$store(box, i + 2, xb, yb, 0)
146: x_vlist$store(box, i + 3, xa, yb, 0)
147: end
148: doit := true
149: end
150: if changed
151: then changed := false
152: text[nz - 6] := char$i2c(hsize / 100 + zero)
153: text[nz - 5] := char$i2c((hsize / 10) // 10 + zero)
154: text[nz - 4] := char$i2c(hsize // 10 + zero)
155: text[nz - 2] := char$i2c(vsize / 100 + zero)
156: text[nz - 1] := char$i2c((vsize / 10) // 10 + zero)
157: text[nz] := char$i2c(vsize // 10 + zero)
158: x_window$text(pop, _cvt[_bytevec, string](text), pfont,
159: pfore, pback, ibw, ibw)
160: end
161: if doit
162: then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1)
163: doit := ~freeze
164: end
165: if freeze cor x_input$pending()
166: then x_input$deq(e)
167: x2 := e.x
168: y2 := e.y
169: if chosen < 0 cand e.kind = ButtonPressed
170: then x1 := x2
171: y1 := y2
172: chosen := e.value
173: elseif e.kind = ButtonReleased cand e.value = chosen
174: then stop := true
175: else x2, y2, bw := x_window$query_mouse(root) end
176: else x2, y2, bw := x_window$query_mouse(root)
177: end
178: if chosen ~= MiddleButton
179: then x1 := x2
180: y1 := y2
181: if chosen >= 0
182: then x2 := defwidth
183: if chosen = LeftButton
184: then y2 := defheight
185: else y2 := (sh - mindim - cross_y) / fheight
186: end
187: if clip
188: then x2 := int$min(int$max((sw - x1 - mindim) / fwidth, 0), x2)
189: y2 := int$min(int$max((sh - y1 - mindim) / fheight, 0), y2)
190: end
191: x2 := x1 + x2 * fwidth + add - 1
192: y2 := y1 + y2 * fheight + add - 1
193: end
194: end
195: d: int := int$max((int$abs(x2 - x1) + xadd) / fwidth, minwidth)
196: if d ~= hsize
197: then hsize := d
198: changed := true
199: end
200: d := d * fwidth + mindim - 1
201: if x2 < x1
202: then x2 := x1 - d
203: else x2 := x1 + d
204: end
205: d := int$max((int$abs(y2 - y1) + yadd) / fheight, minheight)
206: if d ~= vsize
207: then vsize := d
208: changed := true
209: end
210: d := d * fheight + mindim - 1
211: if y2 < y1
212: then y2 := y1 - d
213: else y2 := y1 + d
214: end
215: end
216: if freeze
217: then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1) end
218: x_window$ungrab_mouse()
219: if save ~= x_pixmap$none()
220: then x_window$unmap_transparent(pop)
221: x_window$pixmap_put(root, save, 0, 0, popw + 2 * pbw,
222: poph + 2 * pbw, 0, 0, GXcopy, -1)
223: x_pixmap$destroy(save)
224: end
225: x_window$destroy(pop)
226: if freeze
227: then x_display$ungrab() end
228: x_cursor$destroy(cr)
229: if pfont ~= f
230: then x_font$destroy(pfont) end
231: x_pixmap$destroy(backmap)
232: x_pixmap$destroy(bdrmap)
233: w: x_window := x_window$create(int$min(x1, x2), int$min(y1, y2),
234: hsize * fwidth + add, vsize * fheight + add,
235: back, root, bwidth, border)
236: return(w, hsize, vsize)
237: end x_tcons
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.