Workaround the ANSI codepage limitation on Win32.
This commit is contained in:
		
							parent
							
								
									5d1c8bbf75
								
							
						
					
					
						commit
						2509f0af52
					
				
							
								
								
									
										2
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								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. | ||||
|  | ||||
| @ -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. */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user