]> code.delx.au - gnu-emacs/blobdiff - lisp/term/x-win.el
(system-key-alist): Renamed from vendor-key-syms.
[gnu-emacs] / lisp / term / x-win.el
index 30f5fa9b2e3e0d37e4cffbef80923dc9310a4fe6..7361decaf7f5dfaf5d3b2429ccf8e4a0695a9d38 100644 (file)
@@ -1,23 +1,26 @@
-;; Parse switches controlling how Emacs interfaces with X window system.
-;; Copyright (C) 1990 Free Software Foundation, Inc.
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY.  No author or distributor
-;; accepts responsibility to anyone for the consequences of using it
-;; or for whether it serves any particular purpose or works at all,
-;; unless he says so in writing.  Refer to the GNU Emacs General Public
-;; License for full details.
-
-;; Everyone is granted permission to copy, modify and redistribute
-;; GNU Emacs, but only under the conditions described in the
-;; GNU Emacs General Public License.   A copy of this license is
-;; supposed to have been given to you along with GNU Emacs so you
-;; can know your rights and responsibilities.  It should be in a
-;; file named COPYING.  Among other things, the copyright notice
-;; and this notice must be preserved on all copies.
-
+;;; x-win.el --- parse switches controlling interface with X window system
+;; Copyright (C) 1993 Free Software Foundation, Inc.
+
+;; Author: FSF
+;; Keywords: terminals
+
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to
+;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
 
 ;; X-win.el:  this file is loaded from ../lisp/startup.el when it recognizes
 ;; that X windows are to be used.  Command line switches are parsed and those
@@ -26,6 +29,8 @@
 
 ;; startup.el will then examine startup files, and eventually call the hooks
 ;; which create the first window (s).
+
+;;; Code:
 \f
 ;; These are the standard X switches from the Xt Initialize.c file of
 ;; Release 4.
 ;; -font               *font
 ;; -foreground         *foreground
 ;; -geometry           .geometry
+;; -i                  .iconType
+;; -itype              .iconType
 ;; -iconic             .iconic
 ;; -name               .name
 ;; -reverse            *reverseVideo
 ;; -rv                 *reverseVideo
 ;; -selectionTimeout    .selectionTimeout
 ;; -synchronous                *synchronous
-;; -title              .title
 ;; -xrm
 
 ;; An alist of X options and the function which handles them.  See
 ;; ../startup.el.
 
 (if (not (eq window-system 'x))
-    (error "Loading x-win.el but not compiled for X"))
+    (error "%s: Loading x-win.el but not compiled for X" (invocation-name)))
         
-;; This is a temporary work-around while we the separate keymap
-;; stuff isn't yet fixed.  These variables aren't used anymore,
-;; but the lisp code wants them to exist.  -JimB
-(setq global-mouse-map (make-sparse-keymap))
-(setq global-function-map (make-sparse-keymap))
+(require 'frame)
+(require 'mouse)
+(require 'scroll-bar)
+(require 'faces)
+(require 'select)
+(require 'menu-bar)
+
+(defvar x-invocation-args)
 
-(require 'x-mouse)
-(require 'screen)
+(defvar x-command-line-resources nil)
 
 (setq command-switch-alist
-      (append '(("-dm" .       x-establish-daemon-mode)
-               ("-bw" .        x-handle-numeric-switch)
+      (append '(("-bw" .       x-handle-numeric-switch)
                ("-d" .         x-handle-display)
                ("-display" .   x-handle-display)
-               ("-name" .      x-handle-switch)
+               ("-name" .      x-handle-name-rn-switch)
+               ("-rn" .        x-handle-name-rn-switch)
                ("-T" .         x-handle-switch)
                ("-r" .         x-handle-switch)
                ("-rv" .        x-handle-switch)
                ("-reverse" .   x-handle-switch)
                ("-fn" .        x-handle-switch)
                ("-font" .      x-handle-switch)
-               ("-ib" .        x-handle-switch)
+               ("-ib" .        x-handle-numeric-switch)
                ("-g" .         x-handle-geometry)
                ("-geometry" .  x-handle-geometry)
                ("-fg" .        x-handle-switch)
                ("-bg" .        x-handle-switch)
                ("-background". x-handle-switch)
                ("-ms" .        x-handle-switch)
-               ("-ib" .        x-handle-switch)
-               ("-iconic" .    x-handle-switch)
+               ("-itype" .     x-handle-switch)
+               ("-i"   .       x-handle-switch)
+               ("-iconic" .    x-handle-iconic)
+               ("-xrm" .       x-handle-xrm-switch)
                ("-cr" .        x-handle-switch)
                ("-vb" .        x-handle-switch)
                ("-hb" .        x-handle-switch)
 (defconst x-switch-definitions
   '(("-name" name)
     ("-T" name)
-    ("-r" lose)
-    ("-rv" lose)
-    ("-reverse" lose)
+    ("-r" reverse t)
+    ("-rv" reverse t)
+    ("-reverse" reverse t)
     ("-fn" font)
     ("-font" font)
     ("-ib" internal-border-width)
     ("-background" background-color)
     ("-ms" mouse-color)
     ("-cr" cursor-color)
-    ("-ib" icon-type t)
-    ("-iconic" iconic-startup t)
-    ("-vb" vertical-scroll-bar t)
-    ("-hb" horizontal-scroll-bar t)
+    ("-itype" icon-type t)
+    ("-i" icon-type t)
+    ("-vb" vertical-scroll-bars t)
+    ("-hb" horizontal-scroll-bars t)
     ("-bd" border-color)
     ("-bw" border-width)))
 
   (let ((aelt (assoc switch x-switch-definitions)))
     (if aelt
        (if (nth 2 aelt)
-           (setq screen-default-alist
+           (setq default-frame-alist
                  (cons (cons (nth 1 aelt) (nth 2 aelt))
-                       screen-default-alist))
-         (setq screen-default-alist
+                       default-frame-alist))
+         (setq default-frame-alist
                (cons (cons (nth 1 aelt)
                            (car x-invocation-args))
-                     screen-default-alist)
+                     default-frame-alist)
                x-invocation-args (cdr x-invocation-args))))))
 
+;; Make -iconic apply only to the initial frame!
+(defun x-handle-iconic (switch)
+  (setq initial-frame-alist
+       (cons '(visibility . icon) initial-frame-alist)))
+
 ;; Handler for switches of the form "-switch n"
 (defun x-handle-numeric-switch (switch)
   (let ((aelt (assoc switch x-switch-definitions)))
     (if aelt
-       (setq screen-default-alist
+       (setq default-frame-alist
              (cons (cons (nth 1 aelt)
                          (string-to-int (car x-invocation-args)))
-                   screen-default-alist)
+                   default-frame-alist)
              x-invocation-args
              (cdr x-invocation-args)))))
 
+;; Handle the -xrm option.
+(defun x-handle-xrm-switch (switch)
+  (or (consp x-invocation-args)
+      (error "%s: missing argument to `%s' option" (invocation-name) switch))
+  (setq x-command-line-resources (car x-invocation-args))
+  (setq x-invocation-args (cdr x-invocation-args)))
+
 ;; Handle the geometry option
 (defun x-handle-geometry (switch)
-  (setq initial-screen-alist (append initial-screen-alist
-                                    (x-geometry (car x-invocation-args)))
+  (setq initial-frame-alist
+       (append initial-frame-alist
+               (x-parse-geometry (car x-invocation-args)))
        x-invocation-args (cdr x-invocation-args)))
 
-;; The daemon stuff isn't really useful at the moment.
-(defvar x-daemon-mode nil
-  "When set, means initially create just a minibuffer.")
-         
-(defun x-establish-daemon-mode (switch)
-  (setq x-daemon-mode t))
+;; Handle the -name and -rn options.  Set the variable x-resource-name
+;; to the option's operand; if the switch was `-name', set the name of
+;; the initial frame, too.
+(defun x-handle-name-rn-switch (switch)
+  (or (consp x-invocation-args)
+      (error "%s: missing argument to `%s' option" (invocation-name) switch))
+  (setq x-resource-name (car x-invocation-args)
+       x-invocation-args (cdr x-invocation-args))
+  (if (string= switch "-name")
+      (setq initial-frame-alist (cons (cons 'name x-resource-name)
+                                     initial-frame-alist))))
 
 (defvar x-display-name nil
-  "The X display name specifying server and X screen.")
+  "The X display name specifying server and X frame.")
 
 (defun x-handle-display (switch)
   (setq x-display-name (car x-invocation-args)
@@ -186,44 +214,6 @@ This returns ARGS with the arguments that have been processed removed."
   (setq args (nreverse args)))
 
 
-;; Handle Xresources.
-
-(defun x-read-resources ()
-  "Reread the X defaults from the X server and install them in
-`screen-default-alist', to be used in new screens."
-  (interactive)
-  (mapcar (function
-          (lambda (key-resname-default)
-            (let* ((key (nth 0 key-resname-default))
-                   (tail (assq key screen-default-alist))
-                   (value
-                    (or (x-get-resource (nth 1 key-resname-default))
-                        (nth 2 key-resname-default))))
-              (if tail (setcdr tail value)
-                (setq screen-default-alist
-                      (cons (cons key value)
-                            screen-default-alist))))))
-         '((font "font" "9x15")
-           (background-color "background" "white")
-           (border-width "#BorderWidth" 2)
-           (internal-border-width "#InternalBorderWidth" 1)
-
-           (foreground-color "foreground" "black")
-           (mouse-color "mouse" "black")
-           (cursor-color "cursor" "black")
-           (border-color "border" "black")))
-  (setq x-screen-defaults screen-default-alist))
-
-\f
-;; This is the function which creates the first X window.  It is called
-;; from startup.el before the user's init file is processed.
-
-(defun x-pop-initial-window ()
-  ;; see screen.el for this function
-  (pop-initial-screen (append initial-screen-alist
-                             screen-default-alist))
-  (delete-screen terminal-screen))
-
 \f
 ;;
 ;; Standard X cursor shapes, courtesy of Mr. Fox, who wanted ALL of them.
@@ -463,183 +453,192 @@ This returns ARGS with the arguments that have been processed removed."
     (while all-colors
       (setq this-color (car all-colors)
            all-colors (cdr all-colors))
-      (and (x-defined-color this-color)
+      (and (x-color-defined-p this-color)
           (setq defined-colors (cons this-color defined-colors))))
     defined-colors))
-
 \f
-;;
-;; Function key processing under X.  Function keys are received through
-;; in the input stream as Lisp symbols.
-;;
+;;;; Function keys
 
-(defun define-function-key (map sym definition)
-  (let ((exist (assq sym (cdr map))))
-    (if exist
-       (setcdr exist definition)
-      (setcdr map
-             (cons (cons sym definition)
-                   (cdr map))))))
-
-;; For unused keysyms.  If this happens, it's probably a server or
-;; Xlib bug.
-
-(defun weird-x-keysym ()
+(defun iconify-or-deiconify-frame ()
+  "Iconify the selected frame, or deiconify if it's currently an icon."
   (interactive)
-  (error "Bizarre X keysym received."))
-(define-function-key global-function-map 'xk-not-serious 'weird-x-keysym)
-
-;; Keypad type things
-
-(define-function-key global-function-map 'xk-home 'beginning-of-line)
-(define-function-key global-function-map 'xk-left 'backward-char)
-(define-function-key global-function-map 'xk-up 'previous-line)
-(define-function-key global-function-map 'xk-right 'forward-char)
-(define-function-key global-function-map 'xk-down 'next-line)
-(define-function-key global-function-map 'xk-prior 'previous-line)
-(define-function-key global-function-map 'xk-next 'next-line)
-(define-function-key global-function-map 'xk-end 'end-of-line)
-(define-function-key global-function-map 'xk-begin 'beginning-of-line)
-
- ;;  IsMiscFunctionKey 
-
-(define-function-key global-function-map 'xk-select nil)
-(define-function-key global-function-map 'xk-print nil)
-(define-function-key global-function-map 'xk-execute nil)
-(define-function-key global-function-map 'xk-insert nil)
-(define-function-key global-function-map 'xk-undo nil)
-(define-function-key global-function-map 'xk-redo nil)
-(define-function-key global-function-map 'xk-menu nil)
-(define-function-key global-function-map 'xk-find nil)
-(define-function-key global-function-map 'xk-cancel nil)
-(define-function-key global-function-map 'xk-help nil)
-(define-function-key global-function-map 'xk-break nil)
-
- ;;  IsKeypadKey 
-
-(define-function-key global-function-map 'xk-kp-space
-  '(lambda nil (interactive)
-     (insert " ")))
-(define-function-key global-function-map 'xk-kp-tab
-  '(lambda nil (interactive)
-     (insert "\t")))
-(define-function-key global-function-map 'xk-kp-enter
-  '(lambda nil (interactive)
-     (insert "\n")))
-
-(define-function-key global-function-map 'xk-kp-f1 nil)
-(define-function-key global-function-map 'xk-kp-f2 nil)
-(define-function-key global-function-map 'xk-kp-f3 nil)
-(define-function-key global-function-map 'xk-kp-f4 nil)
-
-(define-function-key global-function-map 'xk-kp-equal
-  '(lambda nil (interactive)
-     (insert "=")))
-(define-function-key global-function-map 'xk-kp-multiply
-  '(lambda nil (interactive)
-     (insert "*")))
-(define-function-key global-function-map 'xk-kp-add
-  '(lambda nil (interactive)
-     (insert "+")))
-(define-function-key global-function-map 'xk-kp-separator
-  '(lambda nil (interactive)
-     (insert ";")))
-(define-function-key global-function-map 'xk-kp-subtract
-  '(lambda nil (interactive)
-     (insert "-")))
-(define-function-key global-function-map 'xk-kp-decimal
-  '(lambda nil (interactive)
-     (insert ".")))
-(define-function-key global-function-map 'xk-kp-divide
-  '(lambda nil (interactive)
-     (insert "/")))
-
-(define-function-key global-function-map 'xk-kp-0
-  '(lambda nil (interactive)
-     (insert "0")))
-(define-function-key global-function-map 'xk-kp-1
-  '(lambda nil (interactive)
-     (insert "1")))
-(define-function-key global-function-map 'xk-kp-2
-  '(lambda nil (interactive)
-     (insert "2")))
-(define-function-key global-function-map 'xk-kp-3
-  '(lambda nil (interactive)
-     (insert "3")))
-(define-function-key global-function-map 'xk-kp-4
-  '(lambda nil (interactive)
-     (insert "4")))
-(define-function-key global-function-map 'xk-kp-5
-  '(lambda nil (interactive)
-     (insert "5")))
-(define-function-key global-function-map 'xk-kp-6
-  '(lambda nil (interactive)
-     (insert "6")))
-(define-function-key global-function-map 'xk-kp-7
-  '(lambda nil (interactive)
-     (insert "7")))
-(define-function-key global-function-map 'xk-kp-8
-  '(lambda nil (interactive)
-     (insert "8")))
-(define-function-key global-function-map 'xk-kp-9
-  '(lambda nil (interactive)
-     (insert "9")))
-
- ;;  IsFunctionKey 
-
-(define-function-key global-function-map 'xk-f1 'rmail)
-(define-function-key global-function-map 'xk-f2 nil)
-(define-function-key global-function-map 'xk-f3 nil)
-(define-function-key global-function-map 'xk-f4 nil)
-(define-function-key global-function-map 'xk-f5 nil)
-(define-function-key global-function-map 'xk-f6 nil)
-(define-function-key global-function-map 'xk-f7 nil)
-(define-function-key global-function-map 'xk-f8 nil)
-(define-function-key global-function-map 'xk-f9 nil)
-(define-function-key global-function-map 'xk-f10 nil)
-(define-function-key global-function-map 'xk-f11 nil)
-(define-function-key global-function-map 'xk-f12 nil)
-(define-function-key global-function-map 'xk-f13 nil)
-(define-function-key global-function-map 'xk-f14 nil)
-(define-function-key global-function-map 'xk-f15 nil)
-(define-function-key global-function-map 'xk-f16 nil)
-(define-function-key global-function-map 'xk-f17 nil)
-(define-function-key global-function-map 'xk-f18 nil)
-(define-function-key global-function-map 'xk-f19 nil)
-(define-function-key global-function-map 'xk-f20 nil)
-(define-function-key global-function-map 'xk-f21 nil)
-(define-function-key global-function-map 'xk-f22 nil)
-(define-function-key global-function-map 'xk-f23 nil)
-(define-function-key global-function-map 'xk-f24 nil)
-(define-function-key global-function-map 'xk-f25 nil)
-(define-function-key global-function-map 'xk-f26 nil)
-(define-function-key global-function-map 'xk-f27 nil)
-(define-function-key global-function-map 'xk-f28 nil)
-(define-function-key global-function-map 'xk-f29 nil)
-(define-function-key global-function-map 'xk-f30 nil)
-(define-function-key global-function-map 'xk-f31 nil)
-(define-function-key global-function-map 'xk-f32 nil)
-(define-function-key global-function-map 'xk-f33 nil)
-(define-function-key global-function-map 'xk-f34 nil)
-(define-function-key global-function-map 'xk-f35 nil)
+  (if (eq (cdr (assq 'visibility (frame-parameters))) t)
+      (iconify-frame)
+    (let ((foo (selected-frame)))
+      (make-frame-invisible foo)
+      (make-frame-visible foo))))
+
+(substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
+                          global-map)
+
+;; Map certain keypad keys into ASCII characters
+;; that people usually expect.
+(define-key function-key-map [backspace] [127])
+(define-key function-key-map [delete] [127])
+(define-key function-key-map [tab] [?\t])
+(define-key function-key-map [linefeed] [?\n])
+(define-key function-key-map [clear] [11])
+(define-key function-key-map [return] [13])
+(define-key function-key-map [escape] [?\e])
+(define-key function-key-map [M-backspace] [?\M-\d])
+(define-key function-key-map [M-delete] [?\M-\d])
+(define-key function-key-map [M-tab] [?\M-\t])
+(define-key function-key-map [M-linefeed] [?\M-\n])
+(define-key function-key-map [M-clear] [?\M-\013])
+(define-key function-key-map [M-return] [?\M-\015])
+(define-key function-key-map [M-escape] [?\M-\e])
+
+;; These tell read-char how to convert
+;; these special chars to ASCII.
+(put 'backspace 'ascii-character 127)
+(put 'delete 'ascii-character 127)
+(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)
+
+;; Set up to recognize vendor-specific keysyms.
+;; Unless/until there is a real conflict,
+;; we need not try to make this list depend on
+;; the type of X server in use.
+(setq system-key-alist
+      '(
+       ;; These are some HP keys.
+       (  168 . mute-acute)
+       (  169 . mute-grave)
+       (  170 . mute-asciicircum)
+       (  171 . mute-diaeresis)
+       (  172 . mute-asciitilde)
+       (  175 . lira)
+       (  190 . guilder)
+       (  252 . block)
+       (  256 . longminus)
+       (65388 . reset)
+       (65389 . system)
+       (65390 . user)
+       (65391 . clearline)
+       (65392 . insertline)
+       (65393 . deleteline)
+       (65394 . insertchar)
+       (65395 . deletechar)
+       (65396 . backtab)
+       (65397 . kp-backtab)
+       ;; This is used on some system or other.
+       (0 . remove)
+       ;; These are for Sun.
+       (392976 . f35)
+       (392977 . f36)
+       (393056 . req)
+       ))
+\f
+;;;; Selections and cut buffers
+
+;;; 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.
+(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.")
+
+;;; Make TEXT, a string, the primary X selection.
+;;; Also, set the value of X cut buffer 0, for backward compatibility
+;;; with older X applications.
+;;; gildea@lcs.mit.edu says it's not desirable to put kills
+;;; in the clipboard.
+(defun x-select-text (text &optional push)
+  ;; Don't send the cut buffer too much text.
+  ;; It becomes slow, and if really big it causes errors.
+  (if (< (length text) x-cut-buffer-max)
+      (x-set-cut-buffer text push)
+    (x-set-cut-buffer "" push))
+  (x-set-selection 'PRIMARY text)
+  (setq x-last-selected-text text))
+
+;;; Return the value of the current X selection.  For compatibility
+;;; with older X applications, this checks cut buffer 0 before
+;;; retrieving the value of the primary selection.
+(defun x-cut-buffer-or-selection-value ()
+  (let (text)
+
+    ;; Consult the selection, then the cut buffer.  Treat empty strings
+    ;; as if they were unset.
+    (setq text (x-get-selection 'PRIMARY))
+    (if (string= text "") (setq text nil))
+    (or text (setq text (x-get-cut-buffer 0)))
+    (if (string= text "") (setq text nil))
+
+    (cond
+     ((not text) nil)
+     ((eq text x-last-selected-text) nil)
+     ((string= text x-last-selected-text)
+      ;; Record the newer string, so subsequent calls can use the `eq' test.
+      (setq x-last-selected-text text)
+      nil)
+     (t
+      (setq x-last-selected-text text)))))
 
+\f
 ;;; Do the actual X Windows setup here; the above code just defines
 ;;; functions and variables that we use now.
 
-(x-open-connection (or x-display-name
-                      (setq x-display-name (getenv "DISPLAY"))))
-
-;; xterm.c depends on using interrupt-driven input, but we don't want
-;; the fcntls to apply to the terminal, so we do this after opening
-;; the display.
-(set-input-mode t nil t)
-
-(x-read-resources)
 (setq command-line-args (x-handle-args command-line-args))
-(x-pop-initial-window)
 
-(setq suspend-hook
-      '(lambda ()
-        (error "Suspending an emacs running under X makes no sense")))
+;;; Make sure we have a valid resource name.
+(or (stringp x-resource-name)
+    (let (i)
+      (setq x-resource-name (invocation-name))
+
+      ;; Change any . or * characters in x-resource-name to hyphens,
+      ;; so as not to choke when we use it in X resource queries.
+      (while (setq i (string-match "[.*]" x-resource-name))
+       (aset x-resource-name i ?-))))
 
-(define-key global-map "\C-z" 'iconify-emacs)
+(x-open-connection (or x-display-name
+                      (setq x-display-name (getenv "DISPLAY")))
+                  x-command-line-resources)
+
+(setq frame-creation-function 'x-create-frame-with-faces)
+
+(setq x-cut-buffer-max (min (- (/ (x-server-max-request-size) 2) 100)
+                           x-cut-buffer-max))
+
+;; Apply a geometry resource to the initial frame.  Put it at the end
+;; of the alist, so that anything specified on the command line takes
+;; precedence.
+(let ((res-geometry (x-get-resource "geometry" "Geometry")))
+  (if res-geometry
+      (setq initial-frame-alist (append initial-frame-alist
+                                       (x-parse-geometry res-geometry)))))
+
+;; Check the reverseVideo resource.
+(let ((case-fold-search t))
+  (let ((rv (x-get-resource "reverseVideo" "ReverseVideo")))
+    (if (and rv
+            (string-match "^\\(true\\|yes\\|on\\)$" rv))
+       (setq default-frame-alist
+             (cons '(reverse . t) default-frame-alist)))))
+
+;; Set x-selection-timeout, measured in milliseconds.
+(let ((res-selection-timeout
+       (x-get-resource "selectionTimeout" "SelectionTimeout")))
+  (setq x-selection-timeout 20000)
+  (if res-selection-timeout
+      (setq x-selection-timeout (string-to-number res-selection-timeout))))
+
+(defun x-win-suspend-error ()
+  (error "Suspending an emacs running under X makes no sense"))
+(add-hook 'suspend-hook 'x-win-suspend-error)
+
+;;; 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-cut-buffer-or-selection-value)
+
+;;; Turn off window-splitting optimization; X is usually fast enough
+;;; that this is only annoying.
+(setq split-window-keep-point t)
+
+;;; x-win.el ends here