Skip to content

Commit 5c0baad

Browse files
authored
提早加载配置文件 (HMCL-dev#6420)
1 parent 850a564 commit 5c0baad

2 files changed

Lines changed: 84 additions & 70 deletions

File tree

HMCL/src/main/java/org/jackhuang/hmcl/EntryPoint.java

Lines changed: 83 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,28 @@
1717
*/
1818
package org.jackhuang.hmcl;
1919

20+
import org.jackhuang.hmcl.setting.SambaException;
21+
import org.jackhuang.hmcl.setting.SettingsManager;
2022
import org.jackhuang.hmcl.util.FileSaver;
2123
import org.jackhuang.hmcl.util.SelfDependencyPatcher;
2224
import org.jackhuang.hmcl.util.SwingUtils;
2325
import org.jackhuang.hmcl.java.JavaRuntime;
2426
import org.jackhuang.hmcl.util.io.FileUtils;
2527
import org.jackhuang.hmcl.util.io.JarUtils;
28+
import org.jackhuang.hmcl.util.platform.CommandBuilder;
2629
import org.jackhuang.hmcl.util.platform.OperatingSystem;
2730

2831
import javax.swing.JOptionPane;
32+
import java.awt.Toolkit;
33+
import java.awt.datatransfer.StringSelection;
2934
import java.io.IOException;
3035
import java.lang.invoke.MethodHandle;
3136
import java.lang.invoke.MethodHandles;
3237
import java.lang.invoke.MethodType;
3338
import java.nio.file.Files;
3439
import java.nio.file.Path;
40+
import java.nio.file.Paths;
41+
import java.util.ArrayList;
3542
import java.util.concurrent.CancellationException;
3643

3744
import static org.jackhuang.hmcl.util.logging.Logger.LOG;
@@ -65,6 +72,17 @@ public static void main(String[] args) {
6572
addEnableNativeAccess();
6673
enableUnsafeMemoryAccess();
6774

75+
try {
76+
SettingsManager.init();
77+
} catch (SambaException e) {
78+
showWarning(i18n("fatal.samba"));
79+
} catch (IOException e) {
80+
LOG.error("Failed to load config", e);
81+
checkConfigOwner();
82+
SwingUtils.showErrorDialog(i18n("fatal.config_loading_failure", SettingsManager.localConfigDirectory()));
83+
EntryPoint.exit(1);
84+
}
85+
6886
Launcher.main(args);
6987
}
7088

@@ -225,15 +243,8 @@ private static void verifyJavaFX() {
225243

226244
private static void checkWine() {
227245
if (OperatingSystem.isRunningUnderWine()) {
228-
SwingUtils.initLookAndFeel();
229246
LOG.warning("HMCL is running under Wine or its distributions!");
230-
231-
int result = JOptionPane.showOptionDialog(null, i18n("fatal.wine_warning"), i18n("message.warning"), JOptionPane.OK_CANCEL_OPTION,
232-
JOptionPane.WARNING_MESSAGE, null, null, null);
233-
234-
if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
235-
exit(1);
236-
}
247+
showWarning(i18n("fatal.wine_warning"));
237248
}
238249
}
239250

@@ -273,6 +284,70 @@ private static void enableUnsafeMemoryAccess() {
273284
}
274285
}
275286

287+
private static void checkConfigOwner() {
288+
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS)
289+
return;
290+
291+
String userName = System.getProperty("user.name");
292+
Path configDirectory = SettingsManager.localConfigDirectory();
293+
if (!Files.exists(configDirectory)) {
294+
return;
295+
}
296+
297+
String owner;
298+
try {
299+
owner = Files.getOwner(configDirectory).getName();
300+
} catch (IOException ioe) {
301+
LOG.warning("Failed to get file owner", ioe);
302+
return;
303+
}
304+
305+
if (Files.isWritable(configDirectory) || userName.equals("root") || userName.equals(owner))
306+
return;
307+
308+
ArrayList<String> files = new ArrayList<>();
309+
files.add(configDirectory.toString());
310+
if (Files.exists(Metadata.HMCL_USER_HOME))
311+
files.add(Metadata.HMCL_USER_HOME.toString());
312+
313+
Path mcDir = Paths.get(".minecraft").toAbsolutePath().normalize();
314+
if (Files.exists(mcDir))
315+
files.add(mcDir.toString());
316+
317+
String command = new CommandBuilder().addAll("sudo", "chown", "-R", userName).addAll(files).toString();
318+
SwingUtils.initLookAndFeel();
319+
320+
Object[] options = {i18n("button.copy_and_exit"), i18n("button.cancel")};
321+
int result = JOptionPane.showOptionDialog(null,
322+
i18n("fatal.config_loading_failure.unix", owner, command),
323+
i18n("message.error"),
324+
JOptionPane.DEFAULT_OPTION,
325+
JOptionPane.ERROR_MESSAGE,
326+
null,
327+
options,
328+
options[0]);
329+
330+
if (result == 0) {
331+
try {
332+
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(command), null);
333+
} catch (Throwable e) {
334+
LOG.warning("Failed to copy command to clipboard", e);
335+
}
336+
}
337+
EntryPoint.exit(1);
338+
}
339+
340+
private static void showWarning(String message) {
341+
SwingUtils.initLookAndFeel();
342+
343+
int result = JOptionPane.showOptionDialog(null, message, i18n("message.warning"), JOptionPane.OK_CANCEL_OPTION,
344+
JOptionPane.WARNING_MESSAGE, null, null, null);
345+
346+
if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
347+
exit(1);
348+
}
349+
}
350+
276351
/**
277352
* Indicates that a fatal error has occurred, and that the application cannot start.
278353
*/

HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
import javafx.scene.control.Alert.AlertType;
3030
import javafx.scene.control.Button;
3131
import javafx.scene.control.ButtonType;
32-
import javafx.scene.input.Clipboard;
33-
import javafx.scene.input.DataFormat;
3432
import javafx.stage.Screen;
3533
import javafx.stage.Stage;
3634
import javafx.util.Duration;
@@ -50,17 +48,11 @@
5048
import org.jackhuang.hmcl.util.platform.*;
5149

5250
import java.io.File;
53-
import java.io.IOException;
5451
import java.lang.management.ManagementFactory;
5552
import java.lang.management.MemoryPoolMXBean;
5653
import java.net.CookieHandler;
5754
import java.net.CookieManager;
58-
import java.nio.file.Files;
59-
import java.nio.file.Path;
60-
import java.nio.file.Paths;
6155
import java.text.DecimalFormat;
62-
import java.util.ArrayList;
63-
import java.util.Collections;
6456
import java.util.Objects;
6557
import java.util.Optional;
6658
import java.util.concurrent.TimeUnit;
@@ -98,18 +90,7 @@ public void start(Stage primaryStage) {
9890
}
9991

10092
try {
101-
try {
102-
SettingsManager.init();
103-
initializeSettingsRuntime();
104-
} catch (SambaException e) {
105-
showAlert(AlertType.WARNING, i18n("fatal.samba"));
106-
} catch (IOException e) {
107-
LOG.error("Failed to load config", e);
108-
checkConfigInTempDir();
109-
checkConfigOwner();
110-
showAlert(AlertType.ERROR, i18n("fatal.config_loading_failure", SettingsManager.localConfigDirectory()));
111-
EntryPoint.exit(1);
112-
}
93+
initializeSettingsRuntime();
11394

11495
// https://lapcatsoftware.com/articles/app-translocation.html
11596
if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS
@@ -274,48 +255,6 @@ private static void checkConfigInTempDir() {
274255
}
275256
}
276257

277-
private static void checkConfigOwner() {
278-
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS)
279-
return;
280-
281-
String userName = System.getProperty("user.name");
282-
Path configDirectory = SettingsManager.localConfigDirectory();
283-
if (!Files.exists(configDirectory)) {
284-
return;
285-
}
286-
287-
String owner;
288-
try {
289-
owner = Files.getOwner(configDirectory).getName();
290-
} catch (IOException ioe) {
291-
LOG.warning("Failed to get file owner", ioe);
292-
return;
293-
}
294-
295-
if (Files.isWritable(configDirectory) || userName.equals("root") || userName.equals(owner))
296-
return;
297-
298-
ArrayList<String> files = new ArrayList<>();
299-
files.add(configDirectory.toString());
300-
if (Files.exists(Metadata.HMCL_USER_HOME))
301-
files.add(Metadata.HMCL_USER_HOME.toString());
302-
303-
Path mcDir = Paths.get(".minecraft").toAbsolutePath().normalize();
304-
if (Files.exists(mcDir))
305-
files.add(mcDir.toString());
306-
307-
String command = new CommandBuilder().addAll("sudo", "chown", "-R", userName).addAll(files).toString();
308-
ButtonType copyAndExit = new ButtonType(i18n("button.copy_and_exit"));
309-
310-
if (showAlert(AlertType.ERROR,
311-
i18n("fatal.config_loading_failure.unix", owner, command),
312-
copyAndExit, ButtonType.CLOSE) == copyAndExit) {
313-
Clipboard.getSystemClipboard()
314-
.setContent(Collections.singletonMap(DataFormat.PLAIN_TEXT, command));
315-
}
316-
EntryPoint.exit(1);
317-
}
318-
319258
@Override
320259
public void stop() throws Exception {
321260
Controllers.onApplicationStop();

0 commit comments

Comments
 (0)