mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
Hack back in a fix for lack of ANSI codes on Windows 10
There must be a better way to do this, but someone more familiar with Win32 internals than I will need to discover it. https://forums.ankiweb.net/t/anki-25-08-beta/63645/61
This commit is contained in:
parent
a3da224511
commit
aeaf001df7
2 changed files with 27 additions and 1 deletions
|
@ -141,7 +141,7 @@ walkdir = "2.5.0"
|
||||||
which = "8.0.0"
|
which = "8.0.0"
|
||||||
widestring = "1.1.0"
|
widestring = "1.1.0"
|
||||||
winapi = { version = "0.3", features = ["wincon", "winreg"] }
|
winapi = { version = "0.3", features = ["wincon", "winreg"] }
|
||||||
windows = { version = "0.61.3", features = ["Media_SpeechSynthesis", "Media_Core", "Foundation_Collections", "Storage_Streams", "Win32_System_Console", "Win32_System_Registry", "Win32_Foundation", "Win32_UI_Shell"] }
|
windows = { version = "0.61.3", features = ["Media_SpeechSynthesis", "Media_Core", "Foundation_Collections", "Storage_Streams", "Win32_System_Console", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_Foundation", "Win32_UI_Shell", "Wdk_System_SystemServices"] }
|
||||||
wiremock = "0.6.3"
|
wiremock = "0.6.3"
|
||||||
xz2 = "0.1.7"
|
xz2 = "0.1.7"
|
||||||
zip = { version = "4.1.0", default-features = false, features = ["deflate", "time"] }
|
zip = { version = "4.1.0", default-features = false, features = ["deflate", "time"] }
|
||||||
|
|
|
@ -8,6 +8,7 @@ use anyhow::Context;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use widestring::u16cstr;
|
use widestring::u16cstr;
|
||||||
use windows::core::PCWSTR;
|
use windows::core::PCWSTR;
|
||||||
|
use windows::Wdk::System::SystemServices::RtlGetVersion;
|
||||||
use windows::Win32::System::Console::AttachConsole;
|
use windows::Win32::System::Console::AttachConsole;
|
||||||
use windows::Win32::System::Console::GetConsoleWindow;
|
use windows::Win32::System::Console::GetConsoleWindow;
|
||||||
use windows::Win32::System::Console::ATTACH_PARENT_PROCESS;
|
use windows::Win32::System::Console::ATTACH_PARENT_PROCESS;
|
||||||
|
@ -18,8 +19,25 @@ use windows::Win32::System::Registry::HKEY;
|
||||||
use windows::Win32::System::Registry::HKEY_CURRENT_USER;
|
use windows::Win32::System::Registry::HKEY_CURRENT_USER;
|
||||||
use windows::Win32::System::Registry::KEY_READ;
|
use windows::Win32::System::Registry::KEY_READ;
|
||||||
use windows::Win32::System::Registry::REG_SZ;
|
use windows::Win32::System::Registry::REG_SZ;
|
||||||
|
use windows::Win32::System::SystemInformation::OSVERSIONINFOW;
|
||||||
use windows::Win32::UI::Shell::SetCurrentProcessExplicitAppUserModelID;
|
use windows::Win32::UI::Shell::SetCurrentProcessExplicitAppUserModelID;
|
||||||
|
|
||||||
|
/// Returns true if running on Windows 10 (not Windows 11)
|
||||||
|
fn is_windows_10() -> bool {
|
||||||
|
unsafe {
|
||||||
|
let mut info = OSVERSIONINFOW {
|
||||||
|
dwOSVersionInfoSize: std::mem::size_of::<OSVERSIONINFOW>() as u32,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
if RtlGetVersion(&mut info).is_ok() {
|
||||||
|
// Windows 10 has build numbers < 22000, Windows 11 >= 22000
|
||||||
|
info.dwBuildNumber < 22000 && info.dwMajorVersion == 10
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn ensure_terminal_shown() -> Result<()> {
|
pub fn ensure_terminal_shown() -> Result<()> {
|
||||||
unsafe {
|
unsafe {
|
||||||
if !GetConsoleWindow().is_invalid() {
|
if !GetConsoleWindow().is_invalid() {
|
||||||
|
@ -29,6 +47,14 @@ pub fn ensure_terminal_shown() -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if std::env::var("ANKI_IMPLICIT_CONSOLE").is_ok() && attach_to_parent_console() {
|
if std::env::var("ANKI_IMPLICIT_CONSOLE").is_ok() && attach_to_parent_console() {
|
||||||
|
// This black magic triggers Windows to switch to the new
|
||||||
|
// ANSI-supporting console host, which is usually only available
|
||||||
|
// when the app is built with the console subsystem.
|
||||||
|
// Only needed on Windows 10, not Windows 11.
|
||||||
|
if is_windows_10() {
|
||||||
|
let _ = Command::new("cmd").args(["/C", ""]).status();
|
||||||
|
}
|
||||||
|
|
||||||
// Successfully attached to parent console
|
// Successfully attached to parent console
|
||||||
reconnect_stdio_to_console();
|
reconnect_stdio_to_console();
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|
Loading…
Reference in a new issue