From 36305fb0c47d13b078e0a647f9f3582993db40e8 Mon Sep 17 00:00:00 2001 From: hero <33593734+hero622@users.noreply.github.com> Date: Tue, 14 May 2024 10:33:04 +0200 Subject: [PATCH] Fix installer cmd color formatting using FFI (#1) * fix cmd color formatting * fix runtime linux error * fix stdout handle * run deno fmt --------- Co-authored-by: NeKz --- deno.json | 4 ++-- src/cmm.ts | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/deno.json b/deno.json index 1201903..4cf24ea 100644 --- a/deno.json +++ b/deno.json @@ -2,10 +2,10 @@ "tasks": { "check": "deno fmt --check && deno lint && deno task check:types", "check:types": "deno check --no-lock src/*.ts", - "run": "deno run -A src/cmm.ts", + "run": "deno run --allow-ffi --unstable-ffi -A src/cmm.ts", "compile": "deno task compile:lin & deno task compile:win", "compile:lin": "deno compile --target x86_64-unknown-linux-gnu --output cmm -A src/cmm.ts", - "compile:win": "deno compile --target x86_64-pc-windows-msvc --output cmm.exe -A src/cmm.ts", + "compile:win": "deno compile --target x86_64-pc-windows-msvc --allow-ffi --unstable-ffi --output cmm.exe -A src/cmm.ts", "pack": "deno run -A src/vpkt.ts pack --output mods/portal_stories/pak01_dir.vpk --pack mods/portal_stories", "pack:check": "deno run -A src/vpkt.ts list --input mods/portal_stories/pak01_dir.vpk" }, diff --git a/src/cmm.ts b/src/cmm.ts index 5ba2d6b..5adf237 100644 --- a/src/cmm.ts +++ b/src/cmm.ts @@ -182,6 +182,37 @@ const validateApiKey = async (apiKey: string) => { } }; +const enableVirtualTerminalProcessing = () => { + const kernel32 = Deno.dlopen('kernel32.dll', { + GetStdHandle: { + parameters: ['u32'], + result: 'pointer', + }, + GetConsoleMode: { + parameters: ['pointer', 'buffer'], + result: 'bool', + }, + SetConsoleMode: { + parameters: ['pointer', 'u32'], + result: 'bool', + }, + }); + + const STD_OUTPUT_HANDLE = 4294967285; + const ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; + + const handle = kernel32.symbols.GetStdHandle(STD_OUTPUT_HANDLE); + + const buffer = new Uint32Array(1).fill(0); + kernel32.symbols.GetConsoleMode(handle, buffer); + + let consoleMode = buffer[0]; + if (consoleMode) { + consoleMode = consoleMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING; + kernel32.symbols.SetConsoleMode(handle, consoleMode); + } +}; + const cli = new Command() .name('cmm') .version(ChallengeModeModVersion) @@ -190,6 +221,10 @@ const cli = new Command() .action(async (option) => { verbose = !!option.verbose; + if (isWindows) { + enableVirtualTerminalProcessing(); + } + const gameSelect = await Select.prompt({ message: 'Choose which game to install the mod to:', options: Object.keys(supportedGames),