diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | Doc/Zsh/params.yo | 7 | ||||
-rw-r--r-- | Src/params.c | 49 |
3 files changed, 57 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index f2e71a441..bfb02a11d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-05-10 Peter Stephenson <pws@csr.com> + + * 29191 (Danek) and 29203 (with fixes): Doc/Zsh/params.yo, + Src/params.c: make TERMINFO variable special. + 2011-05-09 Peter Stephenson <pws@csr.com> * 29195: Src/.distfiles, Src/hashnameddir.c, Src/hashtable.c, @@ -14632,5 +14637,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5286 $ +* $Revision: 1.5287 $ ***************************************************** diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo index d0255af5a..fbaf018d3 100644 --- a/Doc/Zsh/params.yo +++ b/Doc/Zsh/params.yo @@ -1273,6 +1273,13 @@ is necessary to make such an assignment upon any change to the terminal definition database or terminal type in order for the new settings to take effect. ) +vindex(TERMINFO) +item(tt(TERMINFO) <S>)( +A reference to a compiled description of the terminal, used by the +`terminfo' library when the system has it; see manref(terminfo)(5). +If set, this causes the shell to reinitialise the terminal, making +the workaround `tt(TERM=$TERM)' unnecessary. +) vindex(TIMEFMT) item(tt(TIMEFMT))( The format of process time reports with the tt(time) keyword. diff --git a/Src/params.c b/Src/params.c index cdc05213d..f13401793 100644 --- a/Src/params.c +++ b/Src/params.c @@ -86,6 +86,7 @@ mod_export char *ifs, /* $IFS */ *postedit, /* $POSTEDIT */ *term, /* $TERM */ + *zsh_terminfo, /* $TERMINFO */ *ttystrname, /* $TTY */ *pwd; /* $PWD */ @@ -202,6 +203,8 @@ static const struct gsu_scalar home_gsu = { homegetfn, homesetfn, stdunsetfn }; static const struct gsu_scalar term_gsu = { termgetfn, termsetfn, stdunsetfn }; +static const struct gsu_scalar terminfo_gsu = +{ terminfogetfn, terminfosetfn, stdunsetfn }; static const struct gsu_scalar wordchars_gsu = { wordcharsgetfn, wordcharssetfn, stdunsetfn }; static const struct gsu_scalar ifs_gsu = @@ -276,6 +279,7 @@ IPDEF2("-", dash_gsu, PM_READONLY), IPDEF2("histchars", histchars_gsu, PM_DONTIMPORT), IPDEF2("HOME", home_gsu, PM_UNSET), IPDEF2("TERM", term_gsu, 0), +IPDEF2("TERMINFO", terminfo_gsu, PM_UNSET), IPDEF2("WORDCHARS", wordchars_gsu, 0), IPDEF2("IFS", ifs_gsu, PM_DONTIMPORT), IPDEF2("_", underscore_gsu, PM_READONLY), @@ -4045,6 +4049,18 @@ underscoregetfn(UNUSED(Param pm)) return u; } +/* Function used when we need to reinitialise the terminal */ + +static void +term_reinit_from_pm(void) +{ + /* If non-interactive, delay setting up term till we need it. */ + if (unset(INTERACTIVE) || !*term) + termflags |= TERM_UNKNOWN; + else + init_term(); +} + /* Function to get value for special parameter `TERM' */ /**/ @@ -4062,12 +4078,35 @@ termsetfn(UNUSED(Param pm), char *x) { zsfree(term); term = x ? x : ztrdup(""); + term_reinit_from_pm(); +} - /* If non-interactive, delay setting up term till we need it. */ - if (unset(INTERACTIVE) || !*term) - termflags |= TERM_UNKNOWN; - else - init_term(); +/* Function to get value of special parameter `TERMINFO' */ + +/**/ +char * +terminfogetfn(UNUSED(Param pm)) +{ + return zsh_terminfo ? zsh_terminfo : dupstring(""); +} + +/* Function to set value of special parameter `TERMINFO' */ + +/**/ +void +terminfosetfn(Param pm, char *x) +{ + zsfree(zsh_terminfo); + zsh_terminfo = x; + + /* + * terminfo relies on the value being exported before + * we reinitialise the terminal. This is a bit inefficient. + */ + if ((pm->node.flags & PM_EXPORTED) && x) + addenv(pm, x); + + term_reinit_from_pm(); } /* Function to get value for special parameter `pipestatus' */ |