Merge from gnulib.
[emacs.git] / lisp / w32-common-fns.el
blob72946f9bb96d8ff49691814f55c721327c46ccbd
1 ;;; w32-common-fns.el --- Lisp routines for Windows and Cygwin-w32
3 ;; Copyright (C) 1994, 2001-2014 Free Software Foundation, Inc.
5 ;; This file is part of GNU Emacs.
7 ;; GNU Emacs is free software: you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation, either version 3 of the License, or
10 ;; (at your option) any later version.
12 ;; GNU Emacs is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;; GNU General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
20 ;;; Commentary:
21 ;;;
22 ;;; This file contains functions that are used by both native NT Emacs
23 ;;; and Cygwin Emacs compiled to use the native Windows widget
24 ;;; library.
26 (declare-function x-server-version "w32fns.c" (&optional terminal))
28 (defun w32-version ()
29 "Return the MS-Windows version numbers.
30 The value is a list of three integers: the major and minor version
31 numbers, and the build number."
32 (x-server-version))
34 (defun w32-using-nt ()
35 "Return non-nil if running on a Windows NT descendant.
36 That includes all Windows systems except for 9X/Me."
37 (getenv "SystemRoot"))
39 (declare-function w32-get-clipboard-data "w32select.c")
40 (declare-function w32-set-clipboard-data "w32select.c")
41 (declare-function x-server-version "w32fns.c" (&optional display))
43 ;;; Fix interface to (X-specific) mouse.el
44 (defun x-set-selection (type data)
45 "Make an X selection of type TYPE and value DATA.
46 The argument TYPE (nil means `PRIMARY') says which selection, and
47 DATA specifies the contents. TYPE must be a symbol. \(It can also
48 be a string, which stands for the symbol with that name, but this
49 is considered obsolete.) DATA may be a string, a symbol, an
50 integer (or a cons of two integers or list of two integers).
52 The selection may also be a cons of two markers pointing to the same buffer,
53 or an overlay. In these cases, the selection is considered to be the text
54 between the markers *at whatever time the selection is examined*.
55 Thus, editing done in the buffer after you specify the selection
56 can alter the effective value of the selection.
58 The data may also be a vector of valid non-vector selection values.
60 The return value is DATA.
62 Interactively, this command sets the primary selection. Without
63 prefix argument, it reads the selection in the minibuffer. With
64 prefix argument, it uses the text of the region as the selection value.
66 Note that on MS-Windows, primary and secondary selections set by Emacs
67 are not available to other programs."
68 (put 'x-selections (or type 'PRIMARY) data))
70 (defun x-get-selection (&optional type _data-type)
71 "Return the value of an X Windows selection.
72 The argument TYPE (default `PRIMARY') says which selection,
73 and the argument DATA-TYPE (default `STRING') says
74 how to convert the data.
76 TYPE may be any symbol \(but nil stands for `PRIMARY'). However,
77 only a few symbols are commonly used. They conventionally have
78 all upper-case names. The most often used ones, in addition to
79 `PRIMARY', are `SECONDARY' and `CLIPBOARD'.
81 DATA-TYPE is usually `STRING', but can also be one of the symbols
82 in `selection-converter-alist', which see. This argument is
83 ignored on MS-Windows and MS-DOS."
84 (get 'x-selections (or type 'PRIMARY)))
86 ;; x-selection-owner-p is used in simple.el
87 (defun x-selection-owner-p (&optional type)
88 (and (memq type '(nil PRIMARY SECONDARY))
89 (get 'x-selections (or type 'PRIMARY))))
91 ;; The "Windows" keys on newer keyboards bring up the Start menu
92 ;; whether you want it or not - make Emacs ignore these keystrokes
93 ;; rather than beep.
94 (global-set-key [lwindow] 'ignore)
95 (global-set-key [rwindow] 'ignore)
97 (defvar w32-charset-info-alist) ; w32font.c
100 ;;;; Selections
102 ;; We keep track of the last text selected here, so we can check the
103 ;; current selection against it, and avoid passing back our own text
104 ;; from x-selection-value.
105 (defvar x-last-selected-text nil)
106 (defvar x-select-enable-clipboard)
108 (defun x-get-selection-value ()
109 "Return the value of the current selection.
110 Consult the selection. Treat empty strings as if they were unset."
111 (if x-select-enable-clipboard
112 (let (text)
113 ;; Don't die if x-get-selection signals an error.
114 (with-demoted-errors "w32-get-clipboard-data:%s"
115 (setq text (w32-get-clipboard-data)))
116 (if (string= text "") (setq text nil))
117 (cond
118 ((not text) nil)
119 ((eq text x-last-selected-text) nil)
120 ((string= text x-last-selected-text)
121 ;; Record the newer string, so subsequent calls can use the 'eq' test.
122 (setq x-last-selected-text text)
123 nil)
125 (setq x-last-selected-text text))))))
127 (defalias 'x-selection-value 'x-get-selection-value)
129 ;; Arrange for the kill and yank functions to set and check the clipboard.
130 (setq interprogram-cut-function 'x-select-text)
131 (setq interprogram-paste-function 'x-get-selection-value)
133 (provide 'w32-common-fns)