mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 04:38:00 +00:00
- Unfortunately, have to revert r34731 - breaks mobile Forge (at least when running on desktop, e.g. for debugging purposes, but quite possibly on Android itself as well) and does not allow to cast anything from hand at all, making the single click on a card function as a selection (but not allowing to actually cast the spell).
This commit is contained in:
@@ -1,34 +1,25 @@
|
||||
package forge.match.input;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import forge.FThreads;
|
||||
import forge.error.BugReporter;
|
||||
import forge.player.PlayerControllerHuman;
|
||||
import forge.util.ThreadUtil;
|
||||
|
||||
public abstract class InputSyncronizedBase extends InputBase implements InputSynchronized {
|
||||
private static final long serialVersionUID = 8756177361251703052L;
|
||||
private static final Runnable terminationMarker = new Runnable() { public void run() { } };
|
||||
|
||||
// The gameTaskQueue indicates tasks to run while blocked on the game. To stop, add terminationMarker (as null is
|
||||
// not allowed).
|
||||
private LinkedBlockingDeque<Runnable> gameTaskQueue = new LinkedBlockingDeque<Runnable>();
|
||||
private final CountDownLatch cdlDone;
|
||||
|
||||
public InputSyncronizedBase(final PlayerControllerHuman controller) {
|
||||
super(controller);
|
||||
cdlDone = new CountDownLatch(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void awaitLatchRelease() {
|
||||
FThreads.assertExecutedByEdt(false);
|
||||
try {
|
||||
Runnable r = gameTaskQueue.take();
|
||||
while (r != terminationMarker) {
|
||||
r.run();
|
||||
r = gameTaskQueue.take();
|
||||
}
|
||||
try{
|
||||
cdlDone.await();
|
||||
} catch (final InterruptedException e) {
|
||||
BugReporter.reportException(e);
|
||||
}
|
||||
@@ -36,34 +27,12 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
|
||||
|
||||
@Override
|
||||
public final void relaseLatchWhenGameIsOver() {
|
||||
gameTaskQueue.add(terminationMarker);
|
||||
cdlDone.countDown();
|
||||
}
|
||||
|
||||
public void showAndWait() {
|
||||
final boolean isGameThread = ThreadUtil.isGameThread();
|
||||
|
||||
if (isGameThread) {
|
||||
// If we're on the game thread, redirect the "run on game thread" function to instead go through us.
|
||||
getController().getGame().getAction().setInvokeFunction(new Function<Runnable, Void>() {
|
||||
public Void apply(Runnable r) {
|
||||
gameTaskQueue.add(r);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
getController().getInputQueue().setInput(this);
|
||||
awaitLatchRelease();
|
||||
|
||||
if (isGameThread) {
|
||||
// Reset the invoke function to null.
|
||||
getController().getGame().getAction().setInvokeFunction(null);
|
||||
// There's a race that a new task may be queued up before we've reset the invoke function.
|
||||
// To handle this, schedule any remaining tasks normally.
|
||||
for (Runnable r : gameTaskQueue) {
|
||||
getController().getGame().getAction().invoke(r);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected final void stop() {
|
||||
@@ -81,7 +50,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
|
||||
if (getController().getInputQueue().getInput() != null) {
|
||||
getController().getInputQueue().removeInput(InputSyncronizedBase.this);
|
||||
}
|
||||
gameTaskQueue.add(terminationMarker);
|
||||
cdlDone.countDown();
|
||||
}
|
||||
|
||||
protected void onStop() { }
|
||||
|
||||
Reference in New Issue
Block a user