Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions core/src/display_object/movie_clip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3128,32 +3128,34 @@ impl<'gc> TInteractiveObject<'gc> for MovieClip<'gc> {
continue;
}

let mut res = if let Some(child) = child.as_interactive() {
let mut res = None;

if let Some(child) = child.as_interactive() {
if child.as_displayobject().movie().is_action_script_3() {
child.mouse_pick_avm2(context, point, require_button_mode)
} else {
let avm1_result =
child.mouse_pick_avm1(context, point, require_button_mode);
if let Some(result) = avm1_result {
Avm2MousePick::Hit(result)
res = Some(child.mouse_pick_avm2(context, point, require_button_mode));
} else if let Some(result) =
child.mouse_pick_avm1(context, point, require_button_mode)
{
res = Some(Avm2MousePick::Hit(result));
}
}

let mut res = res.unwrap_or_else(|| {
if child.hit_test_shape(context, point, options)
&& child
.masker()
.map(|mask| mask.hit_test_shape(context, point, options))
.unwrap_or(true)
{
if self.mouse_enabled() {
Avm2MousePick::Hit(this)
} else {
Avm2MousePick::Miss
Avm2MousePick::PropagateToParent
}
}
} else if child.hit_test_shape(context, point, options)
&& child
.masker()
.map(|mask| mask.hit_test_shape(context, point, options))
.unwrap_or(true)
{
if self.mouse_enabled() {
Avm2MousePick::Hit(this)
} else {
Avm2MousePick::PropagateToParent
Avm2MousePick::Miss
}
} else {
Avm2MousePick::Miss
};
});

while let Some((clip, clip_range)) = clip_layers.peek() {
// This clip layer no longer applies to the remaining children (which all have lower depth values).
Expand Down
50 changes: 50 additions & 0 deletions tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/Test.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package {

import flash.display.MovieClip;
import flash.display.Loader;
import flash.events.Event;
import flash.events.FocusEvent;
import flash.net.URLRequest;
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class Test extends MovieClip {

var avm1Loader:Loader = new Loader();

var avm1Container:Sprite = new Sprite();

public function Test() {
super();

avm1Container.name = "avm1Container";
addChild(avm1Container);

avm1Loader.contentLoaderInfo.addEventListener("complete", onAVM1Loaded);
avm1Loader.load(new URLRequest("avm1.swf"));

stage.addEventListener("click", function(e) {
trace("Clicked on:", e.target, "(" + e.target.name + ")");
});

stage.addEventListener("keyDown", onKeyPress);
}

public function onKeyPress(e:KeyboardEvent) {
if (e.keyCode == Keyboard.SHIFT) {
avm1Container.mouseEnabled = !avm1Container.mouseEnabled;
trace("avm1Container.mouseEnabled is now", avm1Container.mouseEnabled);
} else if (e.keyCode == Keyboard.SPACE) {
avm1Container.mouseChildren = !avm1Container.mouseChildren;
trace("avm1Container.mouseChildren is now", avm1Container.mouseChildren);
}
}

public function onAVM1Loaded(e:Event):void {
avm1Container.addChild(avm1Loader.content);
}

}

}
Binary file not shown.
Binary file not shown.
51 changes: 51 additions & 0 deletions tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/input.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[
{ "type": "Wait" },
{ "type": "Wait" },

{ "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" },
{ "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" },
{ "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" },
{ "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" },
{ "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" },
{ "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" },
{ "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" },

{ "type": "KeyDown", "key": "Space" },

{ "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" },
{ "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" },
{ "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" },
{ "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" },
{ "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" },
{ "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" },
{ "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" },

{ "type": "KeyDown", "key": "Space" },
{ "type": "KeyDown", "key": "LeftShift" },

{ "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" },
{ "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" },
{ "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" },
{ "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" },
{ "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" },
{ "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" },
{ "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" },

{ "type": "KeyDown", "key": "Space" },

{ "type": "MouseDown", "pos": [90, 190], "btn": "Left" }, { "type": "MouseUp", "pos": [90, 190], "btn": "Left" },
{ "type": "MouseDown", "pos": [155, 175], "btn": "Left" }, { "type": "MouseUp", "pos": [155, 175], "btn": "Left" },
{ "type": "MouseDown", "pos": [160, 140], "btn": "Left" }, { "type": "MouseUp", "pos": [160, 140], "btn": "Left" },
{ "type": "MouseDown", "pos": [140, 230], "btn": "Left" }, { "type": "MouseUp", "pos": [140, 230], "btn": "Left" },
{ "type": "MouseDown", "pos": [290, 90], "btn": "Left" }, { "type": "MouseUp", "pos": [290, 90], "btn": "Left" },
{ "type": "MouseDown", "pos": [350, 125], "btn": "Left" }, { "type": "MouseUp", "pos": [350, 125], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 200], "btn": "Left" },
{ "type": "MouseDown", "pos": [275, 240], "btn": "Left" }, { "type": "MouseUp", "pos": [275, 240], "btn": "Left" },
{ "type": "MouseDown", "pos": [130, 200], "btn": "Left" }, { "type": "MouseUp", "pos": [130, 200], "btn": "Left" }
]
42 changes: 42 additions & 0 deletions tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
input_txt.onSetFocus
input_txt.onKillFocus
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object Stage] (null)
avm1 button clicked
avm1 button clicked
Clicked on: [object Sprite] (avm1Container)
avm1Container.mouseChildren is now false
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object Stage] (null)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
Clicked on: [object Sprite] (avm1Container)
avm1Container.mouseChildren is now true
avm1Container.mouseEnabled is now false
Clicked on: [object Stage] (null)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
input_txt.onSetFocus
input_txt.onKillFocus
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object Stage] (null)
avm1 button clicked
avm1 button clicked
Clicked on: [object MovieClip] (rect_mc)
avm1Container.mouseChildren is now false
Clicked on: [object Stage] (null)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object Stage] (null)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
Clicked on: [object MovieClip] (rect_mc)
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions tests/tests/swfs/avm2/mouse_pick_mixed_avm_swf9/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
num_ticks = 3
Loading