123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- /*
- * 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 = xmalloc ((*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) */
- }
|