From c7f734bf6413268514aeb5194fd48853142eae08 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Thu, 28 May 2026 21:33:37 +0200 Subject: [PATCH] flake --- .gradle/9.4.1/checksums/checksums.lock | Bin 39 -> 17 bytes .../executionHistory/executionHistory.lock | Bin 39 -> 17 bytes .gradle/9.4.1/fileHashes/fileHashes.lock | Bin 39 -> 17 bytes .gradle/9.5.1/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/9.5.1/checksums/md5-checksums.bin | Bin 0 -> 18897 bytes .gradle/9.5.1/checksums/sha1-checksums.bin | Bin 0 -> 19361 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 71194 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/9.5.1/expanded/expanded.lock | Bin 0 -> 17 bytes .gradle/9.5.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/9.5.1/fileHashes/fileHashes.bin | Bin 0 -> 20947 bytes .gradle/9.5.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../9.5.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 18939 bytes .gradle/9.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 39 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 4 +- .gradle/buildOutputCleanup/outputFiles.bin | Bin 18893 -> 19055 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes README.md | 3 + build.gradle | 2 + config.example.toml | 3 + flake.nix | 161 ++++++++++++++++++ .../java/com/gregor/jprototerm/AppConfig.java | 35 ++++ .../com/gregor/jprototerm/ShellSession.java | 3 +- .../gregor/jprototerm/TerminalWorkspace.java | 2 +- 25 files changed, 209 insertions(+), 4 deletions(-) create mode 100644 .gradle/9.5.1/checksums/checksums.lock create mode 100644 .gradle/9.5.1/checksums/md5-checksums.bin create mode 100644 .gradle/9.5.1/checksums/sha1-checksums.bin create mode 100644 .gradle/9.5.1/executionHistory/executionHistory.bin create mode 100644 .gradle/9.5.1/executionHistory/executionHistory.lock create mode 100644 .gradle/9.5.1/expanded/expanded.lock create mode 100644 .gradle/9.5.1/fileChanges/last-build.bin create mode 100644 .gradle/9.5.1/fileHashes/fileHashes.bin create mode 100644 .gradle/9.5.1/fileHashes/fileHashes.lock create mode 100644 .gradle/9.5.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/9.5.1/gc.properties create mode 100644 flake.nix diff --git a/.gradle/9.4.1/checksums/checksums.lock b/.gradle/9.4.1/checksums/checksums.lock index c0e6caeee22edc21c3ff693f4897386e816a60bb..b61369b3db0f44e0e49fffec8af05a1171e0327f 100644 GIT binary patch literal 17 VcmZSnqqyGv@x_|y3}C?62mn241z-RG literal 39 rcmZSnqqyGv@x_|y3}C?6$jrdduukc}%c1QXqAVC#4UNo=4H*~!2Q~|| diff --git a/.gradle/9.4.1/executionHistory/executionHistory.lock b/.gradle/9.4.1/executionHistory/executionHistory.lock index ffbd1cb4911bb6f2190cec38ff963960c2d6e41c..8f8bb0c1db1d2e65b98d8ef2931bc63d5980600c 100644 GIT binary patch literal 17 UcmZSn@Y~A&WN5%61_(F`06r20jQ{`u literal 39 qcmZSn@Y~A&WN5%61_(I9%)rpFuBgPnQ|gU>5(BHDk-4!U0|Nj7&kHpG diff --git a/.gradle/9.4.1/fileHashes/fileHashes.lock b/.gradle/9.4.1/fileHashes/fileHashes.lock index fc51bc1621683e0eb8fd9a7000c069e3e65163c8..ff40eff910d60ebf08428c149552721434a092b0 100644 GIT binary patch literal 17 VcmZQJN)8L&J8{xS1~6dJ0{}0U1VsP< literal 39 rcmZQJN)8L&J8{xS1~6dJVP;@xSU0)7=1gsu>1+m8LnCuzLk0!_;x-Df diff --git a/.gradle/9.5.1/checksums/checksums.lock b/.gradle/9.5.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..508949273be11e1d31b79ad1948d7acd80cda2c8 GIT binary patch literal 17 TcmZSPG&PnmbAR%M0Rk)lA36gX literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/checksums/md5-checksums.bin b/.gradle/9.5.1/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..4b8f9c0845d9c76eccb170f6f5d87096df147568 GIT binary patch literal 18897 zcmeI(-Ahw(9LMpaq0X&3LKK4@Btb}15xlUut5q^1x(JIRAr!Pk&Rxf zY1vzijiux9%mGKnXqQ|*)@=TN(Aget-S_uwiOR2-`9$YT^-XtUjmn*7zS}q5dw5_l zRq}#>nddFs`Q=FQx2t@_%uje0|Bc!Tzp39zT+N4_3mx{vI`w^*nOBxh&s{qAb4umc z%-md!{EJ-U69EJeKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~fz2(DV~m$(ockkZ(w|q!AK(7Yt-618!XNjv{D;iGB_wNXxv^%g zZw%dDwkDrCQ@=NTI5+;{yMvk*^UM>DYm`R(h3JM}YzsC#D$34pJ^%T`$@4ZFH@tAvEfs~D3dU2UVI7l({-3A1_3-ZG`!09y^ZG!ad(V@6Y1rDNkzl+D zv2l*crU&=lTzC2A!!Hl*@CMw{*yfam<#=?%m6}<0fePvKWzOIGN+YN$E3N8XCq eVCD4&cir%O3RcXH_4yZVv(nIYxrg2yX{-PVRomwP literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/checksums/sha1-checksums.bin b/.gradle/9.5.1/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..94928ab36236ea9ba0802886a22ab4ab4262dba8 GIT binary patch literal 19361 zcmeI(X-E`N00;2(%JtmEBTd5&T~g6DJIoRkvCN~=k~FepK_zw5GLH=^v^+ppFx{k9 zOA!kXvLunb(kP8gQZY-z&58~@F~M+4)OLGslw9qDALBnTJHvn8f8V^{eB7OVES5QU zo^Gtg&2;e;XApn@1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009X6F9OFD3(+NuF?Uc` zo^V7g);4{`3AZGKo1xb2V@NLhZee~uc+eU0W-5N>2FbleOkO9Qu-)U(-$chV@qFue zM2JO-vz+99LgvE9`iaD=2gFHqyoAZWHd*r~qrHSA_eo#Khs!ckf96lnyphRG1aZas z88ZX)`*$(9rG`hgW!k}4B=`QjkoyOH8W1&ylH9kQ$$2hG;=3s|m+AN_CU@z4YPoPI!4(eU#P4G=ppIgO_|1|7|ad{h=i$tu?1rTeEE! z$1U#6c4!<8Dd>&K>$l)b6G=6MYWv=whhEL~S#eXdbgb(8(M$n$~LrdeNt zy^Zoo%fOZ1p`U6iK$jcdb~uwYR^h}?AIVdndzKtcTXbE9O6(hwT)AaL-x6UjBfmPsm0QNta5;Hdd2g0k&#aT3y|DP5O-__l)Du7qP091J J?YyAW_ziey!XE$t literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/executionHistory/executionHistory.bin b/.gradle/9.5.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..e93a0d22f2656ef8afe13a2508fb2b30d6184c78 GIT binary patch literal 71194 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 literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/expanded/expanded.lock b/.gradle/9.5.1/expanded/expanded.lock new file mode 100644 index 0000000000000000000000000000000000000000..7d69f7cd3155377099176f9d443489437e3683cd GIT binary patch literal 17 TcmZR+%W*@~;(%EX0~7!NE?EPl literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/fileChanges/last-build.bin b/.gradle/9.5.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/fileHashes/fileHashes.bin b/.gradle/9.5.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ffbe7afde2cb7412227ac1092dd105f0b3f881f GIT binary patch literal 20947 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 UsvO73cB5StHx_4XdYGK}1G$eU<^TWy literal 0 HcmV?d00001 diff --git a/.gradle/9.5.1/gc.properties b/.gradle/9.5.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index f41612dfa36a5d69e6e935a92a4a3755e91eb43d..b94b98c22ad1e288358b8bc09f3dee544ef708b9 100644 GIT binary patch literal 17 VcmZSHJzwb8v8RV>7{Guz4FE!J1-t+N literal 39 scmZSHJzwb8v8RV>7{GujiJ5_+VI7<3(-ZA{J5MmM8XB1!8!|8e01TrG$p8QV diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties index 8ef438f..d0dfc83 100644 --- a/.gradle/buildOutputCleanup/cache.properties +++ b/.gradle/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Wed May 27 23:44:22 CEST 2026 -gradle.version=9.4.1 +#Thu May 28 14:41:41 CEST 2026 +gradle.version=9.5.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index f25149a1a6e30db197086da9da18862b279b8e92..0dc5541bb2de07c865406aa29fbfd84542acf212 100644 GIT binary patch delta 298 zcmX>*neqJ;#tkMCjPjFxB_uSagt6-VsAaHW00S?}|4=Y1{?M$-gfFd7arMcu5()zI zw2rAgHVEAh5%j!2xl|%!@>dB1f%jT#JQiDI_Cr;RPL`Ea&|tf$oROIF;3!m(8D=#5 zR^M6EkM;UPP5C(4R8m1eU>&!hg4t#vsNmVjzCaVi%4??Il$*5xYC&2 + find build/gluonfx -type f -perm -0100 >&2 || true + exit 1 + fi + + cp "$binary" "$out/bin/jprototerm" + wrapProgram "$out/bin/jprototerm" \ + --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath runtimeLibs}" \ + --set GDK_BACKEND x11 + + runHook postInstall + ''; + }; + }); + + devShells = forAllSystems (system: + let + pkgs = import nixpkgs { inherit system; }; + jlib = jlibghostty.packages.${system}.jlibghostty; + runtimeLibs = [ + pkgs.libglvnd + pkgs.glib + pkgs.gtk3 + pkgs.pango + pkgs.alsa-lib + pkgs.ffmpeg.dev + pkgs.ffmpeg.lib + pkgs.freetype + pkgs.libx11 + pkgs.libx11.dev + pkgs.libxext + pkgs.libxrender + pkgs.libxtst + pkgs.libxtst.dev + pkgs.libxi + pkgs.libxcursor + pkgs.libxrandr + pkgs.libxinerama + pkgs.libxcb + pkgs.libxxf86vm + pkgs.zlib + pkgs.zlib.dev + ]; + in { + default = pkgs.mkShell { + packages = [ + pkgs.gradle_9 + pkgs.jdk23 + pkgs.jdt-language-server + ] ++ runtimeLibs; + + JLIBGHOSTTY_MAVEN_REPO = "${jlib}/maven"; + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath runtimeLibs; + }; + }); + }; +} diff --git a/src/main/java/com/gregor/jprototerm/AppConfig.java b/src/main/java/com/gregor/jprototerm/AppConfig.java index 745a494..1e4a580 100644 --- a/src/main/java/com/gregor/jprototerm/AppConfig.java +++ b/src/main/java/com/gregor/jprototerm/AppConfig.java @@ -3,6 +3,7 @@ package com.gregor.jprototerm; import io.github.wasabithumb.jtoml.JToml; import io.github.wasabithumb.jtoml.document.TomlDocument; import io.github.wasabithumb.jtoml.except.TomlException; +import io.github.wasabithumb.jtoml.key.TomlKey; import io.github.wasabithumb.jtoml.value.TomlValue; import io.github.wasabithumb.jtoml.value.primitive.TomlPrimitive; import io.github.wasabithumb.jtoml.value.table.TomlTable; @@ -26,6 +27,7 @@ public record AppConfig( double windowHeight, boolean kittyGraphics, String scrollbackEditorCommand, + Map envOverride, Map keybindings ) { private static final List KEYBINDING_KEYS = List.of( @@ -62,6 +64,7 @@ public record AppConfig( doubleValue(document, "window.height", defaults.windowHeight), booleanValue(document, "kitty_graphics.enabled", defaults.kittyGraphics), stringValue(document, "scrollback.editor_command", defaults.scrollbackEditorCommand), + envOverride(document, defaults.envOverride), keybindings(document, defaults) ); } catch (TomlException ex) { @@ -82,6 +85,7 @@ public record AppConfig( 760.0, true, defaultScrollbackEditorCommand(), + Map.of(), Map.of( "navigate_left", KeyBinding.parse("ALT+H"), "navigate_down", KeyBinding.parse("ALT+J"), @@ -109,6 +113,7 @@ public record AppConfig( windowHeight, kittyGraphics, scrollbackEditorCommand, + envOverride, keybindings ); } @@ -183,6 +188,11 @@ public record AppConfig( builder.append("enabled = ").append(kittyGraphics).append("\n\n"); builder.append("[scrollback]\n"); builder.append("editor_command = ").append(quoted(scrollbackEditorCommand)).append("\n\n"); + builder.append("[env.override]\n"); + for (Map.Entry entry : envOverride.entrySet()) { + builder.append(entry.getKey()).append(" = ").append(quoted(entry.getValue())).append('\n'); + } + builder.append('\n'); builder.append("[keybindings]\n"); for (String key : KEYBINDING_KEYS) { KeyBinding binding = keybindings.get(key); @@ -222,6 +232,31 @@ public record AppConfig( } } + private static Map envOverride(TomlTable table, Map fallback) { + TomlValue value = table.get("env.override"); + if (value == null || !value.isTable()) { + return fallback; + } + + Map result = new LinkedHashMap<>(); + TomlTable overrides = value.asTable(); + for (TomlKey key : overrides.keys(false)) { + if (key.size() != 1) { + continue; + } + + TomlValue override = overrides.get(key); + if (override != null && override.isPrimitive()) { + try { + result.put(key.get(0), override.asPrimitive().asString()); + } catch (RuntimeException ignored) { + // Ignore non-string values; environment values are strings. + } + } + } + return Map.copyOf(result); + } + private static String stringValue(TomlTable table, String key, String fallback) { TomlPrimitive primitive = primitive(table, key); return primitive == null ? fallback : primitive.asString(); diff --git a/src/main/java/com/gregor/jprototerm/ShellSession.java b/src/main/java/com/gregor/jprototerm/ShellSession.java index e70a6fb..60d988c 100644 --- a/src/main/java/com/gregor/jprototerm/ShellSession.java +++ b/src/main/java/com/gregor/jprototerm/ShellSession.java @@ -29,11 +29,12 @@ public final class ShellSession implements AutoCloseable { }); } - public static ShellSession start(String shell, TerminalPane pane, int columns, int rows) { + public static ShellSession start(String shell, Map envOverride, TerminalPane pane, int columns, int rows) { try { Map environment = new HashMap<>(System.getenv()); environment.put("TERM", "xterm-kitty"); environment.put("COLORTERM", "truecolor"); + environment.putAll(envOverride); PtyProcess process = new PtyProcessBuilder(new String[] {shell, "-i"}) .setEnvironment(environment) diff --git a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java index 072fc6c..1360cc5 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java +++ b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java @@ -259,7 +259,7 @@ public final class TerminalWorkspace implements AutoCloseable { private TerminalPane openPane(boolean floating) { TerminalPane pane = TerminalPane.create(config.columns(), config.rows(), config.maxScrollback()); pane.setFloating(floating); - pane.attach(ShellSession.start(config.shell(), pane, config.columns(), config.rows())); + pane.attach(ShellSession.start(config.shell(), config.envOverride(), pane, config.columns(), config.rows())); return pane; }