diff --git a/assets/plugins/plugin-9patch-0.1.4.jar b/assets/plugins/plugin-9patch-0.1.4.jar index b1181f59..02f8521c 100644 Binary files a/assets/plugins/plugin-9patch-0.1.4.jar and b/assets/plugins/plugin-9patch-0.1.4.jar differ diff --git a/assets/plugins/plugin-performance-0.1.4.jar b/assets/plugins/plugin-performance-0.1.4.jar index 814ddca9..8603d064 100644 Binary files a/assets/plugins/plugin-performance-0.1.4.jar and b/assets/plugins/plugin-performance-0.1.4.jar differ diff --git a/assets/plugins/plugin-skin-composer-0.1.4.jar b/assets/plugins/plugin-skin-composer-0.1.4.jar index f379abac..021d5c9e 100644 Binary files a/assets/plugins/plugin-skin-composer-0.1.4.jar and b/assets/plugins/plugin-skin-composer-0.1.4.jar differ diff --git a/assets/plugins/plugin-tiled-0.1.4.jar b/assets/plugins/plugin-tiled-0.1.4.jar index e852df45..d71edcb1 100644 Binary files a/assets/plugins/plugin-tiled-0.1.4.jar and b/assets/plugins/plugin-tiled-0.1.4.jar differ diff --git a/hyperlap2d-common-api b/hyperlap2d-common-api index fe8ed39c..b93fef75 160000 --- a/hyperlap2d-common-api +++ b/hyperlap2d-common-api @@ -1 +1 @@ -Subproject commit fe8ed39c65afc63c8c9bd23338cfe0ff554ced4e +Subproject commit b93fef75493c295495a770c701851ac901fb464a diff --git a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerSettings.java b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerSettings.java index eca2be4c..f83824f5 100644 --- a/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerSettings.java +++ b/plugin-skin-composer/src/main/java/games/rednblack/editor/plugin/skincomposer/SkinComposerSettings.java @@ -41,4 +41,9 @@ public class SkinComposerSettings extends SettingsNodeValue { public boolean validateSettings() { return loaded && getSettings().alwaysCheckUpdates != alwaysCheckUpdates.isChecked(); } + + @Override + public boolean requireRestart() { + return false; + } } diff --git a/src/main/java/games/rednblack/editor/Main.java b/src/main/java/games/rednblack/editor/Main.java index b86239d6..279bbace 100644 --- a/src/main/java/games/rednblack/editor/Main.java +++ b/src/main/java/games/rednblack/editor/Main.java @@ -28,7 +28,6 @@ public class Main { } Thread.currentThread().setUncaughtExceptionHandler(new CustomExceptionHandler()); - Facade.getInstance().setUncaughtExceptionHandler(new FacadeExceptionHandler()); //Increase default lwjgl stack size System.setProperty("org.lwjgl.system.stackSize", "256"); @@ -53,6 +52,8 @@ public class Main { config.setWindowIcon("hyperlap_icon_96.png"); if (settingsManager.editorConfigVO.useANGLEGLES2) config.setOpenGLEmulation(Lwjgl3ApplicationConfiguration.GLEmulation.ANGLE_GLES20, 3, 2); + if (settingsManager.editorConfigVO.failSafeException) + Facade.getInstance().setUncaughtExceptionHandler(new FacadeExceptionHandler()); config.setBackBufferConfig(8,8,8,8,16,8, settingsManager.editorConfigVO.msaaSamples); new Lwjgl3ApplicationGLESFix(HyperLap2DApp.initInstance(dm.width, dm.height, settingsManager), config); @@ -144,4 +145,44 @@ public class Main { return true; } + + public static String getMainClassName() { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + if (trace.length > 0) { + return trace[trace.length - 1].getClassName(); + } + return null; + } + + public static void restartJVM() { + // restart jvm with -XstartOnFirstThread + String separator = System.getProperty("file.separator"); + String classpath = System.getProperty("java.class.path"); + String mainClass = getMainClassName(); + String jvmPath = System.getProperty("java.home") + separator + "bin" + separator + "java"; + + List inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); + + ArrayList jvmArgs = new ArrayList<>(); + + jvmArgs.add(jvmPath); + if (SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_MAC) + jvmArgs.add("-XstartOnFirstThread"); + jvmArgs.add("-Djava.awt.headless=true"); + jvmArgs.addAll(inputArguments); + jvmArgs.add("-cp"); + jvmArgs.add(classpath); + jvmArgs.add(mainClass); + + // if you don't need console output, just enable these two lines + // and delete bits after it. This JVM will then terminate. + ProcessBuilder processBuilder = new ProcessBuilder(jvmArgs); + try { + processBuilder.start(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + System.exit(0); + } } diff --git a/src/main/java/games/rednblack/editor/view/ui/dialog/SettingsDialog.java b/src/main/java/games/rednblack/editor/view/ui/dialog/SettingsDialog.java index e228a822..7c2df01b 100644 --- a/src/main/java/games/rednblack/editor/view/ui/dialog/SettingsDialog.java +++ b/src/main/java/games/rednblack/editor/view/ui/dialog/SettingsDialog.java @@ -7,7 +7,9 @@ import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Tree; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.kotcrab.vis.ui.util.dialog.Dialogs; import com.kotcrab.vis.ui.widget.*; +import games.rednblack.editor.Main; import games.rednblack.h2d.common.H2DDialog; import games.rednblack.h2d.common.view.SettingsNodeValue; import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; @@ -103,18 +105,29 @@ public class SettingsDialog extends H2DDialog { } private void applyAllSettings() { + boolean askToRestart = false; for (SettingsNode node : settingsTree.getRootNodes()) { if (node.getValue().validateSettings()) { + if (node.getValue().requireRestart()) askToRestart = true; node.getValue().translateViewToSettings(); } if (node.getChildren().size > 0) { for (SettingsNode child : node.getChildren()) { if (child.getValue().validateSettings()) { + if (child.getValue().requireRestart()) askToRestart = true; child.getValue().translateViewToSettings(); } } } } + if (askToRestart) { + Dialogs.showConfirmDialog(getStage(), "Restart is required", "Some changes needs to restart the editor,\nwould you like to do it now?", + new String[]{"Yes, restart now", "Cancel"}, new Integer[]{0, 1}, r -> { + if (r == 0) { + Main.restartJVM(); + } + }).padBottom(20).pack(); + } } @Override diff --git a/src/main/java/games/rednblack/editor/view/ui/settings/GeneralSettings.java b/src/main/java/games/rednblack/editor/view/ui/settings/GeneralSettings.java index cf9d8448..5cf91ac1 100644 --- a/src/main/java/games/rednblack/editor/view/ui/settings/GeneralSettings.java +++ b/src/main/java/games/rednblack/editor/view/ui/settings/GeneralSettings.java @@ -14,7 +14,7 @@ import games.rednblack.puremvc.Facade; public class GeneralSettings extends SettingsNodeValue { - private final VisCheckBox autoSaving, useANGLEGLES2; + private final VisCheckBox autoSaving, useANGLEGLES2, failSafeException; private final VisCheckBox enablePlugins; private VisSelectBox filterKeyMapping; private VisSlider uiScaleDensity, msaaSamples, fpsLimit; @@ -27,13 +27,16 @@ public class GeneralSettings extends SettingsNodeValue { autoSaving = StandardWidgetsFactory.createCheckBox("Save changes automatically [EXPERIMENTAL]"); getContentTable().add(autoSaving).left().padTop(5).padLeft(8).row(); + failSafeException = StandardWidgetsFactory.createCheckBox("Keep alive on exceptions [EXPERIMENTAL]"); + getContentTable().add(failSafeException).left().padTop(5).padLeft(8).row(); + getContentTable().add(getKeyMappingTable()).left().padTop(5).row(); getContentTable().add(getUiScaleDensityTable()).left().padTop(5).row(); getContentTable().add("Plugins").left().padTop(10).row(); getContentTable().addSeparator(); - enablePlugins = StandardWidgetsFactory.createCheckBox("Enable plugins [Require restart]"); + enablePlugins = StandardWidgetsFactory.createCheckBox("Enable plugins"); getContentTable().add(enablePlugins).left().padTop(5).padLeft(8).row(); getContentTable().add("Performance").left().padTop(10).row(); @@ -41,7 +44,7 @@ public class GeneralSettings extends SettingsNodeValue { getContentTable().add(getMassSamplesTable()).left().padTop(5).row(); getContentTable().add(getFPSLimitTable()).left().padTop(5).row(); - useANGLEGLES2 = StandardWidgetsFactory.createCheckBox("Use ANGLE OpenGL ES 2 API [Require restart]"); + useANGLEGLES2 = StandardWidgetsFactory.createCheckBox("Use ANGLE OpenGL ES 2 API"); getContentTable().add(useANGLEGLES2).left().padTop(5).padLeft(8).row(); } @@ -53,7 +56,6 @@ public class GeneralSettings extends SettingsNodeValue { filterKeyMapping = StandardWidgetsFactory.createSelectBox(String.class); filterKeyMapping.setItems(settingsManager.getKeyMappingFiles()); mappingTable.add(filterKeyMapping).padLeft(8); - mappingTable.add("[Require restart]").padLeft(8); return mappingTable; } @@ -89,7 +91,7 @@ public class GeneralSettings extends SettingsNodeValue { msaaSamples.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { - labelFactor.setText(getMsaaSamples() + " [Require restart]"); + labelFactor.setText(getMsaaSamples()); } }); @@ -111,7 +113,7 @@ public class GeneralSettings extends SettingsNodeValue { if (getFPSLimit() == 0) labelFactor.setText("Unlimited"); else - labelFactor.setText(getFPSLimit() + " [Require restart]"); + labelFactor.setText(getFPSLimit()); } }); @@ -134,6 +136,7 @@ public class GeneralSettings extends SettingsNodeValue { public void translateSettingsToView() { autoSaving.setChecked(getSettings().autoSave); useANGLEGLES2.setChecked(getSettings().useANGLEGLES2); + failSafeException.setChecked(getSettings().failSafeException); enablePlugins.setChecked(getSettings().enablePlugins); filterKeyMapping.setSelected(getSettings().keyBindingLayout); uiScaleDensity.setValue(getSettings().uiScaleDensity); @@ -145,6 +148,7 @@ public class GeneralSettings extends SettingsNodeValue { public void translateViewToSettings() { getSettings().autoSave = autoSaving.isChecked(); getSettings().useANGLEGLES2 = useANGLEGLES2.isChecked(); + getSettings().failSafeException = failSafeException.isChecked(); getSettings().enablePlugins = enablePlugins.isChecked(); getSettings().keyBindingLayout = filterKeyMapping.getSelected(); getSettings().uiScaleDensity = getUIScaleDensity(); @@ -157,10 +161,21 @@ public class GeneralSettings extends SettingsNodeValue { public boolean validateSettings() { return getSettings().autoSave != autoSaving.isChecked() || getSettings().useANGLEGLES2 != useANGLEGLES2.isChecked() + || getSettings().failSafeException != failSafeException.isChecked() || getSettings().enablePlugins != enablePlugins.isChecked() || !getSettings().keyBindingLayout.equals(filterKeyMapping.getSelected()) || getSettings().uiScaleDensity != getUIScaleDensity() || getSettings().msaaSamples != getMsaaSamples() || getSettings().fpsLimit != getFPSLimit(); } + + @Override + public boolean requireRestart() { + return getSettings().useANGLEGLES2 != useANGLEGLES2.isChecked() + || getSettings().failSafeException != failSafeException.isChecked() + || getSettings().enablePlugins != enablePlugins.isChecked() + || !getSettings().keyBindingLayout.equals(filterKeyMapping.getSelected()) + || getSettings().msaaSamples != getMsaaSamples() + || getSettings().fpsLimit != getFPSLimit(); + } } diff --git a/src/main/java/games/rednblack/editor/view/ui/settings/LivePreviewSettings.java b/src/main/java/games/rednblack/editor/view/ui/settings/LivePreviewSettings.java index 34a32787..f9758eb2 100644 --- a/src/main/java/games/rednblack/editor/view/ui/settings/LivePreviewSettings.java +++ b/src/main/java/games/rednblack/editor/view/ui/settings/LivePreviewSettings.java @@ -97,4 +97,9 @@ public class LivePreviewSettings extends SettingsNodeValue { public boolean validateSettings() { return true; } + + @Override + public boolean requireRestart() { + return false; + } } diff --git a/src/main/java/games/rednblack/editor/view/ui/settings/PluginsSettings.java b/src/main/java/games/rednblack/editor/view/ui/settings/PluginsSettings.java index f8b9f952..1dccb463 100644 --- a/src/main/java/games/rednblack/editor/view/ui/settings/PluginsSettings.java +++ b/src/main/java/games/rednblack/editor/view/ui/settings/PluginsSettings.java @@ -40,4 +40,9 @@ public class PluginsSettings extends SettingsNodeValue { public boolean validateSettings() { return true; } + + @Override + public boolean requireRestart() { + return false; + } } diff --git a/src/main/java/games/rednblack/editor/view/ui/settings/ProjectExportSettings.java b/src/main/java/games/rednblack/editor/view/ui/settings/ProjectExportSettings.java index ae475a44..406f4a9d 100644 --- a/src/main/java/games/rednblack/editor/view/ui/settings/ProjectExportSettings.java +++ b/src/main/java/games/rednblack/editor/view/ui/settings/ProjectExportSettings.java @@ -152,4 +152,9 @@ public class ProjectExportSettings extends SettingsNodeValue { public boolean validateSettings() { return exportSettingsInputFileWidget.getValue() != null; } + + @Override + public boolean requireRestart() { + return false; + } } diff --git a/src/main/java/games/rednblack/editor/view/ui/settings/SandboxSettings.java b/src/main/java/games/rednblack/editor/view/ui/settings/SandboxSettings.java index 83a5245b..16a50b6a 100644 --- a/src/main/java/games/rednblack/editor/view/ui/settings/SandboxSettings.java +++ b/src/main/java/games/rednblack/editor/view/ui/settings/SandboxSettings.java @@ -101,4 +101,9 @@ public class SandboxSettings extends SettingsNodeValue { public boolean validateSettings() { return true; } + + @Override + public boolean requireRestart() { + return false; + } }