From 7289978fa99601b006b2b54d41ad486522119e5d Mon Sep 17 00:00:00 2001
From: Luigi Rosso <luigi.rosso@gmail.com>
Date: Sat, 18 Jun 2022 15:59:20 -0700
Subject: [PATCH] Adding support for align listener action.

---
 lib/src/core/core.dart                        |  2 +-
 .../state_machine_listener_importer.dart      | 13 +++---
 .../animation/listener_action_base.dart       | 13 ++++++
 .../animation/listener_align_target_base.dart | 45 +++++++++++++++++++
 .../animation/listener_bool_change_base.dart  |  8 +++-
 .../animation/listener_input_change_base.dart |  8 ++--
 .../listener_number_change_base.dart          |  8 +++-
 .../listener_trigger_change_base.dart         |  8 +++-
 lib/src/generated/rive_core_context.dart      | 16 +++++++
 lib/src/input_changes.dart                    | 21 ---------
 lib/src/listener_actions.dart                 | 20 +++++++++
 lib/src/rive_core/animation/interpolator.dart |  2 +
 .../rive_core/animation/listener_action.dart  | 30 +++++++++++++
 .../animation/listener_align_target.dart      | 31 +++++++++++++
 .../animation/listener_bool_change.dart       |  3 +-
 .../animation/listener_input_change.dart      | 14 +-----
 .../animation/listener_number_change.dart     |  3 +-
 .../animation/listener_trigger_change.dart    |  3 +-
 .../animation/state_machine_listener.dart     | 27 +++++------
 .../rive_core/state_machine_controller.dart   | 15 +++++--
 20 files changed, 220 insertions(+), 70 deletions(-)
 create mode 100644 lib/src/generated/animation/listener_action_base.dart
 create mode 100644 lib/src/generated/animation/listener_align_target_base.dart
 delete mode 100644 lib/src/input_changes.dart
 create mode 100644 lib/src/listener_actions.dart
 create mode 100644 lib/src/rive_core/animation/listener_action.dart
 create mode 100644 lib/src/rive_core/animation/listener_align_target.dart

diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart
index b10505c..f34d43b 100644
--- a/lib/src/core/core.dart
+++ b/lib/src/core/core.dart
@@ -23,7 +23,7 @@ export 'package:rive/src/core/importers/state_machine_layer_importer.dart';
 export 'package:rive/src/core/importers/state_machine_listener_importer.dart';
 export 'package:rive/src/core/importers/state_transition_importer.dart';
 export 'package:rive/src/generated/rive_core_context.dart';
-export 'package:rive/src/input_changes.dart';
+export 'package:rive/src/listener_actions.dart';
 export 'package:rive/src/runtime_artboard.dart';
 export 'package:rive/src/state_machine_components.dart';
 export 'package:rive/src/state_transition_conditions.dart';
diff --git a/lib/src/core/importers/state_machine_listener_importer.dart b/lib/src/core/importers/state_machine_listener_importer.dart
index 388a52f..0c8ce9d 100644
--- a/lib/src/core/importers/state_machine_listener_importer.dart
+++ b/lib/src/core/importers/state_machine_listener_importer.dart
@@ -1,14 +1,13 @@
 import 'package:rive/src/core/importers/artboard_import_stack_object.dart';
-import 'package:rive/src/rive_core/animation/listener_input_change.dart';
+import 'package:rive/src/rive_core/animation/listener_action.dart';
 import 'package:rive/src/rive_core/animation/state_machine_listener.dart';
 
 class StateMachineListenerImporter extends ArtboardImportStackObject {
-  final StateMachineListener event;
-  StateMachineListenerImporter(this.event);
+  final StateMachineListener listener;
+  StateMachineListenerImporter(this.listener);
 
-  void addInputChange(ListenerInputChange change) {
-    // Other state machine importers do this, do we really need it?
-    // event.context.addObject(change);
-    event.internalAddInputChange(change);
+  void addAction(ListenerAction change) {
+    // listener.context.addObject(change);
+    listener.internalAddAction(change);
   }
 }
diff --git a/lib/src/generated/animation/listener_action_base.dart b/lib/src/generated/animation/listener_action_base.dart
new file mode 100644
index 0000000..2311b10
--- /dev/null
+++ b/lib/src/generated/animation/listener_action_base.dart
@@ -0,0 +1,13 @@
+/// Core automatically generated
+/// lib/src/generated/animation/listener_action_base.dart.
+/// Do not modify manually.
+
+import 'package:rive/src/core/core.dart';
+
+abstract class ListenerActionBase<T extends CoreContext> extends Core<T> {
+  static const int typeKey = 125;
+  @override
+  int get coreType => ListenerActionBase.typeKey;
+  @override
+  Set<int> get coreTypes => {ListenerActionBase.typeKey};
+}
diff --git a/lib/src/generated/animation/listener_align_target_base.dart b/lib/src/generated/animation/listener_align_target_base.dart
new file mode 100644
index 0000000..5243d13
--- /dev/null
+++ b/lib/src/generated/animation/listener_align_target_base.dart
@@ -0,0 +1,45 @@
+/// Core automatically generated
+/// lib/src/generated/animation/listener_align_target_base.dart.
+/// Do not modify manually.
+
+import 'package:rive/src/rive_core/animation/listener_action.dart';
+
+abstract class ListenerAlignTargetBase extends ListenerAction {
+  static const int typeKey = 126;
+  @override
+  int get coreType => ListenerAlignTargetBase.typeKey;
+  @override
+  Set<int> get coreTypes =>
+      {ListenerAlignTargetBase.typeKey, ListenerActionBase.typeKey};
+
+  /// --------------------------------------------------------------------------
+  /// TargetId field with key 240.
+  static const int targetIdInitialValue = 0;
+  int _targetId = targetIdInitialValue;
+  static const int targetIdPropertyKey = 240;
+
+  /// Identifier used to track the object use as a target fo this listener
+  /// action.
+  int get targetId => _targetId;
+
+  /// Change the [_targetId] field value.
+  /// [targetIdChanged] will be invoked only if the field's value has changed.
+  set targetId(int value) {
+    if (_targetId == value) {
+      return;
+    }
+    int from = _targetId;
+    _targetId = value;
+    if (hasValidated) {
+      targetIdChanged(from, value);
+    }
+  }
+
+  void targetIdChanged(int from, int to);
+
+  @override
+  void copy(covariant ListenerAlignTargetBase source) {
+    super.copy(source);
+    _targetId = source._targetId;
+  }
+}
diff --git a/lib/src/generated/animation/listener_bool_change_base.dart b/lib/src/generated/animation/listener_bool_change_base.dart
index a6103dd..8a95f53 100644
--- a/lib/src/generated/animation/listener_bool_change_base.dart
+++ b/lib/src/generated/animation/listener_bool_change_base.dart
@@ -2,6 +2,7 @@
 /// lib/src/generated/animation/listener_bool_change_base.dart.
 /// Do not modify manually.
 
+import 'package:rive/src/generated/animation/listener_action_base.dart';
 import 'package:rive/src/rive_core/animation/listener_input_change.dart';
 
 abstract class ListenerBoolChangeBase extends ListenerInputChange {
@@ -9,8 +10,11 @@ abstract class ListenerBoolChangeBase extends ListenerInputChange {
   @override
   int get coreType => ListenerBoolChangeBase.typeKey;
   @override
-  Set<int> get coreTypes =>
-      {ListenerBoolChangeBase.typeKey, ListenerInputChangeBase.typeKey};
+  Set<int> get coreTypes => {
+        ListenerBoolChangeBase.typeKey,
+        ListenerInputChangeBase.typeKey,
+        ListenerActionBase.typeKey
+      };
 
   /// --------------------------------------------------------------------------
   /// Value field with key 228.
diff --git a/lib/src/generated/animation/listener_input_change_base.dart b/lib/src/generated/animation/listener_input_change_base.dart
index 41efba5..82a7b20 100644
--- a/lib/src/generated/animation/listener_input_change_base.dart
+++ b/lib/src/generated/animation/listener_input_change_base.dart
@@ -2,14 +2,15 @@
 /// lib/src/generated/animation/listener_input_change_base.dart.
 /// Do not modify manually.
 
-import 'package:rive/src/core/core.dart';
+import 'package:rive/src/rive_core/animation/listener_action.dart';
 
-abstract class ListenerInputChangeBase<T extends CoreContext> extends Core<T> {
+abstract class ListenerInputChangeBase extends ListenerAction {
   static const int typeKey = 116;
   @override
   int get coreType => ListenerInputChangeBase.typeKey;
   @override
-  Set<int> get coreTypes => {ListenerInputChangeBase.typeKey};
+  Set<int> get coreTypes =>
+      {ListenerInputChangeBase.typeKey, ListenerActionBase.typeKey};
 
   /// --------------------------------------------------------------------------
   /// InputId field with key 227.
@@ -37,6 +38,7 @@ abstract class ListenerInputChangeBase<T extends CoreContext> extends Core<T> {
 
   @override
   void copy(covariant ListenerInputChangeBase source) {
+    super.copy(source);
     _inputId = source._inputId;
   }
 }
diff --git a/lib/src/generated/animation/listener_number_change_base.dart b/lib/src/generated/animation/listener_number_change_base.dart
index da53ed2..988f8f7 100644
--- a/lib/src/generated/animation/listener_number_change_base.dart
+++ b/lib/src/generated/animation/listener_number_change_base.dart
@@ -2,6 +2,7 @@
 /// lib/src/generated/animation/listener_number_change_base.dart.
 /// Do not modify manually.
 
+import 'package:rive/src/generated/animation/listener_action_base.dart';
 import 'package:rive/src/rive_core/animation/listener_input_change.dart';
 
 abstract class ListenerNumberChangeBase extends ListenerInputChange {
@@ -9,8 +10,11 @@ abstract class ListenerNumberChangeBase extends ListenerInputChange {
   @override
   int get coreType => ListenerNumberChangeBase.typeKey;
   @override
-  Set<int> get coreTypes =>
-      {ListenerNumberChangeBase.typeKey, ListenerInputChangeBase.typeKey};
+  Set<int> get coreTypes => {
+        ListenerNumberChangeBase.typeKey,
+        ListenerInputChangeBase.typeKey,
+        ListenerActionBase.typeKey
+      };
 
   /// --------------------------------------------------------------------------
   /// Value field with key 229.
diff --git a/lib/src/generated/animation/listener_trigger_change_base.dart b/lib/src/generated/animation/listener_trigger_change_base.dart
index a347e7b..686dbcf 100644
--- a/lib/src/generated/animation/listener_trigger_change_base.dart
+++ b/lib/src/generated/animation/listener_trigger_change_base.dart
@@ -2,6 +2,7 @@
 /// lib/src/generated/animation/listener_trigger_change_base.dart.
 /// Do not modify manually.
 
+import 'package:rive/src/generated/animation/listener_action_base.dart';
 import 'package:rive/src/rive_core/animation/listener_input_change.dart';
 
 abstract class ListenerTriggerChangeBase extends ListenerInputChange {
@@ -9,6 +10,9 @@ abstract class ListenerTriggerChangeBase extends ListenerInputChange {
   @override
   int get coreType => ListenerTriggerChangeBase.typeKey;
   @override
-  Set<int> get coreTypes =>
-      {ListenerTriggerChangeBase.typeKey, ListenerInputChangeBase.typeKey};
+  Set<int> get coreTypes => {
+        ListenerTriggerChangeBase.typeKey,
+        ListenerInputChangeBase.typeKey,
+        ListenerActionBase.typeKey
+      };
 }
diff --git a/lib/src/generated/rive_core_context.dart b/lib/src/generated/rive_core_context.dart
index 9d2eb18..32f32d5 100644
--- a/lib/src/generated/rive_core_context.dart
+++ b/lib/src/generated/rive_core_context.dart
@@ -50,6 +50,7 @@ import 'package:rive/src/rive_core/animation/keyframe_color.dart';
 import 'package:rive/src/rive_core/animation/keyframe_double.dart';
 import 'package:rive/src/rive_core/animation/keyframe_id.dart';
 import 'package:rive/src/rive_core/animation/linear_animation.dart';
+import 'package:rive/src/rive_core/animation/listener_align_target.dart';
 import 'package:rive/src/rive_core/animation/listener_bool_change.dart';
 import 'package:rive/src/rive_core/animation/listener_number_change.dart';
 import 'package:rive/src/rive_core/animation/listener_trigger_change.dart';
@@ -164,6 +165,8 @@ class RiveCoreContext {
         return KeyFrameBool();
       case ListenerBoolChangeBase.typeKey:
         return ListenerBoolChange();
+      case ListenerAlignTargetBase.typeKey:
+        return ListenerAlignTarget();
       case TransitionNumberConditionBase.typeKey:
         return TransitionNumberCondition();
       case AnyStateBase.typeKey:
@@ -612,6 +615,11 @@ class RiveCoreContext {
           object.value = value;
         }
         break;
+      case ListenerAlignTargetBase.targetIdPropertyKey:
+        if (object is ListenerAlignTargetBase && value is int) {
+          object.targetId = value;
+        }
+        break;
       case TransitionValueConditionBase.opValuePropertyKey:
         if (object is TransitionValueConditionBase && value is int) {
           object.opValue = value;
@@ -1196,6 +1204,7 @@ class RiveCoreContext {
       case KeyFrameBase.interpolatorIdPropertyKey:
       case KeyFrameIdBase.valuePropertyKey:
       case ListenerBoolChangeBase.valuePropertyKey:
+      case ListenerAlignTargetBase.targetIdPropertyKey:
       case TransitionValueConditionBase.opValuePropertyKey:
       case StateTransitionBase.stateToIdPropertyKey:
       case StateTransitionBase.flagsPropertyKey:
@@ -1423,6 +1432,8 @@ class RiveCoreContext {
         return (object as KeyFrameIdBase).value;
       case ListenerBoolChangeBase.valuePropertyKey:
         return (object as ListenerBoolChangeBase).value;
+      case ListenerAlignTargetBase.targetIdPropertyKey:
+        return (object as ListenerAlignTargetBase).targetId;
       case TransitionValueConditionBase.opValuePropertyKey:
         return (object as TransitionValueConditionBase).opValue;
       case StateTransitionBase.stateToIdPropertyKey:
@@ -1913,6 +1924,11 @@ class RiveCoreContext {
           object.value = value;
         }
         break;
+      case ListenerAlignTargetBase.targetIdPropertyKey:
+        if (object is ListenerAlignTargetBase) {
+          object.targetId = value;
+        }
+        break;
       case TransitionValueConditionBase.opValuePropertyKey:
         if (object is TransitionValueConditionBase) {
           object.opValue = value;
diff --git a/lib/src/input_changes.dart b/lib/src/input_changes.dart
deleted file mode 100644
index 525f2e9..0000000
--- a/lib/src/input_changes.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-import 'dart:collection';
-
-import 'package:rive/src/rive_core/animation/listener_input_change.dart';
-
-class InputChanges extends ListBase<ListenerInputChange> {
-  final List<ListenerInputChange?> _values = [];
-  List<ListenerInputChange> get values => _values.cast<ListenerInputChange>();
-
-  @override
-  int get length => _values.length;
-
-  @override
-  set length(int value) => _values.length = value;
-
-  @override
-  ListenerInputChange operator [](int index) => _values[index]!;
-
-  @override
-  void operator []=(int index, ListenerInputChange value) =>
-      _values[index] = value;
-}
diff --git a/lib/src/listener_actions.dart b/lib/src/listener_actions.dart
new file mode 100644
index 0000000..eb4ec55
--- /dev/null
+++ b/lib/src/listener_actions.dart
@@ -0,0 +1,20 @@
+import 'dart:collection';
+
+import 'package:rive/src/rive_core/animation/listener_action.dart';
+
+class ListenerActions extends ListBase<ListenerAction> {
+  final List<ListenerAction?> _values = [];
+  List<ListenerAction> get values => _values.cast<ListenerAction>();
+
+  @override
+  int get length => _values.length;
+
+  @override
+  set length(int value) => _values.length = value;
+
+  @override
+  ListenerAction operator [](int index) => _values[index]!;
+
+  @override
+  void operator []=(int index, ListenerAction value) => _values[index] = value;
+}
diff --git a/lib/src/rive_core/animation/interpolator.dart b/lib/src/rive_core/animation/interpolator.dart
index 8526b5b..94a09e6 100644
--- a/lib/src/rive_core/animation/interpolator.dart
+++ b/lib/src/rive_core/animation/interpolator.dart
@@ -1,3 +1,5 @@
+
+
 abstract class Interpolator {
   int get id;
 
diff --git a/lib/src/rive_core/animation/listener_action.dart b/lib/src/rive_core/animation/listener_action.dart
new file mode 100644
index 0000000..b015b78
--- /dev/null
+++ b/lib/src/rive_core/animation/listener_action.dart
@@ -0,0 +1,30 @@
+import 'package:rive/src/core/core.dart';
+import 'package:rive/src/generated/animation/listener_action_base.dart';
+import 'package:rive/src/rive_core/animation/state_machine_listener.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
+import 'package:rive/src/rive_core/state_machine_controller.dart';
+
+export 'package:rive/src/generated/animation/listener_action_base.dart';
+
+abstract class ListenerAction extends ListenerActionBase {
+  @override
+  void onAdded() {}
+
+  @override
+  void onAddedDirty() {}
+
+  /// Perform the action.
+  void perform(StateMachineController controller, Vec2D position);
+
+  @override
+  bool import(ImportStack importStack) {
+    var importer = importStack
+        .latest<StateMachineListenerImporter>(StateMachineListenerBase.typeKey);
+    if (importer == null) {
+      return false;
+    }
+    importer.addAction(this);
+
+    return super.import(importStack);
+  }
+}
diff --git a/lib/src/rive_core/animation/listener_align_target.dart b/lib/src/rive_core/animation/listener_align_target.dart
new file mode 100644
index 0000000..3917199
--- /dev/null
+++ b/lib/src/rive_core/animation/listener_align_target.dart
@@ -0,0 +1,31 @@
+import 'package:rive/src/generated/animation/listener_align_target_base.dart';
+import 'package:rive/src/rive_core/constraints/constraint.dart';
+import 'package:rive/src/rive_core/math/mat2d.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
+import 'package:rive/src/rive_core/node.dart';
+import 'package:rive/src/rive_core/state_machine_controller.dart';
+
+export 'package:rive/src/generated/animation/listener_align_target_base.dart';
+
+class ListenerAlignTarget extends ListenerAlignTargetBase {
+  @override
+  void perform(StateMachineController controller, Vec2D position) {
+    Node? target = controller.core.resolve(targetId);
+
+    if (target == null) {
+      return;
+    }
+    var targetParentWorld = parentWorld(target);
+    var inverse = Mat2D();
+    if (!Mat2D.invert(inverse, targetParentWorld)) {
+      return;
+    }
+
+    var localPosition = inverse * position;
+    target.x = localPosition.x;
+    target.y = localPosition.y;
+  }
+
+  @override
+  void targetIdChanged(int from, int to) {}
+}
diff --git a/lib/src/rive_core/animation/listener_bool_change.dart b/lib/src/rive_core/animation/listener_bool_change.dart
index c6abcdc..e9681ab 100644
--- a/lib/src/rive_core/animation/listener_bool_change.dart
+++ b/lib/src/rive_core/animation/listener_bool_change.dart
@@ -1,4 +1,5 @@
 import 'package:rive/src/generated/animation/listener_bool_change_base.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
 import 'package:rive/src/rive_core/state_machine_controller.dart';
 
 export 'package:rive/src/generated/animation/listener_bool_change_base.dart';
@@ -8,7 +9,7 @@ class ListenerBoolChange extends ListenerBoolChangeBase {
   void valueChanged(int from, int to) {}
 
   @override
-  void perform(StateMachineController controller) {
+  void perform(StateMachineController controller, Vec2D position) {
     switch (value) {
       case 0:
         controller.setInputValue(inputId, false);
diff --git a/lib/src/rive_core/animation/listener_input_change.dart b/lib/src/rive_core/animation/listener_input_change.dart
index 0cc82c2..b331afa 100644
--- a/lib/src/rive_core/animation/listener_input_change.dart
+++ b/lib/src/rive_core/animation/listener_input_change.dart
@@ -2,8 +2,6 @@ import 'package:rive/src/core/core.dart';
 import 'package:rive/src/generated/animation/listener_input_change_base.dart';
 import 'package:rive/src/rive_core/animation/state_machine.dart';
 import 'package:rive/src/rive_core/animation/state_machine_input.dart';
-import 'package:rive/src/rive_core/animation/state_machine_listener.dart';
-import 'package:rive/src/rive_core/state_machine_controller.dart';
 
 export 'package:rive/src/generated/animation/listener_input_change_base.dart';
 
@@ -25,25 +23,17 @@ abstract class ListenerInputChange extends ListenerInputChangeBase {
     input = context.resolveWithDefault(to, StateMachineInput.unknown);
   }
 
-  @override
-  void onAdded() {}
-
   @override
   void onAddedDirty() {
+    super.onAddedDirty();
     input = context.resolveWithDefault(inputId, StateMachineInput.unknown);
   }
 
-  /// Make the change to the input values.
-  void perform(StateMachineController controller);
-
   @override
   bool import(ImportStack importStack) {
-    var importer = importStack
-        .latest<StateMachineListenerImporter>(StateMachineListenerBase.typeKey);
-    if (importer == null) {
+    if (!super.import(importStack)) {
       return false;
     }
-    importer.addInputChange(this);
 
     var stateMachineImporter =
         importStack.latest<StateMachineImporter>(StateMachineBase.typeKey);
diff --git a/lib/src/rive_core/animation/listener_number_change.dart b/lib/src/rive_core/animation/listener_number_change.dart
index 0709d58..5bb9709 100644
--- a/lib/src/rive_core/animation/listener_number_change.dart
+++ b/lib/src/rive_core/animation/listener_number_change.dart
@@ -1,4 +1,5 @@
 import 'package:rive/src/generated/animation/listener_number_change_base.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
 import 'package:rive/src/rive_core/state_machine_controller.dart';
 
 export 'package:rive/src/generated/animation/listener_number_change_base.dart';
@@ -8,6 +9,6 @@ class ListenerNumberChange extends ListenerNumberChangeBase {
   void valueChanged(double from, double to) {}
 
   @override
-  void perform(StateMachineController controller) =>
+  void perform(StateMachineController controller, Vec2D position) =>
       controller.setInputValue(inputId, value);
 }
diff --git a/lib/src/rive_core/animation/listener_trigger_change.dart b/lib/src/rive_core/animation/listener_trigger_change.dart
index 3619b45..e43174f 100644
--- a/lib/src/rive_core/animation/listener_trigger_change.dart
+++ b/lib/src/rive_core/animation/listener_trigger_change.dart
@@ -1,10 +1,11 @@
 import 'package:rive/src/generated/animation/listener_trigger_change_base.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
 import 'package:rive/src/rive_core/state_machine_controller.dart';
 
 export 'package:rive/src/generated/animation/listener_trigger_change_base.dart';
 
 class ListenerTriggerChange extends ListenerTriggerChangeBase {
   @override
-  void perform(StateMachineController controller) =>
+  void perform(StateMachineController controller, Vec2D position) =>
       controller.setInputValue(inputId, true);
 }
diff --git a/lib/src/rive_core/animation/state_machine_listener.dart b/lib/src/rive_core/animation/state_machine_listener.dart
index fa0dc6d..6561370 100644
--- a/lib/src/rive_core/animation/state_machine_listener.dart
+++ b/lib/src/rive_core/animation/state_machine_listener.dart
@@ -2,18 +2,19 @@ import 'dart:collection';
 
 import 'package:rive/src/core/core.dart';
 import 'package:rive/src/generated/animation/state_machine_listener_base.dart';
-import 'package:rive/src/rive_core/animation/listener_input_change.dart';
+import 'package:rive/src/rive_core/animation/listener_action.dart';
 import 'package:rive/src/rive_core/animation/state_machine.dart';
 import 'package:rive/src/rive_core/animation/state_machine_component.dart';
+import 'package:rive/src/rive_core/math/vec2d.dart';
 import 'package:rive/src/rive_core/node.dart';
 import 'package:rive/src/rive_core/state_machine_controller.dart';
 
 export 'package:rive/src/generated/animation/state_machine_listener_base.dart';
 
-enum ListenerType { enter, exit, down, up }
+enum ListenerType { enter, exit, down, up, move }
 
 class StateMachineListener extends StateMachineListenerBase {
-  final InputChanges inputChanges = InputChanges();
+  final ListenerActions actions = ListenerActions();
 
   Node? _target;
   Node? get target => _target;
@@ -43,28 +44,28 @@ class StateMachineListener extends StateMachineListenerBase {
   @override
   void targetIdChanged(int from, int to) => target = context.resolve(to);
 
-  /// Called by rive_core to add an [ListenerInputChange] to this
+  /// Called by rive_core to add an [ListenerAction] to this
   /// [StateMachineListener]. This should be @internal when it's supported.
-  bool internalAddInputChange(ListenerInputChange change) {
-    if (inputChanges.contains(change)) {
+  bool internalAddAction(ListenerAction action) {
+    if (actions.contains(action)) {
       return false;
     }
-    inputChanges.add(change);
+    actions.add(action);
 
     return true;
   }
 
-  /// Called by rive_core to remove an [ListenerInputChange] from this
+  /// Called by rive_core to remove an [ListenerAction] from this
   /// [StateMachineListener]. This should be @internal when it's supported.
-  bool internalRemoveInputChange(ListenerInputChange change) {
-    var removed = inputChanges.remove(change);
+  bool internalRemoveAction(ListenerAction action) {
+    var removed = actions.remove(action);
 
     return removed;
   }
 
-  void performChanges(StateMachineController controller) {
-    for (final change in inputChanges) {
-      change.perform(controller);
+  void performChanges(StateMachineController controller, Vec2D position) {
+    for (final action in actions) {
+      action.perform(controller, position);
     }
   }
 }
diff --git a/lib/src/rive_core/state_machine_controller.dart b/lib/src/rive_core/state_machine_controller.dart
index 8ca242c..8098ada 100644
--- a/lib/src/rive_core/state_machine_controller.dart
+++ b/lib/src/rive_core/state_machine_controller.dart
@@ -254,8 +254,12 @@ class StateMachineController extends RiveAnimationController<CoreContext> {
   /// The artboard that this state machine controller is manipulating.
   Artboard? get artboard => _artboard;
 
+  late CoreContext core;
+
   @override
   bool init(CoreContext core) {
+    this.core = core;
+
     _clearLayerControllers();
 
     for (final layer in stateMachine.layers) {
@@ -391,15 +395,15 @@ class StateMachineController extends RiveAnimationController<CoreContext> {
         // we're trying to trigger.
         if (hoverChange) {
           if (isOver && event.listenerType == ListenerType.enter) {
-            event.performChanges(this);
+            event.performChanges(this, position);
             isActive = true;
           } else if (!isOver && event.listenerType == ListenerType.exit) {
-            event.performChanges(this);
+            event.performChanges(this, position);
             isActive = true;
           }
         }
         if (isOver && hitEvent == event.listenerType) {
-          event.performChanges(this);
+          event.performChanges(this, position);
           isActive = true;
         }
       }
@@ -427,7 +431,10 @@ class StateMachineController extends RiveAnimationController<CoreContext> {
     }
   }
 
-  void pointerMove(Vec2D position) => _processEvent(position);
+  void pointerMove(Vec2D position) => _processEvent(
+        position,
+        hitEvent: ListenerType.move,
+      );
 
   void pointerDown(Vec2D position) => _processEvent(
         position,