Support for cut buffers has been removed.
[bpt/emacs.git] / lisp / term / pc-win.el
CommitLineData
55535639 1;;; pc-win.el --- setup support for `PC windows' (whatever that is)
ef88bd2d 2
5fd6d89f 3;; Copyright (C) 1994, 1996, 1997, 1999, 2001, 2002, 2003, 2004,
114f9c96 4;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
ef88bd2d
MW
5
6;; Author: Morten Welinder <terra@diku.dk>
9596811a 7;; Maintainer: FSF
ef88bd2d
MW
8
9;; This file is part of GNU Emacs.
10
1fecc8fe 11;; GNU Emacs is free software: you can redistribute it and/or modify
ef88bd2d 12;; it under the terms of the GNU General Public License as published by
1fecc8fe
GM
13;; the Free Software Foundation, either version 3 of the License, or
14;; (at your option) any later version.
ef88bd2d
MW
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
1fecc8fe 22;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
2fe590dc 23
55535639
PJ
24;;; Commentary:
25
cbcc5ad4
EZ
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
2fe590dc
EN
37;;; Code:
38
cbcc5ad4
EZ
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
ef88bd2d
MW
43(load "term/internal" nil t)
44
73e6adaa
DN
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")
92f9269e 48(declare-function msdos-setup-keyboard "internal" (frame))
73e6adaa 49
cbcc5ad4 50;;; This was copied from etc/rgb.txt, except that some values were changed
f795f633
EZ
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.
c4d64969
EZ
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
f795f633 61;;; the values for WHITE (i.e. less than 117963) are ``dark'', otherwise the
c4d64969
EZ
62;;; color is ``light''; see `frame-set-background-mode' in lisp/faces.el for
63;;; an example.
64(defvar msdos-color-values
1400df92 65 '(("black" 0 0 0 0)
f795f633 66 ("blue" 1 0 0 52480) ; MediumBlue
1400df92
EZ
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))
f795f633 81 "A list of MS-DOS console colors, their indices and 16-bit RGB values.")
a13b5fad 82
ef88bd2d
MW
83;; ---------------------------------------------------------------------------
84;; We want to delay setting frame parameters until the faces are setup
85(defvar default-frame-alist nil)
cbcc5ad4 86;(modify-frame-parameters terminal-frame default-frame-alist)
ef88bd2d
MW
87
88(defun msdos-face-setup ()
7ced34de
EZ
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")
ef88bd2d
MW
94
95 (make-face 'msdos-menu-active-face)
96 (make-face 'msdos-menu-passive-face)
97 (make-face 'msdos-menu-select-face)
7ced34de
EZ
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"))
ef88bd2d 103
f795f633
EZ
104(defun msdos-handle-reverse-video (frame parameters)
105 "Handle the reverse-video frame parameter on MS-DOS frames."
c88c89a0
EZ
106 (when (cdr (or (assq 'reverse parameters)
107 (assq 'reverse default-frame-alist)))
f795f633 108 (let* ((params (frame-parameters frame))
8fcacf13
EZ
109 (fg (cdr (assq 'foreground-color params)))
110 (bg (cdr (assq 'background-color params))))
111 (if (equal fg (cdr (assq 'mouse-color params)))
f795f633 112 (modify-frame-parameters frame
8fcacf13
EZ
113 (list (cons 'mouse-color bg))))
114 (if (equal fg (cdr (assq 'cursor-color params)))
f795f633 115 (modify-frame-parameters frame
8fcacf13 116 (list (cons 'cursor-color bg)))))))
f795f633
EZ
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
cbcc5ad4 120;; actual frame colors.
f795f633
EZ
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
cbcc5ad4
EZ
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.
138Optional frame parameters PARAMETERS specify the frame parameters.
139Parameters not specified by PARAMETERS are taken from
140`default-frame-alist'. If either PARAMETERS or `default-frame-alist'
141contains a `reverse' parameter, handle that. Value is the new frame
142created."
f795f633
EZ
143 (let ((frame (make-terminal-frame parameters))
144 success)
68a89a25 145 (unwind-protect
cbcc5ad4 146 (with-selected-frame frame
f795f633 147 (msdos-handle-reverse-video frame (frame-parameters frame))
cbcc5ad4
EZ
148 (unless (terminal-parameter frame 'terminal-initted)
149 (set-terminal-parameter frame 'terminal-initted t))
68a89a25
EZ
150 (frame-set-background-mode frame)
151 (face-set-after-frame-default frame)
152 (setq success t))
153 (unless success (delete-frame frame)))
e2f35ede 154 frame))
9000684d 155
ef88bd2d 156;; ---------------------------------------------------------------------------
a7acbbe4 157;; More or less useful imitations of certain X-functions. A lot of the
ef88bd2d
MW
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
cee30b8f 163(defun x-list-fonts (pattern &optional face frame maximum width)
c0e2e77f
EZ
164 (if (or (null width) (and (numberp width) (= width 1)))
165 (list "ms-dos")
cee30b8f 166 (list "no-such-font")))
a259d337
RS
167(defun x-display-pixel-width (&optional frame) (frame-width frame))
168(defun x-display-pixel-height (&optional frame) (frame-height frame))
c0e2e77f
EZ
169(defun x-display-planes (&optional frame) 4) ;bg switched to 16 colors as well
170(defun x-display-color-cells (&optional frame) 16)
ef88bd2d
MW
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)
c0e2e77f
EZ
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...
ef88bd2d
MW
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)
a0c712ae 181
ef88bd2d 182;; From lisp/term/x-win.el
f795f633 183(defvar x-display-name "pc"
3077d1f6
EZ
184 "The name of the window display on which Emacs was started.
185On X, the display name of individual X frames is recorded in the
186`display' frame parameter.")
c0e2e77f 187(defvar x-colors (mapcar 'car msdos-color-values)
3077d1f6
EZ
188 "List of basic colors available on color displays.
189For X, the list comes from the `rgb.txt' file,v 10.41 94/02/20.
190For Nextstep, this is a list of non-PANTONE colors returned by
191the operating system.")
c4d64969 192
8254b6b4 193;; From lisp/term/w32-win.el
c432c362
EZ
194;
195;;;; Selections and cut buffers
bb3a4574 196;
c432c362
EZ
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
6d7cc563 199;;; from x-selection-value.
c432c362
EZ
200(defvar x-last-selected-text nil)
201
8c717810
EZ
202(defcustom x-select-enable-clipboard t
203 "Non-nil means cutting and pasting uses the clipboard.
3077d1f6
EZ
204This is in addition to, but in preference to, the primary selection.
205
206On MS-Windows, this is non-nil by default, since Windows does not
207support other types of selections. \(The primary selection that is
208set by Emacs is not accessible to other programs on Windows.\)"
8c717810
EZ
209 :type 'boolean
210 :group 'killing)
c432c362 211
6d7cc563 212(defun x-select-text (text)
3077d1f6
EZ
213 "Select TEXT, a string, according to the window system.
214
6d7cc563
JD
215On X, if `x-select-enable-clipboard' is non-nil, copy TEXT to the
216clipboard. If `x-select-enable-primary' is non-nil, put TEXT in
217the primary selection.
3077d1f6
EZ
218
219On Windows, make TEXT the current selection. If
220`x-select-enable-clipboard' is non-nil, copy the text to the
6d7cc563 221clipboard as well.
3077d1f6 222
6d7cc563 223On Nextstep, put TEXT in the pasteboard."
db95369b 224 (if x-select-enable-clipboard
8254b6b4 225 (w16-set-clipboard-data text))
c432c362 226 (setq x-last-selected-text text))
db95369b 227
c432c362
EZ
228;;; Return the value of the current selection.
229;;; Consult the selection, then the cut buffer. Treat empty strings
230;;; as if they were unset.
231(defun x-get-selection-value ()
db95369b 232 (if x-select-enable-clipboard
c432c362
EZ
233 (let (text)
234 ;; Don't die if x-get-selection signals an error.
235 (condition-case c
8254b6b4
EZ
236 (setq text (w16-get-clipboard-data))
237 (error (message "w16-get-clipboard-data:%s" c)))
c432c362
EZ
238 (if (string= text "") (setq text nil))
239 (cond
240 ((not text) nil)
241 ((eq text x-last-selected-text) nil)
242 ((string= text x-last-selected-text)
243 ;; Record the newer string, so subsequent calls can use the 'eq' test.
244 (setq x-last-selected-text text)
245 nil)
246 (t
247 (setq x-last-selected-text text))))))
248
f22693fc
EZ
249;; x-selection-owner-p is used in simple.el.
250(defun x-selection-owner-p (&optional type)
251 "Whether the current Emacs process owns the given X Selection.
252The arg should be the name of the selection in question, typically one of
253the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
254\(Those are literal upper-case symbol names, since that's what X expects.)
255For convenience, the symbol nil is the same as `PRIMARY',
256and t is the same as `SECONDARY'."
257 (if x-select-enable-clipboard
258 (let (text)
259 ;; Don't die if w16-get-clipboard-data signals an error.
260 (ignore-errors
261 (setq text (w16-get-clipboard-data)))
262 ;; We consider ourselves the owner of the selection if it does
263 ;; not exist, or exists and compares equal with the last text
264 ;; we've put into the Windows clipboard.
265 (cond
266 ((not text) t)
267 ((or (eq text x-last-selected-text)
268 (string= text x-last-selected-text))
269 text)
270 (t nil)))))
271
272;; x-own-selection-internal and x-disown-selection-internal are used
273;; in select.el:x-set-selection.
274(defun x-own-selection-internal (type value)
275 "Assert an X selection of the given TYPE with the given VALUE.
276TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
277\(Those are literal upper-case symbol names, since that's what X expects.)
278VALUE is typically a string, or a cons of two markers, but may be
279anything that the functions on `selection-converter-alist' know about."
280 (ignore-errors
281 (x-select-text value))
282 value)
283
284(defun x-disown-selection-internal (selection &optional time)
285 "If we own the selection SELECTION, disown it.
286Disowning it means there is no such selection."
287 (if (x-selection-owner-p selection)
288 t))
289
ea6401d7
RS
290;; From lisp/faces.el: we only have one font, so always return
291;; it, no matter which variety they've asked for.
292(defun x-frob-font-slant (font which)
293 font)
aa32689c 294(make-obsolete 'x-frob-font-slant 'make-face-... "21.1")
c0e2e77f
EZ
295(defun x-frob-font-weight (font which)
296 font)
aa32689c 297(make-obsolete 'x-frob-font-weight 'make-face-... "21.1")
ea6401d7 298
cee30b8f
RS
299;; From src/fontset.c:
300(fset 'query-fontset 'ignore)
301
e1ddc4b4
RS
302;; From lisp/term/x-win.el: make iconify-or-deiconify-frame a no-op.
303(fset 'iconify-or-deiconify-frame 'ignore)
304
ef88bd2d
MW
305;; From lisp/frame.el
306(fset 'set-default-font 'ignore)
307(fset 'set-mouse-color 'ignore) ; We cannot, I think.
308(fset 'set-cursor-color 'ignore) ; Hardware determined by char under.
309(fset 'set-border-color 'ignore) ; Not useful.
c8a6e3b9 310
9993f59a
EZ
311(defvar msdos-last-help-message nil
312 "The last help message received via `show-help-function'.
313This is used by `msdos-show-help'.")
314
23608640
EZ
315(defvar msdos-previous-message nil
316 "The content of the echo area before help echo was displayed.")
317
318(defun msdos-show-help (help)
8fc29035 319 "Function installed as `show-help-function' on MS-DOS frames."
23608640 320 (when (and (not (window-minibuffer-p)) ;Don't overwrite minibuffer contents.
23608640
EZ
321 (not cursor-in-echo-area)) ;Don't overwrite a prompt.
322 (cond
323 ((stringp help)
9993f59a
EZ
324 (setq help (replace-regexp-in-string "\n" ", " help))
325 (unless (or msdos-previous-message
326 (string-equal help (current-message))
327 (and (stringp msdos-last-help-message)
328 (string-equal msdos-last-help-message
329 (current-message))))
23608640 330 (setq msdos-previous-message (current-message)))
9993f59a 331 (setq msdos-last-help-message help)
08792c11 332 (let ((message-truncate-lines nil)
23608640 333 (message-log-max nil))
9993f59a 334 (message "%s" help)))
23608640
EZ
335 ((stringp msdos-previous-message)
336 (let ((message-log-max nil))
337 (message "%s" msdos-previous-message)
338 (setq msdos-previous-message nil)))
339 (t
340 (message nil)))))
341
342
cbcc5ad4 343;; Initialization.
ef88bd2d 344;; ---------------------------------------------------------------------------
cbcc5ad4
EZ
345;; This function is run, by faces.el:tty-create-frame-with-faces, only
346;; for the initial frame (on each terminal, but we have only one).
347;; This works by setting the `terminal-initted' terminal parameter to
348;; this function, the first time `tty-create-frame-with-faces' is
349;; called on that terminal. `tty-create-frame-with-faces' is called
350;; directly from startup.el and also by `make-frame' through
351;; `frame-creation-function-alist'. `make-frame' will call this
352;; function if `msdos-create-frame-with-faces' (see below) is not
353;; found in `frame-creation-function-alist', which means something is
354;; _very_ wrong, because "internal" terminal emulator should not be
355;; turned on if our window-system is not `pc'. Therefore, the only
356;; Right Thing for us to do here is scream bloody murder.
357(defun terminal-init-internal ()
358 "Terminal initialization function for the MS-DOS \"internal\" terminal.
359Errors out because it is not supposed to be called, ever."
360 (error "terminal-init-internal called for window-system `%s'"
361 (window-system)))
362
363(defun msdos-initialize-window-system ()
364 "Initialization function for the `pc' \"window system\"."
365 (or (eq (window-system) 'pc)
366 (error
367 "`msdos-initialize-window-system' called, but window-system is `%s'"
368 (window-system)))
369 ;; First, the keyboard.
370 (msdos-setup-keyboard terminal-frame) ; see internal.el
371 ;; Next, register the default colors.
372 (let* ((colors msdos-color-values)
373 (color (car colors)))
374 (tty-color-clear)
375 (while colors
376 (tty-color-define (car color) (cadr color) (cddr color))
377 (setq colors (cdr colors) color (car colors))))
378 ;; Modifying color mappings means realized faces don't
379 ;; use the right colors, so clear them.
380 (clear-face-cache)
381 ;; Now set up some additional faces.
382 (msdos-face-setup)
383 ;; Set up the initial frame.
384 (msdos-setup-initial-frame)
23608640
EZ
385 ;; Help echo is displayed in the echo area.
386 (setq show-help-function 'msdos-show-help)
cbcc5ad4
EZ
387 ;; We want to delay the codepage-related setup until after user's
388 ;; .emacs is processed, because people might define their
389 ;; `dos-codepage-setup-hook' there.
390 (add-hook 'after-init-hook 'dos-codepage-setup)
391 ;; In multibyte mode, we want unibyte buffers to be displayed
392 ;; using the terminal coding system, so that they display
393 ;; correctly on the DOS terminal; in unibyte mode we want to see
394 ;; all 8-bit characters verbatim. In both cases, we want the
395 ;; entire range of 8-bit characters to arrive at our display code
396 ;; verbatim.
397 (standard-display-8bit 127 255)
398 ;; We are fast enough to make this optimization unnecessary.
399 (setq split-window-keep-point t)
400 ;; Arrange for the kill and yank functions to set and check the
401 ;; clipboard.
402 (setq interprogram-cut-function 'x-select-text)
403 (setq interprogram-paste-function 'x-get-selection-value)
404 (menu-bar-enable-clipboard)
405 (run-hooks 'terminal-init-msdos-hook))
406
407;; frame-creation-function-alist is examined by frame.el:make-frame.
408(add-to-list 'frame-creation-function-alist
409 '(pc . msdos-create-frame-with-faces))
410;; window-system-initialization-alist is examined by startup.el:command-line.
411(add-to-list 'window-system-initialization-alist
412 '(pc . msdos-initialize-window-system))
413;; We don't need anything beyond tty-handle-args for handling
414;; command-line argument; see startup.el.
415(add-to-list 'handle-args-function-alist '(pc . tty-handle-args))
416
417;; ---------------------------------------------------------------------------
418
419(provide 'pc-win)
092af6d8 420
cbee283d 421;; arch-tag: 5cbdb455-b495-427b-95d0-e417d77d00b4
092af6d8 422;;; pc-win.el ends here