changeset 83594:2716535391b7

Rudimentary fix for environment variable handling. * lisp/env.el (getenv): Restore David Kastrup's fix. (environment): Add optional frame parameter. * lisp/mule-cmds.el (set-locale-environment): Fix getenv call. * lisp/term/rxvt.el (rxvt-set-background-mode): Ditto. * lisp/x-win.el (x-initialize-window-system, terminal-init-xterm): Ditto. * lisp/server.el (server-with-environment): Restore the original environment. Revision: emacs@sv.gnu.org/emacs--multi-tty--0--patch-6 Creator: Karoly Lorentey <karoly@lorentey.hu>
author Miles Bader <miles@gnu.org>
date Wed, 16 May 2007 07:12:33 +0000
parents 6597e68ad5dc
children 43366eac73d8
files README.multi-tty lisp/env.el lisp/international/mule-cmds.el lisp/server.el lisp/term/rxvt.el lisp/term/x-win.el lisp/term/xterm.el
diffstat 7 files changed, 54 insertions(+), 124 deletions(-) [+]
line wrap: on
line diff
--- a/README.multi-tty	Wed May 16 02:51:49 2007 +0000
+++ b/README.multi-tty	Wed May 16 07:12:33 2007 +0000
@@ -19,13 +19,8 @@
 and check their messages without opening a remote X frame or resorting
 to gnus-slave.
 
-WHO IS DOING IT
----------------
-
-I'm Károly Lőrentey.  My address: lorentey@elte.hu.
-
-Comments, bug reports, suggestions and patches are welcome; send them
-to multi-tty@lists.fnord.hu.
+THANKS
+------
 
 The following is a (sadly incomplete) list of people who have
 contributed to the project by testing, submitting patches, bug
@@ -70,21 +65,6 @@
 patches.
 
 
-MAILING LISTS
--------------
-
-The multi-tty mailing list (discussion & bug reports):
-
-    	Address:	multi-tty@lists.fnord.hu
-	Signup:		http://lists.fnord.hu/mailman/listinfo/multi-tty
-	Archive:	http://news.gmane.org/gmane.emacs.multi-tty/
-
-Commit notifications (read-only):
-
-        Address:	multi-tty-commits@lists.fnord.hu
-	Signup:		http://lists.fnord.hu/mailman/listinfo/multi-tty-commits
-
-
 STATUS
 ------
 
@@ -107,13 +87,14 @@
 Known problems:
 
         * GTK support.  If you compile your Emacs with the GTK
-          toolkit, some functionality of multi-tty will be lost.  In
-          particular, you will not be able to work on multiple X
-          displays at once.  Current releases of GTK have limitations
-          and bugs that prevent full-blown multi-display support in
-          Emacs.  (GTK crashes when Emacs tries to disconnect from an
-          X server.)  Use the Lucid toolkit if you want to see a
-          complete feature set.
+          toolkit, some functionality of multi-tty may be lost.  In
+          particular, you may get crashes while working on multiple X
+          displays at once.  Previous releases of GTK had limitations
+          and bugs that prevented full-blown multi-display support in
+          Emacs.  (GTK crashed when Emacs tries to disconnect from an
+          X server.)  Things are much improved in the current GTK
+          version, but if you do experience crashes in libgtk, try
+          compiling Emacs with the Lucid toolkit instead.
 
         * The single-kboard mode.
 
@@ -154,68 +135,12 @@
 HOW TO GET THE BRANCH
 ---------------------
 
-The branch uses Bazaar 1 (http://bazaar.canonical.com) for version control.
-
-Retrieving the latest version of the branch:
-
-	baz register-archive -f http://aszt.inf.elte.hu/~lorentey/mirror/arch/2004
-	baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
-
-This incantation uses an archive mirror that is hosted on a
-high-bandwidth site.  Please note that on average there is a two-hour
-delay for commits to arrive on this mirror.  My primary mirror is on the
-low-bandwidth http://lorentey.hu/ site:
-
-	baz register-archive -f http://lorentey.hu/arch/2004/
-	baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
-
-This is "instantly" updated, but very slow from outside Hungary.
-(By "instantly" I mean as soon as I connect the notebook I work on to
-a network.  It could take days.)
-
-The Arch supermirror provides mirroring services for all public Arch
-repositories.  We have a mirror there, too, if you prefer.
-
-	baz register-archive -f http://mirrors.sourcecontrol.net/lorentey%40elte.hu--2004
-	baz get lorentey@elte.hu--2004/emacs--multi-tty <directory>
-
-My GPG key id is 0FB27A3F; it is available from
-hkp://wwwkeys.eu.pgp.net/, or from my homepage at
-http://lorentey.hu/rolam/gpg.html)
+To get the branch, check out the "multi-tty" CVS branch from Emacs CVS.
 
-Don't worry if the above checkout takes a few minutes to complete;
-once you have a source tree, updating it to the latest revision will
-be _much_ faster.  Use the following command for the update:
-
-	baz replay
-
-You can find more information about Bazaar on
-http://bazaar.canonical.com/.  It's a distributed source control
-system that is somewhat less broken than competing projects.
-
-If you don't have Bazaar, the branch has a homepage from which you can
-download conventional patches against Emacs CVS HEAD:
-
-	http://lorentey.hu/project/emacs.html
-
-I suggest you use Bazaar whenever feasible.
+Alternatively, you can use Bazaar version 1 (not 2) or tla:
 
-
-DEBIAN PACKAGES
----------------
-
-If you run Debian, or a distribution based on Debian, you are welcome
-to use our binary packages; put these lines in your /etc/apt/sources.list:
-
-	# Multi-tty Emacs
-	deb http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
-	deb-src http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
-
-Note that these packages are intended solely to provide an easy way to
-test the new multi-tty features.  They are not to be taken as Emacs
-releases, and it's a mistake to expect robust operation or any kind of
-timely support for them.  Do not install them, unless you'd like to
-have your editor crash on you.
+	baz register-archive http://arch.sv.gnu.org/archives/emacs
+	baz get emacs@sv.gnu.org/emacs--multi-tty--0 <directory>
 
 
 COMPILATION
@@ -225,7 +150,7 @@
 
 	make maintainer-clean  # (If you have compiled Emacs before)
 
-	./configure --without-gtk <your favourite options>
+	./configure <your favourite options>
 	make bootstrap
 	make install
 
@@ -262,8 +187,9 @@
 
 This is work in progress, and probably full of bugs.  It is a good
 idea to run emacs from gdb, so that you'll have a live instance to
-debug if something goes wrong.  Please send me your bug reports on our
-mailing list: multi-tty@lists.fnord.hu
+debug if something goes wrong.  Please send your bug reports to
+emacs-devel@gnu.org.  Please don't forget to mention that you are
+using the multi-tty branch.
 
 TIPS & TRICKS
 -------------
@@ -348,8 +274,7 @@
 CHANGELOG
 ---------
 
-See arch logs.
-
+See the ChangeLog.multi-tty files in the source tree.
 
 NEWS
 ----
--- a/lisp/env.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/env.el	Wed May 16 07:12:33 2007 +0000
@@ -212,20 +212,24 @@
   (let ((value (getenv-internal (if (multibyte-string-p variable)
 				    (encode-coding-string
 				     variable locale-coding-system)
-				  variable))))
+				  variable)
+				frame)))
     (if (and enable-multibyte-characters value)
 	(setq value (decode-coding-string value locale-coding-system)))
     (when (interactive-p)
       (message "%s" (if value value "Not set")))
     value))
 
-(defun environment ()
+(defun environment (&optional frame)
   "Return a list of environment variables with their values.
 Each entry in the list is a string of the form NAME=VALUE.
 
 The returned list can not be used to change environment
 variables, only read them.  See `setenv' to do that.
 
+If optional parameter FRAME is non-nil, then it should be a
+frame.  The function returns the environment of that frame.
+
 The list is constructed by concatenating the elements of
 `process-environment' and the 'environment parameter of the
 selected frame, and removing duplicated and empty values.
@@ -234,7 +238,7 @@
 `locale-coding-system', i.e. the elements must normally be decoded for use.
 See `setenv' and `getenv'."
   (let* ((env (append process-environment
-		      (frame-parameter (frame-with-environment)
+		      (frame-parameter (frame-with-environment frame)
 				       'environment)
 		      nil))
 	 (scan env)
--- a/lisp/international/mule-cmds.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/international/mule-cmds.el	Wed May 16 07:12:33 2007 +0000
@@ -2454,7 +2454,7 @@
 ;; too, for setting things such as calendar holidays, ps-print paper
 ;; size, spelling dictionary.
 
-(defun set-locale-environment (&optional locale-name display)
+(defun set-locale-environment (&optional locale-name frame)
   "Set up multi-lingual environment for using LOCALE-NAME.
 This sets the language environment, the coding system priority,
 the default input method and sometimes other things.
@@ -2475,10 +2475,9 @@
 will be translated according to the table specified by
 `locale-translation-file-name'.
 
-If DISPLAY is non-nil, only set the keyboard coding system and
-the terminal coding system for the given display, and don't touch
-session-global parameters like the language environment.  DISPLAY
-may be a display id or a frame.
+If FRAME is non-nil, only set the keyboard coding system and the
+terminal coding system for the terminal of that frame, and don't
+touch session-global parameters like the language environment.
 
 See also `locale-charset-language-names', `locale-language-names',
 `locale-preferred-coding-systems' and `locale-coding-system'."
@@ -2509,7 +2508,7 @@
       (let ((vars '("LC_ALL" "LC_CTYPE" "LANG")))
 	(while (and vars
 		    (= 0 (length locale))) ; nil or empty string
-	  (setq locale (getenv (pop vars) display)))))
+	  (setq locale (getenv (pop vars) frame)))))
 
     (unless locale
       ;; The two tests are kept separate so the byte-compiler sees
@@ -2583,7 +2582,7 @@
 
 	  ;; Set up for this character set.  This is now the right way
 	  ;; to do it for both unibyte and multibyte modes.
-	  (unless display
+	  (unless frame
 	    (set-language-environment language-name))
 
 	  ;; If default-enable-multibyte-characters is nil,
@@ -2591,7 +2590,7 @@
 	  ;; so the display table and terminal coding system are irrelevant.
 	  (when default-enable-multibyte-characters
 	    (set-display-table-and-terminal-coding-system
-	     language-name coding-system display))
+	     language-name coding-system frame))
 
 	  ;; Set the `keyboard-coding-system' if appropriate (tty
 	  ;; only).  At least X and MS Windows can generate
@@ -2603,13 +2602,13 @@
 	  (let ((kcs (or coding-system
 			 (car (get-language-info language-name
 						 'coding-system)))))
-	    (if kcs (set-keyboard-coding-system kcs display)))
+	    (if kcs (set-keyboard-coding-system kcs frame)))
 
-	  (unless display
+	  (unless frame
 	    (setq locale-coding-system
 		  (car (get-language-info language-name 'coding-priority)))))
 
-	(when (and (not display)
+	(when (and (not frame)
 		   coding-system
 		   (not (coding-system-equal coding-system
 					     locale-coding-system)))
@@ -2625,9 +2624,9 @@
     (when (boundp 'w32-ansi-code-page)
       (let ((code-page-coding (intern (format "cp%d" w32-ansi-code-page))))
 	(when (coding-system-p code-page-coding)
-	  (unless display (setq locale-coding-system code-page-coding))
-	  (set-keyboard-coding-system code-page-coding display)
-	  (set-terminal-coding-system code-page-coding display))))
+	  (unless frame (setq locale-coding-system code-page-coding))
+	  (set-keyboard-coding-system code-page-coding frame)
+	  (set-terminal-coding-system code-page-coding frame))))
 
     (when (eq system-type 'darwin)
       ;; On Darwin, file names are always encoded in utf-8, no matter
@@ -2636,13 +2635,13 @@
       ;; Mac OS X's Terminal.app by default uses utf-8 regardless of
       ;; the locale.
       (when (and (null window-system)
-		 (equal (getenv "TERM_PROGRAM" display) "Apple_Terminal"))
+		 (equal (getenv "TERM_PROGRAM" frame) "Apple_Terminal"))
 	(set-terminal-coding-system 'utf-8)
 	(set-keyboard-coding-system 'utf-8)))
 
     ;; Default to A4 paper if we're not in a C, POSIX or US locale.
     ;; (See comments in Flocale_info.)
-    (unless display
+    (unless frame
       (let ((locale locale)
 	    (paper (locale-info 'paper)))
 	(if paper
@@ -2654,7 +2653,7 @@
 	      (setq ps-paper-type 'a4)))
 	  (let ((vars '("LC_ALL" "LC_PAPER" "LANG")))
 	    (while (and vars (= 0 (length locale)))
-	      (setq locale (getenv (pop vars) display))))
+	      (setq locale (getenv (pop vars) frame))))
 	  (when locale
 	    ;; As of glibc 2.2.5, these are the only US Letter locales,
 	    ;; and the rest are A4.
--- a/lisp/server.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/server.el	Wed May 16 07:12:33 2007 +0000
@@ -268,19 +268,21 @@
 VARS should be a list of strings.
 ENV should be in the same format as `process-environment'."
   (declare (indent 2))
-  (let ((oldvalues (make-symbol "oldvalues"))
+  (let ((old-env (make-symbol "old-env"))
 	(var (make-symbol "var"))
 	(value (make-symbol "value"))
 	(pair (make-symbol "pair")))
-    `(let (,oldvalues)
+    `(let ((,old-env process-environment))
        (dolist (,var ,vars)
 	 (let ((,value (server-getenv-from ,env ,var)))
-	   (setq ,oldvalues (cons (cons ,var (getenv ,var)) ,oldvalues))
-	   (setenv ,var ,value)))
+	   (setq process-environment
+		 (cons (if (null ,value)
+			   ,var
+			 (concat ,var "=" ,value))
+		       process-environment))))
        (unwind-protect
 	   (progn ,@body)
-	 (dolist (,pair ,oldvalues)
-	   (setenv (car ,pair) (cdr ,pair)))))))
+	 (setq process-environment ,old-env)))))
 
 (defun server-delete-client (client &optional noframe)
   "Delete CLIENT, including its buffers, terminals and frames.
--- a/lisp/term/rxvt.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/term/rxvt.el	Wed May 16 07:12:33 2007 +0000
@@ -284,7 +284,7 @@
 ;; intelligent way than the default guesswork in startup.el.
 (defun rxvt-set-background-mode ()
   "Set background mode as appropriate for the default rxvt colors."
-  (let ((fgbg (getenv "COLORFGBG" (terminal-id)))
+  (let ((fgbg (getenv "COLORFGBG"))
 	bg rgb)
     (set-terminal-parameter nil 'background-mode 'light)
     (when (and fgbg
--- a/lisp/term/x-win.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/term/x-win.el	Wed May 16 07:12:33 2007 +0000
@@ -2436,7 +2436,7 @@
 	  (aset x-resource-name i ?-))))
 
   (x-open-connection (or x-display-name
-			 (setq x-display-name (or (getenv "DISPLAY" (terminal-id))
+			 (setq x-display-name (or (getenv "DISPLAY" (selected-frame))
 						  (getenv "DISPLAY"))))
 		     x-command-line-resources
 		     ;; Exit Emacs with fatal error if this fails and we
--- a/lisp/term/xterm.el	Wed May 16 02:51:49 2007 +0000
+++ b/lisp/term/xterm.el	Wed May 16 07:12:33 2007 +0000
@@ -327,8 +327,8 @@
   ;; rxvt terminals sometimes set the TERM variable to "xterm", but
   ;; rxvt's keybindings are incompatible with xterm's. It is
   ;; better in that case to use rxvt's initializion function.
-  (if (and (getenv "COLORTERM" (terminal-id))
-	   (string-match "\\`rxvt" (getenv "COLORTERM" (terminal-id))))
+  (if (and (getenv "COLORTERM" (selected-frame))
+	   (string-match "\\`rxvt" (getenv "COLORTERM" (selected-frame))))
       (tty-run-terminal-initialization (selected-frame) "rxvt")
 
     ;; The terminal intialization C code file might have initialized