From 2509f0af5217bd7186ded2cd55f82b30a7db4fc6 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Fri, 10 Jun 2011 14:52:22 +0200
Subject: Workaround the ANSI codepage limitation on Win32.
---
NEWS | 2 ++
src/logdiag.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+)
diff --git a/NEWS b/NEWS
index 995f81c..58f9ef2 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,7 @@
Version TBD
- Added scrolling using the middle mouse button.
+ - Fixed command line parsing on Windows,
+ it's not limited to the system ANSI codepage anymore.
- Fixed checking for the shift key when selecting.
- Terminals are ignored when hovering the cursor above a selection.
- Disallowed wheel zooming when holding mouse buttons.
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
+#include
+
+/*
+ * 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. */
--
cgit v1.2.3-70-g09d2