2018-12-31 14:07:55 +02:00
|
|
|
//! A stub for Ctrl + C handling.
|
2020-08-26 22:30:19 +03:00
|
|
|
use crate::ctrlc::interrupted::set_interrupted;
|
2023-10-17 11:19:47 +08:00
|
|
|
use tracing::error;
|
2025-09-20 16:33:17 +02:00
|
|
|
use windows::core::BOOL;
|
|
|
|
|
use windows::Win32::System::Console::{SetConsoleCtrlHandler, CTRL_C_EVENT};
|
2018-12-31 14:07:55 +02:00
|
|
|
|
2025-09-20 16:33:17 +02:00
|
|
|
extern "system" fn handler(ctrl_type: u32) -> BOOL {
|
2020-08-26 22:30:19 +03:00
|
|
|
match ctrl_type {
|
|
|
|
|
CTRL_C_EVENT => {
|
|
|
|
|
set_interrupted();
|
2025-09-20 16:33:17 +02:00
|
|
|
true.into()
|
2020-08-26 22:30:19 +03:00
|
|
|
}
|
2025-09-20 16:33:17 +02:00
|
|
|
_ => false.into(),
|
2020-08-26 22:30:19 +03:00
|
|
|
}
|
2018-10-17 14:07:58 +03:00
|
|
|
}
|
|
|
|
|
|
2020-08-26 22:30:19 +03:00
|
|
|
pub fn set_handler() {
|
2025-09-20 16:33:17 +02:00
|
|
|
if let Err(e) = unsafe { SetConsoleCtrlHandler(Some(handler), true) } {
|
|
|
|
|
error!("Cannot set a control C handler: {e}")
|
2020-08-26 22:30:19 +03:00
|
|
|
}
|
|
|
|
|
}
|