Commit de87fb59 authored by Dan Nicolaescu's avatar Dan Nicolaescu
Browse files

* server.el (server-process-filter): Likewise.

(server-process-filter): Likewise. Also set COLORFGBG and
COLORTERM.

* frame.el (frame-initialize, make-frame): Likewise.

* faces.el (tty-set-up-initial-frame-faces): Likewise.

* env.el (read-envvar-name): Don't consider the environment frame
param.
(setenv): Set display-environment-variable and
term-environment-variable.

* frame.c (Qterm_environment_variable,
Qdisplay_environment_variable): New variables.
(syms_of_frame): Intern and staticpro them.

* frame.h: Declare them here.

* callproc.c (child_setup): Use the display-environment-variable
and term-environment-variable frame params.
(getenv_internal): Likewise.
(set_initial_environment): Initialise Vprocess_environment.

* frames.texi (Basic Parameters): Add display-environment-variable
and term-environment-variable.
parent 5f06b608
2007-07-02 Dan Nicolaescu <dann@ics.uci.edu>
* server.el (server-process-filter): Likewise.
(server-process-filter): Likewise. Also set COLORFGBG and
COLORTERM.
* frame.el (frame-initialize, make-frame): Likewise.
* faces.el (tty-set-up-initial-frame-faces): Likewise.
* env.el (read-envvar-name): Don't consider the environment frame
param.
(setenv): Set display-environment-variable and
term-environment-variable.
* term/x-win.el (x-menu-bar-open): Use accelerate-menu.
2007-06-23 Dan Nicolaescu <dann@ics.uci.edu>
......
......@@ -55,7 +55,8 @@ If it is also not t, RET does not exit if it does non-null completion."
(substring enventry 0
(string-match "=" enventry)))))
(append process-environment
(frame-parameter (frame-with-environment) 'environment)))
nil ;;(frame-parameter (frame-with-environment) 'environment)
))
nil mustmatch nil 'read-envvar-name-history))
;; History list for VALUE argument to setenv.
......@@ -191,9 +192,14 @@ a side-effect."
(setq process-environment (setenv-internal process-environment
variable value t))
(setq frame (frame-with-environment frame))
(set-frame-parameter frame 'environment
(setenv-internal (frame-parameter frame 'environment)
variable value nil)))
(cond
((string-equal "TERM" variable)
(set-frame-parameter frame 'term-environment-variable value))
((string-equal "DISPLAY" variable)
(set-frame-parameter frame 'display-environment-variable value))
(t
(setq process-environment (setenv-internal process-environment
variable value nil)))))
value)
(defun getenv (variable &optional frame)
......@@ -238,8 +244,8 @@ Non-ASCII characters are encoded according to the initial value of
`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)
'environment)
;; (frame-parameter (frame-with-environment frame)
;; 'environment)
nil))
(scan env)
prev seen)
......
......@@ -1909,7 +1909,11 @@ terminal type to a different value."
(defun tty-set-up-initial-frame-faces ()
(let ((frame (selected-frame)))
(frame-set-background-mode frame)
(face-set-after-frame-default frame)))
(face-set-after-frame-default frame)
(set-frame-parameter frame-initial-frame 'term-environment-variable
(getenv "TERM"))
(set-frame-parameter frame-initial-frame 'display-environment-variable
(getenv "DISPLAY"))))
......
......@@ -241,6 +241,10 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
;; Copy the environment of the Emacs process into the new frame.
(set-frame-parameter frame-initial-frame 'environment
(frame-parameter terminal-frame 'environment))
(set-frame-parameter frame-initial-frame 'term-environment-variable
(getenv "TERM"))
(set-frame-parameter frame-initial-frame 'display-environment-variable
(getenv "DISPLAY"))
;; At this point, we know that we have a frame open, so we
;; can delete the terminal frame.
(delete-frame terminal-frame)
......@@ -700,11 +704,17 @@ setup is for focus to follow the pointer."
(normal-erase-is-backspace-setup-frame frame)
;; Inherit the 'environment and 'client parameters.
(let ((env (frame-parameter oldframe 'environment))
(client (frame-parameter oldframe 'client)))
(client (frame-parameter oldframe 'client))
(termenv (frame-parameter oldframe 'term-environment-variable))
(displayenv (frame-parameter oldframe 'display-environment-variable)))
(if (not (framep env))
(setq env oldframe))
(if (and env (not (assq 'environment parameters)))
(set-frame-parameter frame 'environment env))
(if (and termenv (not (assq 'term-environment-variable parameters)))
(set-frame-parameter frame 'term-environment-variable termenv))
(if (and displayenv (not (assq 'display-environment-variable parameters)))
(set-frame-parameter frame 'display-environment-variable displayenv))
(if (and client (not (assq 'client parameters)))
(set-frame-parameter frame 'client client)))
(run-hook-with-args 'after-make-frame-functions frame)
......
......@@ -763,6 +763,10 @@ The following commands are accepted by the client:
;; initialization parameters for X frames at
;; the moment.
(modify-frame-parameters frame params)
(set-frame-parameter frame 'display-environment-variable
(server-getenv-from env "DISPLAY"))
(set-frame-parameter frame 'term-environment-variable
(server-getenv-from env "TERM"))
(select-frame frame)
(server-client-set client 'frame frame)
(server-client-set client 'terminal (frame-terminal frame))
......@@ -812,12 +816,19 @@ The following commands are accepted by the client:
"BAUDRATE" "COLUMNS" "ESCDELAY" "HOME" "LINES"
"NCURSES_ASSUMED_COLORS" "NCURSES_NO_PADDING"
"NCURSES_NO_SETBUF" "TERM" "TERMCAP" "TERMINFO"
"TERMINFO_DIRS" "TERMPATH")
"TERMINFO_DIRS" "TERMPATH"
;; rxvt wants these
"COLORFGBG" "COLORTERM")
(setq frame (make-frame-on-tty tty type
;; Ignore nowait here; we always need to clean
;; up opened ttys when the client dies.
`((client . ,proc)
(environment . ,env)))))
(set-frame-parameter frame 'display-environment-variable
(server-getenv-from env "DISPLAY"))
(set-frame-parameter frame 'term-environment-variable
(server-getenv-from env "TERM"))
(select-frame frame)
(server-client-set client 'frame frame)
(server-client-set client 'tty (terminal-name frame))
......
2007-07-02 Dan Nicolaescu <dann@ics.uci.edu>
* frames.texi (Basic Parameters): Add display-environment-variable
and term-environment-variable.
;; Local Variables:
;; coding: iso-2022-7bit
;; add-log-time-zone-rule: t
;; End:
Copyright (C) 2007 Free Software Foundation, Inc.
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, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
......@@ -378,6 +378,14 @@ you don't specify a name, Emacs sets the frame name automatically
If you specify the frame name explicitly when you create the frame, the
name is also used (instead of the name of the Emacs executable) when
looking up X resources for the frame.
@item display-environment-variable
The value of the @code{DISPLAY} environment variable for the frame. It
is passed to child processes.
@item term-environment-variable
The value of the @code{TERM} environment variable for the frame. It
is passed to child processes.
@end table
@node Position Parameters
......
2007-07-02 Dan Nicolaescu <dann@ics.uci.edu>
* frame.c (Qterm_environment_variable,
Qdisplay_environment_variable): New variables.
(syms_of_frame): Intern and staticpro them.
* frame.h: Declare them here.
* callproc.c (child_setup): Use the display-environment-variable
and term-environment-variable frame params.
(getenv_internal): Likewise.
(set_initial_environment): Initialise Vprocess_environment.
2007-06-03 Dan Nicolaescu <dann@ics.uci.edu>
* xselect.c (x_handle_selection_clear): Only access
......
......@@ -1245,6 +1245,8 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
{
char **env;
char *pwd_var;
char *term_var;
char *display_var;
#ifdef WINDOWSNT
int cpid;
HANDLE handles[3];
......@@ -1325,9 +1327,12 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
register char **new_env;
char **p, **q;
register int new_length;
Lisp_Object local = get_frame_param (XFRAME (Fframe_with_environment (selected_frame)),
Qenvironment);
Lisp_Object local = selected_frame; /* get_frame_param (XFRAME (Fframe_with_environment (selected_frame)), */
/* Qenvironment); */
Lisp_Object term;
Lisp_Object display;
new_length = 0;
for (tem = Vprocess_environment;
......@@ -1335,10 +1340,21 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
tem = XCDR (tem))
new_length++;
#if 0
for (tem = local;
CONSP (tem) && STRINGP (XCAR (tem));
tem = XCDR (tem))
new_length++;
#endif
/* Add TERM and DISPLAY from the frame local values. */
term = get_frame_param (XFRAME (local), Qterm_environment_variable);
if (! NILP (term))
new_length++;
display = get_frame_param (XFRAME (local), Qdisplay_environment_variable);
if (! NILP (display))
new_length++;
/* new_length + 2 to include PWD and terminating 0. */
env = new_env = (char **) alloca ((new_length + 2) * sizeof (char *));
......@@ -1348,18 +1364,43 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
if (egetenv ("PWD"))
*new_env++ = pwd_var;
if (! NILP (term))
{
int vlen = strlen ("TERM=") + strlen (SDATA (term)) + 1;
char *vdata = (char *) alloca (vlen);
strcpy (vdata, "TERM=");
strcat (vdata, SDATA (term));
new_env = add_env (env, new_env, vdata);
}
if (! NILP (display))
{
int vlen = strlen ("DISPLAY=") + strlen (SDATA (display)) + 1;
char *vdata = (char *) alloca (vlen);
strcpy (vdata, "DISPLAY=");
strcat (vdata, SDATA (display));
new_env = add_env (env, new_env, vdata);
}
/* Overrides. */
for (tem = Vprocess_environment;
CONSP (tem) && STRINGP (XCAR (tem));
tem = XCDR (tem))
new_env = add_env (env, new_env, SDATA (XCAR (tem)));
{
if ((strcmp (SDATA (XCAR (tem)), "TERM") != 0)
&& (strcmp (SDATA (XCAR (tem)), "DISPLAY") != 0))
new_env = add_env (env, new_env, SDATA (XCAR (tem)));
}
#if 0
/* Local part of environment. */
for (tem = local;
CONSP (tem) && STRINGP (XCAR (tem));
tem = XCDR (tem))
new_env = add_env (env, new_env, SDATA (XCAR (tem)));
#endif
*new_env = 0;
/* Remove variable names without values. */
......@@ -1373,6 +1414,8 @@ child_setup (in, out, err, new_argv, set_pgrp, current_dir)
p++;
}
}
#ifdef WINDOWSNT
prepare_standard_handles (in, out, err, handles);
set_process_dir (SDATA (current_dir));
......@@ -1494,6 +1537,9 @@ getenv_internal (var, varlen, value, valuelen, frame)
Lisp_Object frame;
{
Lisp_Object scan;
Lisp_Object term;
Lisp_Object display;
if (NILP (frame))
{
......@@ -1528,6 +1574,56 @@ getenv_internal (var, varlen, value, valuelen, frame)
frame = selected_frame;
}
/* For TERM and DISPLAY first try to get the values from the frame. */
term = get_frame_param (XFRAME (frame), Qterm_environment_variable);
if (strcmp (var, "TERM") == 0)
if (! NILP (term))
{
*value = (char *) SDATA (term);
*valuelen = SBYTES (term);
return 1;
}
display = get_frame_param (XFRAME (frame), Qdisplay_environment_variable);
if (strcmp (var, "DISPLAY") == 0)
if (! NILP (display))
{
*value = (char *) SDATA (display);
*valuelen = SBYTES (display);
return 1;
}
{
/* Try to find VAR in Vprocess_environment. */
for (scan = Vprocess_environment; CONSP (scan); scan = XCDR (scan))
{
Lisp_Object entry = XCAR (scan);
if (STRINGP (entry)
&& SBYTES (entry) >= varlen
#ifdef WINDOWSNT
/* NT environment variables are case insensitive. */
&& ! strnicmp (SDATA (entry), var, varlen)
#else /* not WINDOWSNT */
&& ! bcmp (SDATA (entry), var, varlen)
#endif /* not WINDOWSNT */
)
{
if (SBYTES (entry) > varlen && SREF (entry, varlen) == '=')
{
*value = (char *) SDATA (entry) + (varlen + 1);
*valuelen = SBYTES (entry) - (varlen + 1);
return 1;
}
else if (SBYTES (entry) == varlen)
{
/* Lone variable names in Vprocess_environment mean that
variable should be removed from the environment. */
return 0;
}
}
}
}
#if 0
/* Find the environment in which to search the variable. */
CHECK_FRAME (frame);
frame = Fframe_with_environment (frame);
......@@ -1555,7 +1651,7 @@ getenv_internal (var, varlen, value, valuelen, frame)
return 1;
}
}
#endif
return 0;
}
......@@ -1737,14 +1833,15 @@ void
set_initial_environment ()
{
register char **envp;
Lisp_Object env = Qnil;
Lisp_Object env = Vprocess_environment;
#ifndef CANNOT_DUMP
if (initialized)
#endif
{
for (envp = environ; *envp; envp++)
env = Fcons (build_string (*envp), env);
store_frame_param (SELECTED_FRAME(), Qenvironment, env);
Vprocess_environment = Fcons (build_string (*envp),
Vprocess_environment);
store_frame_param (SELECTED_FRAME(), Qenvironment, Vprocess_environment);
}
}
......
......@@ -111,6 +111,8 @@ Lisp_Object Qtty_color_mode;
Lisp_Object Qtty, Qtty_type;
Lisp_Object Qwindow_system;
Lisp_Object Qenvironment;
Lisp_Object Qterm_environment_variable;
Lisp_Object Qdisplay_environment_variable;
Lisp_Object Qfullscreen, Qfullwidth, Qfullheight, Qfullboth;
......@@ -4353,7 +4355,12 @@ syms_of_frame ()
staticpro (&Qwindow_system);
Qenvironment = intern ("environment");
staticpro (&Qenvironment);
Qterm_environment_variable = intern ("term-environment-variable");
staticpro (&Qterm_environment_variable);
Qdisplay_environment_variable = intern ("display-environment-variable");
staticpro (&Qdisplay_environment_variable);
Qface_set_after_frame_default = intern ("face-set-after-frame-default");
staticpro (&Qface_set_after_frame_default);
......
......@@ -780,6 +780,8 @@ extern Lisp_Object Qframep, Qframe_live_p;
extern Lisp_Object Qtty, Qtty_type;
extern Lisp_Object Qterminal, Qterminal_live_p;
extern Lisp_Object Qenvironment;
extern Lisp_Object Qterm_environment_variable;
extern Lisp_Object Qdisplay_environment_variable;
extern struct frame *last_nonminibuf_frame;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment