Open menu naturally via chapter events; M returns to menu; debounce M
The menu state machine advances from the menu-intro state to the menu state only when the menu video crosses its chapter-2 marker (onChapter). Fire onChapter from the video loop as PTS crosses playlist markers. Also route the M key through the onMenu dispatcher so it returns to the menu video/title (not just drawing menu items), and debounce the key against auto-repeat.
This commit is contained in:
@@ -80,8 +80,6 @@ public class MoviePlayer extends BaseNativeObject {
|
|||||||
|
|
||||||
if (!previousMenuMode && this.menuMode) {
|
if (!previousMenuMode && this.menuMode) {
|
||||||
VsmxBaseObject callback = controller.getPropertyValue("onMenu");
|
VsmxBaseObject callback = controller.getPropertyValue("onMenu");
|
||||||
System.err.println("[menu] onMenu fires, callback=" + callback
|
|
||||||
+ " (" + (callback == null ? "null" : callback.getClass().getSimpleName()) + ")");
|
|
||||||
if (callback instanceof VsmxFunction function) {
|
if (callback instanceof VsmxFunction function) {
|
||||||
interpreter.interpretFunction(function, null, new VsmxBaseObject[0]);
|
interpreter.interpretFunction(function, null, new VsmxBaseObject[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,8 +69,8 @@ public final class PlayerApp extends Application {
|
|||||||
private volatile boolean skipRequested = false;
|
private volatile boolean skipRequested = false;
|
||||||
|
|
||||||
private volatile VsmxInterpreter menuInterpreter;
|
private volatile VsmxInterpreter menuInterpreter;
|
||||||
private volatile VsmxBaseObject mmActivate;
|
|
||||||
private volatile VsmxNativeObject controllerObject;
|
private volatile VsmxNativeObject controllerObject;
|
||||||
|
private long lastMenuKeyNanos = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage stage) {
|
public void start(Stage stage) {
|
||||||
@@ -147,12 +147,18 @@ public final class PlayerApp extends Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void openMenuDirectly() {
|
private void openMenuDirectly() {
|
||||||
|
// Debounce key auto-repeat.
|
||||||
|
long now = System.nanoTime();
|
||||||
|
if (now - lastMenuKeyNanos < 250_000_000L) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lastMenuKeyNanos = now;
|
||||||
|
|
||||||
VsmxInterpreter interpreter = menuInterpreter;
|
VsmxInterpreter interpreter = menuInterpreter;
|
||||||
VsmxNativeObject c = controllerObject;
|
VsmxNativeObject c = controllerObject;
|
||||||
if (interpreter != null && c != null) {
|
if (interpreter != null && c != null) {
|
||||||
VsmxBaseObject callback = c.getPropertyValue("onMenu");
|
VsmxBaseObject callback = c.getPropertyValue("onMenu");
|
||||||
if (callback instanceof VsmxFunction function) {
|
if (callback instanceof VsmxFunction function) {
|
||||||
System.err.println("[debug] returning to menu");
|
|
||||||
interpreter.interpretFunction(function, null, new VsmxBaseObject[0]);
|
interpreter.interpretFunction(function, null, new VsmxBaseObject[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,7 +218,6 @@ public final class PlayerApp extends Application {
|
|||||||
controller = (Controller) controllerObject.getObject();
|
controller = (Controller) controllerObject.getObject();
|
||||||
moviePlayer = (MoviePlayer) movieplayer.getObject();
|
moviePlayer = (MoviePlayer) movieplayer.getObject();
|
||||||
menuInterpreter = interpreter;
|
menuInterpreter = interpreter;
|
||||||
mmActivate = globals.getPropertyValue("mm_activate");
|
|
||||||
this.controllerObject = controllerObject;
|
this.controllerObject = controllerObject;
|
||||||
controller.callCallback(interpreter, "onAutoPlay", null);
|
controller.callCallback(interpreter, "onAutoPlay", null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user