Files
core-cooldown/src-tauri/src/main.rs
T

68 lines
2.2 KiB
Rust

// Prevents additional console window on Windows in release
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() {
#[cfg(windows)]
if !webview2_check::is_webview2_installed() {
webview2_check::show_missing_dialog();
return;
}
core_cooldown_lib::run()
}
#[cfg(windows)]
mod webview2_check {
use std::ptr;
use winapi::um::winuser::{MessageBoxW, MB_OK, MB_ICONWARNING};
use winapi::um::shellapi::ShellExecuteW;
// Statically linked from WebView2LoaderStatic.lib via msvc_compat shims
extern "system" {
fn GetAvailableCoreWebView2BrowserVersionString(
browser_executable_folder: *const u16,
version_info: *mut *mut u16,
) -> i32;
}
extern "system" {
fn CoTaskMemFree(pv: *mut std::ffi::c_void);
}
fn to_wide(s: &str) -> Vec<u16> {
s.encode_utf16().chain(std::iter::once(0)).collect()
}
pub fn is_webview2_installed() -> bool {
unsafe {
let mut version_info: *mut u16 = ptr::null_mut();
let hr = GetAvailableCoreWebView2BrowserVersionString(
ptr::null(),
&mut version_info,
);
let installed = hr == 0 && !version_info.is_null();
if !version_info.is_null() {
CoTaskMemFree(version_info as *mut _);
}
installed
}
}
pub fn show_missing_dialog() {
let title = to_wide("Core Cooldown - WebView2 Required");
let message = to_wide(
"Microsoft WebView2 Runtime is required to run Core Cooldown, \
but it was not found on this system.\n\n\
Click OK to open the download page in your browser.\n\n\
After installing WebView2, restart Core Cooldown."
);
let url = to_wide("https://developer.microsoft.com/en-us/microsoft-edge/webview2/consumer");
let open = to_wide("open");
unsafe {
MessageBoxW(ptr::null_mut(), message.as_ptr(), title.as_ptr(), MB_OK | MB_ICONWARNING);
ShellExecuteW(ptr::null_mut(), open.as_ptr(), url.as_ptr(), ptr::null(), ptr::null(), 1);
}
}
}