Mercurial > hg > xemacs-beta
comparison lisp/printer.el @ 406:b8cc9ab3f761 r21-2-33
Import from CVS: tag r21-2-33
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:17:09 +0200 |
parents | |
children | de805c49cfc1 |
comparison
equal
deleted
inserted
replaced
405:0e08f63c74d2 | 406:b8cc9ab3f761 |
---|---|
1 ;;; printer.el --- support for hard-copy printing in XEmacs | |
2 | |
3 ;; Copyright (C) 2000 Ben Wing. | |
4 ;; Copyright (C) 2000 Kirill Katsnelson. | |
5 | |
6 ;; Maintainer: XEmacs Development Team | |
7 ;; Keywords: printer, printing, internal, dumped | |
8 | |
9 ;; This file is part of XEmacs. | |
10 | |
11 ;; XEmacs is free software; you can redistribute it and/or modify it | |
12 ;; under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation; either version 2, or (at your option) | |
14 ;; any later version. | |
15 | |
16 ;; XEmacs is distributed in the hope that it will be useful, but | |
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
19 ;; General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with XEmacs; see the file COPYING. If not, write to the Free | |
23 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
24 ;; 02111-1307, USA. | |
25 | |
26 ;;; Synched up with: Not in FSF. | |
27 | |
28 ;;; Authorship: | |
29 | |
30 ;; Created 2000 by Ben Wing, to provide the high-level interface onto the | |
31 ;; print support implemented by Kirill Katsnelson. | |
32 | |
33 ;;; Commentary: | |
34 | |
35 ;; This file is dumped with XEmacs. | |
36 | |
37 | |
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
39 ;; generic printing code ;; | |
40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
41 | |
42 ;; #### should be named print-buffer, but that's currently in | |
43 ;; lpr-buffer with some horrible definition: print-buffer == "print with | |
44 ;; headings", lpr-buffer == "print without headings", and the headings are | |
45 ;; generated by calling the external program "pr"! This is major stone-age | |
46 ;; here! | |
47 ;; | |
48 ;; I propose junking that package entirely and creating a unified, | |
49 ;; modern API here that will work well with modern GUI's on top of it, | |
50 ;; and with various different actual implementations (e.g. lpr or the | |
51 ;; pretty-print package on Unix, built-in msprinter support on | |
52 ;; Windows), where the workings of a particular implementation is | |
53 ;; hidden from the user and there is a consistent set of options to | |
54 ;; control how to print, which works across all implementations. | |
55 ;; | |
56 ;; The code here is just a start and needs a huge amount of work. Probably | |
57 ;; the interfaces below will change and the functions renamed. | |
58 | |
59 (defgroup printing nil | |
60 "Generic printing support." | |
61 :group 'wp) | |
62 | |
63 (defcustom printer-name nil ; "Okidata OL610e/PS PostScript" | |
64 "*Name of printer to print to. | |
65 If nil, use default. | |
66 Under MS Windows, this can have the form `\\\\STOLI\\HP-345-PS'." | |
67 :type 'string | |
68 :group 'printing) | |
69 | |
70 (defcustom printer-page-header '(date buffer-name) | |
71 "*Controls printed page header. | |
72 | |
73 #### not yet implemented. | |
74 | |
75 This can be: | |
76 - nil. Header is not printed. | |
77 - An fbound symbol or lambda expression. The function is called with | |
78 one parameter, a print-context object, every time the headers need | |
79 to be set up. It can use the function `print-context-property' to | |
80 query the properties of this object. The return value is treated as | |
81 if it was literally specified: i.e. it will be reprocessed. | |
82 - A list of up to three elements, for left, center and right portions | |
83 of the header. Each of these can be | |
84 - nil, not to print the portion | |
85 - A string, which will be printed literally. | |
86 - A predefined symbol, on of the following: | |
87 short-file-name File name only, no path | |
88 long-file-name File name with its path | |
89 buffer-name Buffer name | |
90 date Date current when printing started | |
91 time Time current when printing started | |
92 page Current printout page number, 1-based | |
93 user-id User logon id | |
94 user-name User full name | |
95 - A cons of an extent and any of the items given here. The item will | |
96 be displayed using the extent's face, begin-glyph and end-glyph | |
97 properties. | |
98 - A list, each element of which is any of the items given here. | |
99 Each element of the list is rendered in sequence. For example, | |
100 '(\"Page \" page) is rendered as \"Page 5\" on the fifth page. | |
101 - An fbound symbol or lambda expression, called with one parameter, | |
102 a print-context object, as above. The return value is treated as | |
103 if it was literally specified: i.e. it will be reprocessed." | |
104 :type 'sexp | |
105 :group 'printing) | |
106 | |
107 (defcustom printer-page-footer '(nil page) | |
108 "*Controls printed page footer. | |
109 | |
110 #### not yet implemented. | |
111 | |
112 Format is the same as `printer-page-header'." | |
113 :type 'sexp | |
114 :group 'printing) | |
115 | |
116 (defun print-context-property (print-context prop) | |
117 "Return property PROP of PRINT-CONTEXT. | |
118 | |
119 Valid properties are | |
120 | |
121 print-buffer Buffer being printed. | |
122 print-window Window on printer device containing print buffer. | |
123 print-frame Frame on printer device corresponding to current page. | |
124 print-device Device referring to printer. | |
125 printer-name Name of printer being printed to. | |
126 short-file-name File name only, no path | |
127 long-file-name File name with its path | |
128 buffer-name Buffer name | |
129 date Date current when printing started | |
130 time Time current when printing started | |
131 page Current printout page number, 1-based | |
132 user-id User logon id | |
133 user-name User full name" | |
134 (error "not yet implemented")) | |
135 | |
136 (defun generic-print-buffer (&optional buf) | |
137 "Print buffer BUF using a printing method appropriate to the O.S. being run. | |
138 Under Unix, `lpr' is normally used to spool out a no-frills version of the | |
139 buffer, or the `ps-print' package is used to pretty-print the buffer to a | |
140 PostScript printer. Under MS Windows, the built-in printing support is used. | |
141 | |
142 If BUF is nil or omitted, the current buffer is used." | |
143 (interactive) | |
144 (generic-print-region (point-min buf) (point-max buf) buf)) | |
145 | |
146 (defun generic-print-region (b e &optional buf) | |
147 "Print region using a printing method appropriate to the O.S. being run. | |
148 The region between B and E of BUF (defaults to the current buffer) is printed. | |
149 | |
150 Under Unix, `lpr' is normally used to spool out a no-frills version of the | |
151 buffer, or the `ps-print' package is used to pretty-print the buffer to a | |
152 PostScript printer. Under MS Windows, the built-in printing support is used." | |
153 (cond ((valid-specifier-tag-p 'msprinter) | |
154 (or (stringp printer-name) | |
155 (error "Please set `printer-name'")) | |
156 (let (d f) | |
157 (setq buf (decode-buffer buf)) | |
158 (unwind-protect | |
159 (progn | |
160 (setq d (make-device 'msprinter printer-name)) | |
161 (setq f (make-frame | |
162 '(name "Test!" | |
163 menubar-visible-p nil | |
164 has-modeline-p nil | |
165 default-toolbar-visible-p nil | |
166 default-gutter-visible-p nil | |
167 minibuffer none | |
168 modeline-shadow-thickness 0 | |
169 vertical-scrollbar-visible-p nil | |
170 horizontal-scrollbar-visible-p nil) | |
171 d)) | |
172 (let* ((w (frame-root-window f)) | |
173 (vertdpi (cdr (device-system-metric d 'device-dpi))) | |
174 (pixel-vertical-clip-threshold (/ vertdpi 2)) | |
175 (last-end 0) | |
176 done) | |
177 (set-window-buffer w (or buf (current-buffer))) | |
178 (set-window-start w b) | |
179 (while (not done) | |
180 (redisplay-frame f) | |
181 (print-job-eject-page f) | |
182 (let ((end (window-end w)) | |
183 (pixvis (window-last-line-visible-height w))) | |
184 ;; in case we get stuck somewhere, bow out | |
185 ;; rather than printing an infinite number of | |
186 ;; pages. #### this will fail with an image | |
187 ;; bigger than an entire page. but we really | |
188 ;; need this check here. we should be more | |
189 ;; clever in our check, to deal with this case. | |
190 (if (or (= end last-end) | |
191 ;; #### fuckme! window-end returns a value | |
192 ;; outside of the valid range of buffer | |
193 ;; positions!!! | |
194 (>= end e)) | |
195 (setq done t) | |
196 (setq last-end end) | |
197 (set-window-start w end) | |
198 (if pixvis | |
199 (save-selected-window | |
200 (select-window w) | |
201 ;; #### scroll-down should take a window arg. | |
202 (let ((window-pixel-scroll-increment pixvis)) | |
203 (scroll-down 1))))))))) | |
204 (and f (delete-frame f)) | |
205 (and d (delete-device d)) | |
206 ))) | |
207 ((and (not (eq system-type 'windows-nt)) | |
208 (fboundp 'lpr-buffer)) | |
209 (lpr-region buf)) | |
210 (t (error "No print support available")))) |