comparison lisp/printer.el @ 444:576fb035e263 r21-2-37

Import from CVS: tag r21-2-37
author cvs
date Mon, 13 Aug 2007 11:36:19 +0200
parents abe6d1db359e
children b3bbdc4058d7
comparison
equal deleted inserted replaced
443:a8296e22da4e 444:576fb035e263
132 page Current printout page number, 1-based 132 page Current printout page number, 1-based
133 user-id User logon id 133 user-id User logon id
134 user-name User full name" 134 user-name User full name"
135 (error "not yet implemented")) 135 (error "not yet implemented"))
136 136
137 (defun generic-print-buffer (&optional buf) 137 (defun generic-print-buffer (&optional buffer)
138 "Print buffer BUF using a printing method appropriate to the O.S. being run. 138 "Print buffer BUFFER using a printing method appropriate to the O.S. being run.
139 Under Unix, `lpr' is normally used to spool out a no-frills version of the 139 Under Unix, `lpr' is normally used to spool out a no-frills version of the
140 buffer, or the `ps-print' package is used to pretty-print the buffer to a 140 buffer, or the `ps-print' package is used to pretty-print the buffer to a
141 PostScript printer. Under MS Windows, the built-in printing support is used. 141 PostScript printer. Under MS Windows, the built-in printing support is used.
142 142
143 If BUF is nil or omitted, the current buffer is used." 143 If BUFFER is nil or omitted, the current buffer is used."
144 (interactive) 144 (interactive)
145 (generic-print-region (point-min buf) (point-max buf) buf)) 145 (generic-print-region (point-min buffer) (point-max buffer) buffer))
146 146
147 (defun generic-print-region (b e &optional buf) 147 (defun generic-print-region (start end &optional buffer)
148 "Print region using a printing method appropriate to the O.S. being run. 148 "Print region using a printing method appropriate to the O.S. being run.
149 The region between B and E of BUF (defaults to the current buffer) is printed. 149 The region between START and END of BUFFER (defaults to the current
150 buffer) is printed.
150 151
151 Under Unix, `lpr' is normally used to spool out a no-frills version of the 152 Under Unix, `lpr' is normally used to spool out a no-frills version of the
152 buffer, or the `ps-print' package is used to pretty-print the buffer to a 153 buffer, or the `ps-print' package is used to pretty-print the buffer to a
153 PostScript printer. Under MS Windows, the built-in printing support is used." 154 PostScript printer. Under MS Windows, the built-in printing support is used."
154 (cond ((valid-specifier-tag-p 'msprinter) 155 (cond ((valid-specifier-tag-p 'msprinter)
155 (let (d f) 156 (let (d f)
156 (setq buf (decode-buffer buf)) 157 (setq buffer (decode-buffer buffer))
157 (unwind-protect 158 (unwind-protect
158 (progn 159 (progn
159 (setq d (make-device 'msprinter printer-name)) 160 (setq d (make-device 'msprinter printer-name))
160 (setq f (make-frame 161 (setq f (make-frame
161 (list* 'name (concat (substitute ?_ ?. 162 (list* 'name (concat (substitute ?_ ?.
162 (buffer-name buf)) 163 (buffer-name buffer))
163 " - XEmacs") 164 " - XEmacs")
164 '(menubar-visible-p nil 165 '(menubar-visible-p nil
165 has-modeline-p nil 166 has-modeline-p nil
166 default-toolbar-visible-p nil 167 default-toolbar-visible-p nil
167 default-gutter-visible-p nil 168 default-gutter-visible-p nil
173 (let* ((w (frame-root-window f)) 174 (let* ((w (frame-root-window f))
174 (vertdpi (cdr (device-system-metric d 'device-dpi))) 175 (vertdpi (cdr (device-system-metric d 'device-dpi)))
175 (pixel-vertical-clip-threshold (/ vertdpi 2)) 176 (pixel-vertical-clip-threshold (/ vertdpi 2))
176 (last-end 0) 177 (last-end 0)
177 done) 178 done)
178 (set-window-buffer w (or buf (current-buffer))) 179 (set-window-buffer w (or buffer (current-buffer)))
179 (set-window-start w b) 180 (set-window-start w start)
180 (while (not done) 181 (while (not done)
181 (redisplay-frame f) 182 (redisplay-frame f)
182 (print-job-eject-page f) 183 (print-job-eject-page f)
183 (let ((end (window-end w)) 184 (let ((this-end (window-end w))
184 (pixvis (window-last-line-visible-height w))) 185 (pixvis (window-last-line-visible-height w)))
185 ;; in case we get stuck somewhere, bow out 186 ;; in case we get stuck somewhere, bow out
186 ;; rather than printing an infinite number of 187 ;; rather than printing an infinite number of
187 ;; pages. #### this will fail with an image 188 ;; pages. #### this will fail with an image
188 ;; bigger than an entire page. but we really 189 ;; bigger than an entire page. but we really
189 ;; need this check here. we should be more 190 ;; need this check here. we should be more
190 ;; clever in our check, to deal with this case. 191 ;; clever in our check, to deal with this case.
191 (if (or (= end last-end) 192 (if (or (= this-end last-end)
192 ;; #### fuckme! window-end returns a value 193 ;; #### fuckme! window-end returns a value
193 ;; outside of the valid range of buffer 194 ;; outside of the valid range of buffer
194 ;; positions!!! 195 ;; positions!!!
195 (>= end e)) 196 (>= this-end end))
196 (setq done t) 197 (setq done t)
197 (setq last-end end) 198 (setq last-end this-end)
198 (set-window-start w end) 199 (set-window-start w this-end)
199 (if pixvis 200 (if pixvis
200 (save-selected-window 201 (save-selected-window
201 (select-window w) 202 (select-window w)
202 ;; #### scroll-down should take a window arg. 203 ;; #### scroll-down should take a window arg.
203 (let ((window-pixel-scroll-increment pixvis)) 204 (let ((window-pixel-scroll-increment pixvis))
205 (and f (delete-frame f)) 206 (and f (delete-frame f))
206 (and d (delete-device d)) 207 (and d (delete-device d))
207 ))) 208 )))
208 ((and (not (eq system-type 'windows-nt)) 209 ((and (not (eq system-type 'windows-nt))
209 (fboundp 'lpr-buffer)) 210 (fboundp 'lpr-buffer))
210 (lpr-region buf)) 211 (lpr-region buffer))
211 (t (error "No print support available")))) 212 (t (error "No print support available"))))