X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/08b3caa982199bd7939d9d6877203ada5d0083b5..5dc7a1d2c412fc485cca66a2be76f50bfa1f16d7:/lisp/w32-fns.el diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el index 5105505828..20f1a1b560 100644 --- a/lisp/w32-fns.el +++ b/lisp/w32-fns.el @@ -1,10 +1,10 @@ ;;; w32-fns.el --- Lisp routines for Windows NT -;; Copyright (C) 1994, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1994, 2001-2011 Free Software Foundation, Inc. ;; Author: Geoff Voelker ;; Keywords: internal +;; Package: emacs ;; This file is part of GNU Emacs. @@ -31,41 +31,6 @@ ;;;; Function keys -(defvar x-alternatives-map - (let ((map (make-sparse-keymap))) - ;; Map certain keypad keys into ASCII characters that people usually expect. - (define-key map [backspace] [127]) - (define-key map [delete] [127]) - (define-key map [tab] [?\t]) - (define-key map [linefeed] [?\n]) - (define-key map [clear] [?\C-l]) - (define-key map [return] [?\C-m]) - (define-key map [escape] [?\e]) - (define-key map [M-backspace] [?\M-\d]) - (define-key map [M-delete] [?\M-\d]) - (define-key map [M-tab] [?\M-\t]) - (define-key map [M-linefeed] [?\M-\n]) - (define-key map [M-clear] [?\M-\C-l]) - (define-key map [M-return] [?\M-\C-m]) - (define-key map [M-escape] [?\M-\e]) - (define-key map [iso-lefttab] [backtab]) - (define-key map [S-iso-lefttab] [backtab]) - (define-key map [S-tab] [backtab]) - map) - "Keymap of possible alternative meanings for some keys.") - -(defun x-setup-function-keys (frame) - "Set up `function-key-map' on FRAME for w32." - ;; Don't do this twice on the same display, or it would break - ;; normal-erase-is-backspace-mode. - (unless (terminal-parameter frame 'x-setup-function-keys) - ;; Map certain keypad keys into ASCII characters that people usually expect. - (with-selected-frame frame - (let ((map (copy-keymap x-alternatives-map))) - (set-keymap-parent map (keymap-parent local-function-key-map)) - (set-keymap-parent local-function-key-map map))) - (set-terminal-parameter frame 'x-setup-function-keys t))) - (declare-function set-message-beep "w32console.c") (declare-function w32-get-clipboard-data "w32select.c") (declare-function w32-get-locale-info "w32proc.c") @@ -91,7 +56,7 @@ That includes all Windows systems except for 9X/Me." (defun w32-shell-name () "Return the name of the shell being used." - (or (bound-and-true-p explicit-shell-file-name) + (or (bound-and-true-p shell-file-name) (getenv "ESHELL") (getenv "SHELL") (and (w32-using-nt) "cmd.exe") @@ -103,7 +68,7 @@ That includes all Windows systems except for 9X/Me." w32-system-shells))) (defun w32-shell-dos-semantics () - "Return non-nil if the interactive shell being used expects MSDOS shell semantics." + "Return non-nil if the interactive shell being used expects MS-DOS shell semantics." (or (w32-system-shell-p (w32-shell-name)) (and (member (downcase (file-name-nondirectory (w32-shell-name))) '("cmdproxy" "cmdproxy.exe")) @@ -112,7 +77,7 @@ That includes all Windows systems except for 9X/Me." (defvar w32-quote-process-args) ;; defined in w32proc.c (defun w32-check-shell-configuration () - "Check the configuration of shell variables on Windows NT/9X. + "Check the configuration of shell variables on Windows. This function is invoked after loading the init files and processing the command line arguments. It issues a warning if the user or site has configured the shell with inappropriate settings." @@ -170,26 +135,26 @@ You should set this to t when using a non-system shell.\n\n")))) (add-hook 'after-init-hook 'w32-check-shell-configuration) -;;; Override setting chosen at startup. +;; Override setting chosen at startup. (defun set-default-process-coding-system () ;; Most programs on Windows will accept Unix line endings on input ;; (and some programs ported from Unix require it) but most will ;; produce DOS line endings on output. (setq default-process-coding-system - (if default-enable-multibyte-characters + (if (default-value 'enable-multibyte-characters) '(undecided-dos . undecided-unix) '(raw-text-dos . raw-text-unix))) ;; Make cmdproxy default to using DOS line endings for input, ;; because some Windows programs (including command.com) require it. (add-to-list 'process-coding-system-alist `("[cC][mM][dD][pP][rR][oO][xX][yY]" - . ,(if default-enable-multibyte-characters + . ,(if (default-value 'enable-multibyte-characters) '(undecided-dos . undecided-dos) '(raw-text-dos . raw-text-dos)))) ;; plink needs DOS input when entering the password. (add-to-list 'process-coding-system-alist `("[pP][lL][iI][nN][kK]" - . ,(if default-enable-multibyte-characters + . ,(if (default-value 'enable-multibyte-characters) '(undecided-dos . undecided-dos) '(raw-text-dos . raw-text-dos))))) @@ -201,8 +166,8 @@ You should set this to t when using a non-system shell.\n\n")))) (defvar w32-valid-locales nil "List of locale ids known to be supported.") -;;; This is the brute-force version; an efficient version is now -;;; built-in though. +;; This is the brute-force version; an efficient version is now +;; built-in though. (if (not (fboundp 'w32-get-valid-locale-ids)) (defun w32-get-valid-locale-ids () "Return list of all valid Windows locale ids." @@ -217,27 +182,21 @@ You should set this to t when using a non-system shell.\n\n")))) (defun w32-list-locales () "List the name and id of all locales supported by Windows." (interactive) - (if (null w32-valid-locales) - (setq w32-valid-locales (w32-get-valid-locale-ids))) - (switch-to-buffer-other-window (get-buffer-create "*Supported Locales*")) - (erase-buffer) - (insert "LCID\tAbbrev\tFull name\n\n") - (insert (mapconcat - '(lambda (x) - (format "%d\t%s\t%s" - x - (w32-get-locale-info x) - (w32-get-locale-info x t))) - w32-valid-locales "\n")) - (insert "\n") - (goto-char (point-min))) - - -;;; Setup Info-default-directory-list to include the info directory -;;; near where Emacs executable was installed. We used to set INFOPATH, -;;; but when this is set Info-default-directory-list is ignored. We -;;; also cannot rely upon what is set in paths.el because they assume -;;; that configuration during build time is correct for runtime. + (when (null w32-valid-locales) + (setq w32-valid-locales (sort (w32-get-valid-locale-ids) #'<))) + (with-output-to-temp-buffer "*Supported Locales*" + (princ "LCID\tAbbrev\tFull name\n\n") + (dolist (locale w32-valid-locales) + (princ (format "%d\t%s\t%s\n" + locale + (w32-get-locale-info locale) + (w32-get-locale-info locale t)))))) + +;; Setup Info-default-directory-list to include the info directory +;; near where Emacs executable was installed. We used to set INFOPATH, +;; but when this is set Info-default-directory-list is ignored. We +;; also cannot rely upon what is set in paths.el because they assume +;; that configuration during build time is correct for runtime. (defun w32-init-info () (let* ((instdir (file-name-directory invocation-directory)) (dir1 (expand-file-name "../info/" instdir)) @@ -251,30 +210,31 @@ You should set this to t when using a non-system shell.\n\n")))) (add-hook 'before-init-hook 'w32-init-info) -;;; The variable source-directory is used to initialize Info-directory-list. -;;; However, the common case is that Emacs is being used from a binary -;;; distribution, and the value of source-directory is meaningless in that -;;; case. Even worse, source-directory can refer to a directory on a drive -;;; on the build machine that happens to be a removable drive on the user's -;;; machine. When this happens, Emacs tries to access the removable drive -;;; and produces the abort/retry/ignore dialog. Since we do not use -;;; source-directory, set it to something that is a reasonable approximation -;;; on the user's machine. - -;(add-hook 'before-init-hook -; '(lambda () -; (setq source-directory (file-name-as-directory -; (expand-file-name ".." exec-directory))))) - -(defun convert-standard-filename (filename) - "Convert a standard file's name to something suitable for the current OS. +;; The variable source-directory is used to initialize Info-directory-list. +;; However, the common case is that Emacs is being used from a binary +;; distribution, and the value of source-directory is meaningless in that +;; case. Even worse, source-directory can refer to a directory on a drive +;; on the build machine that happens to be a removable drive on the user's +;; machine. When this happens, Emacs tries to access the removable drive +;; and produces the abort/retry/ignore dialog. Since we do not use +;; source-directory, set it to something that is a reasonable approximation +;; on the user's machine. + +;;(add-hook 'before-init-hook +;; (lambda () +;; (setq source-directory (file-name-as-directory +;; (expand-file-name ".." exec-directory))))) + +(defun w32-convert-standard-filename (filename) + "Convert a standard file's name to something suitable for MS-Windows. This means to guarantee valid names and perhaps to canonicalize certain patterns. -On Windows and DOS, replace invalid characters. On DOS, make -sure to obey the 8.3 limitations. On Windows, turn Cygwin names -into native names, and also turn slashes into backslashes if the -shell requires it (see `w32-shell-dos-semantics')." +This function is called by `convert-standard-filename'. + +Replace invalid characters and turn Cygwin names into native +names, and also turn slashes into backslashes if the shell +requires it (see `w32-shell-dos-semantics')." (save-match-data (let ((name (if (string-match "\\`/cygdrive/\\([a-zA-Z]\\)/" filename) @@ -300,12 +260,50 @@ shell requires it (see `w32-shell-dos-semantics')." ;;; Fix interface to (X-specific) mouse.el (defun x-set-selection (type data) - (or type (setq type 'PRIMARY)) - (put 'x-selections type data)) + "Make an X selection of type TYPE and value DATA. +The argument TYPE (nil means `PRIMARY') says which selection, and +DATA specifies the contents. TYPE must be a symbol. \(It can also +be a string, which stands for the symbol with that name, but this +is considered obsolete.) DATA may be a string, a symbol, an +integer (or a cons of two integers or list of two integers). + +The selection may also be a cons of two markers pointing to the same buffer, +or an overlay. In these cases, the selection is considered to be the text +between the markers *at whatever time the selection is examined*. +Thus, editing done in the buffer after you specify the selection +can alter the effective value of the selection. + +The data may also be a vector of valid non-vector selection values. + +The return value is DATA. + +Interactively, this command sets the primary selection. Without +prefix argument, it reads the selection in the minibuffer. With +prefix argument, it uses the text of the region as the selection value. + +Note that on MS-Windows, primary and secondary selections set by Emacs +are not available to other programs." + (put 'x-selections (or type 'PRIMARY) data)) (defun x-get-selection (&optional type data-type) - (or type (setq type 'PRIMARY)) - (get 'x-selections type)) + "Return the value of an X Windows selection. +The argument TYPE (default `PRIMARY') says which selection, +and the argument DATA-TYPE (default `STRING') says +how to convert the data. + +TYPE may be any symbol \(but nil stands for `PRIMARY'). However, +only a few symbols are commonly used. They conventionally have +all upper-case names. The most often used ones, in addition to +`PRIMARY', are `SECONDARY' and `CLIPBOARD'. + +DATA-TYPE is usually `STRING', but can also be one of the symbols +in `selection-converter-alist', which see." + (get 'x-selections (or type 'PRIMARY))) + +;; x-selection-owner-p is used in simple.el +(defun x-selection-owner-p (&optional type) + (and (memq type '(nil PRIMARY SECONDARY)) + (get 'x-selections (or type 'PRIMARY)))) (defun set-w32-system-coding-system (coding-system) "Set the coding system used by the Windows system to CODING-SYSTEM. @@ -328,38 +326,27 @@ This function is provided for backward compatibility, since ;; w32-system-coding-system. Use that instead. (defvaralias 'w32-system-coding-system 'locale-coding-system) -;;; Set to a system sound if you want a fancy bell. +;; Set to a system sound if you want a fancy bell. (set-message-beep nil) -;;; The "Windows" keys on newer keyboards bring up the Start menu -;;; whether you want it or not - make Emacs ignore these keystrokes -;;; rather than beep. +;; The "Windows" keys on newer keyboards bring up the Start menu +;; whether you want it or not - make Emacs ignore these keystrokes +;; rather than beep. (global-set-key [lwindow] 'ignore) (global-set-key [rwindow] 'ignore) -;; These tell read-char how to convert -;; these special chars to ASCII. -(put 'tab 'ascii-character ?\t) -(put 'linefeed 'ascii-character ?\n) -(put 'clear 'ascii-character 12) -(put 'return 'ascii-character 13) -(put 'escape 'ascii-character ?\e) -(put 'backspace 'ascii-character 127) -(put 'delete 'ascii-character 127) - (defun w32-add-charset-info (xlfd-charset windows-charset codepage) "Function to add character sets to display with Windows fonts. Creates entries in `w32-charset-info-alist'. XLFD-CHARSET is a string which will appear in the XLFD font name to -identify the character set. WINDOWS-CHARSET is a symbol identifying +identify the character set. WINDOWS-CHARSET is a symbol identifying the Windows character set this maps to. For the list of possible values, see the documentation for `w32-charset-info-alist'. CODEPAGE can be a numeric codepage that Windows uses to display the character set, t for Unicode output with no codepage translation or nil for 8 bit output with no translation." (add-to-list 'w32-charset-info-alist - (cons xlfd-charset (cons windows-charset codepage))) - ) + (cons xlfd-charset (cons windows-charset codepage)))) ;; The last charset we add becomes the "preferred" charset for the return ;; value from w32-select-font etc, so list the most important charsets last. @@ -386,7 +373,7 @@ bit output with no translation." (w32-add-charset-info "iso8859-13" 'w32-charset-baltic 1257) (w32-add-charset-info "koi8-r" 'w32-charset-russian 20866) (w32-add-charset-info "iso8859-5" 'w32-charset-russian 28595) -(w32-add-charset-info "tis620" 'w32-charset-thai 874) +(w32-add-charset-info "tis620-2533" 'w32-charset-thai 874) (w32-add-charset-info "windows-1258" 'w32-charset-vietnamese 1258) (w32-add-charset-info "ksc5601.1992" 'w32-charset-johab 1361) (w32-add-charset-info "mac-roman" 'w32-charset-mac 10000) @@ -409,30 +396,16 @@ bit output with no translation." 'w32-charset-info-alist "21.1") -;;;; Selections and cut buffers +;;;; Selections -;;; We keep track of the last text selected here, so we can check the -;;; current selection against it, and avoid passing back our own text -;;; from x-cut-buffer-or-selection-value. +;; We keep track of the last text selected here, so we can check the +;; current selection against it, and avoid passing back our own text +;; from x-selection-value. (defvar x-last-selected-text nil) -;;; It is said that overlarge strings are slow to put into the cut buffer. -;;; Note this value is overridden below. -(defvar x-cut-buffer-max 20000 - "Max number of characters to put in the cut buffer.") - -(defun x-select-text (text &optional push) - "Make TEXT the last selected text. -If `x-select-enable-clipboard' is non-nil, copy the text to the system -clipboard as well. Optional PUSH is ignored on Windows." - (if x-select-enable-clipboard - (w32-set-clipboard-data text)) - (setq x-last-selected-text text)) - (defun x-get-selection-value () "Return the value of the current selection. -Consult the selection, then the cut buffer. Treat empty strings as if -they were unset." +Consult the selection. Treat empty strings as if they were unset." (if x-select-enable-clipboard (let (text) ;; Don't die if x-get-selection signals an error. @@ -450,9 +423,9 @@ they were unset." (t (setq x-last-selected-text text)))))) -(defalias 'x-cut-buffer-or-selection-value 'x-get-selection-value) +(defalias 'x-selection-value 'x-get-selection-value) -;;; Arrange for the kill and yank functions to set and check the clipboard. +;; Arrange for the kill and yank functions to set and check the clipboard. (setq interprogram-cut-function 'x-select-text) (setq interprogram-paste-function 'x-get-selection-value) @@ -466,7 +439,9 @@ This is required because some Windows build environments, such as MSYS, munge command-line arguments that include file names to a horrible mess that Emacs is unable to cope with." (let ((generated-autoload-file - (expand-file-name (pop command-line-args-left)))) + (expand-file-name (pop command-line-args-left))) + ;; I can only assume the same considerations may apply here... + (autoload-make-program (pop command-line-args-left))) (batch-update-autoloads))) (defun w32-append-code-lines (orig extra) @@ -483,5 +458,4 @@ to include Sed, which is used by leim/Makefile.in to do the job." (delete-matching-lines "^$\\|^;") (save-buffers-kill-emacs t)) -;; arch-tag: c49b48cc-0f4f-454f-a274-c2dc34815e14 ;;; w32-fns.el ends here