Raymond Toy pushed to branch upstream-clx at cmucl / cmucl
Commits:
-
640f90eb
by Raymond Toy at 2018-12-30T01:29:29Z
5 changed files:
- src/clx/clx.asd
- src/clx/demo/clx-demos.lisp
- src/clx/demo/menu.lisp
- src/clx/dependent.lisp
- src/clx/provide.lisp
Changes:
... | ... | @@ -116,7 +116,8 @@ Independent FOSS developers" |
116 | 116 |
:components
|
117 | 117 |
((:module "demo"
|
118 | 118 |
:components
|
119 |
- ((:file "bezier")
|
|
119 |
+ ((:file "menu")
|
|
120 |
+ (:file "bezier")
|
|
120 | 121 |
(:file "beziertest" :depends-on ("bezier"))
|
121 | 122 |
(:file "clclock")
|
122 | 123 |
(:file "clipboard")
|
... | ... | @@ -126,7 +127,6 @@ Independent FOSS developers" |
126 | 127 |
;; deletion notes. Find out why, and either fix or
|
127 | 128 |
;; workaround the problem.
|
128 | 129 |
(:file "mandel")
|
129 |
- (:file "menu")
|
|
130 | 130 |
(:file "zoid")
|
131 | 131 |
(:file "image")
|
132 | 132 |
(:file "trapezoid" :depends-on ("zoid"))))))
|
... | ... | @@ -5,9 +5,15 @@ |
5 | 5 |
;;;
|
6 | 6 |
;;; This file should be portable to any valid Common Lisp with CLX -- DEC 88.
|
7 | 7 |
;;;
|
8 |
+;;; CMUCL MP support by Douglas Crosher 1998.
|
|
9 |
+;;; Enhancements including the CLX menu, rewrite of the greynetic
|
|
10 |
+;;; demo, and other fixes by Fred Gilham 1998.
|
|
11 |
+;;;
|
|
12 |
+;;; Backported some changes found in CMUCL repository -- jd 2018-12-29.
|
|
8 | 13 |
|
9 |
-(defpackage #:xlib-demo/demos (:use :common-lisp)
|
|
10 |
- (:export do-all-demos demo))
|
|
14 |
+(defpackage #:xlib-demo/demos
|
|
15 |
+ (:use :common-lisp)
|
|
16 |
+ (:export #:demo))
|
|
11 | 17 |
|
12 | 18 |
(in-package :xlib-demo/demos)
|
13 | 19 |
|
... | ... | @@ -21,6 +27,7 @@ |
21 | 27 |
;;; it is running.
|
22 | 28 |
|
23 | 29 |
(defparameter *demos* nil)
|
30 |
+(defparameter *delay* 0.5)
|
|
24 | 31 |
|
25 | 32 |
(defvar *display* nil)
|
26 | 33 |
(defvar *screen* nil)
|
... | ... | @@ -33,105 +40,82 @@ |
33 | 40 |
`(progn
|
34 | 41 |
(defun ,fun-name ,args
|
35 | 42 |
,doc
|
36 |
- (unless *display*
|
|
37 |
- #+:cmu
|
|
38 |
- (multiple-value-setq (*display* *screen*) (ext:open-clx-display))
|
|
39 |
- #+(or sbcl allegro clisp lispworks)
|
|
40 |
- (progn
|
|
41 |
- (setf *display* (xlib::open-default-display))
|
|
42 |
- (setf *screen* (xlib:display-default-screen *display*)))
|
|
43 |
- #-(or cmu sbcl allegro clisp lispworks)
|
|
44 |
- (progn
|
|
45 |
- ;; Portable method
|
|
46 |
- (setf *display* (xlib:open-display (machine-instance)))
|
|
47 |
- (setf *screen* (xlib:display-default-screen *display*)))
|
|
48 |
- (setf *root* (xlib:screen-root *screen*))
|
|
49 |
- (setf *black-pixel* (xlib:screen-black-pixel *screen*))
|
|
50 |
- (setf *white-pixel* (xlib:screen-white-pixel *screen*)))
|
|
51 |
- (let ((*window* (xlib:create-window :parent *root*
|
|
52 |
- :x ,x :y ,y
|
|
53 |
- :event-mask nil
|
|
54 |
- :width ,width :height ,height
|
|
55 |
- :background *white-pixel*
|
|
56 |
- :border *black-pixel*
|
|
57 |
- :border-width 2
|
|
58 |
- :override-redirect :on)))
|
|
43 |
+ (let* ((*display* (or *display*
|
|
44 |
+ (xlib:open-default-display)
|
|
45 |
+ (xlib:open-display (machine-instance))))
|
|
46 |
+ (*screen* (xlib:display-default-screen *display*))
|
|
47 |
+ (*root* (xlib:screen-root *screen*))
|
|
48 |
+ (*black-pixel* (xlib:screen-black-pixel *screen*))
|
|
49 |
+ (*white-pixel* (xlib:screen-white-pixel *screen*))
|
|
50 |
+ (*window* (xlib:create-window :parent *root*
|
|
51 |
+ :x ,x :y ,y
|
|
52 |
+ :event-mask '(:visibility-change)
|
|
53 |
+ :width ,width :height ,height
|
|
54 |
+ :background *white-pixel*
|
|
55 |
+ :border *black-pixel*
|
|
56 |
+ :border-width 2
|
|
57 |
+ :override-redirect :off)))
|
|
58 |
+ (xlib:set-wm-properties *window*
|
|
59 |
+ :name ,demo-name
|
|
60 |
+ :icon-name ,demo-name
|
|
61 |
+ :resource-name ,demo-name
|
|
62 |
+ :x ,x :y ,y :width ,width :height ,height
|
|
63 |
+ :user-specified-position-p t
|
|
64 |
+ :user-specified-size-p t
|
|
65 |
+ :min-width ,width :min-height ,height
|
|
66 |
+ :width-inc nil :height-inc nil)
|
|
59 | 67 |
(xlib:map-window *window*)
|
60 |
- ;;
|
|
61 |
- ;; I hate to do this since this is not something any normal
|
|
62 |
- ;; program should do ...
|
|
63 |
- (setf (xlib:window-priority *window*) :above)
|
|
64 |
- (xlib:display-finish-output *display*)
|
|
65 |
- (unwind-protect
|
|
66 |
- (progn ,@forms)
|
|
67 |
- (xlib:unmap-window *window*)
|
|
68 |
- (xlib:display-finish-output *display*))))
|
|
68 |
+ ;; Wait until we get mapped before doing anything.
|
|
69 |
+ (xlib:display-finish-output *display*)
|
|
70 |
+ (unwind-protect (progn ,@forms)
|
|
71 |
+ (xlib:display-finish-output *display*)
|
|
72 |
+ (xlib:unmap-window *window*))))
|
|
69 | 73 |
(setf (get ',fun-name 'demo-name) ',demo-name)
|
70 | 74 |
(setf (get ',fun-name 'demo-doc) ',doc)
|
71 |
- (export ',fun-name)
|
|
72 | 75 |
(pushnew ',fun-name *demos*)
|
73 | 76 |
',fun-name))
|
74 | 77 |
|
75 | 78 |
|
76 |
-;;;; Main entry points.
|
|
77 |
- |
|
78 |
-(defun do-all-demos ()
|
|
79 |
- (loop
|
|
80 |
- (dolist (demo *demos*)
|
|
81 |
- (funcall demo)
|
|
82 |
- (sleep 3))))
|
|
83 |
- |
|
84 |
-;;; DEMO is a hack to get by. It should be based on creating a menu. At
|
|
85 |
-;;; that time, *name-to-function* should be deleted, since this mapping will
|
|
86 |
-;;; be manifested in the menu slot name cross its action. Also the
|
|
87 |
-;;; "Shove-bounce" demo should be renamed to "Shove bounce"; likewise for
|
|
88 |
-;;; "Fast-towers-of-Hanoi" and "Slow-towers-of-hanoi".
|
|
89 |
-;;;
|
|
79 |
+;;; DEMO
|
|
90 | 80 |
|
91 | 81 |
(defvar *name-to-function* (make-hash-table :test #'eq))
|
92 | 82 |
(defvar *keyword-package* (find-package "KEYWORD"))
|
83 |
+(defvar *demo-names* nil)
|
|
93 | 84 |
|
94 | 85 |
(defun demo ()
|
95 |
- (macrolet ((read-demo ()
|
|
96 |
- `(let ((*package* *keyword-package*))
|
|
97 |
- (read))))
|
|
86 |
+ (let ((*demo-names* '("Quit")))
|
|
98 | 87 |
(dolist (d *demos*)
|
99 | 88 |
(setf (gethash (intern (string-upcase (get d 'demo-name))
|
100 | 89 |
*keyword-package*)
|
101 | 90 |
*name-to-function*)
|
102 |
- d))
|
|
103 |
- (loop
|
|
104 |
- (fresh-line)
|
|
105 |
- (dolist (d *demos*)
|
|
106 |
- (write-string " ")
|
|
107 |
- (write-line (get d 'demo-name)))
|
|
108 |
- (write-string " ")
|
|
109 |
- (write-line "Help <demo name>")
|
|
110 |
- (write-string " ")
|
|
111 |
- (write-line "Quit")
|
|
112 |
- (write-string "Enter demo name: ")
|
|
113 |
- (let ((demo (read-demo)))
|
|
114 |
- (case demo
|
|
115 |
- (:help
|
|
116 |
- (let* ((demo (read-demo))
|
|
117 |
- (fun (gethash demo *name-to-function*)))
|
|
118 |
- (fresh-line)
|
|
119 |
- (if fun
|
|
120 |
- (format t "~&~%~A~&~%" (get fun 'demo-doc))
|
|
121 |
- (format t "Unknown demo name -- ~A." demo))))
|
|
122 |
- (:quit (return t))
|
|
123 |
- (t
|
|
124 |
- (let ((fun (gethash demo *name-to-function*)))
|
|
125 |
- (if fun
|
|
126 |
- #+mp
|
|
127 |
- (mp:make-process #'(lambda ()
|
|
128 |
- (loop
|
|
129 |
- (funcall fun)
|
|
130 |
- (sleep 2)))
|
|
131 |
- :name (format nil "~S" demo))
|
|
132 |
- #-mp
|
|
133 |
- (funcall fun)
|
|
134 |
- (format t "~&~%Unknown demo name -- ~A.~&~%" demo)))))))))
|
|
91 |
+ d)
|
|
92 |
+ (push (get d 'demo-name) *demo-names*))
|
|
93 |
+
|
|
94 |
+ (let* ((display (xlib:open-default-display))
|
|
95 |
+ (screen (xlib:display-default-screen display))
|
|
96 |
+ (fg-color (xlib:screen-white-pixel screen))
|
|
97 |
+ (bg-color (xlib:screen-black-pixel screen))
|
|
98 |
+ (nice-font (xlib:open-font display "fixed")))
|
|
99 |
+
|
|
100 |
+ (let ((a-menu (xlib::create-menu
|
|
101 |
+ (xlib::screen-root screen) ;the menu's parent
|
|
102 |
+ fg-color bg-color nice-font)))
|
|
103 |
+
|
|
104 |
+ (setf (xlib::menu-title a-menu) "Please pick your favorite demo:")
|
|
105 |
+ (xlib::menu-set-item-list a-menu *demo-names*)
|
|
106 |
+ (ignore-errors ;; closing window is not handled properly in menu.
|
|
107 |
+ (unwind-protect
|
|
108 |
+ (do ((choice (xlib::menu-choose a-menu 100 100)
|
|
109 |
+ (xlib::menu-choose a-menu 100 100)))
|
|
110 |
+ ((and choice (string-equal "Quit" choice)))
|
|
111 |
+ (let* ((demo-choice (intern (string-upcase choice)
|
|
112 |
+ *keyword-package*))
|
|
113 |
+ (fun (gethash demo-choice *name-to-function*)))
|
|
114 |
+ (setf choice nil)
|
|
115 |
+ (when fun
|
|
116 |
+ (ignore-errors (funcall fun)))))
|
|
117 |
+ (xlib:display-finish-output display)
|
|
118 |
+ (xlib:close-display display)))))))
|
|
135 | 119 |
|
136 | 120 |
|
137 | 121 |
;;;; Shared demo utilities.
|
... | ... | @@ -143,60 +127,124 @@ |
143 | 127 |
(xlib:window-map-state w))))
|
144 | 128 |
|
145 | 129 |
|
146 |
-;;;; Greynetic.
|
|
147 |
- |
|
148 |
-;;; GREYNETIC displays random sized and shaded boxes in a window. This is
|
|
149 |
-;;; real slow. It needs work.
|
|
150 |
-;;;
|
|
151 |
-(defun greynetic (window duration)
|
|
152 |
- (let* ((pixmap (xlib:create-pixmap :width 32 :height 32 :depth 1
|
|
153 |
- :drawable window))
|
|
154 |
- (gcontext (xlib:create-gcontext :drawable window
|
|
155 |
- :background *white-pixel*
|
|
156 |
- :foreground *black-pixel*
|
|
157 |
- :tile pixmap
|
|
158 |
- :fill-style :tiled)))
|
|
159 |
- (multiple-value-bind (width height) (full-window-state window)
|
|
160 |
- (dotimes (i duration)
|
|
161 |
- (let* ((pixmap-data (greynetic-pixmapper))
|
|
162 |
- (image (xlib:create-image :width 32 :height 32
|
|
163 |
- :depth 1 :data pixmap-data)))
|
|
164 |
- (xlib:put-image pixmap gcontext image :x 0 :y 0 :width 32 :height 32)
|
|
165 |
- (xlib:draw-rectangle window gcontext
|
|
166 |
- (- (random width) 5)
|
|
167 |
- (- (random height) 5)
|
|
168 |
- (+ 4 (random (truncate width 3)))
|
|
169 |
- (+ 4 (random (truncate height 3)))
|
|
170 |
- t))
|
|
171 |
- (xlib:display-force-output *display*)))
|
|
172 |
- (xlib:free-gcontext gcontext)
|
|
173 |
- (xlib:free-pixmap pixmap)))
|
|
174 |
- |
|
175 |
-(defvar *greynetic-pixmap-array*
|
|
176 |
- (make-array '(32 32) :initial-element 0 :element-type 'xlib:pixel))
|
|
177 |
- |
|
178 |
-(defun greynetic-pixmapper ()
|
|
179 |
- (let ((pixmap-data *greynetic-pixmap-array*))
|
|
130 |
+(defun make-random-bitmap ()
|
|
131 |
+ (let ((bitmap-data (make-array '(32 32) :initial-element 0
|
|
132 |
+ :element-type 'xlib::bit)))
|
|
180 | 133 |
(dotimes (i 4)
|
181 | 134 |
(declare (fixnum i))
|
182 | 135 |
(let ((nibble (random 16)))
|
183 |
- (setf nibble (logior nibble (ash nibble 4))
|
|
184 |
- nibble (logior nibble (ash nibble 8))
|
|
185 |
- nibble (logior nibble (ash nibble 12))
|
|
186 |
- nibble (logior nibble (ash nibble 16)))
|
|
187 |
- (dotimes (j 32)
|
|
188 |
- (let ((bit (if (logbitp j nibble) 1 0)))
|
|
189 |
- (setf (aref pixmap-data i j) bit
|
|
190 |
- (aref pixmap-data (+ 4 i) j) bit
|
|
191 |
- (aref pixmap-data (+ 8 i) j) bit
|
|
192 |
- (aref pixmap-data (+ 12 i) j) bit
|
|
193 |
- (aref pixmap-data (+ 16 i) j) bit
|
|
194 |
- (aref pixmap-data (+ 20 i) j) bit
|
|
195 |
- (aref pixmap-data (+ 24 i) j) bit
|
|
196 |
- (aref pixmap-data (+ 28 i) j) bit)))))
|
|
197 |
- pixmap-data))
|
|
198 |
- |
|
199 |
-#+nil
|
|
136 |
+ (setf nibble (logior nibble (ash nibble 4))
|
|
137 |
+ nibble (logior nibble (ash nibble 8))
|
|
138 |
+ nibble (logior nibble (ash nibble 12))
|
|
139 |
+ nibble (logior nibble (ash nibble 16)))
|
|
140 |
+ (dotimes (j 32)
|
|
141 |
+ (let ((bit (if (logbitp j nibble) 1 0)))
|
|
142 |
+ (setf (aref bitmap-data i j) bit
|
|
143 |
+ (aref bitmap-data (+ 4 i) j) bit
|
|
144 |
+ (aref bitmap-data (+ 8 i) j) bit
|
|
145 |
+ (aref bitmap-data (+ 12 i) j) bit
|
|
146 |
+ (aref bitmap-data (+ 16 i) j) bit
|
|
147 |
+ (aref bitmap-data (+ 20 i) j) bit
|
|
148 |
+ (aref bitmap-data (+ 24 i) j) bit
|
|
149 |
+ (aref bitmap-data (+ 28 i) j) bit)))))
|
|
150 |
+ bitmap-data))
|
|
151 |
+ |
|
152 |
+ |
|
153 |
+(defun make-random-pixmap ()
|
|
154 |
+ (let ((image (xlib:create-image :depth 1 :data (make-random-bitmap))))
|
|
155 |
+ (make-pixmap image 32 32)))
|
|
156 |
+ |
|
157 |
+(defvar *pixmaps* nil)
|
|
158 |
+ |
|
159 |
+(defun make-pixmap (image width height)
|
|
160 |
+ (let* ((pixmap (xlib:create-pixmap :width width :height height
|
|
161 |
+ :depth 1 :drawable *root*))
|
|
162 |
+ (gc (xlib:create-gcontext :drawable pixmap
|
|
163 |
+ :background *black-pixel*
|
|
164 |
+ :foreground *white-pixel*)))
|
|
165 |
+ (xlib:put-image pixmap gc image :x 0 :y 0 :width width :height height)
|
|
166 |
+ (xlib:free-gcontext gc)
|
|
167 |
+ pixmap))
|
|
168 |
+ |
|
169 |
+ |
|
170 |
+;;;
|
|
171 |
+;;; This function returns one of the pixmaps in the *pixmaps* array.
|
|
172 |
+(defun greynetic-pixmapper ()
|
|
173 |
+ (aref *pixmaps* (random (length *pixmaps*))))
|
|
174 |
+ |
|
175 |
+ |
|
176 |
+(defun greynetic (window duration)
|
|
177 |
+ (let* ((depth (xlib:drawable-depth window))
|
|
178 |
+ (draw-gcontext (xlib:create-gcontext :drawable window
|
|
179 |
+ :foreground *white-pixel*
|
|
180 |
+ :background *black-pixel*))
|
|
181 |
+ ;; Need a random state per process.
|
|
182 |
+ (*random-state* (make-random-state t))
|
|
183 |
+ (*pixmaps* (let ((pixmap-array (make-array 30)))
|
|
184 |
+ (dotimes (i 30)
|
|
185 |
+ (setf (aref pixmap-array i) (make-random-pixmap)))
|
|
186 |
+ pixmap-array)))
|
|
187 |
+ |
|
188 |
+ (unwind-protect
|
|
189 |
+ (multiple-value-bind (width height) (full-window-state window)
|
|
190 |
+ (declare (fixnum width height))
|
|
191 |
+ (let ((border-x (truncate width 20))
|
|
192 |
+ (border-y (truncate height 20)))
|
|
193 |
+ (declare (fixnum border-x border-y))
|
|
194 |
+ (dotimes (i duration)
|
|
195 |
+ (let ((pixmap (greynetic-pixmapper)))
|
|
196 |
+ (xlib:with-gcontext (draw-gcontext
|
|
197 |
+ :foreground (random (ash 1 depth))
|
|
198 |
+ :background (random (ash 1 depth))
|
|
199 |
+ :stipple pixmap
|
|
200 |
+ :fill-style
|
|
201 |
+ :opaque-stippled)
|
|
202 |
+ (cond ((zerop (mod i 500))
|
|
203 |
+ (xlib:clear-area window)
|
|
204 |
+ (sleep .1))
|
|
205 |
+ (t
|
|
206 |
+ (sleep *delay*)))
|
|
207 |
+ (if (< (random 3) 2)
|
|
208 |
+ (let* ((w (+ border-x
|
|
209 |
+ (truncate (* (random (- width
|
|
210 |
+ (* 2 border-x)))
|
|
211 |
+ (random width)) width)))
|
|
212 |
+ (h (+ border-y
|
|
213 |
+ (truncate (* (random (- height
|
|
214 |
+ (* 2 border-y)))
|
|
215 |
+ (random height)) height)))
|
|
216 |
+ (x (random (- width w)))
|
|
217 |
+ (y (random (- height h))))
|
|
218 |
+ (declare (fixnum w h x y))
|
|
219 |
+ (if (zerop (random 2))
|
|
220 |
+ (xlib:draw-rectangle window draw-gcontext
|
|
221 |
+ x y w h t)
|
|
222 |
+ (xlib:draw-arc window draw-gcontext
|
|
223 |
+ x y w h 0 (* 2 pi) t)))
|
|
224 |
+ (let ((p1-x (+ border-x
|
|
225 |
+ (random (- width (* 2 border-x)))))
|
|
226 |
+ (p1-y (+ border-y
|
|
227 |
+ (random (- height (* 2 border-y)))))
|
|
228 |
+ (p2-x (+ border-x
|
|
229 |
+ (random (- width (* 2 border-x)))))
|
|
230 |
+ (p2-y (+ border-y
|
|
231 |
+ (random (- height (* 2 border-y)))))
|
|
232 |
+ (p3-x (+ border-x
|
|
233 |
+ (random (- width (* 2 border-x)))))
|
|
234 |
+ (p3-y (+ border-y
|
|
235 |
+ (random (- height (* 2 border-y))))))
|
|
236 |
+ (declare (fixnum p1-x p1-y p2-x p2-y p3-x p3-y))
|
|
237 |
+ (xlib:draw-lines window draw-gcontext
|
|
238 |
+ (list p1-x p1-y p2-x p2-y p3-x p3-y)
|
|
239 |
+ :relative-p nil
|
|
240 |
+ :fill-p t
|
|
241 |
+ :shape :convex)))
|
|
242 |
+ (xlib:display-force-output *display*))))))
|
|
243 |
+ (dotimes (i (length *pixmaps*))
|
|
244 |
+ (xlib:free-pixmap (aref *pixmaps* i)))
|
|
245 |
+ (xlib:free-gcontext draw-gcontext))))
|
|
246 |
+ |
|
247 |
+ |
|
200 | 248 |
(defdemo greynetic-demo "Greynetic" (&optional (duration 300))
|
201 | 249 |
100 100 600 600
|
202 | 250 |
"Displays random grey rectangles."
|
... | ... | @@ -677,6 +725,7 @@ |
677 | 725 |
start-needle
|
678 | 726 |
end-needle)
|
679 | 727 |
end-needle)
|
728 |
+ (sleep *delay*)
|
|
680 | 729 |
t)
|
681 | 730 |
|
682 | 731 |
;;; Move-N-Disks moves the top N disks from START-NEEDLE to END-NEEDLE
|
... | ... | @@ -775,27 +824,28 @@ |
775 | 824 |
(when (= prev-neg-velocity 0) (return t))
|
776 | 825 |
(let ((negative-velocity (minusp y-velocity)))
|
777 | 826 |
(loop
|
778 |
- (let ((next-y (+ y y-velocity))
|
|
779 |
- (next-y-velocity (+ y-velocity gravity)))
|
|
780 |
- (declare (fixnum next-y next-y-velocity))
|
|
781 |
- (when (> next-y top-of-window-at-bottom)
|
|
782 |
- (cond
|
|
783 |
- (number-problems
|
|
784 |
- (setf y-velocity (incf prev-neg-velocity)))
|
|
785 |
- (t
|
|
786 |
- (setq y-velocity
|
|
787 |
- (- (truncate (* elasticity y-velocity))))
|
|
788 |
- (when (= y-velocity prev-neg-velocity)
|
|
789 |
- (incf y-velocity)
|
|
790 |
- (setf number-problems t))
|
|
791 |
- (setf prev-neg-velocity y-velocity)))
|
|
792 |
- (setf y top-of-window-at-bottom)
|
|
793 |
- (setf (xlib:drawable-x window) x
|
|
794 |
- (xlib:drawable-y window) y)
|
|
795 |
- (xlib:display-force-output *display*)
|
|
796 |
- (return))
|
|
797 |
- (setq y-velocity next-y-velocity)
|
|
798 |
- (setq y next-y))
|
|
827 |
+ (let ((next-y (+ y y-velocity))
|
|
828 |
+ (next-y-velocity (+ y-velocity gravity)))
|
|
829 |
+ (declare (fixnum next-y next-y-velocity))
|
|
830 |
+ (when (> next-y top-of-window-at-bottom)
|
|
831 |
+ (cond
|
|
832 |
+ (number-problems
|
|
833 |
+ (setf y-velocity (incf prev-neg-velocity)))
|
|
834 |
+ (t
|
|
835 |
+ (setq y-velocity
|
|
836 |
+ (- (truncate (* elasticity y-velocity))))
|
|
837 |
+ (when (= y-velocity prev-neg-velocity)
|
|
838 |
+ (incf y-velocity)
|
|
839 |
+ (setf number-problems t))
|
|
840 |
+ (setf prev-neg-velocity y-velocity)))
|
|
841 |
+ (setf y top-of-window-at-bottom)
|
|
842 |
+ (setf (xlib:drawable-x window) x
|
|
843 |
+ (xlib:drawable-y window) y)
|
|
844 |
+ (xlib:display-force-output *display*)
|
|
845 |
+ (return))
|
|
846 |
+ (setq y-velocity next-y-velocity)
|
|
847 |
+ (setq y next-y)
|
|
848 |
+ (sleep (/ *delay* 100)))
|
|
799 | 849 |
(when (and negative-velocity (>= y-velocity 0))
|
800 | 850 |
(setf negative-velocity nil))
|
801 | 851 |
(let ((next-x (+ x x-velocity)))
|
... | ... | @@ -814,7 +864,7 @@ |
814 | 864 |
100 100 300 300
|
815 | 865 |
"Drops the demo window with an inital X velocity which bounces off
|
816 | 866 |
screen borders."
|
817 |
- (bounce-window *window* 30))
|
|
867 |
+ (bounce-window *window* 3))
|
|
818 | 868 |
|
819 | 869 |
(defdemo bounce-demo "Bounce" ()
|
820 | 870 |
100 100 300 300
|
... | ... | @@ -846,8 +896,8 @@ |
846 | 896 |
(multiple-value-bind (width height) (full-window-state window)
|
847 | 897 |
(xlib:clear-area window)
|
848 | 898 |
(draw-ppict window gc point-count 0.0 0.0 (* width 0.5) (* height 0.5))
|
849 |
- (xlib:display-force-output display)
|
|
850 |
- (sleep 4))
|
|
899 |
+ (xlib:display-finish-output display)
|
|
900 |
+ (sleep 1))
|
|
851 | 901 |
(xlib:free-gcontext gc)))
|
852 | 902 |
|
853 | 903 |
;;; Draw points. X assumes points are in the range of width x height,
|
... | ... | @@ -892,8 +942,8 @@ |
892 | 942 |
:function boole-c2
|
893 | 943 |
:plane-mask (logxor *white-pixel*
|
894 | 944 |
*black-pixel*)
|
895 |
- :background *white-pixel*
|
|
896 |
- :foreground *black-pixel*
|
|
945 |
+ :background *black-pixel*
|
|
946 |
+ :foreground *white-pixel*
|
|
897 | 947 |
:fill-style :solid))
|
898 | 948 |
(rectangles (make-array (* 4 num-rectangles)
|
899 | 949 |
:element-type 'number
|
... | ... | @@ -920,6 +970,7 @@ |
920 | 970 |
(decf y-off (ash y-dir 1))
|
921 | 971 |
(setf y-dir (- y-dir))))
|
922 | 972 |
(xlib:draw-rectangles window gcontext rectangles t)
|
973 |
+ (sleep *delay*)
|
|
923 | 974 |
(xlib:display-force-output display))))
|
924 | 975 |
(xlib:free-gcontext gcontext)))
|
925 | 976 |
|
... | ... | @@ -938,9 +989,12 @@ |
938 | 989 |
(defvar *ball-size-x* 38)
|
939 | 990 |
(defvar *ball-size-y* 34)
|
940 | 991 |
|
941 |
-(defmacro xor-ball (pixmap window gcontext x y)
|
|
942 |
- `(xlib:copy-area ,pixmap ,gcontext 0 0 *ball-size-x* *ball-size-y*
|
|
943 |
- ,window ,x ,y))
|
|
992 |
+(defun xor-ball (pixmap window gcontext x y)
|
|
993 |
+ (xlib:copy-plane pixmap gcontext 1
|
|
994 |
+ 0 0
|
|
995 |
+ *ball-size-x* *ball-size-y*
|
|
996 |
+ window
|
|
997 |
+ x y))
|
|
944 | 998 |
|
945 | 999 |
(defconstant bball-gravity 1)
|
946 | 1000 |
(defconstant maximum-x-drift 7)
|
... | ... | @@ -1016,7 +1070,7 @@ |
1016 | 1070 |
|
1017 | 1071 |
(defun bounce-balls (display window how-many duration)
|
1018 | 1072 |
(xlib:clear-area window)
|
1019 |
- (xlib:display-force-output display)
|
|
1073 |
+ (xlib:display-finish-output display)
|
|
1020 | 1074 |
(multiple-value-bind (*max-bball-x* *max-bball-y*) (full-window-state window)
|
1021 | 1075 |
(let* ((balls (do ((i 0 (1+ i))
|
1022 | 1076 |
(list () (cons (make-ball) list)))
|
... | ... | @@ -1036,16 +1090,16 @@ |
1036 | 1090 |
(xlib:free-gcontext pixmap-gc)
|
1037 | 1091 |
(dolist (ball balls)
|
1038 | 1092 |
(xor-ball bounce-pixmap window gcontext (ball-x ball) (ball-y ball)))
|
1039 |
- (xlib:display-force-output display)
|
|
1093 |
+ (xlib:display-finish-output display)
|
|
1040 | 1094 |
(dotimes (i duration)
|
1041 | 1095 |
(dolist (ball balls)
|
1042 |
- (bounce-1-ball bounce-pixmap window gcontext ball))
|
|
1043 |
- (xlib:display-force-output display))
|
|
1096 |
+ (bounce-1-ball bounce-pixmap window gcontext ball)
|
|
1097 |
+ (xlib:display-finish-output display))
|
|
1098 |
+ (sleep (/ *delay* 50.0)))
|
|
1044 | 1099 |
(xlib:free-pixmap bounce-pixmap)
|
1045 | 1100 |
(xlib:free-gcontext gcontext))))
|
1046 | 1101 |
|
1047 |
-#+nil
|
|
1048 | 1102 |
(defdemo bouncing-ball-demo "Bouncing-Ball" (&optional (how-many 5) (duration 500))
|
1049 |
- 34 34 700 500
|
|
1103 |
+ 36 34 700 500
|
|
1050 | 1104 |
"Bouncing balls in space."
|
1051 | 1105 |
(bounce-balls *display* *window* how-many duration))
|
... | ... | @@ -27,7 +27,8 @@ |
27 | 27 |
;;; |
|
28 | 28 |
;;;----------------------------------------------------------------------------------+
|
29 | 29 |
|
30 |
- |
|
30 |
+;;; Some changes are backported from CMUCL CLX source (our implementation had
|
|
31 |
+;;; errors when we tried to use menu). This one is a little shorter.
|
|
31 | 32 |
|
32 | 33 |
(defstruct (menu)
|
33 | 34 |
"A simple menu of text strings."
|
... | ... | @@ -45,29 +46,27 @@ |
45 | 46 |
|
46 | 47 |
(defun create-menu (parent-window text-color background-color text-font)
|
47 | 48 |
(make-menu
|
48 |
- ;; Create menu graphics context
|
|
49 |
- :gcontext (CREATE-GCONTEXT :drawable parent-window
|
|
50 |
- :foreground text-color
|
|
51 |
- :background background-color
|
|
52 |
- :font text-font)
|
|
53 |
- ;; Create menu window
|
|
54 |
- :window (CREATE-WINDOW
|
|
55 |
- :parent parent-window
|
|
56 |
- :class :input-output
|
|
57 |
- :x 0 ;temporary value
|
|
58 |
- :y 0 ;temporary value
|
|
59 |
- :width 16 ;temporary value
|
|
60 |
- :height 16 ;temporary value
|
|
61 |
- :border-width 2
|
|
62 |
- :border text-color
|
|
63 |
- :background background-color
|
|
64 |
- :save-under :on
|
|
65 |
- :override-redirect :on ;override window mgr when positioning
|
|
66 |
- :event-mask (MAKE-EVENT-MASK :leave-window
|
|
67 |
- :exposure))))
|
|
68 |
- |
|
69 |
- |
|
70 |
-(defun menu-set-item-list (menu &rest item-strings)
|
|
49 |
+ ;; Create menu graphics context
|
|
50 |
+ :gcontext (CREATE-GCONTEXT :drawable parent-window
|
|
51 |
+ :foreground text-color
|
|
52 |
+ :background background-color
|
|
53 |
+ :font text-font)
|
|
54 |
+ ;; Create menu window
|
|
55 |
+ :window (CREATE-WINDOW
|
|
56 |
+ :parent parent-window
|
|
57 |
+ :class :input-output
|
|
58 |
+ :x 0 ;temporary value
|
|
59 |
+ :y 0 ;temporary value
|
|
60 |
+ :width 16 ;temporary value
|
|
61 |
+ :height 16 ;temporary value
|
|
62 |
+ :border-width 2
|
|
63 |
+ :border text-color
|
|
64 |
+ :background background-color
|
|
65 |
+ :save-under :on
|
|
66 |
+ ;; :override-redirect :on ;override window mgr when positioning
|
|
67 |
+ :event-mask (MAKE-EVENT-MASK :leave-window :exposure))))
|
|
68 |
+ |
|
69 |
+(defun menu-set-item-list (menu item-strings)
|
|
71 | 70 |
;; Assume the new items will change the menu's width and height
|
72 | 71 |
(setf (menu-geometry-changed-p menu) t)
|
73 | 72 |
|
... | ... | @@ -148,7 +147,11 @@ |
148 | 147 |
|
149 | 148 |
|
150 | 149 |
(defun menu-refresh (menu)
|
151 |
- (let* ((gcontext (menu-gcontext menu))
|
|
150 |
+ (xlib:set-wm-properties (menu-window menu)
|
|
151 |
+ :name (menu-title menu)
|
|
152 |
+ :icon-name (menu-title menu)
|
|
153 |
+ :resource-name (menu-title menu))
|
|
154 |
+ (let* ((gcontext (menu-gcontext menu))
|
|
152 | 155 |
(baseline-y (FONT-ASCENT (GCONTEXT-FONT gcontext))))
|
153 | 156 |
|
154 | 157 |
;; Show title centered in "reverse-video"
|
... | ... | @@ -217,7 +220,7 @@ |
217 | 220 |
t)))
|
218 | 221 |
|
219 | 222 |
;; Erase the menu
|
220 |
- (UNMAP-WINDOW mw)
|
|
223 |
+;;; (UNMAP-WINDOW mw)
|
|
221 | 224 |
|
222 | 225 |
;; Return selected item string, if any
|
223 | 226 |
(unless (eq selected-item :none) selected-item)))
|
... | ... | @@ -272,111 +275,3 @@ |
272 | 275 |
|
273 | 276 |
;; Make menu visible
|
274 | 277 |
(MAP-WINDOW menu-window)))
|
275 |
- |
|
276 |
-(defun just-say-lisp (&optional (font-name "fixed"))
|
|
277 |
- (let* ((display (open-default-display))
|
|
278 |
- (screen (first (DISPLAY-ROOTS display)))
|
|
279 |
- (fg-color (SCREEN-BLACK-PIXEL screen))
|
|
280 |
- (bg-color (SCREEN-WHITE-PIXEL screen))
|
|
281 |
- (nice-font (OPEN-FONT display font-name))
|
|
282 |
- (a-menu (create-menu (screen-root screen) ;the menu's parent
|
|
283 |
- fg-color bg-color nice-font)))
|
|
284 |
-
|
|
285 |
- (setf (menu-title a-menu) "Please pick your favorite language:")
|
|
286 |
- (menu-set-item-list a-menu "Fortran" "APL" "Forth" "Lisp")
|
|
287 |
-
|
|
288 |
- ;; Bedevil the user until he picks a nice programming language
|
|
289 |
- (unwind-protect
|
|
290 |
- (do (choice)
|
|
291 |
- ((and (setf choice (menu-choose a-menu 100 100))
|
|
292 |
- (string-equal "Lisp" choice))))
|
|
293 |
- |
|
294 |
- (CLOSE-DISPLAY display))))
|
|
295 |
-
|
|
296 |
- |
|
297 |
-(defun pop-up (host strings &key (title "Pick one:") (font "fixed"))
|
|
298 |
- (let* ((display (OPEN-DISPLAY host))
|
|
299 |
- (screen (first (DISPLAY-ROOTS display)))
|
|
300 |
- (fg-color (SCREEN-BLACK-PIXEL screen))
|
|
301 |
- (bg-color (SCREEN-WHITE-PIXEL screen))
|
|
302 |
- (font (OPEN-FONT display font))
|
|
303 |
- (parent-width 400)
|
|
304 |
- (parent-height 400)
|
|
305 |
- (parent (CREATE-WINDOW :parent (SCREEN-ROOT screen)
|
|
306 |
- :override-redirect :on
|
|
307 |
- :x 100 :y 100
|
|
308 |
- :width parent-width :height parent-height
|
|
309 |
- :background bg-color
|
|
310 |
- :event-mask (MAKE-EVENT-MASK :button-press
|
|
311 |
- :exposure)))
|
|
312 |
- (a-menu (create-menu parent fg-color bg-color font))
|
|
313 |
- (prompt "Press a button...")
|
|
314 |
- (prompt-gc (CREATE-GCONTEXT :drawable parent
|
|
315 |
- :foreground fg-color
|
|
316 |
- :background bg-color
|
|
317 |
- :font font))
|
|
318 |
- (prompt-y (FONT-ASCENT font))
|
|
319 |
- (ack-y (- parent-height (FONT-DESCENT font))))
|
|
320 |
-
|
|
321 |
- (setf (menu-title a-menu) title)
|
|
322 |
- (apply #'menu-set-item-list a-menu strings)
|
|
323 |
-
|
|
324 |
- ;; Present main window
|
|
325 |
- (MAP-WINDOW parent)
|
|
326 |
-
|
|
327 |
- (flet ((display-centered-text
|
|
328 |
- (window string gcontext height width)
|
|
329 |
- (multiple-value-bind (w a d l r fa fd) (text-extents gcontext string)
|
|
330 |
- (declare (ignore a d l r))
|
|
331 |
- (let ((box-height (+ fa fd)))
|
|
332 |
-
|
|
333 |
- ;; Clear previous text
|
|
334 |
- (CLEAR-AREA window
|
|
335 |
- :x 0 :y (- height fa)
|
|
336 |
- :width width :height box-height)
|
|
337 |
-
|
|
338 |
- ;; Draw new text
|
|
339 |
- (DRAW-IMAGE-GLYPHS window gcontext (round (- width w) 2) height string)))))
|
|
340 |
-
|
|
341 |
- (unwind-protect
|
|
342 |
- (loop
|
|
343 |
- (EVENT-CASE (display :force-output-p t)
|
|
344 |
-
|
|
345 |
- (:exposure (count)
|
|
346 |
-
|
|
347 |
- ;; Display prompt
|
|
348 |
- (when (zerop count)
|
|
349 |
- (display-centered-text
|
|
350 |
- parent
|
|
351 |
- prompt
|
|
352 |
- prompt-gc
|
|
353 |
- prompt-y
|
|
354 |
- parent-width))
|
|
355 |
- t)
|
|
356 |
-
|
|
357 |
- (:button-press (x y)
|
|
358 |
-
|
|
359 |
- ;; Pop up the menu
|
|
360 |
- (let ((choice (menu-choose a-menu x y)))
|
|
361 |
- (if choice
|
|
362 |
- (display-centered-text
|
|
363 |
- parent
|
|
364 |
- (format nil "You have selected ~a." choice)
|
|
365 |
- prompt-gc
|
|
366 |
- ack-y
|
|
367 |
- parent-width)
|
|
368 |
-
|
|
369 |
- (display-centered-text
|
|
370 |
- parent
|
|
371 |
- "No selection...try again."
|
|
372 |
- prompt-gc
|
|
373 |
- ack-y
|
|
374 |
- parent-width)))
|
|
375 |
- t)
|
|
376 |
-
|
|
377 |
- (otherwise ()
|
|
378 |
- ;;Ignore and discard any other event
|
|
379 |
- t)))
|
|
380 |
-
|
|
381 |
- (CLOSE-DISPLAY display)))))
|
|
382 |
- |
... | ... | @@ -1061,36 +1061,56 @@ |
1061 | 1061 |
;;; :TIMEOUT if it times out, NIL otherwise.
|
1062 | 1062 |
|
1063 | 1063 |
;;; The default implementation
|
1064 |
- |
|
1065 |
-;; Poll for input every *buffer-read-polling-time* SECONDS.
|
|
1066 |
-#-(or CMU sbcl)
|
|
1067 |
-(defparameter *buffer-read-polling-time* 0.5)
|
|
1068 |
- |
|
1069 |
-#-(or CMU sbcl clisp)
|
|
1064 |
+#-(or cmu sbcl clisp (and ecl serve-event))
|
|
1065 |
+(progn
|
|
1066 |
+ ;; Issue a warning to incentivize providing better implementation.
|
|
1067 |
+ (eval-when (:compile-toplevel :load-toplevel :execute)
|
|
1068 |
+ (warn "XLIB::BUFFER-INPUT-WAIT-DEFAULT: timeout polling used."))
|
|
1069 |
+ ;; Poll for input every *buffer-read-polling-time* SECONDS.
|
|
1070 |
+ (defparameter *buffer-read-polling-time* 0.01)
|
|
1071 |
+ (defun buffer-input-wait-default (display timeout)
|
|
1072 |
+ (declare (type display display)
|
|
1073 |
+ (type (or null (real 0 *)) timeout))
|
|
1074 |
+ (declare (clx-values timeout))
|
|
1075 |
+ (let ((stream (display-input-stream display)))
|
|
1076 |
+ (declare (type (or null stream) stream))
|
|
1077 |
+ (cond ((null stream))
|
|
1078 |
+ ((listen stream) nil)
|
|
1079 |
+ ((and timeout (= timeout 0)) :timeout)
|
|
1080 |
+ ((not (null timeout))
|
|
1081 |
+ (multiple-value-bind (npoll fraction)
|
|
1082 |
+ (truncate timeout *buffer-read-polling-time*)
|
|
1083 |
+ (dotimes (i npoll) ; Sleep for a time, then listen again
|
|
1084 |
+ (sleep *buffer-read-polling-time*)
|
|
1085 |
+ (when (listen stream)
|
|
1086 |
+ (return-from buffer-input-wait-default nil)))
|
|
1087 |
+ (when (plusp fraction)
|
|
1088 |
+ (sleep fraction) ; Sleep a fraction of a second
|
|
1089 |
+ (when (listen stream) ; and listen one last time
|
|
1090 |
+ (return-from buffer-input-wait-default nil)))
|
|
1091 |
+ :timeout))))))
|
|
1092 |
+ |
|
1093 |
+#+(and ecl serve-event)
|
|
1070 | 1094 |
(defun buffer-input-wait-default (display timeout)
|
1071 | 1095 |
(declare (type display display)
|
1072 |
- (type (or null (real 0 *)) timeout))
|
|
1073 |
- (declare (clx-values timeout))
|
|
1074 |
- |
|
1096 |
+ (type (or null number) timeout))
|
|
1075 | 1097 |
(let ((stream (display-input-stream display)))
|
1076 | 1098 |
(declare (type (or null stream) stream))
|
1077 | 1099 |
(cond ((null stream))
|
1078 | 1100 |
((listen stream) nil)
|
1079 |
- ((and timeout (= timeout 0)) :timeout)
|
|
1080 |
- ((not (null timeout))
|
|
1081 |
- (multiple-value-bind (npoll fraction)
|
|
1082 |
- (truncate timeout *buffer-read-polling-time*)
|
|
1083 |
- (dotimes (i npoll) ; Sleep for a time, then listen again
|
|
1084 |
- (sleep *buffer-read-polling-time*)
|
|
1085 |
- (when (listen stream)
|
|
1086 |
- (return-from buffer-input-wait-default nil)))
|
|
1087 |
- (when (plusp fraction)
|
|
1088 |
- (sleep fraction) ; Sleep a fraction of a second
|
|
1089 |
- (when (listen stream) ; and listen one last time
|
|
1090 |
- (return-from buffer-input-wait-default nil)))
|
|
1091 |
- :timeout)))))
|
|
1092 |
- |
|
1093 |
-#+(or CMU sbcl clisp)
|
|
1101 |
+ ((eql timeout 0) :timeout)
|
|
1102 |
+ (T (flet ((usable! (fd)
|
|
1103 |
+ (declare (ignore fd))
|
|
1104 |
+ (return-from buffer-input-wait-default)))
|
|
1105 |
+ (serve-event:with-fd-handler ((ext:file-stream-fd
|
|
1106 |
+ (typecase stream
|
|
1107 |
+ (two-way-stream (two-way-stream-input-stream stream))
|
|
1108 |
+ (otherwise stream)))
|
|
1109 |
+ :input #'usable!)
|
|
1110 |
+ (serve-event:serve-event timeout)))
|
|
1111 |
+ :timeout))))
|
|
1112 |
+ |
|
1113 |
+#+(or cmu sbcl clisp)
|
|
1094 | 1114 |
(defun buffer-input-wait-default (display timeout)
|
1095 | 1115 |
(declare (type display display)
|
1096 | 1116 |
(type (or null number) timeout))
|
... | ... | @@ -1099,18 +1119,14 @@ |
1099 | 1119 |
(cond ((null stream))
|
1100 | 1120 |
((listen stream) nil)
|
1101 | 1121 |
((eql timeout 0) :timeout)
|
1102 |
- (t
|
|
1103 |
- (if #+sbcl (sb-sys:wait-until-fd-usable (sb-sys:fd-stream-fd stream)
|
|
1104 |
- :input timeout)
|
|
1105 |
- #+mp (mp:process-wait-until-fd-usable
|
|
1106 |
- (system:fd-stream-fd stream) :input timeout)
|
|
1122 |
+ ;; MP package protocol may be shared between clisp and cmu.
|
|
1123 |
+ ((or #+sbcl (sb-sys:wait-until-fd-usable (sb-sys:fd-stream-fd stream) :input timeout)
|
|
1124 |
+ #+mp (mp:process-wait-until-fd-usable (system:fd-stream-fd stream) :input timeout)
|
|
1107 | 1125 |
#+clisp (multiple-value-bind (sec usec) (floor (or timeout 0))
|
1108 |
- (ext:socket-status stream (and timeout sec)
|
|
1109 |
- (round usec 1d-6)))
|
|
1110 |
- #-(or sbcl mp clisp) (system:wait-until-fd-usable
|
|
1111 |
- (system:fd-stream-fd stream) :input timeout)
|
|
1112 |
- nil
|
|
1113 |
- :timeout)))))
|
|
1126 |
+ (ext:socket-status stream (and timeout sec) (round usec 1d-6)))
|
|
1127 |
+ #+cmu (system:wait-until-fd-usable (system:fd-stream-fd stream) :input timeout))
|
|
1128 |
+ nil)
|
|
1129 |
+ (T :timeout))))
|
|
1114 | 1130 |
|
1115 | 1131 |
;;; BUFFER-LISTEN-DEFAULT - returns T if there is input available for the
|
1116 | 1132 |
;;; buffer. This should never block, so it can be called from the scheduler.
|
... | ... | @@ -17,35 +17,3 @@ |
17 | 17 |
(in-package :common-lisp-user)
|
18 | 18 |
|
19 | 19 |
(provide :clx)
|
20 |
- |
|
21 |
-(defvar *clx-source-pathname*
|
|
22 |
- (pathname "/src/local/clx/*.l"))
|
|
23 |
- |
|
24 |
-(defvar *clx-binary-pathname*
|
|
25 |
- (let ((lisp
|
|
26 |
- (or #+lucid "lucid"
|
|
27 |
- #+akcl "akcl"
|
|
28 |
- #+kcl "kcl"
|
|
29 |
- #+ibcl "ibcl"
|
|
30 |
- (error "Can't provide CLX for this lisp.")))
|
|
31 |
- (architecture
|
|
32 |
- (or #+(or sun3 (and sun (or mc68000 mc68020))) "sun3"
|
|
33 |
- #+(or sun4 sparc) "sparc"
|
|
34 |
- #+(and hp (or mc68000 mc68020)) "hp9000s300"
|
|
35 |
- #+vax "vax"
|
|
36 |
- #+prime "prime"
|
|
37 |
- #+sunrise "sunrise"
|
|
38 |
- #+ibm-rt-pc "ibm-rt-pc"
|
|
39 |
- #+mips "mips"
|
|
40 |
- #+prism "prism"
|
|
41 |
- (error "Can't provide CLX for this architecture."))))
|
|
42 |
- (pathname (format nil "/src/local/clx/~A.~A/" lisp architecture))))
|
|
43 |
- |
|
44 |
-(defvar *compile-clx*
|
|
45 |
- nil)
|
|
46 |
- |
|
47 |
-(load (merge-pathnames "defsystem" *clx-source-pathname*))
|
|
48 |
- |
|
49 |
-(if *compile-clx*
|
|
50 |
- (compile-clx *clx-source-pathname* *clx-binary-pathname*)
|
|
51 |
- (load-clx *clx-binary-pathname*))
|