0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.1.0918: MS-Windows: startup messages are not converted

Problem:    MS-Windows: startup messages are not converted.
Solution:   Convert messages when the current codepage differs from
            'encoding'. (Yasuhiro Matsumoto, closes #3914)
This commit is contained in:
Bram Moolenaar
2019-02-14 14:08:04 +01:00
parent 445e71c5ee
commit 9b5c1fcdea
4 changed files with 104 additions and 61 deletions

View File

@@ -2570,57 +2570,45 @@ msg_use_printf(void)
msg_puts_printf(char_u *str, int maxlen) msg_puts_printf(char_u *str, int maxlen)
{ {
char_u *s = str; char_u *s = str;
char_u buf[4]; char_u *buf = NULL;
char_u *p; char_u *p = s;
#ifdef WIN3264 #ifdef WIN3264
# if !defined(FEAT_GUI_MSWIN)
char_u *ccp = NULL;
# endif
if (!(silent_mode && p_verbose == 0)) if (!(silent_mode && p_verbose == 0))
mch_settmode(TMODE_COOK); /* handle '\r' and '\n' correctly */ mch_settmode(TMODE_COOK); /* handle CR and NL correctly */
# if !defined(FEAT_GUI_MSWIN)
if (enc_codepage >= 0 && (int)GetConsoleCP() != enc_codepage)
{
int inlen = (int)STRLEN(str);
int outlen;
WCHAR *widestr = (WCHAR *)enc_to_utf16(str, &inlen);
if (widestr != NULL)
{
WideCharToMultiByte_alloc(GetConsoleCP(), 0, widestr, inlen,
(LPSTR *)&ccp, &outlen, 0, 0);
vim_free(widestr);
s = str = ccp;
}
}
# endif
#endif #endif
while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL) while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
{ {
if (!(silent_mode && p_verbose == 0)) if (!(silent_mode && p_verbose == 0))
{ {
/* NL --> CR NL translation (for Unix, not for "--version") */ // NL --> CR NL translation (for Unix, not for "--version")
p = &buf[0]; if (*s == NL)
if (*s == '\n' && !info_message) {
*p++ = '\r'; int n = (int)(s - p);
#if defined(USE_CR)
else buf = alloc(n + 3);
memcpy(buf, p, n);
if (!info_message)
buf[n++] = CAR;
#ifdef USE_CR
else
#endif #endif
*p++ = *s; buf[n++] = NL;
*p = '\0'; buf[n++] = NUL;
if (info_message) /* informative message, not an error */ if (info_message) // informative message, not an error
mch_msg((char *)buf); mch_msg((char *)buf);
else else
mch_errmsg((char *)buf); mch_errmsg((char *)buf);
vim_free(buf);
p = s + 1;
}
} }
/* primitive way to compute the current column */ // primitive way to compute the current column
#ifdef FEAT_RIGHTLEFT #ifdef FEAT_RIGHTLEFT
if (cmdmsg_rl) if (cmdmsg_rl)
{ {
if (*s == '\r' || *s == '\n') if (*s == CAR || *s == NL)
msg_col = Columns - 1; msg_col = Columns - 1;
else else
--msg_col; --msg_col;
@@ -2628,19 +2616,27 @@ msg_puts_printf(char_u *str, int maxlen)
else else
#endif #endif
{ {
if (*s == '\r' || *s == '\n') if (*s == CAR || *s == NL)
msg_col = 0; msg_col = 0;
else else
++msg_col; ++msg_col;
} }
++s; ++s;
} }
msg_didout = TRUE; /* assume that line is not empty */
if (*p != NUL && !(silent_mode && p_verbose == 0))
{
if (maxlen > 0 && STRLEN(p) > (size_t)maxlen)
p[maxlen] = 0;
if (info_message)
mch_msg((char *)p);
else
mch_errmsg((char *)p);
}
msg_didout = TRUE; // assume that line is not empty
#ifdef WIN3264 #ifdef WIN3264
# if !defined(FEAT_GUI_MSWIN)
vim_free(ccp);
# endif
if (!(silent_mode && p_verbose == 0)) if (!(silent_mode && p_verbose == 0))
mch_settmode(TMODE_RAW); mch_settmode(TMODE_RAW);
#endif #endif
@@ -2941,32 +2937,51 @@ do_more_prompt(int typed_char)
void void
mch_errmsg(char *str) mch_errmsg(char *str)
{ {
#if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
int len = STRLEN(str);
DWORD nwrite = 0;
DWORD mode = 0;
HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
if (GetConsoleMode(h, &mode) && enc_codepage >= 0
&& (int)GetConsoleCP() != enc_codepage)
{
WCHAR *w = enc_to_utf16((char_u *)str, &len);
WriteConsoleW(h, w, len, &nwrite, NULL);
vim_free(w);
}
else
{
fprintf(stderr, "%s", str);
}
#else
int len; int len;
#if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) # if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stderr if it's a tty. /* On Unix use stderr if it's a tty.
* When not going to start the GUI also use stderr. * When not going to start the GUI also use stderr.
* On Mac, when started from Finder, stderr is the console. */ * On Mac, when started from Finder, stderr is the console. */
if ( if (
# ifdef UNIX # ifdef UNIX
# ifdef MACOS_X # ifdef MACOS_X
(isatty(2) && strcmp("/dev/console", ttyname(2)) != 0) (isatty(2) && strcmp("/dev/console", ttyname(2)) != 0)
# else # else
isatty(2) isatty(2)
# endif
# ifdef FEAT_GUI
||
# endif
# endif # endif
# ifdef FEAT_GUI # ifdef FEAT_GUI
||
# endif
# endif
# ifdef FEAT_GUI
!(gui.in_use || gui.starting) !(gui.in_use || gui.starting)
# endif # endif
) )
{ {
fprintf(stderr, "%s", str); fprintf(stderr, "%s", str);
return; return;
} }
#endif # endif
/* avoid a delay for a message that isn't there */ /* avoid a delay for a message that isn't there */
emsg_on_display = FALSE; emsg_on_display = FALSE;
@@ -2981,7 +2996,7 @@ mch_errmsg(char *str)
{ {
mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len, mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
(char_u *)str, len); (char_u *)str, len);
#ifdef UNIX # ifdef UNIX
/* remove CR characters, they are displayed */ /* remove CR characters, they are displayed */
{ {
char_u *p; char_u *p;
@@ -2995,10 +3010,11 @@ mch_errmsg(char *str)
*p = ' '; *p = ' ';
} }
} }
#endif # endif
--len; /* don't count the NUL at the end */ --len; /* don't count the NUL at the end */
error_ga.ga_len += len; error_ga.ga_len += len;
} }
#endif
} }
/* /*
@@ -3009,7 +3025,27 @@ mch_errmsg(char *str)
void void
mch_msg(char *str) mch_msg(char *str)
{ {
#if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) #if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
int len = STRLEN(str);
DWORD nwrite = 0;
DWORD mode;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
if (GetConsoleMode(h, &mode) && enc_codepage >= 0
&& (int)GetConsoleCP() != enc_codepage)
{
WCHAR *w = enc_to_utf16((char_u *)str, &len);
WriteConsoleW(h, w, len, &nwrite, NULL);
vim_free(w);
}
else
{
printf("%s", str);
}
#else
# if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stdout if we have a tty. This allows "vim -h | more" and /* On Unix use stdout if we have a tty. This allows "vim -h | more" and
* uses mch_errmsg() when started from the desktop. * uses mch_errmsg() when started from the desktop.
* When not going to start the GUI also use stdout. * When not going to start the GUI also use stdout.
@@ -3035,6 +3071,7 @@ mch_msg(char *str)
} }
# endif # endif
mch_errmsg(str); mch_errmsg(str);
#endif
} }
#endif /* USE_MCH_ERRMSG */ #endif /* USE_MCH_ERRMSG */

View File

@@ -675,6 +675,7 @@ mch_suspend(void)
# undef display_errors # undef display_errors
#endif #endif
#ifdef FEAT_GUI
/* /*
* Display the saved error message(s). * Display the saved error message(s).
*/ */
@@ -690,13 +691,9 @@ display_errors(void)
if (!isspace(*p)) if (!isspace(*p))
{ {
(void)gui_mch_dialog( (void)gui_mch_dialog(
#ifdef FEAT_GUI
gui.starting ? VIM_INFO : gui.starting ? VIM_INFO :
#endif
VIM_ERROR, VIM_ERROR,
#ifdef FEAT_GUI
gui.starting ? (char_u *)_("Message") : gui.starting ? (char_u *)_("Message") :
#endif
(char_u *)_("Error"), (char_u *)_("Error"),
(char_u *)p, (char_u *)_("&Ok"), (char_u *)p, (char_u *)_("&Ok"),
1, NULL, FALSE); 1, NULL, FALSE);
@@ -705,6 +702,13 @@ display_errors(void)
ga_clear(&error_ga); ga_clear(&error_ga);
} }
} }
#else
void
display_errors(void)
{
FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE));
}
#endif
#endif #endif

View File

@@ -783,6 +783,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
918,
/**/ /**/
917, 917,
/**/ /**/

View File

@@ -2093,7 +2093,7 @@ typedef enum {
* functions of these names. The declarations would break if the defines had * functions of these names. The declarations would break if the defines had
* been seen at that stage. But it must be before globals.h, where error_ga * been seen at that stage. But it must be before globals.h, where error_ga
* is declared. */ * is declared. */
#if !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_X11) \ #if !defined(MSWIN) && !defined(FEAT_GUI_X11) \
&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO)
# define mch_errmsg(str) fprintf(stderr, "%s", (str)) # define mch_errmsg(str) fprintf(stderr, "%s", (str))
# define display_errors() fflush(stderr) # define display_errors() fflush(stderr)