Prevent ArenaRef from being cloned

This commit is contained in:
Antonio Scandurra 2023-12-20 17:32:59 +01:00
parent 229b5aa8f7
commit 6e2346c537
3 changed files with 46 additions and 25 deletions

View file

@ -1572,30 +1572,43 @@ impl<'a> WindowContext<'a> {
self.propagate_event = true;
for node_id in &dispatch_path {
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
if let Some(context) = node.context.clone() {
context_stack.push(context);
}
for key_listener in node.key_listeners.clone() {
let key_listeners = mem::take(&mut node.key_listeners);
for key_listener in &key_listeners {
key_listener(event, DispatchPhase::Capture, self);
if !self.propagate_event {
return;
break;
}
}
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
node.key_listeners = key_listeners;
if !self.propagate_event {
return;
}
}
// Bubble phase
for node_id in dispatch_path.iter().rev() {
// Handle low level key events
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
for key_listener in node.key_listeners.clone() {
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
let key_listeners = mem::take(&mut node.key_listeners);
for key_listener in &key_listeners {
key_listener(event, DispatchPhase::Bubble, self);
if !self.propagate_event {
return;
break;
}
}
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
node.key_listeners = key_listeners;
if !self.propagate_event {
return;
}
// Match keystrokes
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
@ -1639,38 +1652,52 @@ impl<'a> WindowContext<'a> {
// Capture phase
for node_id in &dispatch_path {
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
let action_listeners = mem::take(&mut node.action_listeners);
for DispatchActionListener {
action_type,
listener,
} in node.action_listeners.clone()
} in &action_listeners
{
let any_action = action.as_any();
if action_type == any_action.type_id() {
if *action_type == any_action.type_id() {
listener(any_action, DispatchPhase::Capture, self);
if !self.propagate_event {
return;
break;
}
}
}
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
node.action_listeners = action_listeners;
if !self.propagate_event {
return;
}
}
// Bubble phase
for node_id in dispatch_path.iter().rev() {
let node = self.window.rendered_frame.dispatch_tree.node(*node_id);
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
let action_listeners = mem::take(&mut node.action_listeners);
for DispatchActionListener {
action_type,
listener,
} in node.action_listeners.clone()
} in &action_listeners
{
let any_action = action.as_any();
if action_type == any_action.type_id() {
if *action_type == any_action.type_id() {
self.propagate_event = false; // Actions stop propagation by default during the bubble phase
listener(any_action, DispatchPhase::Bubble, self);
if !self.propagate_event {
return;
break;
}
}
}
let node = self.window.rendered_frame.dispatch_tree.node_mut(*node_id);
node.action_listeners = action_listeners;
if !self.propagate_event {
return;
}
}
}