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 | Version TBD | ||||||
|  - Added scrolling using the middle mouse button. |  - 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. |  - Fixed checking for the shift key when selecting. | ||||||
|  - Terminals are ignored when hovering the cursor above a selection. |  - Terminals are ignored when hovering the cursor above a selection. | ||||||
|  - Disallowed wheel zooming when holding mouse buttons. |  - Disallowed wheel zooming when holding mouse buttons. | ||||||
|  | |||||||
| @ -16,6 +16,66 @@ | |||||||
| #include "ld-window-main.h" | #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 | int | ||||||
| main (int argc, char *argv[]) | main (int argc, char *argv[]) | ||||||
| { | { | ||||||
| @ -29,6 +89,7 @@ main (int argc, char *argv[]) | |||||||
| 
 | 
 | ||||||
| 	GError *error; | 	GError *error; | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
|  | 	gboolean argv_overriden; | ||||||
| 	gchar *install_dir; | 	gchar *install_dir; | ||||||
| 
 | 
 | ||||||
| 	install_dir = g_win32_get_package_installation_directory_of_module (NULL); | 	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"); | 	bind_textdomain_codeset (GETTEXT_DOMAIN, "UTF-8"); | ||||||
| 	textdomain (GETTEXT_DOMAIN); | 	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; | 	error = NULL; | ||||||
| 	gtk_init_with_args (&argc, &argv, N_("- Schematic editor"), | 	gtk_init_with_args (&argc, &argv, N_("- Schematic editor"), | ||||||
| 		option_entries, GETTEXT_DOMAIN, &error); | 		option_entries, GETTEXT_DOMAIN, &error); | ||||||
| @ -55,6 +123,14 @@ main (int argc, char *argv[]) | |||||||
| 		return 1; | 		return 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | #ifdef _WIN32 | ||||||
|  | 	if (argv_overriden) | ||||||
|  | 	{ | ||||||
|  | 		_putenv ("CHARSET="); | ||||||
|  | 		g_strfreev (argv); | ||||||
|  | 	} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| 	gtk_window_set_default_icon_name (PROJECT_NAME); | 	gtk_window_set_default_icon_name (PROJECT_NAME); | ||||||
| 
 | 
 | ||||||
| 	/* TODO: Be able to open multiple files. */ | 	/* TODO: Be able to open multiple files. */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user