aboutsummaryrefslogtreecommitdiffstats
path: root/main/vte/term.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/vte/term.patch')
-rw-r--r--main/vte/term.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/main/vte/term.patch b/main/vte/term.patch
new file mode 100644
index 0000000000..811385d9f5
--- /dev/null
+++ b/main/vte/term.patch
@@ -0,0 +1,137 @@
+From c5d31b87d7a377f5e6fe93fc1efb061f5c7e9db7 Mon Sep 17 00:00:00 2001
+From: Tomeu Vizoso <tomeu.vizoso@collabora.co.uk>
+Date: Thu, 07 Oct 2010 10:57:45 +0000
+Subject: Pass the correct TERM value inside envp when spawning
+
+So the codepaths that end up invoking execve still have the correct
+TERM entry. Clarify the effect of vte_pty_set_term().
+
+https://bugzilla.gnome.org/show_bug.cgi?id=631589
+---
+diff --git a/src/pty.c b/src/pty.c
+index e3fb782..11dbe6a 100644
+--- a/src/pty.c
++++ b/src/pty.c
+@@ -394,7 +394,7 @@ __vte_pty_get_argv (const char *command,
+ * Returns: a newly allocated string array. Free using g_strfreev()
+ */
+ static gchar **
+-__vte_pty_merge_environ (char **envp)
++__vte_pty_merge_environ (char **envp, const char *term_value)
+ {
+ GHashTable *table;
+ GHashTableIter iter;
+@@ -425,6 +425,9 @@ __vte_pty_merge_environ (char **envp)
+ }
+ }
+
++ if (term_value != NULL)
++ g_hash_table_replace (table, g_strdup ("TERM"), g_strdup (term_value));
++
+ array = g_ptr_array_sized_new (g_hash_table_size (table) + 1);
+ g_hash_table_iter_init(&iter, table);
+ while (g_hash_table_iter_next(&iter, (gpointer) &name, (gpointer) &value)) {
+@@ -518,7 +521,7 @@ __vte_pty_spawn (VtePty *pty,
+ spawn_flags &= ~G_SPAWN_LEAVE_DESCRIPTORS_OPEN;
+
+ /* add the given environment to the childs */
+- envp2 = __vte_pty_merge_environ (envv);
++ envp2 = __vte_pty_merge_environ (envv, pty->priv->term);
+
+ _VTE_DEBUG_IF (VTE_DEBUG_MISC) {
+ g_printerr ("Spawing command:\n");
+@@ -1679,8 +1682,8 @@ vte_pty_class_init (VtePtyClass *klass)
+ /**
+ * VtePty:term:
+ *
+- * The value to set for the TERM environment variable
+- * in vte_pty_child_setup().
++ * The value to set for the TERM environment variable just after
++ * forking.
+ *
+ * Since: 0.26
+ */
+@@ -1816,13 +1819,7 @@ vte_pty_get_fd (VtePty *pty)
+ * @pty: a #VtePty
+ * @emulation: (allow-none): the name of a terminal description, or %NULL
+ *
+- * Sets what value of the TERM environment variable to set
+- * when using vte_pty_child_setup().
+- *
+- * Note: When using fork() and execve(), or the g_spawn_async() family of
+- * functions with vte_pty_child_setup(),
+- * and the environment passed to them contains the <literal>TERM</literal>
+- * environment variable, that value will override the one set here.
++ * Sets what value of the TERM environment variable to set just after forking.
+ *
+ * Since: 0.26
+ */
+diff --git a/src/vte.c b/src/vte.c
+index 5c2c1aa..72aa1a1 100644
+--- a/src/vte.c
++++ b/src/vte.c
+@@ -3518,32 +3518,6 @@ _vte_terminal_get_argv (const char *command,
+ return argv2;
+ }
+
+-/*
+- * _vte_terminal_filter_envv:
+- * @envv: the environment vector
+- *
+- * Filters out the TERM variable from @envv.
+- *
+- * Returns: (transfer container): the filtered environment vector
+- */
+-static char **
+-_vte_terminal_filter_envv (char **envv)
+-{
+- GPtrArray *array;
+- int i;
+-
+- if (envv == NULL)
+- return NULL;
+-
+- array = g_ptr_array_sized_new (g_strv_length (envv));
+- for (i = 0; envv[i]; ++i)
+- if (!g_str_has_prefix (envv[i], "TERM="))
+- g_ptr_array_add (array, envv[i]);
+- g_ptr_array_add (array, NULL);
+-
+- return (char **) g_ptr_array_free (array, FALSE);
+-}
+-
+ /**
+ * vte_terminal_fork_command:
+ * @terminal: a #VteTerminal
+@@ -3580,7 +3554,7 @@ vte_terminal_fork_command(VteTerminal *terminal,
+ gboolean utmp,
+ gboolean wtmp)
+ {
+- char **real_argv, **real_envv;
++ char **real_argv;
+ GSpawnFlags spawn_flags;
+ GPid child_pid;
+ gboolean ret;
+@@ -3596,19 +3570,17 @@ vte_terminal_fork_command(VteTerminal *terminal,
+ spawn_flags = G_SPAWN_CHILD_INHERITS_STDIN |
+ G_SPAWN_SEARCH_PATH;
+ real_argv = _vte_terminal_get_argv (command, argv, &spawn_flags);
+- real_envv = _vte_terminal_filter_envv (envv);
+
+ ret = vte_terminal_fork_command_full(terminal,
+ __vte_pty_get_pty_flags(lastlog, utmp, wtmp),
+ working_directory,
+ real_argv,
+- real_envv,
++ envv,
+ spawn_flags,
+ NULL, NULL,
+ &child_pid,
+ err);
+ g_strfreev (real_argv);
+- g_free (real_envv);
+
+ #ifdef VTE_DEBUG
+ if (error) {
+--
+cgit v0.8.3.1