comparison lisp/printer.el @ 510:5bdbc721d46a

[xemacs-hg @ 2001-05-06 08:33:35 by ben] implement printing the selection when it's selected. force redisplay when set-charset-ccl-program called. if bytecomp or byte-optimize need recompiling, then load the .el version of them first, recompile them, and reload the .elc versions to recompile everything else (so we won't be waiting until the cows come home).
author ben
date Sun, 06 May 2001 08:33:41 +0000
parents 39ccc7dd8077
children 666d73d6ac56
comparison
equal deleted inserted replaced
509:68eb53e4b7e5 510:5bdbc721d46a
251 anything. When called interactively, use a prefix arg to suppress the 251 anything. When called interactively, use a prefix arg to suppress the
252 display of the print dialog box. 252 display of the print dialog box.
253 253
254 If BUFFER is nil or omitted, the current buffer is used." 254 If BUFFER is nil or omitted, the current buffer is used."
255 (interactive (list nil (not current-prefix-arg))) 255 (interactive (list nil (not current-prefix-arg)))
256 (if (or (not (valid-specifier-tag-p 'msprinter)) 256 (let* ((print-region (and (interactive-p) (region-active-p)))
257 (not display-print-dialog)) 257 (start (if print-region (region-beginning) (point-min buffer)))
258 (generic-print-region (point-min buffer) (point-max buffer) buffer) 258 (end (if print-region (region-end) (point-max buffer))))
259 (let* ((d (Printer-get-device)) 259 (if (or (not (valid-specifier-tag-p 'msprinter))
260 (props (condition-case err 260 (not display-print-dialog))
261 (make-dialog-box 'print :device d) 261 (generic-print-region start end buffer)
262 (error 262 (let* ((d (Printer-get-device))
263 (Printer-clear-device) 263 (props (condition-case err
264 (signal (car err) (cdr err)))))) 264 (make-dialog-box 'print :device d
265 (and props (generic-print-region (point-min buffer) 265 :allow-selection print-region
266 (point-max buffer) buffer 266 :selected-page-button
267 d props))))) 267 (if print-region 'selection 'all))
268 (error
269 (Printer-clear-device)
270 (signal (car err) (cdr err))))))
271 (and props
272 (let ((really-print-region
273 (eq (plist-get props 'selected-page-button) 'selection)))
274 (generic-print-region (if really-print-region start
275 (point-min buffer))
276 (if really-print-region end
277 (point-max buffer))
278 buffer d props)))))))
268 279
269 (defun generic-print-region (start end &optional buffer print-device props) 280 (defun generic-print-region (start end &optional buffer print-device props)
270 "Print region using a printing method appropriate to the O.S. being run. 281 "Print region using a printing method appropriate to the O.S. being run.
271 The region between START and END of BUFFER (defaults to the current 282 The region between START and END of BUFFER (defaults to the current
272 buffer) is printed. 283 buffer) is printed.
293 the beginning. 304 the beginning.
294 to-page Last page to print, inclusive, If omitted, printing ends at 305 to-page Last page to print, inclusive, If omitted, printing ends at
295 the end. 306 the end.
296 copies Number of copies to print. If omitted, one copy is printed." 307 copies Number of copies to print. If omitted, one copy is printed."
297 (cond ((valid-specifier-tag-p 'msprinter) 308 (cond ((valid-specifier-tag-p 'msprinter)
298 (let (d f header-buffer footer-buffer) 309 ;; loop, printing one copy of document per loop. kill and
299 (setq buffer (decode-buffer buffer)) 310 ;; re-create the frame each time so that we eject the piece
300 (unwind-protect 311 ;; of paper at the end even if we're printing more than one
301 (progn 312 ;; page per sheet of paper.
302 (setq d (or print-device (Printer-get-device))) 313 (let ((copies (plist-get props 'copies 1)))
303 (setq f (make-frame 314 (while (> copies 0)
304 (list* 'name (concat 315 (let (d f header-buffer footer-buffer)
316 (setq buffer (decode-buffer buffer))
317 (unwind-protect
318 (with-current-buffer buffer
319 (save-restriction
320 (narrow-to-region start end)
321 (setq d (or print-device (Printer-get-device)))
322 (setq f (make-frame
323 (list* 'name
324 (concat
305 (substitute ?_ ?. (buffer-name buffer)) 325 (substitute ?_ ?. (buffer-name buffer))
306 " - XEmacs") 326 " - XEmacs")
307 '(menubar-visible-p 327 '(menubar-visible-p
308 nil 328 nil
309 has-modeline-p nil 329 has-modeline-p nil
310 default-toolbar-visible-p nil 330 default-toolbar-visible-p nil
311 default-gutter-visible-p nil 331 default-gutter-visible-p nil
312 minibuffer none 332 minibuffer none
313 modeline-shadow-thickness 0 333 modeline-shadow-thickness 0
314 vertical-scrollbar-visible-p nil 334 vertical-scrollbar-visible-p nil
315 horizontal-scrollbar-visible-p nil)) 335 horizontal-scrollbar-visible-p nil))
316 d)) 336 d))
317 (let* ((w (frame-root-window f)) 337 (let* ((w (frame-root-window f))
318 (vertdpi (cdr (device-system-metric d 'device-dpi))) 338 (vertdpi
319 (pixel-vertical-clip-threshold (/ vertdpi 2)) 339 (cdr (device-system-metric d 'device-dpi)))
320 (from-page (plist-get props 'from-page 1)) 340 (pixel-vertical-clip-threshold (/ vertdpi 2))
321 (to-page (plist-get props 'to-page)) 341 (from-page (plist-get props 'from-page 1))
322 (copies (plist-get props 'copies 1)) 342 (to-page (plist-get props 'to-page))
323 (context (make-Print-context 343 (context (make-Print-context
324 :start-time (current-time) 344 :start-time (current-time)
325 ;; #### bogus! we need accessors for 345 ;; #### bogus! we need accessors for
326 ;; print-settings objects. 346 ;; print-settings objects.
327 :printer-name 347 :printer-name
328 (or (plist-get props 'name) 348 (or (plist-get props 'name)
329 printer-name 349 printer-name
330 (mswindows-get-default-printer)))) 350 (mswindows-get-default-printer))))
331 header-window 351 header-window
332 footer-window) 352 footer-window)
333 353
334 (when printer-page-header 354 (when printer-page-header
335 (let ((window-min-height 2)) 355 (let ((window-min-height 2))
336 (setq header-window w) 356 (setq header-window w)
337 (setq w (split-window w 2))) 357 (setq w (split-window w 2)))
338 (setq header-buffer (generate-new-buffer " *header*")) 358 (setq header-buffer
339 (set-window-buffer header-window header-buffer)) 359 (generate-new-buffer " *header*"))
340 360 (set-window-buffer header-window header-buffer))
341 (when printer-page-footer 361
342 (let ((window-min-height 2)) 362 (when printer-page-footer
343 (setq footer-window 363 (let ((window-min-height 2))
344 (split-window w (- (window-height w) 2)))) 364 (setq footer-window
345 (setq footer-buffer (generate-new-buffer " *footer*")) 365 (split-window w (- (window-height w) 2))))
346 (set-window-buffer footer-window footer-buffer)) 366 (setq footer-buffer
347 367 (generate-new-buffer " *footer*"))
348 (setf (Print-context-window context) w) 368 (set-window-buffer footer-window footer-buffer))
349 369
350 ;; loop, printing one copy of document per loop 370 (setf (Print-context-window context) w)
351 (while (> copies 0) 371
352 (let ((last-end 0) ; bufpos at end of previous page 372 (let ((last-end 0) ; bufpos at end of previous page
353 reached-end ; t if we've reached the end of the 373 reached-end ; t if we've reached the end of the
354 ; text we're printing 374 ; text we're printing
355 (pageno 1)) 375 (pageno 1))
356 (set-window-buffer w buffer) 376 (set-window-buffer w buffer)
357 (set-window-start w start) 377 (set-window-start w start)
358 378
359 ;; loop, printing one page per loop 379 ;; loop, printing one page per loop
360 (while (and (not reached-end) 380 (while (and (not reached-end)
361 ;; stop at end of region of text or 381 ;; stop at end of region of text or
362 ;; outside of ranges of pages given 382 ;; outside of ranges of pages given
363 (or (not to-page) (<= pageno to-page))) 383 (or (not to-page) (<= pageno to-page)))
364 384
365 (setf (Print-context-pageno context) pageno) 385 (setf (Print-context-pageno context) pageno)
366 386
367 ;; only actually print the page if it's in the 387 ;; only actually print the page if it's in the
368 ;; range. 388 ;; range.
369 (when (>= pageno from-page) 389 (when (>= pageno from-page)
370 (when printer-page-header 390 (when printer-page-header
371 (with-current-buffer header-buffer 391 (with-current-buffer header-buffer
372 (erase-buffer) 392 (erase-buffer)
373 (generate-header-line printer-page-header 393 (generate-header-line printer-page-header
374 context) 394 context)
375 (goto-char (point-min)) 395 (goto-char (point-min))
376 (set-window-start header-window (point-min)))) 396 (set-window-start header-window
377 397 (point-min))))
378 (when printer-page-footer 398
379 (with-current-buffer footer-buffer 399 (when printer-page-footer
380 (erase-buffer) 400 (with-current-buffer footer-buffer
381 (insert "\n") 401 (erase-buffer)
382 (generate-header-line printer-page-footer 402 (insert "\n")
383 context) 403 (generate-header-line printer-page-footer
384 (goto-char (point-min)) 404 context)
385 (set-window-start footer-window (point-min)))) 405 (goto-char (point-min))
386 406 (set-window-start footer-window
387 (redisplay-frame f t) 407 (point-min))))
388 (print-job-eject-page f) 408
389 ) 409 (redisplay-frame f t)
390 ;; but use the GUARANTEE argument to `window-end' 410 (print-job-eject-page f)
391 ;; so that we get the right value even if we 411 )
392 ;; didn't do a redisplay. 412 ;; but use the GUARANTEE argument to `window-end'
393 (let ((this-end (window-end w t)) 413 ;; so that we get the right value even if we
394 (pixvis (window-last-line-visible-height w))) 414 ;; didn't do a redisplay.
395 ;; in case we get stuck somewhere, bow out 415 (let ((this-end (window-end w t))
396 ;; rather than printing an infinite number of 416 (pixvis
397 ;; pages. #### this will fail with an image 417 (window-last-line-visible-height w)))
398 ;; bigger than an entire page. but we really 418 ;; in case we get stuck somewhere, bow out
399 ;; need this check here. we should be more 419 ;; rather than printing an infinite number of
400 ;; clever in our check, to deal with this case. 420 ;; pages. #### this will fail with an image
401 (if (or (= this-end last-end) 421 ;; bigger than an entire page. but we really
402 ;; #### fuckme! window-end returns a value 422 ;; need this check here. we should be more
403 ;; outside of the valid range of buffer 423 ;; clever in our check, to deal with this case.
404 ;; positions!!! 424 (if (or (= this-end last-end)
405 (>= this-end end)) 425 ;; #### fuckme! window-end returns a
406 (setq reached-end t) 426 ;; value outside of the valid range of
407 (setq last-end this-end) 427 ;; buffer positions!!!
408 (set-window-start w this-end) 428 (>= this-end end))
409 (if pixvis 429 (setq reached-end t)
410 (save-selected-window 430 (setq last-end this-end)
411 (select-window w) 431 (set-window-start w this-end)
412 ;; #### scroll-down should take a 432 (if pixvis
413 ;; window arg. 433 (with-selected-window w
414 (let ((window-pixel-scroll-increment 434 ;; #### scroll-down should take a
415 pixvis)) 435 ;; window arg.
416 (scroll-down 1)))))) 436 (let ((window-pixel-scroll-increment
417 (setq pageno (1+ pageno)))) 437 pixvis))
418 (setq copies (1- copies))))) 438 (scroll-down 1))))))
419 (and f (delete-frame f)) 439 (setq pageno (1+ pageno))))))
420 (and header-buffer (kill-buffer header-buffer)) 440 (and f (delete-frame f))
421 (and footer-buffer (kill-buffer footer-buffer)) 441 (and header-buffer (kill-buffer header-buffer))
422 ))) 442 (and footer-buffer (kill-buffer footer-buffer)))))
443 (setq copies (1- copies)))))
423 ((and (not (eq system-type 'windows-nt)) 444 ((and (not (eq system-type 'windows-nt))
424 (fboundp 'lpr-region)) 445 (fboundp 'lpr-region))
425 (lpr-region buffer)) 446 (lpr-region buffer))
426 (t (error "No print support available")))) 447 (t (error "No print support available"))))