From df48deebe2e20e34fe56cf88ede095a91ea51215 Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Fri, 28 May 2010 16:03:14 +0300 Subject: [PATCH] Allow action combos from extra menu Action combos are useful e.g. for implementing true frame advance function. --- Changelog.utf8 | 1 + extramenu | 9 ++++++++ org/jpc/plugins/PCControl.java | 48 ++++++++++++++++++++++++++++++---------- org/jpc/pluginsbase/Plugins.java | 10 +++++---- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/Changelog.utf8 b/Changelog.utf8 index 3691ab4..89874cf 100644 --- a/Changelog.utf8 +++ b/Changelog.utf8 @@ -5,6 +5,7 @@ Changes since JPC-RR Release 10.8: - Add support for author nicknames. - Add ability for Lua to query movie length, rerecord count and headers. - Allow loading Lua plugin without GUI. +- Allow action combos from extra menu. Changes from JPC-RR Release 10.7 to JPC-RR Release 10.8: ======================================================== diff --git a/extramenu b/extramenu index 2cb2a5b..099fd37 100644 --- a/extramenu +++ b/extramenu @@ -32,6 +32,15 @@ (Keys→) B sendevent org.jpc.emulator.peripheral.Keyboard KEYEDGE 54 (Keys→) V sendevent org.jpc.emulator.peripheral.Keyboard KEYEDGE 157 (Keys→) X sendevent org.jpc.emulator.peripheral.Keyboard KEYEDGE 184 +(Start running freely) S trap-vretrace-start-off +(Start running freely) S trap-vretrace-end-off +(Start running freely) S trap-timed-disable +(Start running freely) S pc-start +(Stop running) T pc-stop +(Advance one frame) F trap-vretrace-start-on +(Advance one frame) F trap-vretrace-end-off +(Advance one frame) F trap-timed-disable +(Advance one frame) F pc-start (Frame advance→Enable) 3 trap-vretrace-start-on (Frame advance→Disable) 4 trap-vretrace-start-off (Start PC) 5 pc-start diff --git a/org/jpc/plugins/PCControl.java b/org/jpc/plugins/PCControl.java index 833893f..860f811 100644 --- a/org/jpc/plugins/PCControl.java +++ b/org/jpc/plugins/PCControl.java @@ -99,6 +99,7 @@ public class PCControl extends JFrame implements Plugin private DumpControlDialog dumpDialog; private MenuManager menuManager; private volatile boolean restoreFocus; + private Map > extraActions; private PC.PCFullStatus currentProject; @@ -263,7 +264,9 @@ public class PCControl extends JFrame implements Plugin pc.execute(); if(pc.getHitTraceTrap()) { if(pc.getAndClearTripleFaulted()) - callShowOptionDialog(this, "CPU shut itself down due to triple fault. Rebooting the system.", "Triple fault!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, new String[]{"Dismiss"}, "Dismiss"); + callShowOptionDialog(this, "CPU shut itself down due to triple fault. Rebooting the system.", + "Triple fault!", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, + new String[]{"Dismiss"}, "Dismiss"); if(!willCleanup) SwingUtilities.invokeAndWait(new Thread() { public void run() { stopNoWait(); }}); running = false; @@ -493,6 +496,7 @@ public class PCControl extends JFrame implements Plugin file = new UTFInputLineStream(new FileInputStream(extramenu)); while(true) { + boolean exists = false; String[] line = nextParseLine(file); if(line == null) break; @@ -508,10 +512,9 @@ public class PCControl extends JFrame implements Plugin System.err.println("Warning: Bad extra menu item '" + line[0] + "'."); continue; } - if(used.contains(line[0])) { - System.err.println("Warning: Duplicate extra menu item '" + line[0] + "'."); - continue; - } + if(used.contains(line[0])) + exists = true; + KeyStroke stroke = null; if(!line[1].equals("<>")) { stroke = KeyStroke.getKeyStroke(line[1]); @@ -523,7 +526,14 @@ public class PCControl extends JFrame implements Plugin String[] lineCommand = Arrays.copyOfRange(line, 2, line.length); used.add(line[0]); - menuManager.addMenuItem("Extra→" + line[0], this, "menuExtra", lineCommand, PROFILE_ALWAYS, stroke); + List commandList = extraActions.get(line[0]); + if(commandList == null) + extraActions.put(line[0], commandList = new ArrayList()); + commandList.add(lineCommand); + + if(!exists) + menuManager.addMenuItem("Extra→" + line[0], this, "menuExtra", new String[]{line[0]}, PROFILE_ALWAYS, + stroke); } file.close(); } catch(IOException e) { @@ -546,7 +556,7 @@ public class PCControl extends JFrame implements Plugin shuttingDown = false; configDialog = new PCConfigDialog(); dumpDialog = new DumpControlDialog(manager); - + extraActions = new HashMap >(); menuManager = new MenuManager(); menuManager.setProfile(PROFILE_NO_PC | PROFILE_STOPPED); @@ -628,11 +638,25 @@ public class PCControl extends JFrame implements Plugin public void menuExtra(String i, Object[] args) { - if(args.length == 1) { - vPluginManager.invokeExternalCommand((String)args[0], null); - } else { - String[] rest = Arrays.copyOfRange(args, 1, args.length, String[].class); - vPluginManager.invokeExternalCommand((String)args[0], rest); + final List commandList = extraActions.get(args[0]); + if(commandList == null) { + System.err.println("Warning: Called extra menu with unknown entry '" + args[0] + "'."); + return; + } + + //Run the functions on seperate thread to avoid deadlocking. + (new Thread(new Runnable() { public void run() { menuExtraThreadFunc(commandList); }})).start(); + } + + private void menuExtraThreadFunc(List actions) + { + for(String[] i : actions) { + if(i.length == 1) { + vPluginManager.invokeExternalCommandSynchronous(i[0], null); + } else { + String[] rest = Arrays.copyOfRange(i, 1, i.length, String[].class); + vPluginManager.invokeExternalCommandSynchronous(i[0], rest); + } } } diff --git a/org/jpc/pluginsbase/Plugins.java b/org/jpc/pluginsbase/Plugins.java index 3af07db..47735d1 100644 --- a/org/jpc/pluginsbase/Plugins.java +++ b/org/jpc/pluginsbase/Plugins.java @@ -100,7 +100,7 @@ public class Plugins //All non-registered plugins become registered as we will recconnect them. plugins.addAll(nonRegisteredPlugins); - nonRegisteredPlugins.clear(); + nonRegisteredPlugins.clear(); for(Plugin plugin : plugins) { System.err.println("Informational: Reconnecting " + plugin.getClass().getName() + "..."); @@ -124,7 +124,7 @@ public class Plugins } //All non-registered plugins become registered as we recconnected them. plugins.addAll(nonRegisteredPlugins); - nonRegisteredPlugins.clear(); + nonRegisteredPlugins.clear(); running = false; } @@ -303,7 +303,9 @@ public class Plugins while(synchronous && !inherentlySynchronous && !commandComplete) try { - wait(); + synchronized(this) { + wait(); + } } catch(Exception e) { } return done; @@ -320,7 +322,7 @@ public class Plugins } //Invoke the external command interface. - public synchronized void invokeExternalCommandSynchronous(String cmd, String[] args) + public void invokeExternalCommandSynchronous(String cmd, String[] args) { boolean done = false; for(Plugin plugin : plugins) -- 2.11.4.GIT