From 016cd6ccc0a7d2afb06e784194f61fbce2979880 Mon Sep 17 00:00:00 2001 From: David Wendt Date: Tue, 30 Nov 2021 21:58:47 -0500 Subject: [PATCH] avm2: Make event construction take an `EventData` parameter. This also necessitated the introduction of a `FullScreenEvent` data type. --- core/src/avm2.rs | 2 +- core/src/avm2/events.rs | 10 +++++++--- core/src/avm2/object/event_object.rs | 4 ++-- core/src/backend/audio.rs | 3 ++- core/src/display_object.rs | 10 +++++----- core/src/display_object/container.rs | 10 +++++----- core/src/display_object/stage.rs | 15 +++++++++++---- 7 files changed, 33 insertions(+), 21 deletions(-) diff --git a/core/src/avm2.rs b/core/src/avm2.rs index 97ad388f1..2852e83c6 100644 --- a/core/src/avm2.rs +++ b/core/src/avm2.rs @@ -46,7 +46,7 @@ mod vtable; pub use crate::avm2::activation::Activation; pub use crate::avm2::array::ArrayStorage; 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::object::{ ArrayObject, ClassObject, Object, ScriptObject, SoundChannelObject, StageObject, TObject, diff --git a/core/src/avm2/events.rs b/core/src/avm2/events.rs index 92c6a5a18..6dc82df68 100644 --- a/core/src/avm2/events.rs +++ b/core/src/avm2/events.rs @@ -7,8 +7,8 @@ use crate::avm2::value::Value; use crate::avm2::Error; use crate::display_object::{DisplayObject, TDisplayObject}; use crate::string::AvmString; -use fnv::FnvHashMap; use bitflags::bitflags; +use fnv::FnvHashMap; use gc_arena::Collect; use std::collections::BTreeMap; use std::hash::{Hash, Hasher}; @@ -63,6 +63,10 @@ bitflags! { #[collect(no_drop)] pub enum EventData<'gc> { Event, + FullScreenEvent { + full_screen: bool, + interactive: bool, + }, MouseEvent { local_x: f64, local_y: f64, @@ -110,7 +114,7 @@ pub struct Event<'gc> { impl<'gc> Event<'gc> { /// Construct a new event of a given type. - pub fn new(event_type: S) -> Self + pub fn new(event_type: S, event_data: EventData<'gc>) -> Self where S: Into>, { @@ -123,7 +127,7 @@ impl<'gc> Event<'gc> { event_phase: EventPhase::AtTarget, target: None, event_type: event_type.into(), - event_data: EventData::Event, + event_data, } } diff --git a/core/src/avm2/object/event_object.rs b/core/src/avm2/object/event_object.rs index 606e41f88..3a81de9ff 100644 --- a/core/src/avm2/object/event_object.rs +++ b/core/src/avm2/object/event_object.rs @@ -1,7 +1,7 @@ //! Object representation for events 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::{ClassObject, Object, ObjectPtr, TObject}; use crate::avm2::value::Value; @@ -22,7 +22,7 @@ pub fn event_allocator<'gc>( activation.context.gc_context, EventObjectData { base, - event: Event::new(""), + event: Event::new("", EventData::Event), }, )) .into()) diff --git a/core/src/backend/audio.rs b/core/src/backend/audio.rs index 78ddcb331..8f5951994 100644 --- a/core/src/backend/audio.rs +++ b/core/src/backend/audio.rs @@ -1,6 +1,7 @@ use crate::{ avm1::SoundObject, avm2::Event as Avm2Event, + avm2::EventData as Avm2EventData, avm2::SoundChannelObject, display_object::{self, DisplayObject, MovieClip, TDisplayObject}, }; @@ -313,7 +314,7 @@ impl<'gc> AudioManager<'gc> { action_queue.queue_actions( root, crate::context::ActionType::Event2 { - event: Avm2Event::new("soundComplete"), + event: Avm2Event::new("soundComplete", Avm2EventData::Event), target: object.into(), }, false, diff --git a/core/src/display_object.rs b/core/src/display_object.rs index 476a4619e..552627c44 100644 --- a/core/src/display_object.rs +++ b/core/src/display_object.rs @@ -3,8 +3,8 @@ use crate::avm1::{ }; use crate::avm2::{ Activation as Avm2Activation, Avm2, Error as Avm2Error, Event as Avm2Event, - Namespace as Avm2Namespace, Object as Avm2Object, QName as Avm2QName, TObject as Avm2TObject, - Value as Avm2Value, + EventData as Avm2EventData, Namespace as Avm2Namespace, Object as Avm2Object, + QName as Avm2QName, TObject as Avm2TObject, Value as Avm2Value, }; use crate::context::{RenderContext, UpdateContext}; use crate::drawing::Drawing; @@ -1027,7 +1027,7 @@ pub trait TDisplayObject<'gc>: /// Emit an `enterFrame` event on this DisplayObject and any children it /// may have. 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_cancelable(false); @@ -1073,7 +1073,7 @@ pub trait TDisplayObject<'gc>: /// Emit a `frameConstructed` event on this DisplayObject and any children it /// may have. 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_cancelable(false); @@ -1098,7 +1098,7 @@ pub trait TDisplayObject<'gc>: /// Emit an `exitFrame` broadcast event. 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_cancelable(false); diff --git a/core/src/display_object/container.rs b/core/src/display_object/container.rs index ac80174fe..f270280d4 100644 --- a/core/src/display_object/container.rs +++ b/core/src/display_object/container.rs @@ -1,6 +1,6 @@ //! 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::display_object::avm1_button::Avm1Button; use crate::display_object::movie_clip::MovieClip; @@ -22,7 +22,7 @@ pub fn dispatch_removed_from_stage_event<'gc>( context: &mut UpdateContext<'_, 'gc, '_>, ) { 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_cancelable(false); @@ -45,7 +45,7 @@ pub fn dispatch_removed_event<'gc>( context: &mut UpdateContext<'_, 'gc, '_>, ) { 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_cancelable(false); @@ -65,7 +65,7 @@ pub fn dispatch_added_to_stage_event_only<'gc>( context: &mut UpdateContext<'_, 'gc, '_>, ) { 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_cancelable(false); @@ -97,7 +97,7 @@ pub fn dispatch_added_event_only<'gc>( context: &mut UpdateContext<'_, 'gc, '_>, ) { 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_cancelable(false); diff --git a/core/src/display_object/stage.rs b/core/src/display_object/stage.rs index a5efdd9b7..24de61e38 100644 --- a/core/src/display_object/stage.rs +++ b/core/src/display_object/stage.rs @@ -2,8 +2,9 @@ use crate::avm1::Object as Avm1Object; use crate::avm2::{ - Activation as Avm2Activation, Event as Avm2Event, Object as Avm2Object, - ScriptObject as Avm2ScriptObject, StageObject as Avm2StageObject, Value as Avm2Value, + Activation as Avm2Activation, Event as Avm2Event, EventData as Avm2EventData, + Object as Avm2Object, ScriptObject as Avm2ScriptObject, StageObject as Avm2StageObject, + Value as Avm2Value, }; use crate::config::Letterbox; use crate::context::{RenderContext, UpdateContext}; @@ -559,7 +560,7 @@ impl<'gc> Stage<'gc> { &[], ); } 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_cancelable(false); 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()], ); } 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_cancelable(false);