use kanata_keyberon::layout::{Event, QueuedIter, REAL_KEY_ROW, WaitingAction};
use crate::keys::OsCode;
use super::alloc::Allocations;
pub(crate) fn custom_tap_hold_release(
keys: &[OsCode],
a: &Allocations,
) -> &'static (dyn Fn(QueuedIter) -> (Option<WaitingAction>, bool) + Send + Sync) {
let keys = a.sref_vec(Vec::from_iter(keys.iter().copied()));
a.sref(
move |mut queued: QueuedIter| -> (Option<WaitingAction>, bool) {
while let Some(q) = queued.next() {
if q.event().is_press() {
let (i, j) = q.event().coord();
if i == REAL_KEY_ROW && keys.iter().copied().map(u16::from).any(|j2| j2 == j) {
return (Some(WaitingAction::Tap), false);
}
let target = Event::Release(i, j);
if queued.clone().copied().any(|q| q.event() == target) {
return (Some(WaitingAction::Hold), false);
}
}
}
(None, false)
},
)
}
pub(crate) fn custom_tap_hold_release_trigger_tap_release(
keys_press_trigger_tap: &[OsCode],
keys_press_then_release_trigger_tap: &[OsCode],
a: &Allocations,
) -> &'static (dyn Fn(QueuedIter) -> (Option<WaitingAction>, bool) + Send + Sync) {
let keys_press_then_release_trigger_tap = a.sref_vec(Vec::from_iter(
keys_press_then_release_trigger_tap
.iter()
.copied()
.map(u16::from),
));
let keys_press_trigger_tap = a.sref_vec(Vec::from_iter(
keys_press_trigger_tap.iter().copied().map(u16::from),
));
a.sref(
move |mut queued: QueuedIter| -> (Option<WaitingAction>, bool) {
while let Some(q) = queued.next() {
if q.event().is_press() {
let (i, j) = q.event().coord();
if i != REAL_KEY_ROW {
continue;
}
if keys_press_trigger_tap.iter().copied().any(|j2| j2 == j) {
return (Some(WaitingAction::Tap), false);
}
if keys_press_then_release_trigger_tap
.iter()
.copied()
.any(|j2| j2 == j)
{
let target = Event::Release(i, j);
if queued.clone().copied().any(|q| q.event() == target) {
return (Some(WaitingAction::Tap), false);
}
}
let target = Event::Release(i, j);
if queued.clone().copied().any(|q| q.event() == target) {
return (Some(WaitingAction::Hold), false);
}
}
}
(None, false)
},
)
}
pub(crate) fn custom_tap_hold_except(
keys: &[OsCode],
a: &Allocations,
) -> &'static (dyn Fn(QueuedIter) -> (Option<WaitingAction>, bool) + Send + Sync) {
let keys = a.sref_vec(Vec::from_iter(keys.iter().copied()));
a.sref(
move |mut queued: QueuedIter| -> (Option<WaitingAction>, bool) {
for q in queued.by_ref() {
if q.event().is_press() {
let (_i, j) = q.event().coord();
if keys.iter().copied().map(u16::from).any(|j2| j2 == j) {
return (Some(WaitingAction::Tap), false);
}
return (None, false);
}
}
(None, true)
},
)
}
pub(crate) fn custom_tap_hold_tap_keys(
keys: &[OsCode],
a: &Allocations,
) -> &'static (dyn Fn(QueuedIter) -> (Option<WaitingAction>, bool) + Send + Sync) {
let keys = a.sref_vec(Vec::from_iter(keys.iter().copied()));
a.sref(
move |mut queued: QueuedIter| -> (Option<WaitingAction>, bool) {
for q in queued.by_ref() {
if q.event().is_press() {
let (_i, j) = q.event().coord();
if keys.iter().copied().map(u16::from).any(|j2| j2 == j) {
return (Some(WaitingAction::Tap), false);
}
}
}
(None, false)
},
)
}