]> code.delx.au - gnu-emacs/blob - lisp/term/pc-win.el
Add 2012 to FSF copyright years for Emacs files (do not merge to trunk)
[gnu-emacs] / lisp / term / pc-win.el
1 ;;; pc-win.el --- setup support for `PC windows' (whatever that is)
2
3 ;; Copyright (C) 1994, 1996, 1997, 1999, 2001, 2002, 2003, 2004,
4 ;; 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
5
6 ;; Author: Morten Welinder <terra@diku.dk>
7 ;; Maintainer: FSF
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 3 of the License, or
14 ;; (at your option) 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. If not, see <http://www.gnu.org/licenses/>.
23
24 ;;; Commentary:
25
26 ;; This file is preloaded into Emacs by loadup.el. The functions in
27 ;; this file are then called during startup from startup.el. This
28 ;; means that just loading this file should not have any side effects
29 ;; besides defining functions and variables, and in particular should
30 ;; NOT initialize any window systems.
31
32 ;; The main entry points to this file's features are msdos-handle-args,
33 ;; msdos-create-frame-with-faces, msdos-initialize-window-system,
34 ;; terminal-init-internal. The last one is not supposed to be called,
35 ;; so it just errors out.
36
37 ;;; Code:
38
39 (if (not (fboundp 'msdos-remember-default-colors))
40 (error "%s: Loading pc-win.el but not compiled for MS-DOS"
41 (invocation-name)))
42
43 (load "term/internal" nil t)
44
45 (declare-function msdos-remember-default-colors "msdos.c")
46 (declare-function w16-set-clipboard-data "w16select.c")
47 (declare-function w16-get-clipboard-data "w16select.c")
48 (declare-function msdos-setup-keyboard "internal" (frame))
49
50 ;;; This was copied from etc/rgb.txt, except that some values were changed
51 ;;; a bit to make them consistent with DOS console colors, and the RGB
52 ;;; values were scaled up to 16 bits, as `tty-define-color' requires.
53 ;;;
54 ;;; The mapping between the 16 standard EGA/VGA colors and X color names
55 ;;; was done by running a Unix version of Emacs inside an X client and a
56 ;;; DJGPP-compiled Emacs on the same PC. The names of X colors used to
57 ;;; define the pixel values are shown as comments to each color below.
58 ;;;
59 ;;; If you want to change the RGB values, keep in mind that various pieces
60 ;;; of Emacs think that a color whose RGB values add up to less than 0.6 of
61 ;;; the values for WHITE (i.e. less than 117963) are ``dark'', otherwise the
62 ;;; color is ``light''; see `frame-set-background-mode' in lisp/faces.el for
63 ;;; an example.
64 (defvar msdos-color-values
65 '(("black" 0 0 0 0)
66 ("blue" 1 0 0 52480) ; MediumBlue
67 ("green" 2 8704 35584 8704) ; ForestGreen
68 ("cyan" 3 0 52736 53504) ; DarkTurquoise
69 ("red" 4 45568 8704 8704) ; FireBrick
70 ("magenta" 5 35584 0 35584) ; DarkMagenta
71 ("brown" 6 40960 20992 11520) ; Sienna
72 ("lightgray" 7 48640 48640 48640) ; Gray
73 ("darkgray" 8 26112 26112 26112) ; Gray40
74 ("lightblue" 9 0 0 65535) ; Blue
75 ("lightgreen" 10 0 65535 0) ; Green
76 ("lightcyan" 11 0 65535 65535) ; Cyan
77 ("lightred" 12 65535 0 0) ; Red
78 ("lightmagenta" 13 65535 0 65535) ; Magenta
79 ("yellow" 14 65535 65535 0) ; Yellow
80 ("white" 15 65535 65535 65535))
81 "A list of MS-DOS console colors, their indices and 16-bit RGB values.")
82
83 ;; ---------------------------------------------------------------------------
84 ;; We want to delay setting frame parameters until the faces are setup
85 (defvar default-frame-alist nil)
86 ;(modify-frame-parameters terminal-frame default-frame-alist)
87
88 (defun msdos-face-setup ()
89 "Initial setup of faces for the MS-DOS display."
90 (set-face-foreground 'bold "yellow")
91 (set-face-foreground 'italic "red")
92 (set-face-foreground 'bold-italic "lightred")
93 (set-face-foreground 'underline "white")
94
95 (make-face 'msdos-menu-active-face)
96 (make-face 'msdos-menu-passive-face)
97 (make-face 'msdos-menu-select-face)
98 (set-face-foreground 'msdos-menu-active-face "white")
99 (set-face-foreground 'msdos-menu-passive-face "lightgray")
100 (set-face-background 'msdos-menu-active-face "blue")
101 (set-face-background 'msdos-menu-passive-face "blue")
102 (set-face-background 'msdos-menu-select-face "red"))
103
104 (defun msdos-handle-reverse-video (frame parameters)
105 "Handle the reverse-video frame parameter on MS-DOS frames."
106 (when (cdr (or (assq 'reverse parameters)
107 (assq 'reverse default-frame-alist)))
108 (let* ((params (frame-parameters frame))
109 (fg (cdr (assq 'foreground-color params)))
110 (bg (cdr (assq 'background-color params))))
111 (if (equal fg (cdr (assq 'mouse-color params)))
112 (modify-frame-parameters frame
113 (list (cons 'mouse-color bg))))
114 (if (equal fg (cdr (assq 'cursor-color params)))
115 (modify-frame-parameters frame
116 (list (cons 'cursor-color bg)))))))
117
118 ;; This must run after all the default colors are inserted into
119 ;; tty-color-alist, since msdos-handle-reverse-video needs to know the
120 ;; actual frame colors.
121 (defun msdos-setup-initial-frame ()
122 (modify-frame-parameters terminal-frame default-frame-alist)
123 ;; This remembers the screen colors after applying default-frame-alist,
124 ;; so that all subsequent frames could begin with those colors.
125 (msdos-remember-default-colors terminal-frame)
126 (modify-frame-parameters terminal-frame initial-frame-alist)
127 (msdos-handle-reverse-video terminal-frame
128 (frame-parameters terminal-frame))
129
130 (frame-set-background-mode terminal-frame)
131 (face-set-after-frame-default terminal-frame))
132
133 ;; We create frames as if we were a terminal, but without invoking the
134 ;; terminal-initialization function. Also, our handling of reverse
135 ;; video is slightly different.
136 (defun msdos-create-frame-with-faces (&optional parameters)
137 "Create an frame on MS-DOS display.
138 Optional frame parameters PARAMETERS specify the frame parameters.
139 Parameters not specified by PARAMETERS are taken from
140 `default-frame-alist'. If either PARAMETERS or `default-frame-alist'
141 contains a `reverse' parameter, handle that. Value is the new frame
142 created."
143 (let ((frame (make-terminal-frame parameters))
144 success)
145 (unwind-protect
146 (with-selected-frame frame
147 (msdos-handle-reverse-video frame (frame-parameters frame))
148 (unless (terminal-parameter frame 'terminal-initted)
149 (set-terminal-parameter frame 'terminal-initted t))
150 (frame-set-background-mode frame)
151 (face-set-after-frame-default frame)
152 (setq success t))
153 (unless success (delete-frame frame)))
154 frame))
155
156 ;; ---------------------------------------------------------------------------
157 ;; More or less useful imitations of certain X-functions. A lot of the
158 ;; values returned are questionable, but usually only the form of the
159 ;; returned value matters. Also, by the way, recall that `ignore' is
160 ;; a useful function for returning 'nil regardless of argument.
161
162 ;; From src/xfns.c
163 (defun x-list-fonts (pattern &optional face frame maximum width)
164 (if (or (null width) (and (numberp width) (= width 1)))
165 (list "ms-dos")
166 (list "no-such-font")))
167 (defun x-display-pixel-width (&optional frame) (frame-width frame))
168 (defun x-display-pixel-height (&optional frame) (frame-height frame))
169 (defun x-display-planes (&optional frame) 4) ;bg switched to 16 colors as well
170 (defun x-display-color-cells (&optional frame) 16)
171 (defun x-server-max-request-size (&optional frame) 1000000) ; ???
172 (defun x-server-vendor (&optional frame) t "GNU")
173 (defun x-server-version (&optional frame) '(1 0 0))
174 (defun x-display-screens (&optional frame) 1)
175 (defun x-display-mm-height (&optional frame) 245) ; Guess the size of my
176 (defun x-display-mm-width (&optional frame) 322) ; monitor, EZ...
177 (defun x-display-backing-store (&optional frame) 'not-useful)
178 (defun x-display-visual-class (&optional frame) 'static-color)
179 (fset 'x-display-save-under 'ignore)
180 (fset 'x-get-resource 'ignore)
181
182 ;; From lisp/term/x-win.el
183 (defvar x-display-name "pc"
184 "The name of the window display on which Emacs was started.
185 On X, the display name of individual X frames is recorded in the
186 `display' frame parameter.")
187 (defvar x-colors (mapcar 'car msdos-color-values)
188 "List of basic colors available on color displays.
189 For X, the list comes from the `rgb.txt' file,v 10.41 94/02/20.
190 For Nextstep, this is a list of non-PANTONE colors returned by
191 the operating system.")
192
193 ;; From lisp/term/w32-win.el
194 ;
195 ;;;; Selections and cut buffers
196 ;
197 ;;; We keep track of the last text selected here, so we can check the
198 ;;; current selection against it, and avoid passing back our own text
199 ;;; from x-cut-buffer-or-selection-value.
200 (defvar x-last-selected-text nil)
201
202 (defcustom x-select-enable-clipboard t
203 "Non-nil means cutting and pasting uses the clipboard.
204 This is in addition to, but in preference to, the primary selection.
205
206 On MS-Windows, this is non-nil by default, since Windows does not
207 support other types of selections. \(The primary selection that is
208 set by Emacs is not accessible to other programs on Windows.\)"
209 :type 'boolean
210 :group 'killing)
211
212 (defun x-select-text (text &optional push)
213 "Select TEXT, a string, according to the window system.
214
215 On X, put TEXT in the primary X selection. For backward
216 compatibility with older X applications, set the value of X cut
217 buffer 0 as well, and if the optional argument PUSH is non-nil,
218 rotate the cut buffers. If `x-select-enable-clipboard' is
219 non-nil, copy the text to the X clipboard as well.
220
221 On Windows, make TEXT the current selection. If
222 `x-select-enable-clipboard' is non-nil, copy the text to the
223 clipboard as well. The argument PUSH is ignored.
224
225 On Nextstep, put TEXT in the pasteboard; PUSH is ignored."
226 (if x-select-enable-clipboard
227 (w16-set-clipboard-data text))
228 (setq x-last-selected-text text))
229
230 ;;; Return the value of the current selection.
231 ;;; Consult the selection, then the cut buffer. Treat empty strings
232 ;;; as if they were unset.
233 (defun x-get-selection-value ()
234 (if x-select-enable-clipboard
235 (let (text)
236 ;; Don't die if x-get-selection signals an error.
237 (condition-case c
238 (setq text (w16-get-clipboard-data))
239 (error (message "w16-get-clipboard-data:%s" c)))
240 (if (string= text "") (setq text nil))
241 (cond
242 ((not text) nil)
243 ((eq text x-last-selected-text) nil)
244 ((string= text x-last-selected-text)
245 ;; Record the newer string, so subsequent calls can use the 'eq' test.
246 (setq x-last-selected-text text)
247 nil)
248 (t
249 (setq x-last-selected-text text))))))
250
251 ;; x-selection-owner-p is used in simple.el.
252 (defun x-selection-owner-p (&optional type)
253 "Whether the current Emacs process owns the given X Selection.
254 The arg should be the name of the selection in question, typically one of
255 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
256 \(Those are literal upper-case symbol names, since that's what X expects.)
257 For convenience, the symbol nil is the same as `PRIMARY',
258 and t is the same as `SECONDARY'."
259 (if x-select-enable-clipboard
260 (let (text)
261 ;; Don't die if w16-get-clipboard-data signals an error.
262 (ignore-errors
263 (setq text (w16-get-clipboard-data)))
264 ;; We consider ourselves the owner of the selection if it does
265 ;; not exist, or exists and compares equal with the last text
266 ;; we've put into the Windows clipboard.
267 (cond
268 ((not text) t)
269 ((or (eq text x-last-selected-text)
270 (string= text x-last-selected-text))
271 text)
272 (t nil)))))
273
274 ;; x-own-selection-internal and x-disown-selection-internal are used
275 ;; in select.el:x-set-selection.
276 (defun x-own-selection-internal (type value)
277 "Assert an X selection of the given TYPE with the given VALUE.
278 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
279 \(Those are literal upper-case symbol names, since that's what X expects.)
280 VALUE is typically a string, or a cons of two markers, but may be
281 anything that the functions on `selection-converter-alist' know about."
282 (ignore-errors
283 (x-select-text value))
284 value)
285
286 (defun x-disown-selection-internal (selection &optional time)
287 "If we own the selection SELECTION, disown it.
288 Disowning it means there is no such selection."
289 (if (x-selection-owner-p selection)
290 t))
291
292 ;; From lisp/faces.el: we only have one font, so always return
293 ;; it, no matter which variety they've asked for.
294 (defun x-frob-font-slant (font which)
295 font)
296 (make-obsolete 'x-frob-font-slant 'make-face-... "21.1")
297 (defun x-frob-font-weight (font which)
298 font)
299 (make-obsolete 'x-frob-font-weight 'make-face-... "21.1")
300
301 ;; From src/fontset.c:
302 (fset 'query-fontset 'ignore)
303
304 ;; From lisp/term/x-win.el: make iconify-or-deiconify-frame a no-op.
305 (fset 'iconify-or-deiconify-frame 'ignore)
306
307 ;; From lisp/frame.el
308 (fset 'set-default-font 'ignore)
309 (fset 'set-mouse-color 'ignore) ; We cannot, I think.
310 (fset 'set-cursor-color 'ignore) ; Hardware determined by char under.
311 (fset 'set-border-color 'ignore) ; Not useful.
312
313 (defvar msdos-last-help-message nil
314 "The last help message received via `show-help-function'.
315 This is used by `msdos-show-help'.")
316
317 (defvar msdos-previous-message nil
318 "The content of the echo area before help echo was displayed.")
319
320 (defun msdos-show-help (help)
321 "Function installed as `show-help-function' on MS-DOS frames."
322 (when (and (not (window-minibuffer-p)) ;Don't overwrite minibuffer contents.
323 (not cursor-in-echo-area)) ;Don't overwrite a prompt.
324 (cond
325 ((stringp help)
326 (setq help (replace-regexp-in-string "\n" ", " help))
327 (unless (or msdos-previous-message
328 (string-equal help (current-message))
329 (and (stringp msdos-last-help-message)
330 (string-equal msdos-last-help-message
331 (current-message))))
332 (setq msdos-previous-message (current-message)))
333 (setq msdos-last-help-message help)
334 (let ((message-truncate-lines nil)
335 (message-log-max nil))
336 (message "%s" help)))
337 ((stringp msdos-previous-message)
338 (let ((message-log-max nil))
339 (message "%s" msdos-previous-message)
340 (setq msdos-previous-message nil)))
341 (t
342 (message nil)))))
343
344
345 ;; Initialization.
346 ;; ---------------------------------------------------------------------------
347 ;; This function is run, by faces.el:tty-create-frame-with-faces, only
348 ;; for the initial frame (on each terminal, but we have only one).
349 ;; This works by setting the `terminal-initted' terminal parameter to
350 ;; this function, the first time `tty-create-frame-with-faces' is
351 ;; called on that terminal. `tty-create-frame-with-faces' is called
352 ;; directly from startup.el and also by `make-frame' through
353 ;; `frame-creation-function-alist'. `make-frame' will call this
354 ;; function if `msdos-create-frame-with-faces' (see below) is not
355 ;; found in `frame-creation-function-alist', which means something is
356 ;; _very_ wrong, because "internal" terminal emulator should not be
357 ;; turned on if our window-system is not `pc'. Therefore, the only
358 ;; Right Thing for us to do here is scream bloody murder.
359 (defun terminal-init-internal ()
360 "Terminal initialization function for the MS-DOS \"internal\" terminal.
361 Errors out because it is not supposed to be called, ever."
362 (error "terminal-init-internal called for window-system `%s'"
363 (window-system)))
364
365 (defun msdos-initialize-window-system ()
366 "Initialization function for the `pc' \"window system\"."
367 (or (eq (window-system) 'pc)
368 (error
369 "`msdos-initialize-window-system' called, but window-system is `%s'"
370 (window-system)))
371 ;; First, the keyboard.
372 (msdos-setup-keyboard terminal-frame) ; see internal.el
373 ;; Next, register the default colors.
374 (let* ((colors msdos-color-values)
375 (color (car colors)))
376 (tty-color-clear)
377 (while colors
378 (tty-color-define (car color) (cadr color) (cddr color))
379 (setq colors (cdr colors) color (car colors))))
380 ;; Modifying color mappings means realized faces don't
381 ;; use the right colors, so clear them.
382 (clear-face-cache)
383 ;; Now set up some additional faces.
384 (msdos-face-setup)
385 ;; Set up the initial frame.
386 (msdos-setup-initial-frame)
387 ;; Help echo is displayed in the echo area.
388 (setq show-help-function 'msdos-show-help)
389 ;; We want to delay the codepage-related setup until after user's
390 ;; .emacs is processed, because people might define their
391 ;; `dos-codepage-setup-hook' there.
392 (add-hook 'after-init-hook 'dos-codepage-setup)
393 ;; In multibyte mode, we want unibyte buffers to be displayed
394 ;; using the terminal coding system, so that they display
395 ;; correctly on the DOS terminal; in unibyte mode we want to see
396 ;; all 8-bit characters verbatim. In both cases, we want the
397 ;; entire range of 8-bit characters to arrive at our display code
398 ;; verbatim.
399 (standard-display-8bit 127 255)
400 ;; We are fast enough to make this optimization unnecessary.
401 (setq split-window-keep-point t)
402 ;; Arrange for the kill and yank functions to set and check the
403 ;; clipboard.
404 (setq interprogram-cut-function 'x-select-text)
405 (setq interprogram-paste-function 'x-get-selection-value)
406 (menu-bar-enable-clipboard)
407 (run-hooks 'terminal-init-msdos-hook))
408
409 ;; frame-creation-function-alist is examined by frame.el:make-frame.
410 (add-to-list 'frame-creation-function-alist
411 '(pc . msdos-create-frame-with-faces))
412 ;; window-system-initialization-alist is examined by startup.el:command-line.
413 (add-to-list 'window-system-initialization-alist
414 '(pc . msdos-initialize-window-system))
415 ;; We don't need anything beyond tty-handle-args for handling
416 ;; command-line argument; see startup.el.
417 (add-to-list 'handle-args-function-alist '(pc . tty-handle-args))
418
419 ;; ---------------------------------------------------------------------------
420
421 (provide 'pc-win)
422
423 ;; arch-tag: 5cbdb455-b495-427b-95d0-e417d77d00b4
424 ;;; pc-win.el ends here