From 5e12666b8fd4a3e7d93d26000c00eaea00820273 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Sat, 1 Oct 2022 11:11:30 +0000 Subject: [PATCH] layout: Pressed buttons are now a list of indices This makes it possible to copy layout state wholesale, as well as to drop shared state of keys. --- src/layout.rs | 213 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 140 insertions(+), 73 deletions(-) diff --git a/src/layout.rs b/src/layout.rs index a68a480e..dc41d5c0 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -238,16 +238,20 @@ pub mod c { // The list must be copied, // because it will be mutated in the loop - for key in layout.state.pressed_keys.clone() { - let key: &Rc> = key.borrow(); - seat::handle_release_key( - layout, - &mut submission, - Some(&ui_backend), - time, - Some((&popover_state, app_state.clone())), - key, - ); + for button in layout.state.pressed_buttons.clone() { + if let Some(key) = layout.shape.get_key(&button).map(|k| k.clone()) { + seat::handle_release_key( + layout, + &mut submission, + Some(&ui_backend), + time, + Some((&popover_state, app_state.clone())), + &key, + button, + ); + } else { + log_print!(logging::Level::Bug, "Failed to find button at position {:?}", button); + } } drawing::queue_redraw(ui_keyboard); } @@ -265,16 +269,21 @@ pub mod c { let mut submission = submission.borrow_mut(); // The list must be copied, // because it will be mutated in the loop - for key in layout.state.pressed_keys.clone() { - let key: &Rc> = key.borrow(); - seat::handle_release_key( - layout, - &mut submission, - None, // don't update UI - Timestamp(time), - None, // don't switch layouts - &mut key.clone(), - ); + for button in layout.state.pressed_buttons.clone() { + if let Some(key) = layout.shape.get_key(&button) { + let key: &Rc> = key.borrow(); + seat::handle_release_key( + layout, + &mut submission, + None, // don't update UI + Timestamp(time), + None, // don't switch layouts + &mut key.clone(), + button, + ); + } else { + log_print!(logging::Level::Bug, "Failed to find button at position {:?}", button); + } } } @@ -296,14 +305,20 @@ pub mod c { ); let state = layout.find_button_by_position(point) - .map(|place| place.button.state.clone()); + .map(|(place, index)| (place.button.state.clone(), index)); - if let Some(state) = state { + if let Some((state, (row, position_in_row))) = state { + let button = ButtonPosition { + view: layout.state.current_view.clone(), + row, + position_in_row, + }; seat::handle_press_key( layout, &mut submission, Timestamp(time), &state, + button, ); // maybe TODO: draw on the display buffer here drawing::queue_redraw(ui_keyboard); @@ -344,39 +359,48 @@ pub mod c { Point { x: x_widget, y: y_widget } ); - let pressed = layout.state.pressed_keys.clone(); + let pressed = layout.state.pressed_buttons.clone(); let button_info = { let place = layout.find_button_by_position(point); - place.map(|place| {( + place.map(|(place, index)| {( place.button.state.clone(), - place.button.clone(), - place.offset, + index, )}) }; - if let Some((state, _button, _view_position)) = button_info { + if let Some((state, (row, position_in_row))) = button_info { let mut found = false; - for wrapped_key in pressed { - let key: &Rc> = wrapped_key.borrow(); - if Rc::ptr_eq(&state, &wrapped_key.0) { - found = true; + for button in pressed { + if let Some(key) = layout.shape.get_key(&button).map(|k| k.clone()) { + if Rc::ptr_eq(&state, &key) { + found = true; + } else { + seat::handle_release_key( + layout, + &mut submission, + Some(&ui_backend), + time, + Some((&popover_state, app_state.clone())), + &key, + button, + ); + } } else { - seat::handle_release_key( - layout, - &mut submission, - Some(&ui_backend), - time, - Some((&popover_state, app_state.clone())), - key, - ); + log_print!(logging::Level::Bug, "Failed to find button at position {:?}", button); } } if !found { + let button = ButtonPosition { + view: layout.state.current_view.clone(), + row, + position_in_row, + }; seat::handle_press_key( layout, &mut submission, time, &state, + button, ); // maybe TODO: draw on the display buffer here unsafe { @@ -384,16 +408,20 @@ pub mod c { } } } else { - for wrapped_key in pressed { - let key: &Rc> = wrapped_key.borrow(); - seat::handle_release_key( - layout, - &mut submission, - Some(&ui_backend), - time, - Some((&popover_state, app_state.clone())), - key, - ); + for button in pressed { + if let Some(key) = layout.shape.get_key(&button).map(|k| k.clone()) { + seat::handle_release_key( + layout, + &mut submission, + Some(&ui_backend), + time, + Some((&popover_state, app_state.clone())), + &key, + button, + ); + } else { + log_print!(logging::Level::Bug, "Failed to find button at position {:?}", button); + } } } drawing::queue_redraw(ui_keyboard); @@ -509,8 +537,9 @@ impl Row { } /// Finds the first button that covers the specified point - /// relative to row's position's origin - fn find_button_by_position(&self, x: f64) -> &(f64, Box