avm2: Make event construction take an `EventData` parameter.

This also necessitated the introduction of a `FullScreenEvent` data type.
This commit is contained in:
David Wendt 2021-11-30 21:58:47 -05:00 committed by Mike Welsh
parent 43161976c7
commit 016cd6ccc0
7 changed files with 33 additions and 21 deletions

View File

@ -46,7 +46,7 @@ mod vtable;
pub use crate::avm2::activation::Activation; pub use crate::avm2::activation::Activation;
pub use crate::avm2::array::ArrayStorage; pub use crate::avm2::array::ArrayStorage;
pub use crate::avm2::domain::Domain; pub use crate::avm2::domain::Domain;
pub use crate::avm2::events::Event; pub use crate::avm2::events::{Event, EventData};
pub use crate::avm2::names::{Namespace, QName}; pub use crate::avm2::names::{Namespace, QName};
pub use crate::avm2::object::{ pub use crate::avm2::object::{
ArrayObject, ClassObject, Object, ScriptObject, SoundChannelObject, StageObject, TObject, ArrayObject, ClassObject, Object, ScriptObject, SoundChannelObject, StageObject, TObject,

View File

@ -7,8 +7,8 @@ use crate::avm2::value::Value;
use crate::avm2::Error; use crate::avm2::Error;
use crate::display_object::{DisplayObject, TDisplayObject}; use crate::display_object::{DisplayObject, TDisplayObject};
use crate::string::AvmString; use crate::string::AvmString;
use fnv::FnvHashMap;
use bitflags::bitflags; use bitflags::bitflags;
use fnv::FnvHashMap;
use gc_arena::Collect; use gc_arena::Collect;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
@ -63,6 +63,10 @@ bitflags! {
#[collect(no_drop)] #[collect(no_drop)]
pub enum EventData<'gc> { pub enum EventData<'gc> {
Event, Event,
FullScreenEvent {
full_screen: bool,
interactive: bool,
},
MouseEvent { MouseEvent {
local_x: f64, local_x: f64,
local_y: f64, local_y: f64,
@ -110,7 +114,7 @@ pub struct Event<'gc> {
impl<'gc> Event<'gc> { impl<'gc> Event<'gc> {
/// Construct a new event of a given type. /// Construct a new event of a given type.
pub fn new<S>(event_type: S) -> Self pub fn new<S>(event_type: S, event_data: EventData<'gc>) -> Self
where where
S: Into<AvmString<'gc>>, S: Into<AvmString<'gc>>,
{ {
@ -123,7 +127,7 @@ impl<'gc> Event<'gc> {
event_phase: EventPhase::AtTarget, event_phase: EventPhase::AtTarget,
target: None, target: None,
event_type: event_type.into(), event_type: event_type.into(),
event_data: EventData::Event, event_data,
} }
} }

View File

@ -1,7 +1,7 @@
//! Object representation for events //! Object representation for events
use crate::avm2::activation::Activation; use crate::avm2::activation::Activation;
use crate::avm2::events::Event; use crate::avm2::events::{Event, EventData};
use crate::avm2::object::script_object::ScriptObjectData; use crate::avm2::object::script_object::ScriptObjectData;
use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject}; use crate::avm2::object::{ClassObject, Object, ObjectPtr, TObject};
use crate::avm2::value::Value; use crate::avm2::value::Value;
@ -22,7 +22,7 @@ pub fn event_allocator<'gc>(
activation.context.gc_context, activation.context.gc_context,
EventObjectData { EventObjectData {
base, base,
event: Event::new(""), event: Event::new("", EventData::Event),
}, },
)) ))
.into()) .into())

View File

@ -1,6 +1,7 @@
use crate::{ use crate::{
avm1::SoundObject, avm1::SoundObject,
avm2::Event as Avm2Event, avm2::Event as Avm2Event,
avm2::EventData as Avm2EventData,
avm2::SoundChannelObject, avm2::SoundChannelObject,
display_object::{self, DisplayObject, MovieClip, TDisplayObject}, display_object::{self, DisplayObject, MovieClip, TDisplayObject},
}; };
@ -313,7 +314,7 @@ impl<'gc> AudioManager<'gc> {
action_queue.queue_actions( action_queue.queue_actions(
root, root,
crate::context::ActionType::Event2 { crate::context::ActionType::Event2 {
event: Avm2Event::new("soundComplete"), event: Avm2Event::new("soundComplete", Avm2EventData::Event),
target: object.into(), target: object.into(),
}, },
false, false,

View File

@ -3,8 +3,8 @@ use crate::avm1::{
}; };
use crate::avm2::{ use crate::avm2::{
Activation as Avm2Activation, Avm2, Error as Avm2Error, Event as Avm2Event, Activation as Avm2Activation, Avm2, Error as Avm2Error, Event as Avm2Event,
Namespace as Avm2Namespace, Object as Avm2Object, QName as Avm2QName, TObject as Avm2TObject, EventData as Avm2EventData, Namespace as Avm2Namespace, Object as Avm2Object,
Value as Avm2Value, QName as Avm2QName, TObject as Avm2TObject, Value as Avm2Value,
}; };
use crate::context::{RenderContext, UpdateContext}; use crate::context::{RenderContext, UpdateContext};
use crate::drawing::Drawing; use crate::drawing::Drawing;
@ -1027,7 +1027,7 @@ pub trait TDisplayObject<'gc>:
/// Emit an `enterFrame` event on this DisplayObject and any children it /// Emit an `enterFrame` event on this DisplayObject and any children it
/// may have. /// may have.
fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { fn enter_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) {
let mut enter_frame_evt = Avm2Event::new("enterFrame"); let mut enter_frame_evt = Avm2Event::new("enterFrame", Avm2EventData::Event);
enter_frame_evt.set_bubbles(false); enter_frame_evt.set_bubbles(false);
enter_frame_evt.set_cancelable(false); enter_frame_evt.set_cancelable(false);
@ -1073,7 +1073,7 @@ pub trait TDisplayObject<'gc>:
/// Emit a `frameConstructed` event on this DisplayObject and any children it /// Emit a `frameConstructed` event on this DisplayObject and any children it
/// may have. /// may have.
fn frame_constructed(&self, context: &mut UpdateContext<'_, 'gc, '_>) { fn frame_constructed(&self, context: &mut UpdateContext<'_, 'gc, '_>) {
let mut frame_constructed_evt = Avm2Event::new("frameConstructed"); let mut frame_constructed_evt = Avm2Event::new("frameConstructed", Avm2EventData::Event);
frame_constructed_evt.set_bubbles(false); frame_constructed_evt.set_bubbles(false);
frame_constructed_evt.set_cancelable(false); frame_constructed_evt.set_cancelable(false);
@ -1098,7 +1098,7 @@ pub trait TDisplayObject<'gc>:
/// Emit an `exitFrame` broadcast event. /// Emit an `exitFrame` broadcast event.
fn exit_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) { fn exit_frame(&self, context: &mut UpdateContext<'_, 'gc, '_>) {
let mut exit_frame_evt = Avm2Event::new("exitFrame"); let mut exit_frame_evt = Avm2Event::new("exitFrame", Avm2EventData::Event);
exit_frame_evt.set_bubbles(false); exit_frame_evt.set_bubbles(false);
exit_frame_evt.set_cancelable(false); exit_frame_evt.set_cancelable(false);

View File

@ -1,6 +1,6 @@
//! Container mix-in for display objects //! Container mix-in for display objects
use crate::avm2::{Avm2, Event as Avm2Event, Value as Avm2Value}; use crate::avm2::{Avm2, Event as Avm2Event, EventData as Avm2EventData, Value as Avm2Value};
use crate::context::{RenderContext, UpdateContext}; use crate::context::{RenderContext, UpdateContext};
use crate::display_object::avm1_button::Avm1Button; use crate::display_object::avm1_button::Avm1Button;
use crate::display_object::movie_clip::MovieClip; use crate::display_object::movie_clip::MovieClip;
@ -22,7 +22,7 @@ pub fn dispatch_removed_from_stage_event<'gc>(
context: &mut UpdateContext<'_, 'gc, '_>, context: &mut UpdateContext<'_, 'gc, '_>,
) { ) {
if let Avm2Value::Object(object) = child.object2() { if let Avm2Value::Object(object) = child.object2() {
let mut removed_evt = Avm2Event::new("removedFromStage"); let mut removed_evt = Avm2Event::new("removedFromStage", Avm2EventData::Event);
removed_evt.set_bubbles(false); removed_evt.set_bubbles(false);
removed_evt.set_cancelable(false); removed_evt.set_cancelable(false);
@ -45,7 +45,7 @@ pub fn dispatch_removed_event<'gc>(
context: &mut UpdateContext<'_, 'gc, '_>, context: &mut UpdateContext<'_, 'gc, '_>,
) { ) {
if let Avm2Value::Object(object) = child.object2() { if let Avm2Value::Object(object) = child.object2() {
let mut removed_evt = Avm2Event::new("removed"); let mut removed_evt = Avm2Event::new("removed", Avm2EventData::Event);
removed_evt.set_bubbles(true); removed_evt.set_bubbles(true);
removed_evt.set_cancelable(false); removed_evt.set_cancelable(false);
@ -65,7 +65,7 @@ pub fn dispatch_added_to_stage_event_only<'gc>(
context: &mut UpdateContext<'_, 'gc, '_>, context: &mut UpdateContext<'_, 'gc, '_>,
) { ) {
if let Avm2Value::Object(object) = child.object2() { if let Avm2Value::Object(object) = child.object2() {
let mut removed_evt = Avm2Event::new("addedToStage"); let mut removed_evt = Avm2Event::new("addedToStage", Avm2EventData::Event);
removed_evt.set_bubbles(false); removed_evt.set_bubbles(false);
removed_evt.set_cancelable(false); removed_evt.set_cancelable(false);
@ -97,7 +97,7 @@ pub fn dispatch_added_event_only<'gc>(
context: &mut UpdateContext<'_, 'gc, '_>, context: &mut UpdateContext<'_, 'gc, '_>,
) { ) {
if let Avm2Value::Object(object) = child.object2() { if let Avm2Value::Object(object) = child.object2() {
let mut removed_evt = Avm2Event::new("added"); let mut removed_evt = Avm2Event::new("added", Avm2EventData::Event);
removed_evt.set_bubbles(true); removed_evt.set_bubbles(true);
removed_evt.set_cancelable(false); removed_evt.set_cancelable(false);

View File

@ -2,8 +2,9 @@
use crate::avm1::Object as Avm1Object; use crate::avm1::Object as Avm1Object;
use crate::avm2::{ use crate::avm2::{
Activation as Avm2Activation, Event as Avm2Event, Object as Avm2Object, Activation as Avm2Activation, Event as Avm2Event, EventData as Avm2EventData,
ScriptObject as Avm2ScriptObject, StageObject as Avm2StageObject, Value as Avm2Value, Object as Avm2Object, ScriptObject as Avm2ScriptObject, StageObject as Avm2StageObject,
Value as Avm2Value,
}; };
use crate::config::Letterbox; use crate::config::Letterbox;
use crate::context::{RenderContext, UpdateContext}; use crate::context::{RenderContext, UpdateContext};
@ -559,7 +560,7 @@ impl<'gc> Stage<'gc> {
&[], &[],
); );
} else if let Avm2Value::Object(stage) = self.object2() { } else if let Avm2Value::Object(stage) = self.object2() {
let mut resized_event = Avm2Event::new("resize"); let mut resized_event = Avm2Event::new("resize", Avm2EventData::Event);
resized_event.set_bubbles(false); resized_event.set_bubbles(false);
resized_event.set_cancelable(false); resized_event.set_cancelable(false);
if let Err(e) = crate::avm2::Avm2::dispatch_event(context, resized_event, stage) { if let Err(e) = crate::avm2::Avm2::dispatch_event(context, resized_event, stage) {
@ -581,7 +582,13 @@ impl<'gc> Stage<'gc> {
&[self.is_fullscreen().into()], &[self.is_fullscreen().into()],
); );
} else if let Avm2Value::Object(stage) = self.object2() { } else if let Avm2Value::Object(stage) = self.object2() {
let mut full_screen_event = Avm2Event::new("fullScreen"); let mut full_screen_event = Avm2Event::new(
"fullScreen",
Avm2EventData::FullScreenEvent {
full_screen: self.is_fullscreen(),
interactive: true,
},
);
full_screen_event.set_bubbles(false); full_screen_event.set_bubbles(false);
full_screen_event.set_cancelable(false); full_screen_event.set_cancelable(false);