(make-device 'msprinter printer-name))))
(defun Printer-clear-device ()
+ ;; relying on GC to delete the device is too error-prone since there
+ ;; only can be one anyway.
+ (and printer-current-device (delete-device printer-current-device))
(setq printer-current-device nil))
(defcustom printer-page-header '((face bold date) nil (face bold buffer-name))
If BUFFER is nil or omitted, the current buffer is used."
(interactive (list nil (not current-prefix-arg)))
- (let* ((print-region (and (interactive-p) (region-active-p)))
- (start (if print-region (region-beginning) (point-min buffer)))
- (end (if print-region (region-end) (point-max buffer))))
- (if (or (not (valid-specifier-tag-p 'msprinter))
- (not display-print-dialog))
- (generic-print-region start end buffer)
- (let* ((d (Printer-get-device))
- (props (condition-case err
- (make-dialog-box 'print :device d
+ (condition-case err
+ (let* ((print-region (and (interactive-p) (region-active-p)))
+ (start (if print-region (region-beginning) (point-min buffer)))
+ (end (if print-region (region-end) (point-max buffer))))
+ (if (or (not (valid-device-type-p 'msprinter))
+ (not display-print-dialog))
+ (generic-print-region start end buffer)
+ (let* ((d (Printer-get-device))
+ (props (make-dialog-box 'print :device d
:allow-selection print-region
:selected-page-button
- (if print-region 'selection 'all))
- (error
- (Printer-clear-device)
- (signal (car err) (cdr err))))))
- (and props
- (let ((really-print-region
- (eq (plist-get props 'selected-page-button) 'selection)))
- (generic-print-region (if really-print-region start
- (point-min buffer))
- (if really-print-region end
- (point-max buffer))
- buffer d props)))))))
+ (if print-region 'selection 'all))))
+ (and props
+ (let ((really-print-region
+ (eq (plist-get props 'selected-page-button) 'selection)))
+ (generic-print-region (if really-print-region start
+ (point-min buffer))
+ (if really-print-region end
+ (point-max buffer))
+ buffer d props))))))
+ (error
+ ;; Make sure we catch all errors thrown from the native code.
+ (Printer-clear-device)
+ (signal (car err) (cdr err)))))
(defun generic-print-region (start end &optional buffer print-device props)
"Print region using a printing method appropriate to the O.S. being run.
to-page Last page to print, inclusive, If omitted, printing ends at
the end.
copies Number of copies to print. If omitted, one copy is printed."
- (cond ((valid-specifier-tag-p 'msprinter)
+ (cond ((valid-device-type-p 'msprinter)
;; loop, printing one copy of document per loop. kill and
;; re-create the frame each time so that we eject the piece
;; of paper at the end even if we're printing more than one
;; page per sheet of paper.
- (let ((copies (plist-get props 'copies 1)))
+ (let ((copies (plist-get props 'copies 1))
+ ;; This is not relevant to printing and can mess up
+ ;; msprinter frame sizing
+ default-frame-plist)
(while (> copies 0)
(let (d f header-buffer footer-buffer)
(setq buffer (decode-buffer buffer))
minibuffer none
modeline-shadow-thickness 0
vertical-scrollbar-visible-p nil
- horizontal-scrollbar-visible-p nil))
+ horizontal-scrollbar-visible-p nil
+ [default foreground] "black"
+ [default background] "white"))
d))
(let* ((w (frame-root-window f))
(vertdpi