diff lisp/simple.el @ 83387:0181341f0aca

Fix Delete key on X by adapting normal-erase-is-backspace-mode for multi-tty. (Reported by Dan Waber and Dan Nicolaescu.) * lisp/frame.el (terminal-parameter-p): New function. (terminal-parameter): Use it. * lisp/simple.el (normal-erase-is-backspace): Add 'maybe option, set it as default. (normal-erase-is-backspace-mode): Rewrite for multiple display support. (normal-erase-is-backspace-setup-frame): New function. * lisp/frame.el (make-frame): Call it. * lisp/startup.el (command-line): Call it. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-427
author Karoly Lorentey <lorentey@elte.hu>
date Sun, 23 Oct 2005 22:11:22 +0000
parents db4e74787e6f
children 732c5740ca8f
line wrap: on
line diff
--- a/lisp/simple.el	Wed Oct 19 14:06:17 2005 +0000
+++ b/lisp/simple.el	Sun Oct 23 22:11:22 2005 +0000
@@ -5237,36 +5237,33 @@
 
 ;;; Handling of Backspace and Delete keys.
 
-(defcustom normal-erase-is-backspace
-  (and (not noninteractive)
-       (or (memq system-type '(ms-dos windows-nt))
-	   (eq initial-window-system 'mac)
-	   (and (memq initial-window-system '(x))
-		(fboundp 'x-backspace-delete-keys-p)
-		(x-backspace-delete-keys-p))
-	   ;; If the terminal Emacs is running on has erase char
-	   ;; set to ^H, use the Backspace key for deleting
-	   ;; backward and, and the Delete key for deleting forward.
-	   (and (null initial-window-system)
-		(eq tty-erase-char ?\^H))))
-  "If non-nil, Delete key deletes forward and Backspace key deletes backward.
-
-On window systems, the default value of this option is chosen
-according to the keyboard used.  If the keyboard has both a Backspace
-key and a Delete key, and both are mapped to their usual meanings, the
-option's default value is set to t, so that Backspace can be used to
-delete backward, and Delete can be used to delete forward.
-
-If not running under a window system, customizing this option accomplishes
-a similar effect by mapping C-h, which is usually generated by the
-Backspace key, to DEL, and by mapping DEL to C-d via
-`keyboard-translate'.  The former functionality of C-h is available on
-the F1 key.  You should probably not use this setting if you don't
-have both Backspace, Delete and F1 keys.
+(defcustom normal-erase-is-backspace 'maybe
+  "Set the default behaviour of the Delete and Backspace keys.
+
+If set to t, Delete key deletes forward and Backspace key deletes
+backward.
+
+If set to nil, both Delete and Backspace keys delete backward.
+
+If set to 'maybe (which is the default), Emacs automatically
+selects a behaviour.  On window systems, the behaviour depends on
+the keyboard used.  If the keyboard has both a Backspace key and
+a Delete key, and both are mapped to their usual meanings, the
+option's default value is set to t, so that Backspace can be used
+to delete backward, and Delete can be used to delete forward.
+
+If not running under a window system, customizing this option
+accomplishes a similar effect by mapping C-h, which is usually
+generated by the Backspace key, to DEL, and by mapping DEL to C-d
+via `keyboard-translate'.  The former functionality of C-h is
+available on the F1 key.  You should probably not use this
+setting if you don't have both Backspace, Delete and F1 keys.
 
 Setting this variable with setq doesn't take effect.  Programmatically,
 call `normal-erase-is-backspace-mode' (which see) instead."
-  :type 'boolean
+  :type '(choice (const :tag "Off" nil)
+		 (const :tag "Maybe" maybe)
+		 (other :tag "On" t))
   :group 'editing-basics
   :version "21.1"
   :set (lambda (symbol value)
@@ -5276,17 +5273,40 @@
 	     (normal-erase-is-backspace-mode (or value 0))
 	   (set-default symbol value))))
 
+(defun normal-erase-is-backspace-setup-frame (&optional frame)
+  "Set up `normal-erase-is-backspace-mode' on FRAME, if necessary."
+  (unless frame (setq frame (selected-frame)))
+  (with-selected-frame frame
+    (unless (terminal-parameter-p nil 'normal-erase-is-backspace)
+      (if (cond ((terminal-parameter-p nil 'normal-erase-is-backspace)
+		 (terminal-parameter nil 'normal-erase-is-backspace))
+		((eq normal-erase-is-backspace 'maybe)
+		 (and (not noninteractive)
+		      (or (memq system-type '(ms-dos windows-nt))
+			  (eq window-system 'mac)
+			  (and (memq window-system '(x))
+			       (fboundp 'x-backspace-delete-keys-p)
+			       (x-backspace-delete-keys-p))
+			  ;; If the terminal Emacs is running on has erase char
+			  ;; set to ^H, use the Backspace key for deleting
+			  ;; backward and, and the Delete key for deleting forward.
+			  (and (null window-system)
+			       (eq tty-erase-char ?\^H)))))
+		(t
+		 normal-erase-is-backspace))
+	  (normal-erase-is-backspace-mode 1)
+	(normal-erase-is-backspace-mode 0)))))
 
 (defun normal-erase-is-backspace-mode (&optional arg)
   "Toggle the Erase and Delete mode of the Backspace and Delete keys.
 
 With numeric arg, turn the mode on if and only if ARG is positive.
 
-On window systems, when this mode is on, Delete is mapped to C-d and
-Backspace is mapped to DEL; when this mode is off, both Delete and
-Backspace are mapped to DEL.  (The remapping goes via
-`function-key-map', so binding Delete or Backspace in the global or
-local keymap will override that.)
+On window systems, when this mode is on, Delete is mapped to C-d
+and Backspace is mapped to DEL; when this mode is off, both
+Delete and Backspace are mapped to DEL.  (The remapping goes via
+`local-function-key-map', so binding Delete or Backspace in the
+global or local keymap will override that.)
 
 In addition, on window systems, the bindings of C-Delete, M-Delete,
 C-M-Delete, C-Backspace, M-Backspace, and C-M-Backspace are changed in
@@ -5308,33 +5328,34 @@
 
 See also `normal-erase-is-backspace'."
   (interactive "P")
-  (setq normal-erase-is-backspace
-	(if arg
-	    (> (prefix-numeric-value arg) 0)
-	  (not normal-erase-is-backspace)))
+  (set-terminal-parameter
+   nil 'normal-erase-is-backspace
+   (if arg
+       (> (prefix-numeric-value arg) 0)
+     (not (terminal-parameter nil 'normal-erase-is-backspace))))
 
   (cond ((or (memq window-system '(x w32 mac pc))
 	     (memq system-type '(ms-dos windows-nt)))
-	 (let ((bindings
-		`(([C-delete] [C-backspace])
-		  ([M-delete] [M-backspace])
-		  ([C-M-delete] [C-M-backspace])
-		  (,esc-map
-		   [C-delete] [C-backspace])))
-	       (old-state (lookup-key function-key-map [delete])))
-
-	   (if normal-erase-is-backspace
+	 (let* ((lfkm (terminal-local-value 'local-function-key-map nil))
+		(bindings
+		 `(([C-delete] [C-backspace])
+		   ([M-delete] [M-backspace])
+		   ([C-M-delete] [C-M-backspace])
+		   (,esc-map
+		    [C-delete] [C-backspace])))
+		(old-state (lookup-key lfkm [delete])))
+
+	   (if (terminal-parameter nil 'normal-erase-is-backspace)
 	       (progn
-		 ;; XXX Perhaps this mode should be terminal-local, not global -- lorentey
-		 (define-key function-key-map [delete] [?\C-d])
-		 (define-key function-key-map [kp-delete] [?\C-d])
-		 (define-key function-key-map [backspace] [?\C-?]))
-	     (define-key function-key-map [delete] [?\C-?])
-	     (define-key function-key-map [kp-delete] [?\C-?])
-	     (define-key function-key-map [backspace] [?\C-?]))
+		 (define-key lfkm [delete] [?\C-d])
+		 (define-key lfkm [kp-delete] [?\C-d])
+		 (define-key lfkm [backspace] [?\C-?]))
+	     (define-key lfkm [delete] [?\C-?])
+	     (define-key lfkm [kp-delete] [?\C-?])
+	     (define-key lfkm [backspace] [?\C-?]))
 
 	   ;; Maybe swap bindings of C-delete and C-backspace, etc.
-	   (unless (equal old-state (lookup-key function-key-map [delete]))
+	   (unless (equal old-state (lookup-key lfkm [delete]))
 	     (dolist (binding bindings)
 	       (let ((map global-map))
 		 (when (keymapp (car binding))
@@ -5346,8 +5367,9 @@
 		   (define-key map key1 binding2)
 		   (define-key map key2 binding1)))))))
 	 (t
-	  (if normal-erase-is-backspace
+	  (if (terminal-parameter nil 'normal-erase-is-backspace)
 	      (progn
+		;; XXX This should be terminal-local -- lorentey
 		(keyboard-translate ?\C-h ?\C-?)
 		(keyboard-translate ?\C-? ?\C-d))
 	    (keyboard-translate ?\C-h ?\C-h)