web: Inline all the Closures for JsCallback::register

This commit is contained in:
Nathan Adams 2024-06-02 00:11:35 +02:00
parent e7fc1a7a4d
commit a9c5928b62
1 changed files with 185 additions and 205 deletions

View File

@ -847,289 +847,269 @@ impl RuffleHandle {
}));
// Create mouse move handler.
let mouse_move_callback = Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let event = PlayerEvent::MouseMove {
x: f64::from(js_event.offset_x()) * instance.device_pixel_ratio,
y: f64::from(js_event.offset_y()) * instance.device_pixel_ratio,
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
if instance.has_focus {
js_event.prevent_default();
}
});
});
instance.mouse_move_callback = Some(JsCallback::register(
&canvas,
"pointermove",
mouse_move_callback,
Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let event = PlayerEvent::MouseMove {
x: f64::from(js_event.offset_x()) * instance.device_pixel_ratio,
y: f64::from(js_event.offset_y()) * instance.device_pixel_ratio,
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
if instance.has_focus {
js_event.prevent_default();
}
});
}),
false,
));
// Create mouse enter handler.
let mouse_enter_callback = Closure::new(move |_js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let _ = instance.with_core_mut(|core| {
core.set_mouse_in_stage(true);
});
});
});
instance.mouse_enter_callback = Some(JsCallback::register(
&canvas,
"pointerenter",
mouse_enter_callback,
Closure::new(move |_js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let _ = instance.with_core_mut(|core| {
core.set_mouse_in_stage(true);
});
});
}),
false,
));
// Create mouse leave handler.
let mouse_leave_callback = Closure::new(move |_js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let _ = instance.with_core_mut(|core| {
core.set_mouse_in_stage(false);
core.handle_event(PlayerEvent::MouseLeave);
});
});
});
instance.mouse_leave_callback = Some(JsCallback::register(
&canvas,
"pointerleave",
mouse_leave_callback,
Closure::new(move |_js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
let _ = instance.with_core_mut(|core| {
core.set_mouse_in_stage(false);
core.handle_event(PlayerEvent::MouseLeave);
});
});
}),
false,
));
// Create mouse down handler.
let mouse_down_callback = Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
if let Some(target) = js_event.current_target() {
let _ = target
.unchecked_ref::<Element>()
.set_pointer_capture(js_event.pointer_id());
}
let device_pixel_ratio = instance.device_pixel_ratio;
let event = PlayerEvent::MouseDown {
x: f64::from(js_event.offset_x()) * device_pixel_ratio,
y: f64::from(js_event.offset_y()) * device_pixel_ratio,
button: match js_event.button() {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
_ => MouseButton::Unknown,
},
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
js_event.prevent_default();
});
});
instance.mouse_down_callback = Some(JsCallback::register(
&canvas,
"pointerdown",
mouse_down_callback,
Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(move |instance| {
if let Some(target) = js_event.current_target() {
let _ = target
.unchecked_ref::<Element>()
.set_pointer_capture(js_event.pointer_id());
}
let device_pixel_ratio = instance.device_pixel_ratio;
let event = PlayerEvent::MouseDown {
x: f64::from(js_event.offset_x()) * device_pixel_ratio,
y: f64::from(js_event.offset_y()) * device_pixel_ratio,
button: match js_event.button() {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
_ => MouseButton::Unknown,
},
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
js_event.prevent_default();
});
}),
false,
));
// Create player mouse down handler.
let player_mouse_down_callback = Closure::new(move |_js_event| {
let _ = ruffle.with_instance_mut(|instance| {
instance.has_focus = true;
// Ensure the parent window gets focus. This is necessary for events
// to be received when the player is inside a frame.
instance.window.focus().warn_on_error();
});
});
instance.player_mouse_down_callback = Some(JsCallback::register(
&js_player,
"pointerdown",
player_mouse_down_callback,
Closure::new(move |_js_event| {
let _ = ruffle.with_instance_mut(|instance| {
instance.has_focus = true;
// Ensure the parent window gets focus. This is necessary for events
// to be received when the player is inside a frame.
instance.window.focus().warn_on_error();
});
}),
false,
));
// Create window mouse down handler.
let window_mouse_down_callback = Closure::new(move |_js_event| {
let _ = ruffle.with_instance_mut(|instance| {
// If we actually clicked on the player, this will be reset to true
// after the event bubbles down to the player.
instance.has_focus = false;
});
});
instance.window_mouse_down_callback = Some(JsCallback::register(
&window,
"pointerdown",
window_mouse_down_callback,
Closure::new(move |_js_event| {
let _ = ruffle.with_instance_mut(|instance| {
// If we actually clicked on the player, this will be reset to true
// after the event bubbles down to the player.
instance.has_focus = false;
});
}),
true, // Use capture so this first *before* the player mouse down handler.
));
// Create mouse up handler.
let mouse_up_callback = Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(|instance| {
if let Some(target) = js_event.current_target() {
let _ = target
.unchecked_ref::<Element>()
.release_pointer_capture(js_event.pointer_id());
}
let event = PlayerEvent::MouseUp {
x: f64::from(js_event.offset_x()) * instance.device_pixel_ratio,
y: f64::from(js_event.offset_y()) * instance.device_pixel_ratio,
button: match js_event.button() {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
_ => MouseButton::Unknown,
},
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
if instance.has_focus {
js_event.prevent_default();
}
});
});
instance.mouse_up_callback = Some(JsCallback::register(
&canvas,
"pointerup",
mouse_up_callback,
Closure::new(move |js_event: PointerEvent| {
let _ = ruffle.with_instance(|instance| {
if let Some(target) = js_event.current_target() {
let _ = target
.unchecked_ref::<Element>()
.release_pointer_capture(js_event.pointer_id());
}
let event = PlayerEvent::MouseUp {
x: f64::from(js_event.offset_x()) * instance.device_pixel_ratio,
y: f64::from(js_event.offset_y()) * instance.device_pixel_ratio,
button: match js_event.button() {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
_ => MouseButton::Unknown,
},
};
let _ = instance.with_core_mut(|core| {
core.handle_event(event);
});
if instance.has_focus {
js_event.prevent_default();
}
});
}),
false,
));
// Create mouse wheel handler.
let mouse_wheel_callback = Closure::new(move |js_event: WheelEvent| {
let _ = ruffle.with_instance(|instance| {
let delta = match js_event.delta_mode() {
WheelEvent::DOM_DELTA_LINE => MouseWheelDelta::Lines(-js_event.delta_y()),
WheelEvent::DOM_DELTA_PIXEL => MouseWheelDelta::Pixels(-js_event.delta_y()),
_ => return,
};
let _ = instance.with_core_mut(|core| {
core.handle_event(PlayerEvent::MouseWheel { delta });
if core.should_prevent_scrolling() {
js_event.prevent_default();
}
});
});
});
instance.mouse_wheel_callback = Some(JsCallback::register(
&canvas,
"wheel",
mouse_wheel_callback,
Closure::new(move |js_event: WheelEvent| {
let _ = ruffle.with_instance(|instance| {
let delta = match js_event.delta_mode() {
WheelEvent::DOM_DELTA_LINE => {
MouseWheelDelta::Lines(-js_event.delta_y())
}
WheelEvent::DOM_DELTA_PIXEL => {
MouseWheelDelta::Pixels(-js_event.delta_y())
}
_ => return,
};
let _ = instance.with_core_mut(|core| {
core.handle_event(PlayerEvent::MouseWheel { delta });
if core.should_prevent_scrolling() {
js_event.prevent_default();
}
});
});
}),
false,
));
// Create keydown event handler.
let key_down_callback = Closure::new(move |js_event: KeyboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let mut paste_event = false;
let _ = instance.with_core_mut(|core| {
let key_code = web_to_ruffle_key_code(&js_event.code());
let key_char = web_key_to_codepoint(&js_event.key());
let is_ctrl_cmd = js_event.ctrl_key() || js_event.meta_key();
core.handle_event(PlayerEvent::KeyDown { key_code, key_char });
if let Some(control_code) = web_to_ruffle_text_control(
&js_event.key(),
is_ctrl_cmd,
js_event.shift_key(),
) {
paste_event = control_code == TextControlCode::Paste;
// The JS paste event fires separately and the clipboard text is not available until then,
// so we need to wait before handling it
if !paste_event {
core.handle_event(PlayerEvent::TextControl {
code: control_code,
});
}
} else if let Some(codepoint) = key_char {
core.handle_event(PlayerEvent::TextInput { codepoint });
}
});
// Don't prevent the JS paste event from firing
if !paste_event {
js_event.prevent_default();
}
}
});
});
instance.key_down_callback = Some(JsCallback::register(
&window,
"keydown",
key_down_callback,
Closure::new(move |js_event: KeyboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let mut paste_event = false;
let _ = instance.with_core_mut(|core| {
let key_code = web_to_ruffle_key_code(&js_event.code());
let key_char = web_key_to_codepoint(&js_event.key());
let is_ctrl_cmd = js_event.ctrl_key() || js_event.meta_key();
core.handle_event(PlayerEvent::KeyDown { key_code, key_char });
if let Some(control_code) = web_to_ruffle_text_control(
&js_event.key(),
is_ctrl_cmd,
js_event.shift_key(),
) {
paste_event = control_code == TextControlCode::Paste;
// The JS paste event fires separately and the clipboard text is not available until then,
// so we need to wait before handling it
if !paste_event {
core.handle_event(PlayerEvent::TextControl {
code: control_code,
});
}
} else if let Some(codepoint) = key_char {
core.handle_event(PlayerEvent::TextInput { codepoint });
}
});
// Don't prevent the JS paste event from firing
if !paste_event {
js_event.prevent_default();
}
}
});
}),
false,
));
let paste_callback = Closure::new(move |js_event: ClipboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let _ = instance.with_core_mut(|core| {
let clipboard_content = if let Some(content) = js_event.clipboard_data()
{
content.get_data("text/plain").unwrap_or_default()
} else {
"".into()
};
core.ui_mut().set_clipboard_content(clipboard_content);
core.handle_event(PlayerEvent::TextControl {
code: TextControlCode::Paste,
});
});
js_event.prevent_default();
}
});
});
instance.paste_callback = Some(JsCallback::register(
&window,
"paste",
paste_callback,
Closure::new(move |js_event: ClipboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let _ = instance.with_core_mut(|core| {
let clipboard_content =
if let Some(content) = js_event.clipboard_data() {
content.get_data("text/plain").unwrap_or_default()
} else {
"".into()
};
core.ui_mut().set_clipboard_content(clipboard_content);
core.handle_event(PlayerEvent::TextControl {
code: TextControlCode::Paste,
});
});
js_event.prevent_default();
}
});
}),
false,
));
// Create keyup event handler.
let key_up_callback = Closure::new(move |js_event: KeyboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let _ = instance.with_core_mut(|core| {
let key_code = web_to_ruffle_key_code(&js_event.code());
let key_char = web_key_to_codepoint(&js_event.key());
core.handle_event(PlayerEvent::KeyUp { key_code, key_char });
});
js_event.prevent_default();
}
});
});
instance.key_up_callback = Some(JsCallback::register(
&window,
"keyup",
key_up_callback,
Closure::new(move |js_event: KeyboardEvent| {
let _ = ruffle.with_instance(|instance| {
if instance.has_focus {
let _ = instance.with_core_mut(|core| {
let key_code = web_to_ruffle_key_code(&js_event.code());
let key_char = web_key_to_codepoint(&js_event.key());
core.handle_event(PlayerEvent::KeyUp { key_code, key_char });
});
js_event.prevent_default();
}
});
}),
false,
));
let unload_callback = Closure::new(move |_| {
let _ = ruffle.with_core_mut(|core| {
core.flush_shared_objects();
});
});
instance.unload_callback = Some(JsCallback::register(
&window,
"unload",
unload_callback,
Closure::new(move |_| {
let _ = ruffle.with_core_mut(|core| {
core.flush_shared_objects();
});
}),
false,
));
})?;