diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index f3069c4c6f7..7d8130a755c 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -49,6 +49,7 @@ import forge.toolbox.FSkin.SkinImage; import forge.util.BuildInfo; import forge.util.Callback; import forge.util.FileUtil; +import forge.util.OperatingSystem; public class GuiDesktop implements IGuiBase { @Override @@ -286,6 +287,6 @@ public class GuiDesktop implements IGuiBase { @Override public void preventSystemSleep(boolean preventSleep) { - + OperatingSystem.preventSystemSleep(preventSleep); } } \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 3fa6ade2e20..caa6898aa1a 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -12,6 +12,7 @@ import forge.Forge; import forge.assets.AssetsDownloader; import forge.interfaces.IDeviceAdapter; import forge.util.FileUtil; +import forge.util.OperatingSystem; import forge.util.RestartUtil; import forge.util.Utils; @@ -96,7 +97,7 @@ public class Main { @Override public void preventSystemSleep(boolean preventSleep) { - + OperatingSystem.preventSystemSleep(preventSleep); } } } diff --git a/forge-gui/src/main/java/forge/util/OperatingSystem.java b/forge-gui/src/main/java/forge/util/OperatingSystem.java index d6570ceefc5..018a2d3f71d 100644 --- a/forge-gui/src/main/java/forge/util/OperatingSystem.java +++ b/forge-gui/src/main/java/forge/util/OperatingSystem.java @@ -1,5 +1,7 @@ package forge.util; +import forge.FThreads; + public class OperatingSystem { private static String os = System.getProperty("os.name").toLowerCase(); @@ -18,4 +20,42 @@ public class OperatingSystem { public static boolean isSolaris() { return os.contains("sunos"); } + + //utility for preventing system from sleeping + private static boolean preventSleep; + private static java.util.concurrent.ScheduledFuture delayedKeepAwakeTask; + + public static void preventSystemSleep(boolean preventSleep0) { + if (preventSleep == preventSleep0) { return; } + preventSleep = preventSleep0; + + if (delayedKeepAwakeTask != null) { //ensure current delayed task canceled if needed + delayedKeepAwakeTask.cancel(false); + delayedKeepAwakeTask = null; + } + + if (preventSleep) { //ensure task scheduled from EDT thread + FThreads.invokeInEdtNowOrLater(keepSystemAwake); + } + } + + private static Runnable keepSystemAwake = new Runnable() { + @Override + public void run() { + if (!preventSleep) { return; } //ensure this flag is still set + + try { + //use robot to simulate user action so system standby timer resets + java.awt.Robot robot = new java.awt.Robot(); + robot.keyPress(0xF002); //simulate F15 key press since that won't do anything noticable + + delayedKeepAwakeTask = ThreadUtil.delay(30000, keepSystemAwake); //repeat every 30 seconds until flag cleared + } + catch (Exception e) { + preventSleep = false; + delayedKeepAwakeTask = null; + e.printStackTrace(); + } + } + }; }