summaryrefslogtreecommitdiff
path: root/compat
diff options
context:
space:
mode:
authorKarsten Blees <blees@dcon.de>2010-07-31 00:04:03 +0000
committerJunio C Hamano <gitster@pobox.com>2014-06-10 13:32:50 -0700
commit1edeb9abf5828e317999b4ebe8b7472c494341f2 (patch)
tree8d5117a62ae26f1970406fce753baf68aafdb7b3 /compat
parent143e615270bd17dcef0d8e5751dacc496eff687d (diff)
downloadgit-1edeb9abf5828e317999b4ebe8b7472c494341f2.tar.gz
Win32: warn if the console font doesn't support Unicode
Unicode console output won't display correctly with default settings because the default console font ("Terminal") only supports the system's OEM charset. Unfortunately, this is a user specific setting, so it cannot be easily fixed by e.g. some registry tricks in the setup program. This change prints a warning on exit if console output contained non-ascii characters and the console font is supposedly not a TrueType font (which usually have decent Unicode support). Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Stepan Kasal <kasal@ucw.cz> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'compat')
-rw-r--r--compat/winansi.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/compat/winansi.c b/compat/winansi.c
index c4be401a6e..bec6713b74 100644
--- a/compat/winansi.c
+++ b/compat/winansi.c
@@ -2,8 +2,11 @@
* Copyright 2008 Peter Harris <git@peter.is-a-geek.org>
*/
+#undef NOGDI
#include "../git-compat-util.h"
#include <malloc.h>
+#include <wingdi.h>
+#include <winreg.h>
/*
Functions to be wrapped:
@@ -27,6 +30,62 @@ static WORD attr;
static int negative;
static FILE *last_stream = NULL;
+#ifdef __MINGW32__
+typedef struct _CONSOLE_FONT_INFOEX {
+ ULONG cbSize;
+ DWORD nFont;
+ COORD dwFontSize;
+ UINT FontFamily;
+ UINT FontWeight;
+ WCHAR FaceName[LF_FACESIZE];
+} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;
+#endif
+
+typedef BOOL (WINAPI *PGETCURRENTCONSOLEFONTEX)(HANDLE, BOOL,
+ PCONSOLE_FONT_INFOEX);
+
+static void print_font_warning(void)
+{
+ warning("Your console font probably doesn\'t support Unicode. If "
+ "you experience strange characters in the output, consider "
+ "switching to a TrueType font such as Lucida Console!");
+}
+
+static void check_truetype_font(void)
+{
+ static int truetype_font_checked;
+ DWORD fontFamily = 0;
+ PGETCURRENTCONSOLEFONTEX pGetCurrentConsoleFontEx;
+
+ /* don't do this twice */
+ if (truetype_font_checked)
+ return;
+ truetype_font_checked = 1;
+
+ /* GetCurrentConsoleFontEx is available since Vista */
+ pGetCurrentConsoleFontEx = (PGETCURRENTCONSOLEFONTEX) GetProcAddress(
+ GetModuleHandle("kernel32.dll"), "GetCurrentConsoleFontEx");
+ if (pGetCurrentConsoleFontEx) {
+ CONSOLE_FONT_INFOEX cfi;
+ cfi.cbSize = sizeof(cfi);
+ if (pGetCurrentConsoleFontEx(console, 0, &cfi))
+ fontFamily = cfi.FontFamily;
+ } else {
+ /* pre-Vista: check default console font in registry */
+ HKEY hkey;
+ if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CURRENT_USER, "Console", 0,
+ KEY_READ, &hkey)) {
+ DWORD size = sizeof(fontFamily);
+ RegQueryValueExA(hkey, "FontFamily", NULL, NULL,
+ (LPVOID) &fontFamily, &size);
+ RegCloseKey(hkey);
+ }
+ }
+
+ if (!(fontFamily & TMPF_TRUETYPE))
+ atexit(print_font_warning);
+}
+
static int is_console(FILE *stream)
{
CONSOLE_SCREEN_BUFFER_INFO sbi;
@@ -69,6 +128,13 @@ static int write_console(const char *str, size_t len)
WriteConsoleW(console, wbuf, wlen, NULL, NULL);
+ /*
+ * if non-ascii characters are printed, check that the current console
+ * font supports this
+ */
+ if (wlen != len)
+ check_truetype_font();
+
/* return original (utf-8 encoded) length */
return len;
}