aboutsummaryrefslogtreecommitdiffstats
path: root/src/ctrlc.rs
diff options
context:
space:
mode:
authorJonas Maier <>2026-03-11 16:44:03 +0100
committerJonas Maier <>2026-03-11 16:44:03 +0100
commitcb4be2c707dcfbf06ea7d08fa603e2257e2f669f (patch)
tree42781f53bc47d59e687f1b54378c5c4e0979733a /src/ctrlc.rs
parent18ad2173816bf455c2dabece9009aae29133b3d3 (diff)
downloadpish-cb4be2c707dcfbf06ea7d08fa603e2257e2f669f.tar.gz
cancelable builtins
Diffstat (limited to 'src/ctrlc.rs')
-rw-r--r--src/ctrlc.rs25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/ctrlc.rs b/src/ctrlc.rs
index 4c0153a..9bf53fa 100644
--- a/src/ctrlc.rs
+++ b/src/ctrlc.rs
@@ -1,7 +1,7 @@
use crate::Session;
use libc::c_int;
use nix::sys::signal::*;
-use std::sync::*;
+use std::{sync::*, time::Instant};
static SESSION: Mutex<Option<Arc<Mutex<Session>>>> = Mutex::new(None);
@@ -9,7 +9,7 @@ fn handle() {
let Ok(mut se) = SESSION.lock() else { return };
let Some(se) = se.as_mut() else { return };
let Ok(mut se) = se.lock() else { return };
- se.ctrlc.pressed = true;
+ se.ctrlc.last_press = Instant::now();
}
extern "C" fn c_handle(_signal: c_int) {
@@ -21,9 +21,16 @@ extern "C" fn c_handle(_signal: c_int) {
});
}
-#[derive(Default)]
pub struct CtrlC {
- pressed: bool,
+ last_press: Instant,
+}
+
+impl Default for CtrlC {
+ fn default() -> Self {
+ Self {
+ last_press: Instant::now(),
+ }
+ }
}
struct Teardown;
@@ -52,12 +59,6 @@ pub fn setup(session: Arc<Mutex<Session>>) -> impl Drop {
Teardown
}
-pub fn peek(session: &Session) -> bool {
- session.ctrlc.pressed
-}
-
-pub fn pop(session: &mut Session) -> bool {
- let x = session.ctrlc.pressed;
- session.ctrlc.pressed = false;
- x
+pub fn pressed_since(session: &Session, instant: Instant) -> bool {
+ session.ctrlc.last_press > instant
}