diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2011-06-10 14:52:22 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2011-06-10 14:52:22 +0200 |
commit | 2509f0af5217bd7186ded2cd55f82b30a7db4fc6 (patch) | |
tree | 0d8afe666a5a6d46677477834fba6e5265191e8a /src | |
parent | 5d1c8bbf75a275ddbc1f01b43165ce9411986b6e (diff) | |
download | logdiag-2509f0af5217bd7186ded2cd55f82b30a7db4fc6.tar.gz logdiag-2509f0af5217bd7186ded2cd55f82b30a7db4fc6.tar.xz logdiag-2509f0af5217bd7186ded2cd55f82b30a7db4fc6.zip |
Workaround the ANSI codepage limitation on Win32.
Diffstat (limited to 'src')
-rw-r--r-- | src/logdiag.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/logdiag.c b/src/logdiag.c index 90548d3..c44c1c3 100644 --- a/src/logdiag.c +++ b/src/logdiag.c @@ -16,6 +16,66 @@ #include "ld-window-main.h" +#ifdef _WIN32 +#include <windows.h> +#include <shellapi.h> + +/* + * get_utf8_args: + * @argc: where the number of arguments will be stored. + * @argv: where the actual array of arguments will be stored. + * Use g_strfreev() to free the array. + * + * Retrieve program arguments in UTF-8 encoding on Windows. + * + * Return value: %TRUE if the function has succeeded. + */ +static gboolean +get_utf8_args (int *argc, char ***argv) +{ + LPWSTR *argv_wide; + int i, argc_local, buff_size; + char **argv_local, *arg; + + argv_wide = CommandLineToArgvW (GetCommandLineW (), &argc_local); + if (!argv_wide) + return FALSE; + + argv_local = g_malloc ((argc_local + 1) * sizeof (char *)); + for (i = 0; i < argc_local; i++) + { + buff_size = WideCharToMultiByte (CP_UTF8, 0, argv_wide[i], -1, + NULL, 0, NULL, NULL); + if (!buff_size) + goto get_utf8_args_fail; + + argv_local[i] = g_malloc (buff_size); + if (!WideCharToMultiByte (CP_UTF8, 0, argv_wide[i], -1, + argv_local[i], buff_size, NULL, NULL)) + { + g_free (argv_local[i]); + goto get_utf8_args_fail; + } + } + argv_local[i] = NULL; + LocalFree (argv_wide); + + if (argc) + *argc = argc_local; + if (argv) + *argv = argv_local; + return TRUE; + +get_utf8_args_fail: + while (i--) + g_free (argv_local[i]); + g_free (argv_local); + + LocalFree (argv_wide); + return FALSE; +} +#endif + int main (int argc, char *argv[]) { @@ -29,6 +89,7 @@ main (int argc, char *argv[]) GError *error; #ifdef _WIN32 + gboolean argv_overriden; gchar *install_dir; install_dir = g_win32_get_package_installation_directory_of_module (NULL); @@ -45,6 +106,13 @@ main (int argc, char *argv[]) bind_textdomain_codeset (GETTEXT_DOMAIN, "UTF-8"); textdomain (GETTEXT_DOMAIN); +#ifdef _WIN32 + /* Don't be limited by the ANSI codepage. */ + argv_overriden = get_utf8_args (&argc, &argv); + if (argv_overriden) + _putenv ("CHARSET=UTF-8"); +#endif + error = NULL; gtk_init_with_args (&argc, &argv, N_("- Schematic editor"), option_entries, GETTEXT_DOMAIN, &error); @@ -55,6 +123,14 @@ main (int argc, char *argv[]) return 1; } +#ifdef _WIN32 + if (argv_overriden) + { + _putenv ("CHARSET="); + g_strfreev (argv); + } +#endif + gtk_window_set_default_icon_name (PROJECT_NAME); /* TODO: Be able to open multiple files. */ |