patch 8.0.1330: MS-Windows: job in terminal can't get back to Vim
Problem: MS-Windows: job in terminal can't get back to Vim.
Solution: set VIM_SERVERNAME in the environment. (Yasuhiro Matsumoto, closes
#2360)
diff --git a/src/os_win32.c b/src/os_win32.c
index 3a2b356..becbeee 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5034,10 +5034,10 @@
* environment argument of vim_create_process().
*/
void
-win32_build_env(dict_T *env, garray_T *gap)
+win32_build_env(dict_T *env, garray_T *gap, int is_terminal)
{
hashitem_T *hi;
- int todo = (int)env->dv_hashtab.ht_used;
+ long_u todo = env != NULL ? env->dv_hashtab.ht_used : 0;
LPVOID base = GetEnvironmentStringsW();
/* for last \0 */
@@ -5062,35 +5062,56 @@
*((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
}
- for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi)
+ if (env != NULL)
{
- if (!HASHITEM_EMPTY(hi))
+ for (hi = env->dv_hashtab.ht_array; todo > 0; ++hi)
{
- typval_T *item = &dict_lookup(hi)->di_tv;
- WCHAR *wkey = enc_to_utf16((char_u *)hi->hi_key, NULL);
- WCHAR *wval = enc_to_utf16(get_tv_string(item), NULL);
- --todo;
- if (wkey != NULL && wval != NULL)
+ if (!HASHITEM_EMPTY(hi))
{
- size_t n;
- size_t lkey = wcslen(wkey);
- size_t lval = wcslen(wval);
+ typval_T *item = &dict_lookup(hi)->di_tv;
+ WCHAR *wkey = enc_to_utf16((char_u *)hi->hi_key, NULL);
+ WCHAR *wval = enc_to_utf16(get_tv_string(item), NULL);
+ --todo;
+ if (wkey != NULL && wval != NULL)
+ {
+ size_t n;
+ size_t lkey = wcslen(wkey);
+ size_t lval = wcslen(wval);
- if (ga_grow(gap, (int)(lkey + lval + 2)) != OK)
- continue;
- for (n = 0; n < lkey; n++)
- *((WCHAR*)gap->ga_data + gap->ga_len++) = wkey[n];
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'=';
- for (n = 0; n < lval; n++)
- *((WCHAR*)gap->ga_data + gap->ga_len++) = wval[n];
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ if (ga_grow(gap, (int)(lkey + lval + 2)) != OK)
+ continue;
+ for (n = 0; n < lkey; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = wkey[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'=';
+ for (n = 0; n < lval; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = wval[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ if (wkey != NULL) vim_free(wkey);
+ if (wval != NULL) vim_free(wval);
}
- if (wkey != NULL) vim_free(wkey);
- if (wval != NULL) vim_free(wval);
}
}
- *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+# ifdef FEAT_CLIENTSERVER
+ if (is_terminal)
+ {
+ char_u *servername = get_vim_var_str(VV_SEND_SERVER);
+ size_t lval = STRLEN(servername);
+ size_t n;
+
+ if (ga_grow(gap, (int)(14 + lval + 2)) == OK)
+ {
+ for (n = 0; n < 15; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)"VIM_SERVERNAME="[n];
+ for (n = 0; n < lval; n++)
+ *((WCHAR*)gap->ga_data + gap->ga_len++) =
+ (WCHAR)servername[n];
+ *((WCHAR*)gap->ga_data + gap->ga_len++) = L'\0';
+ }
+ }
+# endif
}
void
@@ -5133,7 +5154,7 @@
}
if (options->jo_env != NULL)
- win32_build_env(options->jo_env, &ga);
+ win32_build_env(options->jo_env, &ga, FALSE);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));