diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:29:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 16:29:51 +0000 |
commit | 6e7a315eb67cb6c113cf37e1d66c4f11a51a2b3e (patch) | |
tree | 32451fa3cdd9321fb2591fada9891b2cb70a9cd1 /grub-core/osdep/windows/init.c | |
parent | Initial commit. (diff) | |
download | grub2-3e86199209a10ed6555e30b8b71884cb7cc45ed2.tar.xz grub2-3e86199209a10ed6555e30b8b71884cb7cc45ed2.zip |
Adding upstream version 2.06.upstream/2.06upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'grub-core/osdep/windows/init.c')
-rw-r--r-- | grub-core/osdep/windows/init.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/grub-core/osdep/windows/init.c b/grub-core/osdep/windows/init.c new file mode 100644 index 0000000..6297de6 --- /dev/null +++ b/grub-core/osdep/windows/init.c @@ -0,0 +1,190 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <config.h> +#include <config-util.h> +#include <grub/util/misc.h> +#include <grub/osdep/hostfile.h> +#include <grub/util/windows.h> +#include <grub/emu/config.h> + +#include <wincon.h> +#include <windows.h> + +#include <grub/util/misc.h> + +#include "progname.h" + +struct grub_windows_console_font_infoex { + ULONG cbSize; + DWORD nFont; + COORD dwFontSize; + UINT FontFamily; + UINT FontWeight; + WCHAR FaceName[LF_FACESIZE]; +}; + +static int +check_is_raster (HMODULE kernel32, HANDLE hnd) +{ + CONSOLE_FONT_INFO console_font_info; + BOOL (WINAPI * func_GetCurrentConsoleFont) (HANDLE, BOOL, + PCONSOLE_FONT_INFO); + + func_GetCurrentConsoleFont = (void *) + GetProcAddress (kernel32, "GetCurrentConsoleFont"); + + if (!func_GetCurrentConsoleFont) + return 1; + + if (!func_GetCurrentConsoleFont (hnd, FALSE, &console_font_info)) + return 1; + return console_font_info.nFont < 12; +} + +static void +set_console_unicode_font (void) +{ + BOOL (WINAPI * func_SetCurrentConsoleFontEx) (HANDLE, BOOL, + struct grub_windows_console_font_infoex *); + BOOL (WINAPI * func_SetConsoleFont)(HANDLE, DWORD); + HMODULE kernel32; + HANDLE out_handle = GetStdHandle (STD_OUTPUT_HANDLE); + HANDLE err_handle = GetStdHandle (STD_ERROR_HANDLE); + int out_raster, err_raster; + + kernel32 = GetModuleHandle(TEXT("kernel32.dll")); + if (!kernel32) + return; + + out_raster = check_is_raster (kernel32, out_handle); + err_raster = check_is_raster (kernel32, err_handle); + + if (!out_raster && !err_raster) + return; + + func_SetCurrentConsoleFontEx = (void *) GetProcAddress (kernel32, "SetCurrentConsoleFontEx"); + + /* Newer windows versions. */ + if (func_SetCurrentConsoleFontEx) + { + struct grub_windows_console_font_infoex new_console_font_info; + new_console_font_info.cbSize = sizeof (new_console_font_info); + new_console_font_info.nFont = 12; + new_console_font_info.dwFontSize.X = 7; + new_console_font_info.dwFontSize.Y = 12; + new_console_font_info.FontFamily = FF_DONTCARE; + new_console_font_info.FontWeight = 400; + memcpy (new_console_font_info.FaceName, TEXT("Lucida Console"), + sizeof (TEXT("Lucida Console"))); + if (out_raster) + func_SetCurrentConsoleFontEx (out_handle, FALSE, + &new_console_font_info); + if (err_raster) + func_SetCurrentConsoleFontEx (err_handle, FALSE, + &new_console_font_info); + return; + } + + /* Fallback for older versions. */ + func_SetConsoleFont = (void *) GetProcAddress (kernel32, "SetConsoleFont"); + if (func_SetConsoleFont) + { + if (out_raster) + func_SetConsoleFont (out_handle, 12); + if (err_raster) + func_SetConsoleFont (err_handle, 12); + } +} + +static char *grub_util_base_directory; +static char *locale_dir; + +const char * +grub_util_get_config_filename (void) +{ + static char *value = NULL; + if (!value) + value = grub_util_path_concat (2, grub_util_base_directory, "grub.cfg"); + return value; +} + +const char * +grub_util_get_pkgdatadir (void) +{ + return grub_util_base_directory; +} + +const char * +grub_util_get_localedir (void) +{ + return locale_dir; +} + +const char * +grub_util_get_pkglibdir (void) +{ + return grub_util_base_directory; +} + +void +grub_util_host_init (int *argc __attribute__ ((unused)), + char ***argv) +{ + char *ptr; + + SetConsoleOutputCP (CP_UTF8); + SetConsoleCP (CP_UTF8); + + set_console_unicode_font (); + +#if SIZEOF_TCHAR == 1 + +#elif SIZEOF_TCHAR == 2 + LPWSTR tcmdline = GetCommandLineW (); + int i; + LPWSTR *targv; + + targv = CommandLineToArgvW (tcmdline, argc); + *argv = xcalloc (*argc + 1, sizeof (argv[0])); + + for (i = 0; i < *argc; i++) + (*argv)[i] = grub_util_tchar_to_utf8 (targv[i]); + (*argv)[i] = NULL; +#else +#error "Unsupported TCHAR size" +#endif + + grub_util_base_directory = grub_canonicalize_file_name ((*argv)[0]); + if (!grub_util_base_directory) + grub_util_base_directory = xstrdup ((*argv)[0]); + for (ptr = grub_util_base_directory + strlen (grub_util_base_directory) - 1; + ptr >= grub_util_base_directory && *ptr != '/' && *ptr != '\\'; ptr--); + if (ptr >= grub_util_base_directory) + *ptr = '\0'; + + locale_dir = grub_util_path_concat (2, grub_util_base_directory, "locale"); + + set_program_name ((*argv)[0]); + +#if (defined (GRUB_UTIL) && defined(ENABLE_NLS) && ENABLE_NLS) + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, locale_dir); + textdomain (PACKAGE); +#endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */ +} |