only add motion data for the device that started the swipe

This commit is contained in:
Diamond White 2026-03-15 11:05:11 +00:00
parent 74e8c4b588
commit f8f38f6adf
3 changed files with 28 additions and 8 deletions

View File

@ -363,7 +363,7 @@ pub(super) fn create_keyboard_panel(
};
let within_key_pos = data.metadata.get_mouse_pos_normalized(&common.alterables.transform_stack);
handle_press(app, &k, &k_label, &k_cap_type, &within_key_pos, state, button);
handle_press(app, &k, &k_label, &k_cap_type, &within_key_pos, state, button, button.device);
on_press_anim(k.clone(), common, data);
Ok(EventResult::Pass)
}
@ -378,8 +378,11 @@ pub(super) fn create_keyboard_panel(
let k_cap_type = key_cap_type.clone();
move |common, data, app, state| {
let within_key_pos = data.metadata.get_mouse_pos_normalized(&common.alterables.transform_stack);
let CallbackMetadata::MousePosition(position) = data.metadata else {
panic!("CallbackMetadata should contain MousePosition!");
};
handle_mouse_motion(&k, &k_label, &k_cap_type, state, &within_key_pos);
handle_mouse_motion(&k, &k_label, &k_cap_type, state, &within_key_pos, position.device);
Ok(EventResult::Pass)
}
}),

View File

@ -422,7 +422,14 @@ enum KeyButtonData {
},
}
fn handle_mouse_motion(key: &KeyState, key_label: &Vec<String>, key_cap_type: &KeyCapType, keyboard: &mut KeyboardState, within_key_pos: &Option<Vec2>) {
fn handle_mouse_motion(
key: &KeyState,
key_label: &Vec<String>,
key_cap_type: &KeyCapType,
keyboard: &mut KeyboardState,
within_key_pos: &Option<Vec2>,
device: usize
) {
if let Some(swipe_manager) = keyboard.swipe_typing_manager.as_mut() && *key_cap_type == KeyCapType::Letter {
if !swipe_manager.is_current_swipe_empty() {
match &key.button_state {
@ -432,7 +439,7 @@ fn handle_mouse_motion(key: &KeyState, key_label: &Vec<String>, key_cap_type: &K
if pos.x >= 0.0 && pos.x <= 1.0 && pos.y >= 0.0 && pos.y <= 1.0 {
if let Some(label) = key_label.first() {
swipe_manager.add_swipe(pos, label.chars().next().unwrap_or_default());
swipe_manager.add_swipe(pos, label.chars().next().unwrap_or_default(), device);
}
}
}
@ -451,13 +458,14 @@ fn handle_press(
within_key_pos: &Option<Vec2>,
keyboard: &mut KeyboardState,
button: MouseButtonEvent,
device: usize
) {
match &key.button_state {
KeyButtonData::Key { vk, pressed } => {
if let Some(swipe_manager) = keyboard.swipe_typing_manager.as_mut() && *key_cap_type == KeyCapType::Letter {
if let Some(pos) = within_key_pos {
if let Some(label) = key_label.first() {
swipe_manager.add_swipe(pos, label.chars().next().unwrap_or_default());
swipe_manager.add_swipe(pos, label.chars().next().unwrap_or_default(), device);
}
}
}

View File

@ -19,6 +19,7 @@ pub struct SwipeTypingManager {
clipboard: Clipboard,
swipe_left_first_key: bool,
first_swipe_char: char,
current_swipe_device: Option<usize>, // the pointer that started this swipe
last_swiped_word: Option<String>
}
impl SwipeTypingManager {
@ -69,6 +70,7 @@ impl SwipeTypingManager {
clipboard: Clipboard::new()?,
swipe_left_first_key: false,
first_swipe_char: char::default(),
current_swipe_device: None,
last_swiped_word: None
})
}
@ -98,11 +100,13 @@ impl SwipeTypingManager {
self.current_swipe = Vec::new();
self.first_swipe_char = char::default();
self.swipe_left_first_key = false;
self.current_swipe_device = None;
}
fn start_swipe(&mut self, key_label: char) -> Instant{
fn start_swipe(&mut self, key_label: char, device: usize) -> Instant{
let now = Instant::now();
self.swipe_start_time = Some(now);
self.first_swipe_char = key_label.to_ascii_lowercase();
self.current_swipe_device = Some(device);
self.swipe_candidates = Vec::new();
now
}
@ -112,7 +116,7 @@ impl SwipeTypingManager {
pub fn is_current_swipe_empty(&self) -> bool {
self.current_swipe.is_empty()
}
pub fn add_swipe(&mut self, within_key_pos_normalized: &Vec2, key_label: char) {
pub fn add_swipe(&mut self, within_key_pos_normalized: &Vec2, key_label: char, device: usize) {
if let Some(pos) = self.keyboard_gird.key_positions.get(&key_label.to_ascii_lowercase()) {
if self.first_swipe_char != char::default() && self.first_swipe_char != key_label.to_ascii_lowercase() {
self.swipe_left_first_key = true;
@ -122,9 +126,14 @@ impl SwipeTypingManager {
//println!("char : {key_label} at pos: {key_pos}");
let start_time = match self.swipe_start_time {
Some(time) => time,
None => self.start_swipe(key_label)
None => self.start_swipe(key_label, device)
};
// only allow the pointer that started the swipe to contribute to it
if let Some(current_device) = self.current_swipe_device && current_device != device{
return;
}
let within_key_pos_from_center = Vec2 {
x: within_key_pos_normalized.x - 0.5,
y: 0.5 - within_key_pos_normalized.y,