From 3edf93aca43219c05a230335e9fd221f021d4fec Mon Sep 17 00:00:00 2001 From: fgnm Date: Mon, 29 Jan 2024 10:17:49 +0100 Subject: [PATCH] Add settings to enable failsafe exceptions, improve settings dialog with automatic restart --- assets/plugins/plugin-9patch-0.1.4.jar | Bin 23198 -> 23198 bytes assets/plugins/plugin-performance-0.1.4.jar | Bin 6125 -> 6125 bytes assets/plugins/plugin-skin-composer-0.1.4.jar | Bin 9959 -> 9990 bytes assets/plugins/plugin-tiled-0.1.4.jar | Bin 102932 -> 102932 bytes hyperlap2d-common-api | 2 +- .../skincomposer/SkinComposerSettings.java | 5 ++ .../java/games/rednblack/editor/Main.java | 43 +++++++++++++++++- .../editor/view/ui/dialog/SettingsDialog.java | 13 ++++++ .../view/ui/settings/GeneralSettings.java | 27 ++++++++--- .../view/ui/settings/LivePreviewSettings.java | 5 ++ .../view/ui/settings/PluginsSettings.java | 5 ++ .../ui/settings/ProjectExportSettings.java | 5 ++ .../view/ui/settings/SandboxSettings.java | 5 ++ 13 files changed, 102 insertions(+), 8 deletions(-) diff --git a/assets/plugins/plugin-9patch-0.1.4.jar b/assets/plugins/plugin-9patch-0.1.4.jar index b1181f597cc06221fdb41029bedb69d199b3390e..02f8521c58310794fb9e63af853308ec992e363f 100644 GIT binary patch delta 645 zcmbQYm2uuyM!o=VW)?061`ZAe9Ut3>iF~RoVA|Z1MH|F#QG(E`bRhICV=z5gkkJal z@Mm-ZGd5dl&0vDCR#@+1hp^I|_p(7)(;1C;A*`!9=lLM4nl~L&mdz)9+)dZuG;J+{#b~Qkx7IZ;qu8=A;w^*Pc96x1Dij2bBFZ;avO=)zWRpl?h#5R#QcO#PpyD!|GWgKGEEh1@a<>~lX zhzHs3&C?lYK;>S@pXY<9GG^Ju4q<)d-U~J3rLiECrDM1gs)NhHn30c>NrV~Um&sNk z#$eA(E)1~)n=yHFhyjH0JOt`|)lf%>NLHu^gt09&2*Pj-mzt~=rUUZIxc;x23zOnFo(UCkAWdVhJnEXVH?Ai#^X9*>l73OCjSfP z0V_89!ta;K&cN`7pMk*~Me!_apkm9(C&C~K_dHXs$Y5h&CWK(vu&Hw4P*2Y=O8(`BT5Va Di!aSe diff --git a/assets/plugins/plugin-performance-0.1.4.jar b/assets/plugins/plugin-performance-0.1.4.jar index 814ddca9e855309e01924d59cf61e0be7447beb2..8603d0640169fd36362e66d98bc8403a4207979c 100644 GIT binary patch delta 241 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 alK37r6|uA80RN~%zF+R|!3CKguYUuLBsX;c delta 2889 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 CeMgP} diff --git a/assets/plugins/plugin-tiled-0.1.4.jar b/assets/plugins/plugin-tiled-0.1.4.jar index e852df45fda094a820c01d427362fe41d9fa4219..d71edcb18172908d5f0e88a528ab287c698e6263 100644 GIT binary patch delta 3259 zcmZ`+3s96*6ut*`mj!kgOaw$hGzCRSQ8cv_Nibm*QNol8C16qmMFiK!g06z1$gAJF zmZL_~Xb&Bj7TrmEX;F?!XgM`#r7=U3rlUQ_9$@D_{#|~oe}?_DDoMURT&BC}RFH?x3ZGRcW%4fA7SQx;9Aw_GGk;%1S>HvtL9pw<` zJeHsCC+tR5j4^V%4%fzpBcD3{>hY+&+7HEe;I-0${F`d@mN6TO>ItY}O-w%gmz2J1`P#WicxL|nqj6gzkqX?NpFZw{N zlGtXTA6LO(r}f;NKyK}varnHbh|-hCav8?yl{9>9z2r;C$`D3x96IW0VI}xF{Z8JM zHEM7EQ&O`WIVo3Xod@JD8rrT4I!=0}O31L#3ADKu^mJS@$P8Xi0e=v=cFqHxOy-T* z;4PQkR=6V#zR!TYvP6l=ut-XqQ(=OXmS@63FEeYM2a}TS*t`iDsx)SeWm~4yH<{_Z z-QeR|GZP#FTgjO9xTwK^`2{ioYwBr9d*7@ha&^-*Erb{J{Qi6ET-Z>Puqh|2&EPUG zf_70sIwl(Ch-Av5VT)*S*PjUxC3h}nLxiym+Cn^khu<12LDIl*YX=yu0d~ zg7mt|tbk0~Rt9HH>NGNm>&+4f_2x>~ciCW<%bXlY46=Y%khf=W>Hc*fMw4Dz2QzqB z8f=5{VwGl-^Gd62kR)X7Hc6ijUJvO)cEJu|UR9u+%8R9; z9u*VLe_I_LKpVF}n(&RRMBlgo?ps_AgSqsj%_yvN3(d+ZTL`^VAsd34Dp0*OSoJY0 z>8l6!QP-BEx*^1)-j^TNM{Q@|vqpH-g%zP(&1riM3PRE~w2NarE>9N=KHSA~hV*yY z8t-;tN6UjE<*Qqez>>+V2yt|@1BP)F7E3(}$G8IrlAfgKM5PI$Xrdjb;?^cv-tS6N z3MdX=-B3cNy3Gk`brkn8Z?VHr5wvF$2F*!Tk)nk3`SmE>HxH$g>HF&?^#3#YZLxCk z#8}$vPF-ul;SQqAyJ4ZVyJWJbBTg;* z5buX6;e^cBMEYPSb9qMO*;I{8Z@egC8+S^Y8@$v1`2}Y`*n|KY=ia@%?CCWyL;zT} zBEakeC>>9;x60s}17735=YRs|(&#r;YN=K-|0&JPU$Gy4ppS+Rsj(F`Q|~K?=N9N+ zkfp7(sS=j*YDZmdif+Qg_P7rrGc+__`+x`ZZwaJlRMHN<7O!t#d0SD)NVMbdAx zONu2RpH|1kE|1Un1_%|AifR$As9RNy;F&D%u(VwQJZ*53v~~RK2h~zfZ`VPz0GZo> zAU!{NRL3(Rn7-Mdw%%L2QJ?t}jh_iKsSyW9xV^Fg#ZkAZVCUl>ptPvGX#pD(4O)ef9XZ33^}WmZ$@O{*GR^zkLPv`$D7iL z=R=AHs@r2~qyu)tC_!i%tJaFqZWtq-GzrTYvs;Zbp4Cm6=;nc6HYTNbq=BDF0^<>O zAH2IzHPI>WEF46a*i{6p1JxB-s+xTp1#Rwo7P2pmwORgijw0bj*a=ui_tWaQkPW1C zMPWhyL%F4exoi77zL2~j>NfV^EbKv?MEBF`IP{cojLR!4S-ZOAq2g7~xt)FR-wpoB i6W$16-lubb-pYm$OVgMfk?MR_Xt z8*fZ233+G}qNMJ|ZEX^bNi{XGae_`pNfepbMsZ5g8K>F@?YZ~dfAyElx!#Usi z?z!i2@4xF+zg@5TS@N?@<{-ub0@$}NR4?teOf|o|Z~4;h*;(dq#Q$63=>5iYdS93+ z-&z=?l8^`UrQmu!rzn`DlCjiiDS3KlLfj7tmooY=Sr6WP)0d>L|8ZPNO`|JKHI!lD>Lg*nsLKei`7ofb82UHAS!m%Ch_syNX@YiensDcVaXg0wz& zp!S5DSX`CvbhQo3>8rjn`28y#SLRt6Gf!n~F$SOP8tN&t(pvxitXZ+0EPI4hO_f{y zNor`!QHA=X_1+N4HC*#p!zs+?XTFRTAlGy)zdV*-cS3;cm4>ra57*7-tSZ>Rb*)Ob zyY{zA7hS$WMVMW@K9E)l*^^0G;rs2dSgy3@aOtpP0%NYpj4hNYKez(|JU@zoOv_Da;#7on$BCzqKF2y9= z^bxw>%VcH$&G_j837^*q{(Mshgvf=jFaP#zF1E+EV8$}NaK_xuPA}ZXk92~aw(y@0 zTzGDl&J<7DE}=E$=~^5Asskb<|2-|26Mu>E{L{?XTmyeap@d@|%=~|a5Xo;ftC$2# z-@<)fAF+kxBH^RGl;z83Y*c9bhd0h#HZhhHz}P%5TI`@+N85KdsuP6I-H4HTigg;z zlWw)2Ce5_7w=~GXA$v!;5CWhhxW?=DOE8uDTd;>USehp`x0XnIc zn9qks-)24-*u3YMKV!pTjO7{N(TxKB1cf%%fT3k>RiP!{LGbqKf;$&u9j^FnL=urtWR2nZqwN>wQ$P4b?Y4l&kW++aQkoGq#}m$|(wF zsK-7on2UQ?y_kZ*9KvgIwjr3-LCSYf3)siyJIMBVJJ~#Llu9bidJICPu!Xmut!>o26`)zs1~PJJO1_&$E>+{_=NR0V5)ek8>0xaxjd)(W+BB1oc2Z+4xg! zFp)AQK>%_Q3mn8v+*5RsaWyd@p@UG_6Qy$>+qPuE5rM^ooANu z{%(kG5~!mk9UsI;FjkHbY#Q(5cIKA=t9iO&<%$Q^u3mNLWhC5oX4WN)V$K#IIUYFP u$L;)e6}inQUsqMVrs}(#tBZmcA7G5fcSCrnXPv%GX-!3GH6QDSsQ&{bY3z6a 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; + } }