Mercurial > emacs
annotate lisp/gs.el @ 72550:666bd542be19
(get_window_cursor_type): Replace BOX cursor on images
with a hollow box cursor if image is larger than 32x32 (or the default
frame font if that is bigger). Replace any other cursor on images
with hollow box cursor, as redisplay doesn't support bar and hbar
cursors on images.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sun, 27 Aug 2006 22:23:07 +0000 |
parents | 3bd95f4f2941 |
children | e3694f1cb928 c5406394f567 |
rev | line source |
---|---|
25003 | 1 ;;; gs.el --- interface to Ghostscript |
2 | |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64091
diff
changeset
|
3 ;; Copyright (C) 1998, 2001, 2002, 2003, 2004, |
68651
3bd95f4f2941
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64762
diff
changeset
|
4 ;; 2005, 2006 Free Software Foundation, Inc. |
25003 | 5 |
6 ;; Maintainer: FSF | |
7 ;; Keywords: internal | |
8 | |
9 ;; This file is part of GNU Emacs. | |
10 | |
11 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
12 ;; it 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 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
64091 | 23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
24 ;; Boston, MA 02110-1301, USA. | |
25003 | 25 |
26 ;;; Commentary: | |
27 | |
28 ;; This code is experimental. Don't use it. | |
29 | |
30 ;;; Code: | |
31 | |
32 (defvar gs-program "gs" | |
33 "The name of the Ghostscript interpreter.") | |
34 | |
35 | |
36 (defvar gs-device "x11" | |
37 "The Ghostscript device to use to produce images.") | |
38 | |
39 | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
40 (defvar gs-options |
25003 | 41 '("-q" |
42 ;"-dNOPAUSE" | |
55725
00841464e6d8
(gs-options): Add -dSAFER. Mark it risky.
Richard M. Stallman <rms@gnu.org>
parents:
52401
diff
changeset
|
43 "-dSAFER" |
25003 | 44 "-dBATCH" |
45 "-sDEVICE=<device>" | |
46 "<file>") | |
47 "List of command line arguments to pass to Ghostscript. | |
48 Arguments may contain place-holders `<file>' for the name of the | |
49 input file, and `<device>' for the device to use.") | |
55725
00841464e6d8
(gs-options): Add -dSAFER. Mark it risky.
Richard M. Stallman <rms@gnu.org>
parents:
52401
diff
changeset
|
50 (put 'gs-options 'risky-local-variable t) |
25003 | 51 |
52 (defun gs-options (device file) | |
53 "Return a list of command line options with place-holders replaced. | |
54 DEVICE is the value to substitute for the place-holder `<device>', | |
55 FILE is the value to substitute for the place-holder `<file>'." | |
56 (mapcar #'(lambda (option) | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
57 (setq option (replace-regexp-in-string "<device>" device option) |
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
58 option (replace-regexp-in-string "<file>" file option))) |
25003 | 59 gs-options)) |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
60 |
25003 | 61 ;; The GHOSTVIEW property (taken from gv 3.5.8). |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
62 ;; |
25003 | 63 ;; Type: |
64 ;; | |
65 ;; STRING | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
66 ;; |
25003 | 67 ;; Parameters: |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
68 ;; |
25003 | 69 ;; BPIXMAP ORIENT LLX LLY URX URY XDPI YDPI [LEFT BOTTOM TOP RIGHT] |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
70 ;; |
25003 | 71 ;; Scanf format: "%d %d %d %d %d %d %f %f %d %d %d %d" |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
72 ;; |
25003 | 73 ;; Explanation of parameters: |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
74 ;; |
25003 | 75 ;; BPIXMAP: pixmap id of the backing pixmap for the window. If no |
76 ;; pixmap is to be used, this parameter should be zero. This | |
77 ;; parameter must be zero when drawing on a pixmap. | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
78 ;; |
25003 | 79 ;; ORIENT: orientation of the page. The number represents clockwise |
80 ;; rotation of the paper in degrees. Permitted values are 0, 90, 180, | |
81 ;; 270. | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
82 ;; |
25003 | 83 ;; LLX, LLY, URX, URY: Bounding box of the drawable. The bounding box |
84 ;; is specified in PostScript points in default user coordinates. | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
85 ;; |
25003 | 86 ;; XDPI, YDPI: Resolution of window. (This can be derived from the |
87 ;; other parameters, but not without roundoff error. These values are | |
88 ;; included to avoid this error.) | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
89 ;; |
25003 | 90 ;; LEFT, BOTTOM, TOP, RIGHT: (optional) Margins around the window. |
91 ;; The margins extend the imageable area beyond the boundaries of the | |
92 ;; window. This is primarily used for popup zoom windows. I have | |
93 ;; encountered several instances of PostScript programs that position | |
94 ;; themselves with respect to the imageable area. The margins are | |
95 ;; specified in PostScript points. If omitted, the margins are | |
96 ;; assumed to be 0. | |
97 | |
98 (defun gs-width-in-pt (frame pixel-width) | |
99 "Return, on FRAME, pixel width PIXEL-WIDTH tranlated to pt." | |
100 (let ((mm (* (float pixel-width) | |
101 (/ (float (x-display-mm-width frame)) | |
102 (float (x-display-pixel-width frame)))))) | |
103 (/ (* 25.4 mm) 72.0))) | |
104 | |
105 | |
106 (defun gs-height-in-pt (frame pixel-height) | |
107 "Return, on FRAME, pixel height PIXEL-HEIGHT tranlated to pt." | |
108 (let ((mm (* (float pixel-height) | |
109 (/ (float (x-display-mm-height frame)) | |
110 (float (x-display-pixel-height frame)))))) | |
111 (/ (* 25.4 mm) 72.0))) | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
112 |
25003 | 113 |
114 (defun gs-set-ghostview-window-prop (frame spec img-width img-height) | |
115 "Set the `GHOSTVIEW' window property of FRAME. | |
116 SPEC is a GS image specification. IMG-WIDTH is the width of the | |
117 requested image, and IMG-HEIGHT is the height of the requested | |
118 image in pixels." | |
119 (let* ((box (plist-get (cdr spec) :bounding-box)) | |
39518
db80e2ff68e8
(gs-set-ghostview-window-prop): Fix args of `elt'.
Gerd Moellmann <gerd@gnu.org>
parents:
39313
diff
changeset
|
120 (llx (elt box 0)) |
db80e2ff68e8
(gs-set-ghostview-window-prop): Fix args of `elt'.
Gerd Moellmann <gerd@gnu.org>
parents:
39313
diff
changeset
|
121 (lly (elt box 1)) |
db80e2ff68e8
(gs-set-ghostview-window-prop): Fix args of `elt'.
Gerd Moellmann <gerd@gnu.org>
parents:
39313
diff
changeset
|
122 (urx (elt box 2)) |
db80e2ff68e8
(gs-set-ghostview-window-prop): Fix args of `elt'.
Gerd Moellmann <gerd@gnu.org>
parents:
39313
diff
changeset
|
123 (ury (elt box 3)) |
25003 | 124 (rotation (or (plist-get (cdr spec) :rotate) 0)) |
125 ;; The pixel width IMG-WIDTH of the pixmap gives the | |
126 ;; dots, URX - LLX give the inch. | |
127 (in-width (/ (- urx llx) 72.0)) | |
128 (in-height (/ (- ury lly) 72.0)) | |
129 (xdpi (/ img-width in-width)) | |
130 (ydpi (/ img-height in-height))) | |
131 (x-change-window-property "GHOSTVIEW" | |
132 (format "0 %d %d %d %d %d %g %g" | |
133 rotation llx lly urx ury xdpi ydpi) | |
134 frame))) | |
135 | |
136 | |
137 (defun gs-set-ghostview-colors-window-prop (frame pixel-colors) | |
138 "Set the `GHOSTVIEW_COLORS' environment variable depending on FRAME." | |
139 (let ((mode (cond ((x-display-color-p frame) "Color") | |
140 ((x-display-grayscale-p frame) "Grayscale") | |
141 (t "Monochrome")))) | |
142 (x-change-window-property "GHOSTVIEW_COLORS" | |
38890
a6653fe3cbb9
(gs-set-ghostview-colors-window-prop): Call
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
143 (format "%s %s" mode pixel-colors) |
a6653fe3cbb9
(gs-set-ghostview-colors-window-prop): Call
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
144 frame))) |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
145 |
25003 | 146 |
147 ; | |
148 ;;;###autoload | |
149 (defun gs-load-image (frame spec img-width img-height window-and-pixmap-id | |
150 pixel-colors) | |
151 "Load a PS image for display on FRAME. | |
152 SPEC is an image specification, IMG-HEIGHT and IMG-WIDTH are width | |
153 and height of the image in pixels. WINDOW-AND-PIXMAP-ID is a string of | |
154 the form \"WINDOW-ID PIXMAP-ID\". Value is non-nil if successful." | |
155 (unwind-protect | |
156 (let ((file (plist-get (cdr spec) :file)) | |
38890
a6653fe3cbb9
(gs-set-ghostview-colors-window-prop): Call
Gerd Moellmann <gerd@gnu.org>
parents:
38412
diff
changeset
|
157 gs |
38997
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
158 (timeout 40)) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
159 ;; Wait while property gets freed from a previous ghostscript process |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
160 ;; sit-for returns nil as soon as input starts being |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
161 ;; available, so if we want to give GhostScript a reasonable |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
162 ;; chance of starting up, we better use sleep-for. We let |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
163 ;; sleep-for wait only half the time because if input is |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
164 ;; available, it is more likely that we don't care that much |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
165 ;; about garbled redisplay and are in a hurry. |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
166 (while (and |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
167 ;; Wait while the property is not yet available |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
168 (not (zerop (length (x-window-property "GHOSTVIEW" |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
169 frame)))) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
170 ;; The following was an alternative condition: wait |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
171 ;; while there is still a process running. The idea |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
172 ;; was to avoid contention between processes. Turned |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
173 ;; out even more sluggish. |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
174 ;; (get-buffer-process "*GS*") |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
175 (not (zerop timeout))) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
176 (unless (sit-for 0 100 t) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
177 (sleep-for 0 50)) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
178 (setq timeout (1- timeout))) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
179 |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
180 ;; No use waiting longer. We might want to try killing off |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
181 ;; stuck processes, but there is no point in doing so: either |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
182 ;; they are stuck for good, in which case the user would |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
183 ;; probably be responsible for that, and killing them off will |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
184 ;; make debugging harder, or they are not. In that case, they |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
185 ;; will cause incomplete displays. But the same will happen |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
186 ;; if they are killed, anyway. The whole is rather |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
187 ;; disconcerting, and fast scrolling through a dozen images |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
188 ;; will make Emacs freeze for a while. The alternatives are a) |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
189 ;; proper implementation not waiting at all but creating |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
190 ;; appropriate queues, or b) permanently bad display due to |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
191 ;; bad cached images. So remember that this |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
192 ;; is just a hack and if people don't like the behaviour, they |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
193 ;; will most likely like the easy alternatives even less. |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
194 ;; And at least the image cache will make the delay apparent |
751bf57c84a1
(gs-load-image): Use sleep-for.
Gerd Moellmann <gerd@gnu.org>
parents:
38935
diff
changeset
|
195 ;; just once. |
25003 | 196 (gs-set-ghostview-window-prop frame spec img-width img-height) |
197 (gs-set-ghostview-colors-window-prop frame pixel-colors) | |
198 (setenv "GHOSTVIEW" window-and-pixmap-id) | |
199 (setq gs (apply 'start-process "gs" "*GS*" gs-program | |
200 (gs-options gs-device file))) | |
55771
4b9c2c0fbfe1
(gs-load-image): Use `set-process-query-on-exit-flag' instead of
John Paul Wallington <jpw@pobox.com>
parents:
55725
diff
changeset
|
201 (set-process-query-on-exit-flag gs nil) |
25003 | 202 gs) |
203 nil)) | |
204 | |
205 | |
206 ;(defun gs-put-tiger () | |
207 ; (let* ((ps-file "/usr/local/share/ghostscript/5.10/examples/tiger.ps") | |
25651
e65a0e39a0a9
Change `ghostscript' to `postscript' in comment.
Gerd Moellmann <gerd@gnu.org>
parents:
25003
diff
changeset
|
208 ; (spec `(image :type postscript |
25003 | 209 ; :pt-width 200 :pt-height 200 |
210 ; :bounding-box (22 171 567 738) | |
211 ; :file ,ps-file))) | |
212 ; (put-text-property 1 2 'display spec))) | |
35522
9c7789e8882b
use replace-regexps-in-string instead of dired- and gs-replace-in-string
Sam Steingold <sds@gnu.org>
parents:
25651
diff
changeset
|
213 ; |
25003 | 214 |
215 (provide 'gs) | |
216 | |
52401 | 217 ;;; arch-tag: 06ab51b8-4932-4cfe-9f60-b924a8edb3f0 |
38412
253f761ad37b
Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents:
35522
diff
changeset
|
218 ;;; gs.el ends here |