summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Maudoux <layus.on@gmail.com>2016-11-09 17:14:33 +0100
committerPeter Stephenson <p.w.stephenson@ntlworld.com>2016-11-20 20:24:15 +0000
commitdae21874d498ccd3f947f6f47e5ec23feb2bdcb4 (patch)
treef92d59fc773c1485ead0d87aa8d607d0627fe84c
parent368884a3aacd9852ae1310346695dbf2240e863b (diff)
downloadzsh-dae21874d498ccd3f947f6f47e5ec23feb2bdcb4.tar.gz
zsh-dae21874d498ccd3f947f6f47e5ec23feb2bdcb4.tar.xz
zsh-dae21874d498ccd3f947f6f47e5ec23feb2bdcb4.zip
39900: Add TERMINFO_DIRS special like TERMINFO.
Although this is a colon-separated array there is no tied array.
-rw-r--r--ChangeLog4
-rw-r--r--Doc/Zsh/params.yo18
-rw-r--r--Src/params.c31
3 files changed, 49 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 7b05d39d3..e21a269e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2016-11-20  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* Guillaume Maudoux: 39900 (doc slightly tweaked): Src/params.c,
+	Doc/Zsh/params.yo: Add TERMINFO_DIRS special colon-separated
+	array, not tied.
+
 	* 39995 (from 39977): Src/params.c, Test/A06assign.ztst:
 	optimisation of string assignment if length is unchanged.
 
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
index 0db8a1c0e..905e92d22 100644
--- a/Doc/Zsh/params.yo
+++ b/Doc/Zsh/params.yo
@@ -1493,10 +1493,20 @@ 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.
+A reference to your terminfo database, 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(TERMINFO_DIRS)
+item(tt(TERMINFO_DIRS) <S>)(
+A colon-seprarated list of terminfo databases, used by the `terminfo' library
+when the system has it; see manref(terminfo)(5). This variable is only
+used by certain terminal libraries, in particular ncurses; see
+manref(terminfo)(5) to check support on your system.  If set, this
+causes the shell to reinitialise the terminal, making the workaround
+`tt(TERM=$TERM)' unnecessary.  Note that unlike other colon-separated
+arrays this is not tied to a zsh array.
 )
 vindex(TIMEFMT)
 item(tt(TIMEFMT))(
diff --git a/Src/params.c b/Src/params.c
index a79debc93..45f398a27 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -87,6 +87,7 @@ char *ifs,		/* $IFS         */
      *postedit,		/* $POSTEDIT    */
      *term,		/* $TERM        */
      *zsh_terminfo,     /* $TERMINFO    */
+     *zsh_terminfodirs, /* $TERMINFO_DIRS */
      *ttystrname,	/* $TTY         */
      *pwd;		/* $PWD         */
 
@@ -208,6 +209,8 @@ 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 terminfodirs_gsu =
+{ terminfodirsgetfn, terminfodirssetfn, stdunsetfn };
 static const struct gsu_scalar wordchars_gsu =
 { wordcharsgetfn, wordcharssetfn, stdunsetfn };
 static const struct gsu_scalar ifs_gsu =
@@ -283,6 +286,7 @@ IPDEF2("histchars", histchars_gsu, PM_DONTIMPORT),
 IPDEF2("HOME", home_gsu, PM_UNSET),
 IPDEF2("TERM", term_gsu, PM_UNSET),
 IPDEF2("TERMINFO", terminfo_gsu, PM_UNSET),
+IPDEF2("TERMINFO_DIRS", terminfodirs_gsu, PM_UNSET),
 IPDEF2("WORDCHARS", wordchars_gsu, 0),
 IPDEF2("IFS", ifs_gsu, PM_DONTIMPORT | PM_RESTRICTED),
 IPDEF2("_", underscore_gsu, PM_DONTIMPORT),
@@ -4548,6 +4552,33 @@ terminfosetfn(Param pm, char *x)
     term_reinit_from_pm();
 }
 
+/* Function to get value of special parameter `TERMINFO_DIRS' */
+
+/**/
+char *
+terminfodirsgetfn(UNUSED(Param pm))
+{
+    return zsh_terminfodirs ? zsh_terminfodirs : dupstring("");
+}
+
+/* Function to set value of special parameter `TERMINFO_DIRS' */
+
+/**/
+void
+terminfodirssetfn(Param pm, char *x)
+{
+    zsfree(zsh_terminfodirs);
+    zsh_terminfodirs = 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' */
 
 /**/