avm2: Make event construction take an `EventData` parameter.
This also necessitated the introduction of a `FullScreenEvent` data type.
This commit is contained in:
parent
43161976c7
commit
016cd6ccc0
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue