From e9061ebc8b34c400d14e86ca6be7ca4b3ae166a8 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Thu, 26 Aug 2021 03:52:32 +0800 Subject: [PATCH] feat: process priority --- .../jackhuang/hmcl/game/LaunchOptions.java | 15 +++++++- .../jackhuang/hmcl/game/ProcessPriority.java | 26 ++++++++++++++ .../hmcl/launch/DefaultLauncher.java | 36 ++++++++++++++++++- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/game/ProcessPriority.java diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java index 39d261e6c..179a35510 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LaunchOptions.java @@ -1,6 +1,6 @@ /* * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors + * Copyright (C) 2021 huangyuhui and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,6 +55,7 @@ public class LaunchOptions implements Serializable { private String preLaunchCommand; private NativesDirectoryType nativesDirType; private String nativesDir; + private ProcessPriority processPriority; /** * The game directory @@ -217,6 +218,13 @@ public class LaunchOptions implements Serializable { return nativesDir; } + /** + * Process priority + */ + public ProcessPriority getProcessPriority() { + return processPriority; + } + public static class Builder { private final LaunchOptions options = new LaunchOptions(); @@ -489,5 +497,10 @@ public class LaunchOptions implements Serializable { return this; } + public Builder setProcessPriority(ProcessPriority processPriority) { + options.processPriority = processPriority; + return this; + } + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ProcessPriority.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ProcessPriority.java new file mode 100644 index 000000000..2ed20c88d --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ProcessPriority.java @@ -0,0 +1,26 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2021 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.game; + +public enum ProcessPriority { + LOW, + BELOW_NORMAL, + NORMAL, + ABOVE_NORMAL, + HIGH +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index add889b0b..71003387b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -71,9 +71,43 @@ public class DefaultLauncher extends Launcher { private CommandBuilder generateCommandLine(File nativeFolder) throws IOException { CommandBuilder res = new CommandBuilder(); + switch (options.getProcessPriority()) { + case HIGH: + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + res.add("cmd", "/C", "start", "unused title", "/B", "/high"); + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + res.add("nice", "-n", "-5"); + } + break; + case ABOVE_NORMAL: + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + res.add("cmd", "/C", "start", "unused title", "/B", "/abovenormal"); + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + res.add("nice", "-n", "-1"); + } + break; + case NORMAL: + // do nothing + break; + case BELOW_NORMAL: + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + res.add("cmd", "/C", "start", "unused title", "/B", "/belownormal"); + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + res.add("nice", "-n", "1"); + } + break; + case LOW: + if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { + res.add("cmd", "/C", "start", "unused title", "/B", "/low"); + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { + res.add("nice", "-n", "5"); + } + break; + } + // Executable if (StringUtils.isNotBlank(options.getWrapper())) - res.add(options.getWrapper()); + res.addAllWithoutParsing(StringUtils.tokenize(options.getWrapper())); res.add(options.getJava().getBinary().toString());