tUnicode support is now detected automatically on both GTK+ and Win32 systems. … | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b64e60e800462e30a3669e8bbd65f351204acd67 | |
parent 941fff842010d3c75fd552e0686ec2f7b8f4f9a2 | |
Author: Ben Webb <[email protected]> | |
Date: Thu, 22 Aug 2002 17:59:27 +0000 | |
Unicode support is now detected automatically on both GTK+ and Win32 systems. | |
Diffstat: | |
M src/gtkport/gtkport.c | 10 ++++++++++ | |
M src/gtkport/gtkport.h | 2 ++ | |
M src/gtkport/unicodewrap.c | 84 +++++++++++++++++++++++------… | |
M src/gtkport/unicodewrap.h | 3 +++ | |
M src/gui_client/gtk_client.c | 15 ++++++++------- | |
5 files changed, 85 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c | |
t@@ -1117,6 +1117,7 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInst… | |
WNDCLASS wc; | |
hInst = hInstance; | |
+ InitUnicodeSupport(); | |
defFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); | |
urlFont = CreateFont(14, 0, 0, 0, FW_SEMIBOLD, FALSE, TRUE, FALSE, | |
ANSI_CHARSET, OUT_DEFAULT_PRECIS, | |
t@@ -5466,6 +5467,15 @@ gchar *GtkGetFile(const GtkWidget *parent, const gchar … | |
return filename; | |
} | |
+gboolean HaveUnicodeSupport(void) | |
+{ | |
+#ifdef HAVE_GLIB2 | |
+ return TRUE; | |
+#else | |
+ return FALSE; | |
+#endif | |
+} | |
+ | |
#endif /* CYGWIN */ | |
#if CYGWIN || !HAVE_GLIB2 | |
diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h | |
t@@ -751,6 +751,8 @@ struct _GtkUrl { | |
gchar *target, *bin; | |
}; | |
+gboolean HaveUnicodeSupport(void); | |
+ | |
#endif /* CYGWIN */ | |
#if CYGWIN || !HAVE_GLIB2 | |
diff --git a/src/gtkport/unicodewrap.c b/src/gtkport/unicodewrap.c | |
t@@ -30,17 +30,57 @@ | |
#include "unicodewrap.h" | |
+static gboolean unicode_support = FALSE; | |
+ | |
+/* | |
+ * Sets the global variable unicode_support to reflect whether this version | |
+ * of Windows understands Unicode. (WinNT/2000/XP do, 95/98/ME do not.) | |
+ * This is done by calling the Unicode version of GetVersionEx, which should | |
+ * have no undesirable side effects. On non-Unicode systems, this is just | |
+ * a stub function that returns an error. | |
+ */ | |
+void InitUnicodeSupport(void) | |
+{ | |
+ OSVERSIONINFOW verinfo; | |
+ | |
+ verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); | |
+ | |
+ unicode_support = | |
+ (GetVersionExW(&verinfo) || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED); | |
+} | |
+ | |
+gboolean HaveUnicodeSupport(void) | |
+{ | |
+ return unicode_support; | |
+} | |
+ | |
+/* | |
+ * Converts a string from our internal representation (UTF-8) to a form | |
+ * suitable for Windows Unicode-aware functions (i.e. UTF-16). This | |
+ * returned string must be g_free'd when no longer needed. | |
+ */ | |
+static gunichar2 *strtow32(const char *instr) | |
+{ | |
+ gunichar2 *outstr; | |
+ outstr = g_utf8_to_utf16(instr, -1, NULL, NULL, NULL); | |
+ if (!outstr) { | |
+ outstr = g_utf8_to_utf16("[?]", -1, NULL, NULL, NULL); | |
+ } | |
+} | |
+ | |
BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString) | |
{ | |
- gunichar2 *text; | |
BOOL retval; | |
- if (!(text = g_utf8_to_utf16(lpString, -1, NULL, NULL, NULL))) { | |
- retval = SetWindowTextA(hWnd, lpString); | |
- } else { | |
+ if (unicode_support) { | |
+ gunichar2 *text; | |
+ text = strtow32(lpString); | |
retval = SetWindowTextW(hWnd, text); | |
g_free(text); | |
+ } else { | |
+ retval = SetWindowTextA(hWnd, lpString); | |
} | |
+ | |
return retval; | |
} | |
t@@ -48,20 +88,20 @@ HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowNa… | |
int x, int y, int nWidth, int nHeight, HWND hwndParent, | |
HMENU hMenu, HANDLE hInstance, LPVOID lpParam) | |
{ | |
- gunichar2 *classname, *winname; | |
HWND retval; | |
- classname = g_utf8_to_utf16(lpClassName, -1, NULL, NULL, NULL); | |
- winname = g_utf8_to_utf16(lpWindowName, -1, NULL, NULL, NULL); | |
- if (!classname || !winname) { | |
- retval = CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, | |
+ if (unicode_support) { | |
+ gunichar2 *classname, *winname; | |
+ classname = strtow32(lpClassName); | |
+ winname = strtow32(lpWindowName); | |
+ retval = CreateWindowW(classname, winname, dwStyle, x, y, nWidth, | |
nHeight, hwndParent, hMenu, hInstance, lpParam); | |
+ g_free(classname); | |
+ g_free(winname); | |
} else { | |
- retval = CreateWindowW(classname, winname, dwStyle, x, y, nWidth, | |
+ retval = CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, | |
nHeight, hwndParent, hMenu, hInstance, lpParam); | |
} | |
- g_free(classname); | |
- g_free(winname); | |
return retval; | |
} | |
t@@ -70,22 +110,22 @@ HWND myCreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassNam… | |
int nWidth, int nHeight, HWND hwndParent, HMENU hMenu, | |
HANDLE hInstance, LPVOID lpParam) | |
{ | |
- gunichar2 *classname, *winname; | |
HWND retval; | |
- classname = g_utf8_to_utf16(lpClassName, -1, NULL, NULL, NULL); | |
- winname = g_utf8_to_utf16(lpWindowName, -1, NULL, NULL, NULL); | |
- if (!classname || !winname) { | |
- retval = CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, | |
- x, y, nWidth, nHeight, hwndParent, hMenu, | |
- hInstance, lpParam); | |
- } else { | |
+ if (unicode_support) { | |
+ gunichar2 *classname, *winname; | |
+ classname = strtow32(lpClassName); | |
+ winname = strtow32(lpWindowName); | |
retval = CreateWindowExW(dwExStyle, classname, winname, dwStyle, x, y, | |
nWidth, nHeight, hwndParent, hMenu, hInstance, | |
lpParam); | |
+ g_free(classname); | |
+ g_free(winname); | |
+ } else { | |
+ retval = CreateWindowExA(dwExStyle, lpClassName, lpWindowName, dwStyle, | |
+ x, y, nWidth, nHeight, hwndParent, hMenu, | |
+ hInstance, lpParam); | |
} | |
- g_free(classname); | |
- g_free(winname); | |
return retval; | |
} | |
diff --git a/src/gtkport/unicodewrap.h b/src/gtkport/unicodewrap.h | |
t@@ -30,6 +30,9 @@ | |
#ifdef CYGWIN | |
#include <windows.h> | |
+void InitUnicodeSupport(void); | |
+void HaveUnicodeSupport(void); | |
+ | |
BOOL mySetWindowText(HWND hWnd, LPCTSTR lpString); | |
HWND myCreateWindow(LPCTSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, | |
int x, int y, int nWidth, int nHeight, HWND hwndParent, | |
diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c | |
t@@ -2179,14 +2179,15 @@ gboolean GtkLoop(int *argc, char **argv[], | |
gtk_init(argc, argv); | |
#endif | |
-#if HAVE_GLIB2 | |
- /* GTK+2 expects all strings to be UTF-8, so we force gettext to return | |
- * all translations in this encoding here. */ | |
- bind_textdomain_codeset(PACKAGE, "UTF-8"); | |
+ if (HaveUnicodeSupport()) { | |
+ /* GTK+2 (and the GTK emulation code on WinNT systems) expects all | |
+ * strings to be UTF-8, so we force gettext to return all translations | |
+ * in this encoding here. */ | |
+ bind_textdomain_codeset(PACKAGE, "UTF-8"); | |
- Conv_SetInternalCodeset("UTF-8"); | |
- WantUTF8Errors(TRUE); | |
-#endif | |
+ Conv_SetInternalCodeset("UTF-8"); | |
+ WantUTF8Errors(TRUE); | |
+ } | |
InitConfiguration(cmdline); | |
ClientData.cmdline = cmdline; | |