From a3f4878fc748acb567f2a14eb138d9de199ae90d Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Thu, 28 May 2026 00:33:38 +0200 Subject: [PATCH] stacking --- .classpath | 18 ++ .gitignore | 11 + .gradle/8.14.4/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.14.4/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.14.4/gc.properties | 0 .gradle/8.9/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/8.9/checksums/md5-checksums.bin | Bin 0 -> 20047 bytes .gradle/8.9/checksums/sha1-checksums.bin | Bin 0 -> 24491 bytes .../8.9/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.9/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.9/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.9/gc.properties | 0 .gradle/9.4.1/checksums/checksums.lock | Bin 0 -> 39 bytes .gradle/9.4.1/checksums/md5-checksums.bin | Bin 0 -> 21997 bytes .gradle/9.4.1/checksums/sha1-checksums.bin | Bin 0 -> 30863 bytes .../executionHistory/executionHistory.bin | Bin 0 -> 49514 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 39 bytes .gradle/9.4.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/9.4.1/fileHashes/fileHashes.bin | Bin 0 -> 27697 bytes .gradle/9.4.1/fileHashes/fileHashes.lock | Bin 0 -> 39 bytes .../9.4.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 20469 bytes .gradle/9.4.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 39 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18893 bytes .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 .project | 34 +++ .settings/org.eclipse.buildship.core.prefs | 13 + README.md | 16 +- build.gradle | 31 ++ build.gradle.kts | 32 -- .../com/gregor/jprototerm/AppConfig.class | Bin 0 -> 9131 bytes .../com/gregor/jprototerm/Direction.class | Bin 0 -> 1206 bytes .../com/gregor/jprototerm/KeyBinding.class | Bin 0 -> 4198 bytes .../com/gregor/jprototerm/KeyEncoder$1.class | Bin 0 -> 2064 bytes .../com/gregor/jprototerm/KeyEncoder.class | Bin 0 -> 2841 bytes .../main/com/gregor/jprototerm/Main$1.class | Bin 0 -> 963 bytes .../main/com/gregor/jprototerm/Main.class | Bin 0 -> 6359 bytes .../com/gregor/jprototerm/ShellSession.class | Bin 0 -> 6208 bytes .../TerminalCanvasView$FontMetrics.class | Bin 0 -> 1861 bytes .../jprototerm/TerminalCanvasView.class | Bin 0 -> 13153 bytes .../com/gregor/jprototerm/TerminalPane.class | Bin 0 -> 4090 bytes .../jprototerm/TerminalWorkspace$1.class | Bin 0 -> 841 bytes .../gregor/jprototerm/TerminalWorkspace.class | Bin 0 -> 11312 bytes .../stash-dir/Main$1.class.uniqueId5 | Bin 0 -> 963 bytes .../stash-dir/Main.class.uniqueId3 | Bin 0 -> 6359 bytes ...inalCanvasView$FontMetrics.class.uniqueId4 | Bin 0 -> 1861 bytes .../TerminalCanvasView.class.uniqueId1 | Bin 0 -> 13153 bytes .../TerminalWorkspace$1.class.uniqueId2 | Bin 0 -> 841 bytes .../TerminalWorkspace.class.uniqueId0 | Bin 0 -> 11295 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 26141 bytes config.example.toml | 3 + devenv.lock | 65 +++++ devenv.nix | 46 +++ devenv.yaml | 18 ++ flake.lock | 274 ------------------ flake.nix | 182 ------------ settings.gradle.kts | 22 -- .../java/com/gregor/jprototerm/AppConfig.java | 15 +- .../com/gregor/jprototerm/KeyBinding.java | 17 +- .../com/gregor/jprototerm/KeyEncoder.java | 50 ++++ .../jprototerm/KittyGraphicsRegistry.java | 143 --------- src/main/java/com/gregor/jprototerm/Main.java | 14 +- .../com/gregor/jprototerm/ShellSession.java | 49 ++-- .../gregor/jprototerm/TerminalCanvasView.java | 194 ++++++++++++- .../com/gregor/jprototerm/TerminalPane.java | 68 ++++- .../gregor/jprototerm/TerminalWorkspace.java | 189 +++++++++++- .../com.gregor/jprototerm/jni-config.json | 123 -------- .../com.gregor/jprototerm/reflect-config.json | 43 --- .../jprototerm/resource-config.json | 6 - 72 files changed, 788 insertions(+), 890 deletions(-) create mode 100644 .classpath create mode 100644 .gradle/8.14.4/fileChanges/last-build.bin create mode 100644 .gradle/8.14.4/fileHashes/fileHashes.lock create mode 100644 .gradle/8.14.4/gc.properties create mode 100644 .gradle/8.9/checksums/checksums.lock create mode 100644 .gradle/8.9/checksums/md5-checksums.bin create mode 100644 .gradle/8.9/checksums/sha1-checksums.bin create mode 100644 .gradle/8.9/dependencies-accessors/gc.properties create mode 100644 .gradle/8.9/executionHistory/executionHistory.lock create mode 100644 .gradle/8.9/fileChanges/last-build.bin create mode 100644 .gradle/8.9/fileHashes/fileHashes.lock create mode 100644 .gradle/8.9/gc.properties create mode 100644 .gradle/9.4.1/checksums/checksums.lock create mode 100644 .gradle/9.4.1/checksums/md5-checksums.bin create mode 100644 .gradle/9.4.1/checksums/sha1-checksums.bin create mode 100644 .gradle/9.4.1/executionHistory/executionHistory.bin create mode 100644 .gradle/9.4.1/executionHistory/executionHistory.lock create mode 100644 .gradle/9.4.1/fileChanges/last-build.bin create mode 100644 .gradle/9.4.1/fileHashes/fileHashes.bin create mode 100644 .gradle/9.4.1/fileHashes/fileHashes.lock create mode 100644 .gradle/9.4.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/9.4.1/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .project create mode 100644 .settings/org.eclipse.buildship.core.prefs create mode 100644 build.gradle delete mode 100644 build.gradle.kts create mode 100644 build/classes/java/main/com/gregor/jprototerm/AppConfig.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/Direction.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyBinding.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyEncoder$1.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyEncoder.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/Main$1.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/Main.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/ShellSession.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView$FontMetrics.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalPane.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class create mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace.class create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Main$1.class.uniqueId5 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId3 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/TerminalCanvasView$FontMetrics.class.uniqueId4 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/TerminalCanvasView.class.uniqueId1 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace$1.class.uniqueId2 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace.class.uniqueId0 create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 devenv.lock create mode 100644 devenv.nix create mode 100644 devenv.yaml delete mode 100644 flake.lock delete mode 100644 flake.nix delete mode 100644 settings.gradle.kts delete mode 100644 src/main/java/com/gregor/jprototerm/KittyGraphicsRegistry.java delete mode 100644 src/main/resources/META-INF/native-image/com.gregor/jprototerm/jni-config.json delete mode 100644 src/main/resources/META-INF/native-image/com.gregor/jprototerm/reflect-config.json delete mode 100644 src/main/resources/META-INF/native-image/com.gregor/jprototerm/resource-config.json diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..be88c88 --- /dev/null +++ b/.classpath @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index b2be92b..ed72e43 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,12 @@ result + +# Devenv +.devenv* +devenv.local.nix +devenv.local.yaml + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml diff --git a/.gradle/8.14.4/fileChanges/last-build.bin b/.gradle/8.14.4/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/8.14.4/fileHashes/fileHashes.lock b/.gradle/8.14.4/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..71936add78fc508f5af6fe134c1937f66a150bee GIT binary patch literal 17 TcmZP$Gp-h!dvcLI0~7!NDFXv# literal 0 HcmV?d00001 diff --git a/.gradle/8.14.4/gc.properties b/.gradle/8.14.4/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.9/checksums/checksums.lock b/.gradle/8.9/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..6b42c4eba65073d186bab0a732b674042a1128a9 GIT binary patch literal 17 UcmZQ}?CP#~-6yb%0Rkog05bLjrvLx| literal 0 HcmV?d00001 diff --git a/.gradle/8.9/checksums/md5-checksums.bin b/.gradle/8.9/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..f5f7e88854a7abbe8f79399161afbb2a0458f81f GIT binary patch literal 20047 zcmeI3`BRfe7{_xA#HfiVDmZe8coexJYQa%Z&{mRwiX6%zpygB$kSIt+>IG^Ps3b)# z<}T!b*LysrA5%b$?objFaJP0&pVSh?|ib~eRe;)lV6fu z&S23YSBRqitFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00aLQ z1MbvBMx)8-nz57*<6;;L!C30Sa9?MDysR|$H2PSaMt(n#Y>CSZ)6F)~>JV1DlM4Xygpn=EfXixa7dxKlvwXW;O{hJW}dSR~XZf;B! z;-X-}naPTtC-Ffq5O?nR$Sa;7F*P!HkJ}$7oD;M+c6&hhPq=??!ny5TIBtW1#y%Z?Bs@@XQ*0;9(#GRSB0Sh+Enm`;HHf(5ZNfth??uO^ z-}oEXts^`luBmYSx$9|&3%P{vC`_zwto>#?;!Z~h-z76N*qYtkiug)>!pS>>!NN6A z3%G*;FaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE41fVJ00zJS7ytuc z01SWuFaQR?02lxRU;qq&0Wbgt{)-0YQG+(2UPj87)|~RNvfgI551KWy4uz}18wP`! z8G6qQ|C67ULN&7ZcOpo$e$QyRaKN~+_tKXeZLLs3;7YZmF7_Sjrj`gSS`x6^{e;Yk zqg~4m@xnC(wWe8v8Zff(evp+oW zr~lXep51j5^N%*!pc=+kRRP9?5oR7S|1Lv(a2Ee%ilCwBKxB}z#wNerJe1H-8Fgbjy#lz zE=HqbOX!Iloy(=Avdb=3#o0p*jF5-8?`P

zj&fbp*1V#A?JAAUT<_QY=gs}?Y@Kn9Sd`!;(i4N(Qw!=&Z`|0vBFWKjg{5-0Q=>X| z7$x`#^u#OYGbbyH|GH&c5EkRk-;k_KYzmw6D@u&CuO5E&v~bGNgoRmkAI$Q%1yE-~ zREe`Fpbq&tKzx!!6;#b*PJ_no~X)^8>@#z_xp0XtkNQed z)!2$^jB27M!t;t>{PF$u`bgf+Mm^5TE?mO_B?PJTL{dw>h*wO325mJW=`OA~24uRYf0_P&bx rE>tGA%|i2FQ6|(A!_6XTTY4XJa%$?6W*;wVw=3-$Wuk<((wW6Spfd|m literal 0 HcmV?d00001 diff --git a/.gradle/8.9/checksums/sha1-checksums.bin b/.gradle/8.9/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..33d14880701ace10955e8dbbf8a552329fe67d6a GIT binary patch literal 24491 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 literal 0 HcmV?d00001 diff --git a/.gradle/8.9/dependencies-accessors/gc.properties b/.gradle/8.9/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/8.9/executionHistory/executionHistory.lock b/.gradle/8.9/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..8afbfe112891b7929fc40aecf97975dfab81b308 GIT binary patch literal 17 ScmZRcbN?3e(Zih#FaQ8L9|Uax literal 0 HcmV?d00001 diff --git a/.gradle/8.9/fileChanges/last-build.bin b/.gradle/8.9/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/8.9/fileHashes/fileHashes.lock b/.gradle/8.9/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..1d4ce21e275c71e968cf992d6abc611ab427a5b3 GIT binary patch literal 17 TcmZQRa&fxiVO!-=1}FdkGw=iH literal 0 HcmV?d00001 diff --git a/.gradle/8.9/gc.properties b/.gradle/8.9/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/9.4.1/checksums/checksums.lock b/.gradle/9.4.1/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..98fc7a5677a6e1bcabab90a0ddb2ffbef3f522ab GIT binary patch literal 39 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 F{y&RPLC63A literal 0 HcmV?d00001 diff --git a/.gradle/9.4.1/executionHistory/executionHistory.bin b/.gradle/9.4.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..1a9b6d6be246d3737f179de2c4b1c68256a8e71e GIT binary patch literal 49514 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 literal 0 HcmV?d00001 diff --git a/.gradle/9.4.1/gc.properties b/.gradle/9.4.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..3413bb35d4e5eae3e11bb43788ce44190c757826 GIT binary patch literal 39 scmZSHJzwb8v8RV>7{Gw>5;Frs!@89be% literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..8ef438f --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Wed May 27 23:44:22 CEST 2026 +gradle.version=9.4.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..f25149a1a6e30db197086da9da18862b279b8e92 GIT binary patch literal 18893 zcmeI&Pe>F|9Ki8O6v_W-ZfmF+i3xU)ipYadAvJr^Lfk_Vn}X!Q%k~E)gk=ef5-+l* zAb1k8gXJHTwGG5SH>LXq^Ge-s z+B@}iYNX4zVI-VaYkVSr00IagfB*srAb + + jprototerm + Project jprototerm created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + 1779917652126 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..97aed87 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments=--init-script /home/anon/.eclipse/1927926929_linux_gtk_x86_64/configuration/org.eclipse.osgi/58/0/.cp/gradle/init/init.gradle +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(8.9)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/nix/store/c3pl7bqrx3d2rc3dh98z6yaj0mv1p52g-openjdk-21.0.10+7/lib/openjdk +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/README.md b/README.md index 23d2aa0..43dd93f 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,17 @@ JavaFX canvas terminal prototype using `jlibghostty` for terminal emulation, Nix nix build ``` -The package build compiles with Nix-provided OpenJFX 25, `jlibghostty`, JToml, and GraalVM Native Image directly so it does not depend on Gradle plugin resolution inside the Nix sandbox. +The package build uses GluonFX through Gradle so JavaFX native-image metadata is generated by the toolchain that is designed for it. In a strict pure Nix sandbox, Gradle dependencies must be vendored first with `gradle2nix` or a checked-in Maven/Gradle cache. For development: ```sh nix develop gradle -PjlibghosttyMavenRepo="$JLIBGHOSTTY_MAVEN_REPO" run -gradle -PjlibghosttyMavenRepo="$JLIBGHOSTTY_MAVEN_REPO" nativeCompile +gradle -PjlibghosttyMavenRepo="$JLIBGHOSTTY_MAVEN_REPO" -Pgluonfx.mainClassName=com.gregor.jprototerm.Main nativeExecutable ``` -The Gradle project is kept for interactive development and IDE import. +The Gradle project is the source of truth for native JavaFX builds. ## Config @@ -57,11 +57,17 @@ navigate_down = "ALT+J" navigate_up = "ALT+K" navigate_right = "ALT+L" toggle_floating = "ALT+F" +new_floating = "ALT+SHIFT+F" +next_floating = "ALT+F12" +close_pane = "ALT+X" ``` ## Defaults - `Alt+h/j/k/l`: navigate panes -- `Alt+f`: open or close a floating pane -- Font default: `Symbols Nerd Font Mono` +- `Alt+f`: show or hide all floating panes +- `Alt+Shift+f`: create a new floating pane +- `Alt+F12`: cycle floating panes +- `Alt+x`: close the active floating pane +- Font default: `JetBrainsMono Nerd Font` - Kitty graphics protocol parsing is enabled by default diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..3635554 --- /dev/null +++ b/build.gradle @@ -0,0 +1,31 @@ +plugins { + id 'application' + id 'org.openjfx.javafxplugin' version '0.1.0' +} + +repositories { + mavenCentral() + + maven { + url = uri(System.getenv("JLIBGHOSTTY_MAVEN_REPO")) + } +} + +dependencies { + implementation 'io.github.wasabithumb:jtoml:1.5.2' + implementation 'dev.jlibghostty:jlibghostty:0.1.0-SNAPSHOT' + implementation 'org.jetbrains.pty4j:pty4j:0.13.11' +} + +javafx { + version = '22' + modules = [ 'javafx.controls', 'javafx.fxml' ] +} + +application { + mainClass = 'com.gregor.jprototerm.Main' +} + +run { + jvmArgs += ['--enable-native-access=ALL-UNNAMED'] +} diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 72e980d..0000000 --- a/build.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ -plugins { - application - id("org.openjfx.javafxplugin") version "0.1.0" - id("com.gluonhq.gluonfx-gradle-plugin") version "1.0.28" -} - -group = "com.gregor" -version = "0.1.0" - -dependencies { - implementation("dev.jlibghostty:jlibghostty:0.1.0-SNAPSHOT") - implementation("io.github.wasabithumb:jtoml:1.5.2") -} - -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(25)) - } -} - -application { - mainClass.set("com.gregor.jprototerm.Main") -} - -javafx { - version = "25" - modules = listOf("javafx.controls", "javafx.graphics") -} - -gluonfx { - mainClassName = "com.gregor.jprototerm.Main" -} diff --git a/build/classes/java/main/com/gregor/jprototerm/AppConfig.class b/build/classes/java/main/com/gregor/jprototerm/AppConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..24abfbb69cf5bf9f23862d2143b836616fba79df GIT binary patch literal 9131 zcmd^Ed3Y4(dH=mSn2|IBG0}lI1x7YnEn0(ZEVJ0*5CQ=Lf-nZ`L>{e1t3|6Fd3S_N z+}N${)=fy0G>zk!9`2nsr8Q0?TR4wX_j1~_P4Bc#uk^msBW>EWjg#j0eKXpf#fzl+ z;lJp4X6MuUUBCDI-tV2yeEsE50oX5YJ*rS`pvFQimI<29Ip>{3*2$$4C)|{m9~CUy zmC0rNdj!>6x=z)>M4f?p3k|RY8&ck6BAs{BUOsVdD)0H8@8%~Hd#0xLdAYGnT41ES z?DS-=AdmqydAWrZYGzH|n<*&5N((mLBB(8lyV{}6Fo%S=?#Go^k ztmnv>g>J-&Xw)5Zrn5eW-L$3a$RdK$Q+q5Va4UICY2h7r{Bc1mCu@o1GG1aVlXVk{ zo;0vsu&TV{NG3ONY|77gxq94=I}Gfwa3^{NZz&(w&s7MkF;h6cimztr=&;N3~S z79E~c8|=2Q2YZ#txDM@cpd!qL7aR3b)01w_PpG~7!hez``e^aWVlz1>+Y?%1Cp%5)aNC98o>!w1zB57vsZCC*Rx*&CcBjym2f7AK9HQ`x+bTyeaYV4Z zNYbvLa2&O8499791?>qTl!+Sy<&EG%ON-()aYE2sM5f$qcuc#WiIeo!@}2@cP~kph z;Xa%u?on@=a=5V~?Ca_?akl8fJu}L;O*}xM22R~GuD#mCJLo>zorlw*KlivfrI=9# z@<9s@M!3$1=Ve_dcVkhW?K*3M=GvHZ&S%n&?+$0(G2g_Ppgj^qddj*RFpi9Ya~38* zUuo2SJ0D&cfzz%pxH)tHt)^om=iHQ^jA||<8ORAbD#x9}?uETU6jOqjvhWb{jMZUe z6I{GO7Pi>##J%Vc6XdxhMF#VniSyT!V$l6CO|K}}=_wQM6tq>8y6XHE`d)E#UL6P~ z9u=&vI3eu+Rz`o{OQ*B$@L1M!d>#lU9v7^MPI|+DCuwatcP29BI~c{IQ_6e4Q*rJ- zOqVO}@t$irFYkV@IzF;q!5yA*a;}N@DHkZ6Sv{pbWosX>@ZI>JpvoH)*;c`>A~7N~ zt8ZpX=w0}%%^-pbDc?oe-1xr;D;>y zFn*+bwmxha5A>mSj1gS&_rZEh;#CVjk6$2V%E=cfs2!D1EG0(%Qn>0N6R(BM z!zO+uY#uT3nXuV!;@24+6@sCI1N|qvN%$-Up$Prkwww5^aNubZzr!GRy6?d7zGFxG z2M!D$JT|z$o;LS;7JeU}c@}?X;qMif4dn88-kWms{sj~NNa)NI)#b*-7da=vLo+er6vhqwi(r!m zrnei&X5F-t-IGu2)U)Wd%B23y!k6&xoK5qa%=nq}RQ=;O=FD9<5!N1^DDJ9LRR)Cs z1GDWf<3A1jmxZq=gTHH`fVALB%$%J|FQ7D_$t|T3IjRcO}h+AyiE=m_!^Jd zlE_X>=lsm1TNIU=`+pYiV4@f7)5)Zs+Q%-bwxmYc5|`Z@q;L(gObkOz=1)>5*tR$W z*JSL115qp5H}2$z+=r&!T*_sxviNc;_1Af1vOyZeGNjRx|6?v~E>kFKMJ?21 z$x5+FcS>}@-HTkI7F1EvrdXRTX^~b6*Y^T#3GUc(op4jU)R!fjp|`8WR$0<6tGU=X zyN}JxigvAEb+_jdhll2TK6tTDoEes2M9$XvEch&qVJMT%IsSB>+wU(w zXm>?sgt)J>$>CytoV+K=n`gky3f_I)qrB0&d40W8#R@OwP~rKEx>bb48h<=P4mMtA z?Ggh_&C2Irn3`XsY0&k@z0u=N-kD^O&2zo{n@%v^B;Q@9$T{;)USiDo3$)<21-)Q? zT=_+t38u@GeEWh^D`hxJ_EWkH(j4fnJZdvL9`c>k1Zyv$?8DN@LB?=eUqs*6i^klc zR>y$FI18Lf4~<;#8H|`+Q$S-*HakKnJOZwx_lQk#PraNVxu8fEc3{EU2!q$gPBON2 z35%Bk)-@?m#HGY5FUy5pf|c`WT``qa@iRPN=V@=!`j`(4dDHon8x*IO7u}{uofnK0 z^YzIl#(uxx^MW7vOu>|XW}N%H>Fj7n&htBTYSke-JH!;$bk2lzo}?K23a@`Lyv_!)HC8jeI&+ER&&nIVtxV!XnAX zW{+&U+JXA_z`FI^6H1d@oNE`$+U)3I_%pA9Qk~tmth%;&~I(Qx%F%5i=>9 zc#;99!tiL)G;aoPTw)(BekkL+NwRdNUe3z>hCE=&+vOds3zt~R2WNUBSSVBx!!(O7 zfz|{s+(^z8PknA7mCsC3Zc*;`Wt~DHN(j$@D7$6i3FKOK+!amV8p!3`yk62R7(#>W zEb&}nm3i$LlA<*%Je0;As1n?KHS%`A-A+F3Nlw$7p{)?PD< z=Gdy*S+vDg8M9auTU9rU^|6+QS!|58TeIkVfpe>66MvU+U0}J~#NRR0^S4(vODErK zX&zL6ujWE=)~l-j++DR4CpEgIc&XJb#f_m`ik~{&QXDntmg32ho7uMXzP-3bI!L*N zl+HRmXa$?QS7g=*##C;6+@HU7=E1q)TF~3k2qo!y3wcHPyU^roEO5UxyZK#0G3aj5@iU zs=WuDIEb5Zg8F%Y3LZljrr7%^_46TYWx=3_Qc2)*xD{W-HmTyLkX5*iCf7|JZsKk` zq#Jk2Jv2R~sJz@WvdOc*O zn2umS2KjrG9|`(#FTcUmsSijY&L`tZkB4=$lKR{IK`J5z1{ z@z9wX`%j1F@aI?Tzn;V2E(^&2pvdg24g0u8pgdc9=Slkby%f?Zs_L{Bu=2fS*eTmo zB+?=@A+KYz!3tBos-1+0)@VFj&Hkq=MK*(g@c;+11|1HhwP^QmjdcrM=jhf?qc(nJ zD}{7rXH8sLRU-k|_~#JVYHkla$Ux!H=SSG1do4!M(7VPJ*yl2)x5u~79o8p%kX!QJZB*O(AvL0J&zwZv%l|EeGw@sFZz z>s9=Ru;Mf?GxdEH$P(bBhN6s-lZpUZiU3+<2e+-_$QAgK+!Y0|+`yOj2h!wcsSv<3 z9IIkvTMyj~`yhqytWoD|r5o*T~4{~j(%sYOd^rv}+p z1ld*u*+!6*3D;P8El7(X`wi|^ufF|+ATQ~$^mq+&XH9zzRk`K)_L{5sy5RYpY!l~l zVrabv=ewwhN4eKy?0uZQPhb_EEaF@h;#2}yUBtP%h;ub@uIAnbIaI=|DQQy)^FV-; zpMMq>rc^B~%y&}|?;*n%3G{v3>iuNo14WQa5$5Jag~>uu2y%vFc`Whh?Y=6tJb&V^ z!HQp%dSOtil`CvA#Vpxg;IB_Jf_#{`p5dAQtj4AfH>@v;ZG9*BHWAbbaA$bcM@!*WCh<)|E!=F>&05+*21WG{2>bCFm|JQ zal?yTC-%Z11qRuGf+WRqX>*TZqTHp%n^f(9fVwR@TbQ@$%)yvV8xLa)Xeq{oIvo8 z8<;?jA-U`YUcACE)K1l^+$vNwC^~5#*O1a+Xz1gpU|htYI}?WVYd1a$ z4|nZ|a>z?0LXM9-3MtF01$Nwss8q@qD&&!6$8U{kzKx3ybGhryub2$F6*eNr-SoJ` z-fPp&@|#_qqlsq8>dNXc_b)(^EGZ&6QADyJkj`@B@l4u(h#9JTL?}m*KYA1CFBrJQ z;3q;1v-C}hJ&E#1QA9%IFHqzadWKD3VE7V@=O;SyAJd9)m4!JxAv8~~LS-L$Dp?1T zAe*Bo(Uv+rGjfix&-D90CKU@@g$7f0^FAcPz89P2%rlvl@y@o k0{JtfxtOa4Lo{*_VGqSDiI@TxBazgr(?7#=+E3ucZz}Hf=>Px# literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/KeyBinding.class b/build/classes/java/main/com/gregor/jprototerm/KeyBinding.class new file mode 100644 index 0000000000000000000000000000000000000000..26acc652d9d58ad8d43d9e977190fd49e1b6a97d GIT binary patch literal 4198 zcmb_f?N=OE8UI~&W@lK2081cU0%Su|0t4Xtg4WdakHneFb7 zCRVMjRr{j#t=6_iO{x}ct&(U+PkK)MR*!!5Pf$Pj#dAEKXW zGEgVQw2bR`c{eNP8Vp3`oLZQ-PkM4@vw~Bj!uq`ksuD#iNnK(s8+{5 z14G!)<%J*}0)6FrOVRZmzd-^u91!SOL)~yTYt5P2q5Ry^qUCr8&t$BeXS+_6a6M$; zJ{%Uy6xBHJAyPmB@ut*eU1a$fwY+(E z_I@*OE?TUmlv8tNUX}#LXziGkfOVTkDe5${ zw#n^6nuxjycPXE-4%sp>b!%7B-7<yyeiO6f%r^t ziN#r2|D`P{y$1@P3vmt%8PM zu;#4!TtQ1II~rDqr<=19k3lMN4{x3-UUmwfMSNp%6qS!Azvn~A@A*7pU&C6)3yR!N zlFG7I*|#LFKqR(ahL&i(jM_xoWz;8P%4IZOYVx&K$l`w%u=Lkzmc9fZ&@ui-ht zJ+JXiVyvGe75sC#jvu2#QIu=+VT15Lp~`Fc1-uv_g_*75AF!)u6=R8CLpzTy4v%qI zdme2ZKEz@Dc|Ex2imVgd>6io zuW@hbp^B=$eY`B>LpCr+>?XTR@`c1`)nM-$08P#*?`(Tgt_}QSp-uLO*-o%cDVu)x zXZF3l(Z_t;BtyhOqBm;#)OLxA*4}8wry5mKn|h;`PpRR-Hi<9(jtD;ToVAy?OPHgx zVx;E-s68u*cd@WC%5P_d2ET&W@jX6ggD7+|=U~>KLl<5`H@?pCH~9PFW%QCWNzOi; zV_f9Hk5lFx{eOvEGWr*M%z*q2Y|Ydy)P7dNV|HClY*rDn*TS#{63)3 zfCfJ5I)Vst1K!Kz(}?)T0g3R9g~te3idkupKVm9~F99;iw-)E`o1*w0a!ZHwM9)>6 zxsiMT3jI1LbbJ%vq6WUSSyucKMw0?RR0+zPnV}Zd@S#yrxc2shqZNhgZ%?=hk5(|d z@n*pm_k;yy@Bw z(9#kKJ^&KDRzd=)uW5s-s;UqYJoO0)J^&JY03_Pis^_d-CJ((lR*Lt(zvJ1Rv)LK{ z`p3`r0chCrq7Du>oD%hL33RSyH?!w21xmV6Gy?hJMx`8>HZF(EoFU-a%oZv}Nuay0 ze=_11p73BTQh|8)~}3sDdCyjP+LK7o2IkY?qb}1ylBrHzba5sctsKBm5Fana*%>KEZ|K5`A2#pNURRWw`RD#9Q`|m=>`M z??{}m3scFsea``jK`uD7M3}D_mKb5X!dgtr*h9u7PIAee3QlT^)wxegyvsF@UHhwn zvl8!dwJtKq_j+IAT$Mx235igZ!%R&gQsoG9N+Me2D05mOR^=EoA(5=|B=bXwnJP~) zGZM2^o@UNVe8hA_1_#)mNG#NB_w|{?=QZ1nElFhA^{-!sE|KGkOs2HN;=~NSDb4=> zotIeQFKRC@7EDj^40(w)E;oi^$+Winf`Y_4f8z>AC!-nrSxkuyF4f1QiP^LpmVl3! zXm!aXm)8uvEYNUPFXW5)^0>XS=IAw7cTH0)Uo;Yx^<~4#WS0xHkD6nqo-NE}tvtI{ zY)qH4`UP73HG9)$#nO#Pp08+9d*uYrOcmNX1+$bduEdS^;h( zY^i*T-Kczqy;pgh-J~33`;^1%eae&UX5|mqEy{6rt8$9nrkrN)SDs_HD}T)HQ2vyC zKzWhfsl3cSsBEyilvmk@lrOLkD;L?_w!f#JHV<0Sjy80l7sn`%V+f;^V+bNlsUd|l zWd=*oDRZ=GN|a@6;Tq+2+`vuBTeyuoly|X>9m;!nfQOWi@EA`hpW+#wQ@+4UyrTR~ zKseAQoWdtsC|gC3=%w_F0WnNDBF>2rWmu#{nldAngie_g8=^#67F*&P<#lmG+@!oE zZi_pVcg42Yp}Z#^h=-Jq#AES<@~LRUMFU2dG-+@iq3@%>$=)^@j*3st@eZIx` qyqiYE|K^b3+W&fh6PN8~zrU}esmPLKQcxaX%Q3%(b6 zq3ut{7rHrb)b<6ca_Yii`^b##=4^q^*6bye>}rcwmBquM@3`Y#Ni0E~fqHpmg_RG# zJ4-6rXkZ1J1hjEG%9C?(Nv~IQ8|e)(-LRhY zMnyYGM--Jx+@k2FNj-6-b|8^~c)MRdP4&4?~3M)U_sF@|vs z69ybiE~pcgHLR1|gyr`#?Gvp7ZJ8wUnAYGL@K6w_k%3VMW+-Omr~q{dz3U4F+s{}5 z?@hF3g7KD}? z1_EnTO)YTHMf9UdD)Xwcj%)9qnLcd$2d%?-+G=LKoRvRh`HuW9PA0+$ho?7Zf2v5B zf@Q4kxc;J)4*0QQsX7x0_v;IZ1@o|X$|kL91gAA6sxnScXHU9 z@pJZWM_N`T-#_&nbx3{a-~DzF4%*UsT35Zx^THtXtpZ=U32!ve@e-q0FRIG$N)oT) zH4VR(5%`TjT>Z++jyvm3*=c2$3d(L~k>?*1cwv4xih}C!J(fF~w}VvH^QLABT^BlN z-pqoH2agr(i-?cRlUMy=!2?=6B4g$A!%iq&Wem73Gb?WefgNagosZl3AT79Yp{g1p zKCPD)WfCa6u%0h=2{RW+aAYHcz=QnS$Wd@CZT~aG+ax7;i2r5J1K9NVpg&AzC?Pz8 zNBO1WF)ULDl=M-OvSMfZ8E7Zbz@hRKYB^M&!s7O`sL8JV8%o!nmJ4cKTd=z+5pFcEj&RWI zjxc2QMA&QYiqLQNMd&eiN9Z#5MA%~PjnHXkBdjy`M`$sxjnHgf7opKS7-5-tC_;_- zvj~gLnCHwwn)L=WK*v*w5x}=}0@3RH} z6%F_RjrfR?pP&iKsb8QO|Hc*gFWc(ZJoA58gL7yR0*a1Ov03?8%rh{CEmaQ=%XL z$1`}At1>7pXk6KJ4kt9UB!29#N8@{*ls{ioM&V19QOGl68nR4>TTfys2W!z8*k>_S z-81^sSsXb%KUXrmtd3|Rr2E>5G_i@;Ms%Aq(*2C-GILJ4|Cn_D?b7{sE_D9}x?S!m zrFjOrc;XIZ>GT8Gi9>Y!2zuEicfm#mljy?~*QINg#ubw9^g%FgvNOB0-+VJWGrxZS_zB<;VIC=@9b`PLAj`1T)uXU)L|>b5_}1t| zC&G-v6E0Qx5raSBQQ2Cg;!#_Q_YBp>Vwct&Rp)BLV~ef1$RY2*^>7IuLvhF_JRB!7 z3SV}HqMO7F1tZ>#r4dc7n&T*9*bN#}Sj1I-4y#rEHn}KZ)q(G!h&6^C>+|MA$dw%N zL~0d2J3qDLNEn9fW2t2FgdrVN+Agl*nuB!@8`eAc-yac;5vphTj)En1u%)Xld0SAU zN}C~5*FC|o+K@^#$D@ugE#8U9vewXDsyjE*-si?lGLTfc?Ikg0t*cS07FT{qJ^lxh zaQ=x%2Dc1c^m7%mY$M7RNY9& zQuSwa4k`?riwkSrJnUhgVI@wuNfqdJ zVw7l-3pCWs_w6jxDMh=8>!fc?hn*(fTB`eB!1i8$hjVsT{f5h*rqE52Sum2faFgWv z+rToAicvJxCZUy$c;PM*VE fl*v1Td*q+OF7A`gAV3ulrj`H)q+P<;U(xylFtF+$ literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/Main.class b/build/classes/java/main/com/gregor/jprototerm/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..72439f568607bf55f24b8d2efb9f1a1ac0f8e1fd GIT binary patch literal 6359 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 literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/ShellSession.class b/build/classes/java/main/com/gregor/jprototerm/ShellSession.class new file mode 100644 index 0000000000000000000000000000000000000000..9a4d193e05d9216cfff7e355c7d5da1bb8532484 GIT binary patch literal 6208 zcmcIod0ZUz761NVVU}e$vN1t&AW2BV5wgas5n?nTDJTRI5G1kcune%tGP9kXg`l;q z+QYWCwU#MThgVLRbYM89FL4z`lx9|4kj$qHf`M+kMxe|@p!MEOvX$@K;erh9|Tr*O8JC6 zbl-+Avx;8FwdTm{&V{goi_}?^3 zD^F9g0xJaylJ;>H!*VS!C)-6=a3k3>x)nzAh2up_R( zZY^q?))Y-&gS85(RGfiofhxzGg;UxN>(La&i9iLH=#3epaoyFEekIUZ>l(Ola`t+j z!wZGdYI=2RA{Nyh0M@J6fEvb6I;2~4Dfa>k=Y~O16`N7ZkXtE2cV(>;w^PTtc?p?5 z5+Y`3@gB|4n?3U#e(g&chBg$}n~PD81_fJGG-9hj%_%YTJfvI6)X;d0{5;zOE?emm zK7FL=i^roSH`uZVsY|D z!KK+q*cSO4M3+EbV=RPrbW5jum|?XCdUNtk5wlEVoXI4x zbrDcGON3_&G498Jg3DD5Vt+bicEU^;bD zvltOsRCCRta1bw)p(e-|xD{bhC4WvepkD#kS?;i$mAj+6?Qm32*xV~ZNMb_8Bn}IN zh)x%G4Q*8CmXOXiC)OUd!rZ#9QE{!rvSM62q_?t4YxY3Q9^+lo)(krt!gYADf|sax zDXw2~zw*~8A~9*jY%aPY7oIf!Mu9UN<6Yv#72KxccHAMb&T-9PV4`E1#rYAsW(;fA zaI5>w6e+l@Z}(N(1y;E(_=PN!rcnq zCByY@hCR&@|L!jRJkTQjybJGD@jltM6pX}E$uY^$_pA7TGvXj8vG|aR591?DOj^-l z_}YhxG^r#B=U>qDkKrB#M^)U5kNb%_FT+aiwh4|Y9WtwrshGwLb6vA6Z7OOen2}jg z_sVgHFYM_dMlFm0PRLz%R^aOY*?vo$e9L8a+z{@^0}38g@en@2@-JZ?IULaviFk|| z#7vCz#5H@ww7BI3*#mTv+)VolKZ`Tkr11s#lr;X+0^Lg)?@uys=gQ9htj#NPQmCCu=4v z*b-t3%qeCYHs42-xkx&FvFx|loao#{R=C3pc*c6+M2i$!8~_rBjgi|52=+z+R%U{< zG8@3DL>k0%vsd1+SmWZ6owTonWi@(;wtB%}o1SDn=YmPyV8svE`eAO91w(G(%sbG+ z?O-T1G9p{Dr%AZDHa;}0)y(s_W}Co{=fq^!q6Mhb_2*Q2ro&yi?=0^Bvmz&JGJ6uw zES__uJ^n{(s?C`N{u%&|j|D|JH@y*! zI)|%mvpQ+BWvX_#)KpEupa?TNTg_B_xY{uJX8wJ(psLfPsue2!iD$V|g?!@K^Y8da zQ1JMO={jSrM88;(J#Z%-5NT&k-wYKgj(!G z9opE{bfJN#;w`wG-#wxPK&P`woaw;O4u$gu@C*Es+Ab#uGD-!Mslu=DYmU)r{02|* zD(@sTa{U|eTl|h7$-Ce4E+2p3y~=m4wm)*_pEwePcm`30>k0fBxA0d+H_jDgbSoLa zn{G$oD6h&KZXR5{W(KdD#v5cD^Bw18zY2aPQE(oWZKs3h`{GxbiC?8-kTk8*F(}Vj zJ|BV>;4kEpyYj76D_7p+TX}iIy?Dzs-ZqUpIl6or?>T~CSN$}O9ObMaX;V%6U31p+ z8Q4K{F5uloB-k##znBs&Scg`k-4TulON<~hGc*;>=r#6 zpCUR1oU?aXHSVV&#AX^F+%k=i4(`mm6Pu;!cbt53?ft=~z?S^VKt2g|Up+}P%e3I% z+>w)y9>Iz|jvPuF8fWoIXI#2dh-MNa?ao;Y7kJVy#HGxWP6oY;MA}2LbQ9}7%I>Fh zKffCdU^nT}g9DCxJ2_(m6Zt7TO(&O=Z1*}OxR7}!U6v5<&A7bRqm5kU8P0HHQ;NW| zC{*ybb6N<>O!il?Oo=Wn?TX>I27c6CGK10-q5WaIyHpe44xTxQcjPjWTGA$B<*7 zWFn`#CX|Qd-sh=qp=ueCQdv-#WM6WUY+j=@0d(~V{;qT-9rO9fre8WI%JbyT>gl_J zGSb}=7w%vK1NF!}e@mU0JtWLtV%?h|2Pb6kDaoW&iGyf{yDC>=JK(L<rJV7iLr!x~ho)`wUOd9)?UJ5T3*1gZ1IB&EOlI4XildZn%e|ZuxZ0Ud3v#8s+@< z`~=^)Xt47T5}{%!B2O^EkS}D4=7|C!OC)nctmc>^g8Y|v#X{x(dQK~IewTTp%Q@=4 UU+KNC6t&b4qGX+D5RIt(4{$u5k^lez literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView$FontMetrics.class b/build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView$FontMetrics.class new file mode 100644 index 0000000000000000000000000000000000000000..37dff2de2b3c37c1d0970ceb13443c1b3273bc80 GIT binary patch literal 1861 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⋘$C!qw?+_MZgT#asZ@iIQcU7Qp)^5KCOYAl4eU82Oy0VB~ETUJ7=r!Bp4}F(# zTR*qUQk5{g`ZeGXu7wx9o4fbY%u2skJilMVZi4BuKR1Za&J-v5Xs1wa-Al7TSqM6( z&F}Slf`y%f--dRT(C*kvM-Or>3>Nx5g`Kd{LVvFCLJa0GAbbeYB4D(iwPtw3)sEsC*O9x`V!pH$y4-I&wGItJU~jd5>PO>o-<1}=r&mQHayC3pm7l#nz*zHb5eXkyA57{?gri(_Wfzkgwc$kZ;+Dn%nks-+sPB8o$%ecbux;o9yYm$QOsmepTkq zDfiekWiFYboiQ#j9^=;#_BTk>eg|zmhj+k#gtvYkdEyK3)-S^6zl_-a3Y|x<()si! zc&fh`H7v9zIH-o}0I5@ou*E4$tt6UCUb#(iR;&-JDl1%9`M~|TEjg!@dp1`-a4XHNDz7YeZ=T;; zRqonci9ad1QIcPf;BS8GrOMSe@Kn{%q^BeJ5T4n%=?&P_n+RBM!GXSwiT@o5^BWNR z9Wz1MJXmy`T4g4K!PROAj_m<0P-{?PgL_Tt19(NXk`K|bJ|&x8N9fgf}%07vZXZH_7k6ih@8l~?9X@mqH2%`eM$Lhrw%WJ2$*T3uPDQ~XcK zPal<-`3L#@uWdi?)fUXEDV$wXB(d>>n(^}UVNGdS!6S6Gzp$(z#RI$jZn*G5e-XZv z+U>XSWyh_mHraWZEh0;E8PY}|eFbRe6{?e41(l=lYdEr$w9*W$D4bZ(*3Ex@` z_i`LwQ7xu}NQCc468wEyNe{qG9zux!0d_wRBfS3*0sTkl^$1d*N8t(|V>kT_`^3l1 zB3}>eRnl`Xi!)$^i}6D7klF}8(}=zj@(aQBLE~wQz`NgU#>QiWyGS-;rI6)i<99R+ z_kDGy+9VE^^U{lrlDI{H3MFxifCA?kw+IJ`k|btukZ6_U8EGF%XQ@vhqRZxP1C4uM z^45(X&`gVWS$yRH{Cy#;R06-`0Q@#u?Iw%gv(tg5oQX|2uG0FPiS;==fZaH$Vml_*J) z1okEAxuWFEl}dOrvJLFh)n+&^`xK(aP!mnbOd{^#Q?P|RtB9^bMsW{Uia2cc*mi^} z$MQ@emkOX>sW#XS!PptuRXa-9Q>#zH!-iC+I@gpUs#`^!x|oVPbxF0&DQ#Eht4q-n UFHZoNe03R3QkSbM)E+APKdeuiA^-pY literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/TerminalPane.class b/build/classes/java/main/com/gregor/jprototerm/TerminalPane.class new file mode 100644 index 0000000000000000000000000000000000000000..2b79a1b8afe799e25e0c164822327fddb2d9b3c1 GIT binary patch literal 4090 zcmb7H`%@d&75-L8S`cgV2rnbRi66BP5XHo)6TrBB#E%+`YX~+tcCv`Iv{-1B)e4OJ z2yN5m(Ij>H%1`n5xBQZs#xoVpG&4=7p6L($lRBNI-?_VhtcuoVW_5P&-us>Jp8K71 zmVf;F&wl~%Dn5-NggPBz0}(_uG%uMeW-4dqGpVVCB`fV|h>qEL+Z)$Vm*}6>QLkY@ zO)7bIE|qrj>5}VOc`s#p&a$0Oolxeob<^T#+KNF(T>~0n=-6doH<~o;OFPS{jB8~a zH?>r79nbMBcR4k~A3Ja6E}3~t!)`8LwA|^uStw>5@)(+U3b&);vc*6vp3$JM*hPCG zM^J5E#@h{api@J=xD}5Yx+fN`mDEzsUdUvfqUWt`u~A5S40Iz-q_mSOE$53wIxk4Q z2Kr^iH(7@oy*I`$dZj{_R^?u0m1@N7pgLe5PM2NUPd_wVREm^&K7cW_8Y!azTg z8ak`7&-$#%#3@*L4aXAy7jkE(^wx+$QN$3pu`|*rna|4Hlz|sSJ-Tb%bgg1GhGD#@ z;jwLKn8d%{0mrMzj+wey)#!5+rT0`dxHCa#_ApOv7G8W_Vd zdMjGRA|t8cz(j3DO=qoKZrY#4O&!Pgbeu47Qb_F}!pbF#W|1Nk37fhkdQ{mqx7dwbF-#v%X2Uo_OfYl(38agq?$(vsF47$5weC!fjqGN$Q?Csw_K? zvP@59nUu;h9hGGgD$Bm2Ec=ME%tU3GdbDjsW*MfZH9ozAI)rHtBp*Ucehq!@AsWhv zCBtPjCkM)COZJq}mFz8}=Yc}G!{0t86o?j9oLh+5gFWcwcpp2}Ui^@6lRhqfgdg*X z9@IWHbteo%>P|S;p#eX^+X16I*$JcW?)X>O`xOpOevQVt!S47&3|t)A!1F_2@@)vh zqgBn^$MyTk;Q+dDu)=q@bXd+Jmh@EOH=sqa2yu24>tt5PQFfHT_g&(O@4n=p&^9;u zH!%YnIGm*0!AGB?{^H=Hp>G~=mX3CM1FyKUb&5|1xr6;w=kA*@!1EepRE89%4z=UH zt$6g|r}!ED{#>Diz9kI5ni_SyqjRRFDawMc8AGsnCxC8yCXZW zdk^o|V)w!0?0$t019szNEoT}P)r@RwMLq|Cqm0bU6`rD7afm9Nv)4!y4X|Ddu$p-Q zBY#Ju7@otpp!$*CO$&^2FJs)xcm;Cv7IJe%gn7=ATx=VGieUH_YWULvR85*J*-7pcXoW?G$YgFpsbvG_2OfPnIq+!k8@|=iOvQm$o3fSMU*+2~ z96ej%r6cennrMagEnkO}CVW8zwc#T&n!?BY6&5L4*+_&eCcof~pBnxaE>wU=wzlwV z+zl3QA6mSO$?8L!;-Out2yNw|Nl_BVtu=`>R}-18N#v8-M4GFKTp^LGI}nkoC`2yf zH~jS@BDK|z$fZA4MdVsdBC|CY&r~mdqvqndnv1VgFHYB7{CdsB^VN$pH5dODzYF%f zMkO|ItDVV1Wn4=3mobyM+vc&K%Md> zs6yE(Uw}&No$~b;%#((r^F6=ad>Yy?-$-j%kKaRc&pjBu_fX#+{tV#a>1_{hAkDWd0EU=&&jvC{>a&bTZ zsW+tn?uoEIH;zPU_e52R9)qV6W|jMqrs^l(ILig#GP8=*Ziyvug(Yx}W#kUdF$z%Z29^;eXG;zZ*UTqs#+Q9Pm@%h#CT^6$UDiqNaP|@Vu zHGsMiK*jwK3gXBH-b!k$&OWjyu$7JLL!RA7g#MT*b(eekq{2l!a3Q;3F_oPAJ#Rz! G!+!v}eGyIo literal 0 HcmV?d00001 diff --git a/build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class b/build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2bd6d75b30a1c6778146b43e297138033cdd1977 GIT binary patch literal 841 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 a^6ut{M>xO!(cfGAMrD~iDv!%P)cpy53F?vn literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Main$1.class.uniqueId5 b/build/tmp/compileJava/compileTransaction/stash-dir/Main$1.class.uniqueId5 new file mode 100644 index 0000000000000000000000000000000000000000..068e051a6a31f644ff226bdafccdcc0b2c9b1480 GIT binary patch literal 963 zcma)4-)|B@5dIb@2j@wTs;$=AqGCO0?ddbdXh@B1D4LYe__)9dOO9RLJJ3h}B@=(e z2mb*7DB~>9^g%FgvNOB0-+VJWGrxZS_zB<;VIC=@9b`PLAj`1T)uXU)L|>b5_}1t| zC&G-v6E0Qx5raSBQQ2Cg;!#_Q_YBp>Vwct&Rp)BLV~ef1$RY2*^>7IuLvhF_JRB!7 z3SV}HqMO7F1tZ>#r4dc7n&T*9*bN#}Sj1I-4y#rEHn}KZ)q(G!h&6^C>+|MA$dw%N zL~0d2J3qDLNEn9fW2t2FgdrVN+Agl*nuB!@8`eAc-yac;5vphTj)En1u%)Xld0SAU zN}C~5*FC|o+K@^#$D@ugE#8U9vewXDsyjE*-si?lGLTfc?Ikg0t*cS07FT{qJ^lxh zaQ=x%2Dc1c^m7%mY$M7RNY9& zQuSwa4k`?riwkSrJnUhgVI@wuNfqdJ zVw7l-3pCWs_w6jxDMh=8>!fc?hn*(fTB`eB!1i8$hjVsT{f5h*rqE52Sum2faFgWv z+rToAicvJxCZUy$c;PM*VE fl*v1Td*q+OF7A`gAV3ulrj`H)q+P<;U(xylFtF+$ literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId3 new file mode 100644 index 0000000000000000000000000000000000000000..72439f568607bf55f24b8d2efb9f1a1ac0f8e1fd GIT binary patch literal 6359 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 literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/TerminalCanvasView$FontMetrics.class.uniqueId4 b/build/tmp/compileJava/compileTransaction/stash-dir/TerminalCanvasView$FontMetrics.class.uniqueId4 new file mode 100644 index 0000000000000000000000000000000000000000..37dff2de2b3c37c1d0970ceb13443c1b3273bc80 GIT binary patch literal 1861 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⋘$C!qw?+_MZgT#asZ@iIQcU7Qp)^5KCOYAl4eU82Oy0VB~ETUJ7=r!Bp4}F(# zTR*qUQk5{g`ZeGXu7wx9o4fbY%u2skJilMVZi4BuKR1Za&J-v5Xs1wa-Al7TSqM6( z&F}Slf`y%f--dRT(C*kvM-Or>3>Nx5g`Kd{LVvFCLJa0GAbbeYB4D(iwPtw3)sEsC*O9x`V!pH$y4-I&wGItJU~jd5>PO>o-<1}=r&mQHayC3pm7l#nz*zHb5eXkyA57{?gri(_Wfzkgwc$kZ;+Dn%nks-+sPB8o$%ecbux;o9yYm$QOsmepTkq zDfiekWiFYboiQ#j9^=;#_BTk>eg|zmhj+k#gtvYkdEyK3)-S^6zl_-a3Y|x<()si! zc&fh`H7v9zIH-o}0I5@ou*E4$tt6UCUb#(iR;&-JDl1%9`M~|TEjg!@dp1`-a4XHNDz7YeZ=T;; zRqonci9ad1QIcPf;BS8GrOMSe@Kn{%q^BeJ5T4n%=?&P_n+RBM!GXSwiT@o5^BWNR z9Wz1MJXmy`T4g4K!PROAj_m<0P-{?PgL_Tt19(NXk`K|bJ|&x8N9fgf}%07vZXZH_7k6ih@8l~?9X@mqH2%`eM$Lhrw%WJ2$*T3uPDQ~XcK zPal<-`3L#@uWdi?)fUXEDV$wXB(d>>n(^}UVNGdS!6S6Gzp$(z#RI$jZn*G5e-XZv z+U>XSWyh_mHraWZEh0;E8PY}|eFbRe6{?e41(l=lYdEr$w9*W$D4bZ(*3Ex@` z_i`LwQ7xu}NQCc468wEyNe{qG9zux!0d_wRBfS3*0sTkl^$1d*N8t(|V>kT_`^3l1 zB3}>eRnl`Xi!)$^i}6D7klF}8(}=zj@(aQBLE~wQz`NgU#>QiWyGS-;rI6)i<99R+ z_kDGy+9VE^^U{lrlDI{H3MFxifCA?kw+IJ`k|btukZ6_U8EGF%XQ@vhqRZxP1C4uM z^45(X&`gVWS$yRH{Cy#;R06-`0Q@#u?Iw%gv(tg5oQX|2uG0FPiS;==fZaH$Vml_*J) z1okEAxuWFEl}dOrvJLFh)n+&^`xK(aP!mnbOd{^#Q?P|RtB9^bMsW{Uia2cc*mi^} z$MQ@emkOX>sW#XS!PptuRXa-9Q>#zH!-iC+I@gpUs#`^!x|oVPbxF0&DQ#Eht4q-n UFHZoNe03R3QkSbM)E+APKdeuiA^-pY literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace$1.class.uniqueId2 b/build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace$1.class.uniqueId2 new file mode 100644 index 0000000000000000000000000000000000000000..cae4c9b87a504144bf944af3410b9129f8d9cef6 GIT binary patch literal 841 zcma)4U2hUW6g>kA3%IqkR*Lnbtz9j&+KndqqA@WAEGZvGusrl>SSGM^*&(w_{Xf1K zAJxPdWBLR9QN}xK6EvFCWHa}kn=|*EJ9oeT_<9DQ3MYpIk|qobDWnV8{ zl)J)yz_4R?-guEaYVxT~*X&=e?71uZH&=<{dX^@+Y+(_32BT4}bs07<^ry#Pwr~Y2 z45m~A?Sdg$D%VXE7}m!8lsi5ThE7X%X6~rw34c&kN-8Z^v~W$!C0@VO@VbQ?v3jN5 zYw5x*3+uX&dR2dM&^58ike_#K_s8_844J2{?*(4;EEYZ@_xo}n7#15|AX>9YU#Kqc z`&3zONSFIZTzMLw7Z*AacTeb*&T+0IXUY{dPv0o~^|X8105z`$t}jC`7&b*Tk^>X> z7`Fd&J>fl&KC4?_{=H)!D-^lPzvQLkKQRJn~UiZ-FQNKyvWzJQ&5 z%YB0RQGW}cv1GL0!8nZJD#6qot`SVn;Z1^O3_rj?7AsiARTN3%F2!v;#3PE2@f;P3 xN!%g5bgcTG7@);~SU>@po=J@6p9l3U#jG-RC>q$M^L|{}#U906JQF4P%ugy{#ajRX literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/TerminalWorkspace.class.uniqueId0 new file mode 100644 index 0000000000000000000000000000000000000000..9774dde921b8fb0fea2f3e5e6b0f027cd8c027fa GIT binary patch literal 11295 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 Ol$WT7)FbLK)cg@Hd*`J9 literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..adba47dcb0ba42fab4a0e4f383e5c3667a0b50f3 GIT binary patch literal 26141 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

ERtpP)*y-;sdyaOD9;rWPfy3q{ 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 literal 0 HcmV?d00001 diff --git a/config.example.toml b/config.example.toml index f6f5df2..cb450ee 100644 --- a/config.example.toml +++ b/config.example.toml @@ -18,3 +18,6 @@ navigate_down = "ALT+J" navigate_up = "ALT+K" navigate_right = "ALT+L" toggle_floating = "ALT+F" +new_floating = "ALT+SHIFT+F" +next_floating = "ALT+F12" +close_pane = "ALT+X" diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000..5834f80 --- /dev/null +++ b/devenv.lock @@ -0,0 +1,65 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1779749056, + "narHash": "sha256-AtocdrunzuxTvSDn+82RntEhrs6TicM6Z4/zNQS9KKg=", + "owner": "cachix", + "repo": "devenv", + "rev": "099ac65fcef79e88127bdc06adbd1ea94255274a", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "nixpkgs": { + "inputs": { + "nixpkgs-src": "nixpkgs-src" + }, + "locked": { + "lastModified": 1778507786, + "narHash": "sha256-HzSQCKMsMr8r55LwM1JuzIOB+8bzk0FEv6sItKvsfoY=", + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "8f24a228a782e24576b155d1e39f0d914b380691", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", + "type": "github" + } + }, + "nixpkgs-src": { + "flake": false, + "locked": { + "lastModified": 1778274207, + "narHash": "sha256-I4puXmX1iovcCHZlRmztO3vW0mAbbRvq4F8wgIMQ1MM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b3da656039dc7a6240f27b2ef8cc6a3ef3bccae7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..78379c6 --- /dev/null +++ b/devenv.nix @@ -0,0 +1,46 @@ +{ pkgs, lib, config, inputs, ... }: + +let + system = pkgs.stdenv.hostPlatform.system; + + jlibghostty = builtins.getFlake + "git+https://gitea.gregorlohaus.com/gregor/jlibghostty.git"; + + jlib = jlibghostty.packages.${system}.jlibghostty; +in +{ + packages = [ + pkgs.git + pkgs.gradle_9 + pkgs.jdk25 + pkgs.jdt-language-server + pkgs.openjfx + + pkgs.glib + pkgs.xorg.libXxf86vm + pkgs.xorg.libXrender + pkgs.xorg.libXtst + pkgs.xorg.libXi + pkgs.xorg.libXrandr + + pkgs.libGL + pkgs.gtk3 + pkgs.alsa-lib + ]; + + env.LD_LIBRARY_PATH = lib.makeLibraryPath [ + pkgs.openjfx + + pkgs.glib + pkgs.xorg.libXxf86vm + pkgs.xorg.libXrender + pkgs.xorg.libXtst + pkgs.xorg.libXi + pkgs.xorg.libXrandr + + pkgs.libGL + pkgs.gtk3 + pkgs.alsa-lib + ] + ":/usr/lib/x86_64-linux-gnu/nvidia/current"; + env.JLIBGHOSTTY_MAVEN_REPO = "${jlib}/maven"; +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..4da5c66 --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling + +# If you're using non-OSS software, you can set allowUnfree to true. +# allowUnfree: true + +# If you're not willing to allow unsupported packages: +# allowUnsupportedSystem: false + +# If you're willing to use a package that's vulnerable +# permittedInsecurePackages: +# - "openssl-1.1.1w" + +# If you have more than one devenv you can merge them +#imports: +# - ./backend diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 14956f4..0000000 --- a/flake.lock +++ /dev/null @@ -1,274 +0,0 @@ -{ - "nodes": { - "flake-compat": { - "flake": false, - "locked": { - "lastModified": 1761588595, - "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "ghostty": { - "inputs": { - "flake-compat": "flake-compat", - "home-manager": "home-manager", - "nixpkgs": [ - "jlibghostty", - "nixpkgs" - ], - "systems": "systems", - "zig": "zig", - "zon2nix": "zon2nix" - }, - "locked": { - "lastModified": 1779812402, - "narHash": "sha256-gozJEyJHbaAyrbzODKeWJhxpUrGK6m4DIPDogfjz2BU=", - "owner": "ghostty-org", - "repo": "ghostty", - "rev": "2e5ad917eb4e325a3dbb161c3f41208a8cd35e44", - "type": "github" - }, - "original": { - "owner": "ghostty-org", - "repo": "ghostty", - "type": "github" - } - }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "jlibghostty", - "ghostty", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1770586272, - "narHash": "sha256-Ucci8mu8QfxwzyfER2DQDbvW9t1BnTUJhBmY7ybralo=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "b1f916ba052341edc1f80d4b2399f1092a4873ca", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "javafx-base": { - "flake": false, - "locked": { - "narHash": "sha256-96fttJUts/rFwKB7u5G8NWkK2NjJ3a6eIKbe1RTWkmM=", - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-base/25/javafx-base-25-linux.jar" - }, - "original": { - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-base/25/javafx-base-25-linux.jar" - } - }, - "javafx-controls": { - "flake": false, - "locked": { - "narHash": "sha256-2Cdc2/hPOjJmQidDjXu9vnlwAuawLn0cg/tLhzFfkUs=", - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-controls/25/javafx-controls-25-linux.jar" - }, - "original": { - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-controls/25/javafx-controls-25-linux.jar" - } - }, - "javafx-graphics": { - "flake": false, - "locked": { - "narHash": "sha256-w01IhRAQzcfTvwkqIQkjrI8ZPXT0VTEeijfzbqp3G0k=", - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-graphics/25/javafx-graphics-25-linux.jar" - }, - "original": { - "type": "file", - "url": "https://repo.maven.apache.org/maven2/org/openjfx/javafx-graphics/25/javafx-graphics-25-linux.jar" - } - }, - "jlibghostty": { - "inputs": { - "ghostty": "ghostty", - "nixpkgs": "nixpkgs" - }, - "locked": { - "lastModified": 1779889299, - "narHash": "sha256-B82MyhTvlfeszdcuM3F8YDSZYaxUom+m59oQKSoWjmQ=", - "ref": "refs/heads/main", - "rev": "eea43843002f8fae4fa4cb1c46b64339124bf6b2", - "revCount": 6, - "type": "git", - "url": "https://gitea.gregorlohaus.com/gregor/jlibghostty.git" - }, - "original": { - "type": "git", - "url": "https://gitea.gregorlohaus.com/gregor/jlibghostty.git" - } - }, - "jtoml-all": { - "flake": false, - "locked": { - "narHash": "sha256-KWrUaDVmnWzdkQxjgPFFNl8DOEvkCqWW3OmXU2sZHKw=", - "type": "file", - "url": "https://repo.maven.apache.org/maven2/io/github/wasabithumb/jtoml-all/1.5.2/jtoml-all-1.5.2.jar" - }, - "original": { - "type": "file", - "url": "https://repo.maven.apache.org/maven2/io/github/wasabithumb/jtoml-all/1.5.2/jtoml-all-1.5.2.jar" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "javafx-base": "javafx-base", - "javafx-controls": "javafx-controls", - "javafx-graphics": "javafx-graphics", - "jlibghostty": "jlibghostty", - "jtoml-all": "jtoml-all", - "nixpkgs": "nixpkgs_2" - } - }, - "systems": { - "flake": false, - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "zig": { - "inputs": { - "flake-compat": [ - "jlibghostty", - "ghostty", - "flake-compat" - ], - "nixpkgs": [ - "jlibghostty", - "ghostty", - "nixpkgs" - ], - "systems": [ - "jlibghostty", - "ghostty", - "systems" - ] - }, - "locked": { - "lastModified": 1776789209, - "narHash": "sha256-G6B7Q4TXn7MZ1mB+f9rymjsYF5PLWoSvmbxijb/99bw=", - "owner": "mitchellh", - "repo": "zig-overlay", - "rev": "14fe971844e841297ddd2ce9783d6892b467af39", - "type": "github" - }, - "original": { - "owner": "mitchellh", - "repo": "zig-overlay", - "type": "github" - } - }, - "zig_2": { - "inputs": { - "nixpkgs": [ - "jlibghostty", - "ghostty", - "zon2nix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1777234348, - "narHash": "sha256-fKw44a4qbUuI5eTG8k0gPbqMV5TOrjYF35PBzsYgd2U=", - "ref": "refs/heads/main", - "rev": "2c781c0609ecda600ab98f98cca417bbd981bd53", - "revCount": 1677, - "type": "git", - "url": "https://codeberg.org/jcollie/zig-overlay.git" - }, - "original": { - "type": "git", - "url": "https://codeberg.org/jcollie/zig-overlay.git" - } - }, - "zon2nix": { - "inputs": { - "nixpkgs": [ - "jlibghostty", - "ghostty", - "nixpkgs" - ], - "zig": "zig_2" - }, - "locked": { - "lastModified": 1777314365, - "narHash": "sha256-eLxQaD0wc96Neqkln8wHS0rNq/chPODifFkhwrwilEU=", - "owner": "jcollie", - "repo": "zon2nix", - "rev": "a5a1d412ad1ab6305511997bbc92b3a9dd6cb784", - "type": "github" - }, - "original": { - "owner": "jcollie", - "ref": "main", - "repo": "zon2nix", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 5e081d8..0000000 --- a/flake.nix +++ /dev/null @@ -1,182 +0,0 @@ -{ - description = "JavaFX terminal using jlibghostty and GraalVM Native Image"; - - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - jlibghostty.url = "git+https://gitea.gregorlohaus.com/gregor/jlibghostty.git"; - - jtoml-all = { - url = "https://repo.maven.apache.org/maven2/io/github/wasabithumb/jtoml-all/1.5.2/jtoml-all-1.5.2.jar"; - flake = false; - }; - - javafx-base = { - url = "https://repo.maven.apache.org/maven2/org/openjfx/javafx-base/25/javafx-base-25-linux.jar"; - flake = false; - }; - - javafx-controls = { - url = "https://repo.maven.apache.org/maven2/org/openjfx/javafx-controls/25/javafx-controls-25-linux.jar"; - flake = false; - }; - - javafx-graphics = { - url = "https://repo.maven.apache.org/maven2/org/openjfx/javafx-graphics/25/javafx-graphics-25-linux.jar"; - flake = false; - }; - }; - - outputs = { - self, - nixpkgs, - jlibghostty, - jtoml-all, - javafx-base, - javafx-controls, - javafx-graphics - }: - let - system = "x86_64-linux"; - pkgs = import nixpkgs { inherit system; }; - - jlib = jlibghostty.packages.${system}.jlibghostty; - graalvm = pkgs.graalvmPackages.graalvm-ce; - gradle = if pkgs ? gradle_9 then pkgs.gradle_9 else pkgs.gradle; - openjfx = pkgs.javaPackages.openjfx25; - javafxNativeLibraryPath = pkgs.lib.concatStringsSep ":" [ - "${openjfx}/modules_libs/javafx.base" - "${openjfx}/modules_libs/javafx.graphics" - "${openjfx}/modules_libs/javafx.media" - ]; - x11 = name: oldName: pkgs.${name} or pkgs.xorg.${oldName}; - mesaDrivers = pkgs.mesa; - runtimeLibraryPath = pkgs.lib.makeLibraryPath ([ - openjfx - jlib - pkgs.gtk3 - pkgs.glib - pkgs.pango - pkgs.cairo - pkgs.gdk-pixbuf - pkgs.harfbuzz - pkgs.freetype - pkgs.fontconfig - pkgs.libxkbcommon - pkgs.zlib - pkgs.stdenv.cc.cc.lib - pkgs.libglvnd - (x11 "libx11" "libX11") - (x11 "libxext" "libXext") - (x11 "libxrender" "libXrender") - (x11 "libxtst" "libXtst") - (x11 "libxi" "libXi") - (x11 "libxcursor" "libXcursor") - (x11 "libxrandr" "libXrandr") - (x11 "libxinerama" "libXinerama") - (x11 "libxcb" "libxcb") - ] - ++ pkgs.lib.optionals (pkgs ? atk) [ pkgs.atk ] - ++ pkgs.lib.optionals (pkgs ? libxxf86vm || pkgs.xorg ? libXxf86vm) [ (x11 "libxxf86vm" "libXxf86vm") ] - ++ pkgs.lib.optionals (pkgs ? libGL) [ pkgs.libGL ] - ++ pkgs.lib.optionals (pkgs ? mesa) [ pkgs.mesa ]); - openglDriverPath = pkgs.lib.concatStringsSep ":" [ - "/run/opengl-driver/lib" - "/run/opengl-driver-32/lib" - "${mesaDrivers}/lib" - ]; - driDriverPath = pkgs.lib.concatStringsSep ":" [ - "/run/opengl-driver/lib/dri" - "/run/opengl-driver-32/lib/dri" - "${mesaDrivers}/lib/dri" - ]; - in { - packages.${system}.default = pkgs.stdenvNoCC.mkDerivation { - pname = "jprototerm"; - version = "0.1.0"; - src = ./.; - - nativeBuildInputs = [ - graalvm - pkgs.makeWrapper - ]; - - buildPhase = '' - runHook preBuild - - mkdir -p build/classes build/native-image build/lib build/javafx-modules - - find src/main/java -name '*.java' | sort > build/sources.txt - cp ${jtoml-all} build/lib/jtoml-all.jar - cp ${javafx-base} build/javafx-modules/javafx-base.jar - cp ${javafx-controls} build/javafx-modules/javafx-controls.jar - cp ${javafx-graphics} build/javafx-modules/javafx-graphics.jar - javafx_module_path="build/javafx-modules" - - jlib_classpath="$( - find ${jlib}/maven -type f -name '*.jar' \ - ! -name '*-sources.jar' \ - ! -name '*-javadoc.jar' \ - | sort \ - | paste -sd: - - )" - app_classpath="build/classes:build/lib/jtoml-all.jar:$jlib_classpath:build/javafx-modules/javafx-base.jar:build/javafx-modules/javafx-controls.jar:build/javafx-modules/javafx-graphics.jar" - - javac \ - --release 25 \ - --module-path "$javafx_module_path" \ - --add-modules javafx.controls,javafx.graphics \ - -cp "build/lib/jtoml-all.jar:$jlib_classpath" \ - -d build/classes \ - @build/sources.txt - - if [ -d src/main/resources ]; then - cp -R src/main/resources/. build/classes/ - fi - - native-image \ - --no-fallback \ - --enable-native-access=javafx.graphics \ - -Djava.library.path=${javafxNativeLibraryPath} \ - --module-path "$javafx_module_path" \ - --add-modules javafx.controls,javafx.graphics \ - -cp "$app_classpath" \ - -H:Class=com.gregor.jprototerm.Main \ - -o build/native-image/jprototerm - - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - - mkdir -p $out/bin - cp build/native-image/jprototerm $out/bin/jprototerm - - wrapProgram $out/bin/jprototerm \ - --set GDK_BACKEND x11 \ - --set LIBGL_DRIVERS_PATH ${driDriverPath} \ - --set JAVA_TOOL_OPTIONS "-Dprism.order=es2,sw -Dprism.verbose=true" \ - --add-flags "-Djava.library.path=${javafxNativeLibraryPath}" \ - --add-flags "-Dprism.order=es2,sw" \ - --add-flags "-Dprism.verbose=true" \ - --prefix LD_LIBRARY_PATH : ${javafxNativeLibraryPath}:${runtimeLibraryPath}:${openglDriverPath} \ - --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.util-linux pkgs.bash ]} - - runHook postInstall - ''; - }; - - devShells.${system}.default = pkgs.mkShell { - packages = [ - graalvm - gradle - pkgs.util-linux - ]; - - shellHook = '' - export JLIBGHOSTTY_MAVEN_REPO=${jlib}/maven - echo "Use: gradle -PjlibghosttyMavenRepo=$JLIBGHOSTTY_MAVEN_REPO run" - ''; - }; - }; -} diff --git a/settings.gradle.kts b/settings.gradle.kts deleted file mode 100644 index 9ea7c35..0000000 --- a/settings.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - } -} - -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - mavenCentral() - maven { - url = uri( - providers.gradleProperty("jlibghosttyMavenRepo") - .orElse("../jlibghostty/result/maven") - .get() - ) - } - } -} - -rootProject.name = "jprototerm" diff --git a/src/main/java/com/gregor/jprototerm/AppConfig.java b/src/main/java/com/gregor/jprototerm/AppConfig.java index 983f12b..cd07328 100644 --- a/src/main/java/com/gregor/jprototerm/AppConfig.java +++ b/src/main/java/com/gregor/jprototerm/AppConfig.java @@ -45,7 +45,10 @@ public record AppConfig( "navigate_down", binding(document, "keybindings.navigate_down", defaults.keybindings.get("navigate_down")), "navigate_up", binding(document, "keybindings.navigate_up", defaults.keybindings.get("navigate_up")), "navigate_right", binding(document, "keybindings.navigate_right", defaults.keybindings.get("navigate_right")), - "toggle_floating", binding(document, "keybindings.toggle_floating", defaults.keybindings.get("toggle_floating")) + "toggle_floating", binding(document, "keybindings.toggle_floating", defaults.keybindings.get("toggle_floating")), + "new_floating", binding(document, "keybindings.new_floating", defaults.keybindings.get("new_floating")), + "next_floating", binding(document, "keybindings.next_floating", defaults.keybindings.get("next_floating")), + "close_pane", binding(document, "keybindings.close_pane", defaults.keybindings.get("close_pane")) ) ); } catch (TomlException ex) { @@ -59,7 +62,7 @@ public record AppConfig( 100, 30, defaultShell(), - "Symbols Nerd Font Mono", + "JetBrainsMono Nerd Font", 15.0, 1200.0, 760.0, @@ -69,7 +72,10 @@ public record AppConfig( "navigate_down", KeyBinding.parse("ALT+J"), "navigate_up", KeyBinding.parse("ALT+K"), "navigate_right", KeyBinding.parse("ALT+L"), - "toggle_floating", KeyBinding.parse("ALT+F") + "toggle_floating", KeyBinding.parse("ALT+F"), + "new_floating", KeyBinding.parse("ALT+SHIFT+F"), + "next_floating", KeyBinding.parse("ALT+F12"), + "close_pane", KeyBinding.parse("ALT+X") ) ); } @@ -83,8 +89,7 @@ public record AppConfig( } private static String defaultShell() { - String shell = System.getenv("SHELL"); - return shell == null || shell.isBlank() ? "/bin/sh" : shell; + return "/bin/bash"; } private static KeyBinding binding(TomlTable table, String key, KeyBinding fallback) { diff --git a/src/main/java/com/gregor/jprototerm/KeyBinding.java b/src/main/java/com/gregor/jprototerm/KeyBinding.java index 996521d..1c0ebe9 100644 --- a/src/main/java/com/gregor/jprototerm/KeyBinding.java +++ b/src/main/java/com/gregor/jprototerm/KeyBinding.java @@ -18,7 +18,7 @@ public record KeyBinding(boolean alt, boolean control, boolean shift, KeyCode co case "ALT", "META" -> alt = true; case "CTRL", "CONTROL" -> control = true; case "SHIFT" -> shift = true; - default -> code = KeyCode.getKeyCode(token); + default -> code = keyCode(token); } } @@ -34,4 +34,19 @@ public record KeyBinding(boolean alt, boolean control, boolean shift, KeyCode co && event.isShiftDown() == shift && event.getCode() == code; } + + private static KeyCode keyCode(String token) { + KeyCode alias = switch (token) { + case "GRAVE", "BACKTICK", "BACK_QUOTE", "`" -> KeyCode.BACK_QUOTE; + default -> null; + }; + if (alias != null) { + return alias; + } + try { + return KeyCode.valueOf(token); + } catch (IllegalArgumentException ex) { + return KeyCode.getKeyCode(token); + } + } } diff --git a/src/main/java/com/gregor/jprototerm/KeyEncoder.java b/src/main/java/com/gregor/jprototerm/KeyEncoder.java index 795274c..765b1b3 100644 --- a/src/main/java/com/gregor/jprototerm/KeyEncoder.java +++ b/src/main/java/com/gregor/jprototerm/KeyEncoder.java @@ -8,6 +8,20 @@ final class KeyEncoder { } static String encode(KeyEvent event) { + if (event.isControlDown() && !event.isAltDown() && !event.isMetaDown()) { + String control = controlSequence(event); + if (control != null) { + return control; + } + } + + if (event.isAltDown() && !event.isControlDown() && !event.isMetaDown()) { + String alt = altSequence(event); + if (alt != null) { + return alt; + } + } + KeyCode code = event.getCode(); return switch (code) { case ENTER -> "\r"; @@ -23,7 +37,43 @@ final class KeyEncoder { case DELETE -> "\u001b[3~"; case PAGE_UP -> "\u001b[5~"; case PAGE_DOWN -> "\u001b[6~"; + case F1 -> "\u001bOP"; + case F2 -> "\u001bOQ"; + case F3 -> "\u001bOR"; + case F4 -> "\u001bOS"; + case F5 -> "\u001b[15~"; + case F6 -> "\u001b[17~"; + case F7 -> "\u001b[18~"; + case F8 -> "\u001b[19~"; + case F9 -> "\u001b[20~"; + case F10 -> "\u001b[21~"; + case F11 -> "\u001b[23~"; + case F12 -> "\u001b[24~"; default -> null; }; } + + private static String controlSequence(KeyEvent event) { + KeyCode code = event.getCode(); + if (code.isLetterKey()) { + return String.valueOf((char) (Character.toUpperCase(code.getName().charAt(0)) - '@')); + } + return switch (code) { + case SPACE -> "\u0000"; + case OPEN_BRACKET -> "\u001b"; + case BACK_SLASH -> "\u001c"; + case CLOSE_BRACKET -> "\u001d"; + case DIGIT6 -> "\u001e"; + case MINUS -> "\u001f"; + default -> null; + }; + } + + private static String altSequence(KeyEvent event) { + KeyCode code = event.getCode(); + if (code.isLetterKey() || code.isDigitKey()) { + return "\u001b" + code.getName().toLowerCase(); + } + return null; + } } diff --git a/src/main/java/com/gregor/jprototerm/KittyGraphicsRegistry.java b/src/main/java/com/gregor/jprototerm/KittyGraphicsRegistry.java deleted file mode 100644 index e35ab9e..0000000 --- a/src/main/java/com/gregor/jprototerm/KittyGraphicsRegistry.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.gregor.jprototerm; - -import javafx.scene.canvas.GraphicsContext; -import javafx.scene.image.Image; - -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.Base64; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public final class KittyGraphicsRegistry { - private final boolean enabled; - private final StringBuilder stream = new StringBuilder(); - private final Map chunks = new HashMap<>(); - private final List placements = new ArrayList<>(); - - public KittyGraphicsRegistry(boolean enabled) { - this.enabled = enabled; - } - - public synchronized void accept(String text) { - if (!enabled) { - return; - } - stream.append(text); - parseBufferedCommands(); - } - - public synchronized void draw(GraphicsContext gc, double originX, double originY, double cellWidth, double lineHeight) { - if (!enabled) { - return; - } - - for (Placement placement : placements) { - double x = originX + placement.column * cellWidth; - double y = originY + placement.row * lineHeight; - double width = placement.columns <= 0 ? placement.image.getWidth() : placement.columns * cellWidth; - double height = placement.rows <= 0 ? placement.image.getHeight() : placement.rows * lineHeight; - gc.drawImage(placement.image, x, y, width, height); - } - } - - public synchronized void clear() { - chunks.clear(); - placements.clear(); - stream.setLength(0); - } - - private void parseBufferedCommands() { - int start; - while ((start = stream.indexOf("\u001b_G")) >= 0) { - int end = commandEnd(start + 3); - if (end < 0) { - if (start > 0) { - stream.delete(0, start); - } - return; - } - - String command = stream.substring(start + 3, end); - handleCommand(command); - stream.delete(0, end + terminatorLength(end)); - } - - if (stream.length() > 16384) { - stream.delete(0, stream.length() - 4096); - } - } - - private int commandEnd(int from) { - int bell = stream.indexOf("\u0007", from); - int st = stream.indexOf("\u001b\\", from); - if (bell < 0) { - return st; - } - if (st < 0) { - return bell; - } - return Math.min(bell, st); - } - - private int terminatorLength(int end) { - return stream.charAt(end) == '\u0007' ? 1 : 2; - } - - private void handleCommand(String command) { - int separator = command.indexOf(';'); - if (separator < 0) { - return; - } - - Map control = parseControl(command.substring(0, separator)); - String payload = command.substring(separator + 1).replace("\n", "").replace("\r", ""); - - int id = intControl(control, "i", 1); - boolean more = intControl(control, "m", 0) == 1; - chunks.computeIfAbsent(id, ignored -> new StringBuilder()).append(payload); - if (more) { - return; - } - - String data = chunks.remove(id).toString(); - try { - byte[] bytes = Base64.getDecoder().decode(data); - Image image = new Image(new ByteArrayInputStream(bytes)); - if (!image.isError()) { - placements.add(new Placement( - image, - intControl(control, "x", 0), - intControl(control, "y", 0), - intControl(control, "c", 0), - intControl(control, "r", 0) - )); - } - } catch (IllegalArgumentException ignored) { - chunks.remove(id); - } - } - - private static Map parseControl(String text) { - Map result = new HashMap<>(); - for (String part : text.split(",")) { - int equals = part.indexOf('='); - if (equals > 0) { - result.put(part.substring(0, equals), part.substring(equals + 1)); - } - } - return result; - } - - private static int intControl(Map control, String key, int fallback) { - try { - return Integer.parseInt(control.getOrDefault(key, String.valueOf(fallback))); - } catch (NumberFormatException ex) { - return fallback; - } - } - - private record Placement(Image image, int column, int row, int columns, int rows) { - } -} diff --git a/src/main/java/com/gregor/jprototerm/Main.java b/src/main/java/com/gregor/jprototerm/Main.java index adae33a..911c412 100644 --- a/src/main/java/com/gregor/jprototerm/Main.java +++ b/src/main/java/com/gregor/jprototerm/Main.java @@ -20,6 +20,7 @@ public final class Main extends Application { StackPane root = new StackPane(terminalView.canvas()); terminalView.canvas().widthProperty().bind(root.widthProperty()); terminalView.canvas().heightProperty().bind(root.heightProperty()); + terminalView.canvas().setOnMousePressed(event -> terminalView.canvas().requestFocus()); Scene scene = new Scene(root, config.windowWidth(), config.windowHeight()); scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> handlePressed(config, event)); @@ -38,6 +39,7 @@ public final class Main extends Application { workspace.close(); }); stage.show(); + terminalView.canvas().requestFocus(); } private void handlePressed(AppConfig config, KeyEvent event) { @@ -56,6 +58,15 @@ public final class Main extends Application { } else if (config.keybindings().get("toggle_floating").matches(event)) { workspace.toggleFloating(); event.consume(); + } else if (config.keybindings().get("new_floating").matches(event)) { + workspace.createFloatingPane(); + event.consume(); + } else if (config.keybindings().get("next_floating").matches(event)) { + workspace.nextFloatingPane(); + event.consume(); + } else if (config.keybindings().get("close_pane").matches(event)) { + workspace.closeActivePane(); + event.consume(); } else { String encoded = KeyEncoder.encode(event); if (encoded != null) { @@ -78,8 +89,7 @@ public final class Main extends Application { } public static void main(String[] args) { - System.setProperty("prism.order", "es2,sw"); - System.setProperty("prism.verbose", "true"); + System.setProperty("prism.order", System.getProperty("prism.order", "es2,sw")); launch(Main.class, args); } } diff --git a/src/main/java/com/gregor/jprototerm/ShellSession.java b/src/main/java/com/gregor/jprototerm/ShellSession.java index 7f38311..64101cd 100644 --- a/src/main/java/com/gregor/jprototerm/ShellSession.java +++ b/src/main/java/com/gregor/jprototerm/ShellSession.java @@ -1,20 +1,25 @@ package com.gregor.jprototerm; +import com.pty4j.PtyProcess; +import com.pty4j.PtyProcessBuilder; +import com.pty4j.WinSize; import javafx.application.Platform; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public final class ShellSession implements AutoCloseable { - private final Process process; + private final PtyProcess process; private final OutputStream stdin; private final ExecutorService reader; private volatile boolean closed; - private ShellSession(Process process, TerminalPane pane, KittyGraphicsRegistry graphicsRegistry) { + private ShellSession(PtyProcess process, TerminalPane pane) { this.process = process; this.stdin = process.getOutputStream(); this.reader = Executors.newSingleThreadExecutor(runnable -> { @@ -22,27 +27,35 @@ public final class ShellSession implements AutoCloseable { thread.setDaemon(true); return thread; }); - reader.submit(() -> readOutput(pane, graphicsRegistry)); + reader.submit(() -> readOutput(pane)); } - public static ShellSession start(String shell, TerminalPane pane, KittyGraphicsRegistry graphicsRegistry) { + public static ShellSession start(String shell, TerminalPane pane, int columns, int rows) { try { - ProcessBuilder processBuilder = new ProcessBuilder( - "script", - "-qfec", - shell + " -i", - "/dev/null" - ).redirectErrorStream(true); - processBuilder.environment().put("TERM", "xterm-kitty"); - processBuilder.environment().put("COLORTERM", "truecolor"); - Process process = processBuilder.start(); - return new ShellSession(process, pane, graphicsRegistry); + Map environment = new HashMap<>(System.getenv()); + environment.put("TERM", "xterm-kitty"); + environment.put("COLORTERM", "truecolor"); + + PtyProcess process = new PtyProcessBuilder(new String[] {shell, "-i"}) + .setEnvironment(environment) + .setInitialColumns(columns) + .setInitialRows(rows) + .setDirectory(System.getProperty("user.home")) + .start(); + return new ShellSession(process, pane); } catch (IOException ex) { pane.write("failed to start shell: " + ex.getMessage() + "\r\n"); throw new IllegalStateException("Could not start shell " + shell, ex); } } + public void resize(int columns, int rows) { + if (closed) { + return; + } + process.setWinSize(new WinSize(columns, rows)); + } + public void send(String text) { if (closed) { return; @@ -55,17 +68,17 @@ public final class ShellSession implements AutoCloseable { } } - private void readOutput(TerminalPane pane, KittyGraphicsRegistry graphicsRegistry) { + private void readOutput(TerminalPane pane) { byte[] buffer = new byte[8192]; try { int read; while ((read = process.getInputStream().read(buffer)) != -1) { - String text = new String(buffer, 0, read, StandardCharsets.UTF_8); if (!closed) { - graphicsRegistry.accept(text); + byte[] bytes = new byte[read]; + System.arraycopy(buffer, 0, bytes, 0, read); Platform.runLater(() -> { if (!closed) { - pane.write(text); + pane.write(bytes); } }); } diff --git a/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java b/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java index 24ecc70..cf03466 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java +++ b/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java @@ -1,15 +1,37 @@ package com.gregor.jprototerm; +import dev.jlibghostty.KittyImageCompression; +import dev.jlibghostty.KittyImageFormat; +import dev.jlibghostty.KittyImageSnapshot; +import dev.jlibghostty.KittyPlacement; +import dev.jlibghostty.KittyRenderInfo; +import dev.jlibghostty.RenderCell; +import dev.jlibghostty.RenderColor; +import dev.jlibghostty.RenderCursorStyle; +import dev.jlibghostty.RenderRow; +import dev.jlibghostty.RenderStateSnapshot; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; +import javafx.scene.image.Image; +import javafx.scene.image.PixelFormat; +import javafx.scene.image.WritableImage; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontSmoothingType; +import javafx.scene.text.Text; + +import java.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.Map; public final class TerminalCanvasView { + private static final Color DEFAULT_FOREGROUND = Color.rgb(225, 229, 235); + private static final Color SELECTED_BACKGROUND = Color.rgb(52, 92, 140); + private final Canvas canvas = new Canvas(); private final TerminalWorkspace workspace; private final AppConfig config; + private final Map kittyImageCache = new HashMap<>(); public TerminalCanvasView(TerminalWorkspace workspace, AppConfig config) { this.workspace = workspace; @@ -29,7 +51,7 @@ public final class TerminalCanvasView { GraphicsContext gc = canvas.getGraphicsContext2D(); gc.setFill(Color.rgb(16, 16, 18)); gc.fillRect(0, 0, width, height); - gc.setFontSmoothingType(FontSmoothingType.GRAY); + gc.setFontSmoothingType(FontSmoothingType.LCD); for (TerminalPane pane : workspace.panes()) { drawPane(gc, pane); @@ -55,20 +77,172 @@ public final class TerminalCanvasView { Font font = Font.font(config.fontFamily(), config.fontSize()); gc.setFont(font); - gc.setFill(Color.rgb(225, 229, 235)); - double lineHeight = Math.ceil(config.fontSize() * 1.35); + FontMetrics metrics = measureFontMetrics(font); + int columns = Math.max(1, (int) ((pane.width() - 24.0) / metrics.cellWidth)); + int rows = Math.max(1, (int) ((pane.height() - 24.0) / metrics.lineHeight)); + pane.resize(columns, rows, (int) Math.round(metrics.cellWidth), (int) Math.round(metrics.lineHeight)); + double left = pane.x() + 12.0; - double baseline = pane.y() + 18.0; - int maxLines = Math.max(1, (int) ((pane.height() - 24.0) / lineHeight)); + double top = pane.y() + 12.0; + double baseline = top + metrics.baselineOffset; - String[] lines = pane.snapshotText().split("\\R", -1); - int start = Math.max(0, lines.length - maxLines); - for (int i = start; i < lines.length; i++) { - gc.fillText(lines[i], left, baseline + ((i - start) * lineHeight)); + RenderStateSnapshot snapshot = pane.renderSnapshot(); + if (snapshot != null) { + for (RenderRow row : snapshot.renderRows()) { + drawRow(gc, row, left, top, baseline, metrics.cellWidth, metrics.lineHeight); + } } - pane.graphicsRegistry().draw(gc, pane.x() + 12.0, pane.y() + 12.0, config.fontSize() * 0.62, lineHeight); + if (snapshot != null) { + drawCursor(gc, snapshot, left, top, metrics.cellWidth, metrics.lineHeight); + } + + if (config.kittyGraphics()) { + drawKittyGraphics(gc, pane, left, top, metrics.cellWidth, metrics.lineHeight); + } gc.restore(); } + + private static FontMetrics measureFontMetrics(Font font) { + Text text = new Text("Mg"); + text.setFont(font); + double textHeight = text.getLayoutBounds().getHeight(); + double lineHeight = Math.max(1.0, Math.ceil(textHeight * 1.2)); + double baselineOffset = -text.getLayoutBounds().getMinY() + ((lineHeight - textHeight) / 2.0); + + Text cell = new Text("M"); + cell.setFont(font); + double cellWidth = Math.max(1.0, Math.ceil(cell.getLayoutBounds().getWidth())); + return new FontMetrics(cellWidth, lineHeight, baselineOffset); + } + + private static void drawRow( + GraphicsContext gc, + RenderRow row, + double left, + double top, + double baseline, + double cellWidth, + double lineHeight + ) { + for (RenderCell cell : row.cells()) { + double x = left + (cell.column() * cellWidth); + double cellTop = top + (row.row() * lineHeight); + cell.background().ifPresent(background -> { + gc.setFill(toFxColor(background)); + gc.fillRect(x, cellTop, cellWidth, lineHeight); + }); + if (cell.selected()) { + gc.setFill(SELECTED_BACKGROUND); + gc.fillRect(x, cellTop, cellWidth, lineHeight); + } + if (cell.codepoints().length == 0) { + continue; + } + + double y = baseline + (row.row() * lineHeight); + Color foreground = cell.foreground().map(TerminalCanvasView::toFxColor).orElse(DEFAULT_FOREGROUND); + gc.setFill(foreground); + gc.fillText(cell.text(), x, y); + } + } + + private static Color toFxColor(RenderColor color) { + return Color.rgb(color.red(), color.green(), color.blue()); + } + + private static void drawCursor(GraphicsContext gc, RenderStateSnapshot snapshot, double left, double top, double cellWidth, double lineHeight) { + if (!snapshot.cursorVisible() || !snapshot.cursorViewportHasValue()) { + return; + } + + double x = left + (snapshot.cursorViewportX() * cellWidth); + double y = top + (snapshot.cursorViewportY() * lineHeight); + gc.setStroke(Color.rgb(225, 229, 235)); + gc.setFill(Color.rgb(225, 229, 235, 0.28)); + gc.setLineWidth(1.5); + + RenderCursorStyle style = snapshot.cursorStyle(); + if (style == RenderCursorStyle.BAR) { + gc.strokeLine(x + 0.5, y + 2.0, x + 0.5, y + lineHeight - 2.0); + } else if (style == RenderCursorStyle.UNDERLINE) { + gc.strokeLine(x + 1.0, y + lineHeight - 2.0, x + cellWidth - 1.0, y + lineHeight - 2.0); + } else if (style == RenderCursorStyle.BLOCK) { + gc.fillRect(x + 0.5, y + 1.0, Math.max(1.0, cellWidth - 1.0), Math.max(1.0, lineHeight - 2.0)); + } else { + gc.strokeRect(x + 0.5, y + 1.0, Math.max(1.0, cellWidth - 1.0), Math.max(1.0, lineHeight - 2.0)); + } + } + + private void drawKittyGraphics(GraphicsContext gc, TerminalPane pane, double originX, double originY, double cellWidth, double lineHeight) { + pane.kittyGraphics().ifPresent(graphics -> { + for (KittyPlacement placement : graphics.placements()) { + Image image = imageFor(placement); + if (image == null) { + continue; + } + + KittyRenderInfo renderInfo = placement.renderInfo().orElse(null); + double x = originX; + double y = originY; + double width = image.getWidth(); + double height = image.getHeight(); + + if (renderInfo != null) { + x += renderInfo.viewportColumn() * cellWidth; + y += renderInfo.viewportRow() * lineHeight; + width = renderInfo.gridColumns() > 0 ? renderInfo.gridColumns() * cellWidth : renderInfo.pixelWidth(); + height = renderInfo.gridRows() > 0 ? renderInfo.gridRows() * lineHeight : renderInfo.pixelHeight(); + } else { + width = placement.columns() > 0 ? placement.columns() * cellWidth : width; + height = placement.rows() > 0 ? placement.rows() * lineHeight : height; + } + + gc.drawImage(image, x + placement.xOffset(), y + placement.yOffset(), width, height); + } + }); + } + + private Image imageFor(KittyPlacement placement) { + return placement.image() + .map(snapshot -> kittyImageCache.computeIfAbsent(snapshot.id(), ignored -> decodeImage(snapshot))) + .orElse(null); + } + + private Image decodeImage(KittyImageSnapshot snapshot) { + if (snapshot.compression() != KittyImageCompression.NONE) { + return null; + } + + if (snapshot.format() == KittyImageFormat.PNG) { + return new Image(new ByteArrayInputStream(snapshot.data())); + } + + int width = Math.toIntExact(snapshot.width()); + int height = Math.toIntExact(snapshot.height()); + WritableImage image = new WritableImage(width, height); + byte[] data = snapshot.data(); + + if (snapshot.format() == KittyImageFormat.RGBA) { + image.getPixelWriter().setPixels(0, 0, width, height, PixelFormat.getByteBgraInstance(), rgbaToBgra(data), 0, width * 4); + } else if (snapshot.format() == KittyImageFormat.RGB) { + image.getPixelWriter().setPixels(0, 0, width, height, PixelFormat.getByteRgbInstance(), data, 0, width * 3); + } + return image; + } + + private static byte[] rgbaToBgra(byte[] rgba) { + byte[] bgra = new byte[rgba.length]; + for (int i = 0; i + 3 < rgba.length; i += 4) { + bgra[i] = rgba[i + 2]; + bgra[i + 1] = rgba[i + 1]; + bgra[i + 2] = rgba[i]; + bgra[i + 3] = rgba[i + 3]; + } + return bgra; + } + + private record FontMetrics(double cellWidth, double lineHeight, double baselineOffset) { + } } diff --git a/src/main/java/com/gregor/jprototerm/TerminalPane.java b/src/main/java/com/gregor/jprototerm/TerminalPane.java index 6c41cf0..b2b35d0 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalPane.java +++ b/src/main/java/com/gregor/jprototerm/TerminalPane.java @@ -1,30 +1,38 @@ package com.gregor.jprototerm; import dev.jlibghostty.Ghostty; +import dev.jlibghostty.KittyGraphics; +import dev.jlibghostty.RenderStateSnapshot; import dev.jlibghostty.Terminal; import dev.jlibghostty.TerminalOptions; +import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; public final class TerminalPane implements AutoCloseable { private final Terminal terminal; - private final KittyGraphicsRegistry graphicsRegistry; - private final AtomicReference snapshotText = new AtomicReference<>(""); + private final AtomicReference renderSnapshot = new AtomicReference<>(); private ShellSession session; private boolean floating; + private boolean visible = true; private double x; private double y; private double width; private double height; + private int columns; + private int rows; + private int pixelWidth; + private int pixelHeight; - private TerminalPane(Terminal terminal, KittyGraphicsRegistry graphicsRegistry) { + private TerminalPane(Terminal terminal, int columns, int rows) { this.terminal = terminal; - this.graphicsRegistry = graphicsRegistry; + this.columns = columns; + this.rows = rows; } - public static TerminalPane create(int columns, int rows, boolean kittyGraphics) { + public static TerminalPane create(int columns, int rows) { Terminal terminal = Ghostty.open(TerminalOptions.of(columns, rows)); - TerminalPane pane = new TerminalPane(terminal, new KittyGraphicsRegistry(kittyGraphics)); + TerminalPane pane = new TerminalPane(terminal, columns, rows); pane.refresh(); return pane; } @@ -36,6 +44,13 @@ public final class TerminalPane implements AutoCloseable { } } + public void write(byte[] bytes) { + synchronized (terminal) { + terminal.write(bytes); + refresh(); + } + } + public void attach(ShellSession session) { this.session = session; } @@ -46,12 +61,14 @@ public final class TerminalPane implements AutoCloseable { } } - public String snapshotText() { - return snapshotText.get(); + public RenderStateSnapshot renderSnapshot() { + return renderSnapshot.get(); } - public KittyGraphicsRegistry graphicsRegistry() { - return graphicsRegistry; + public Optional kittyGraphics() { + synchronized (terminal) { + return terminal.kittyGraphics(); + } } public boolean floating() { @@ -62,6 +79,14 @@ public final class TerminalPane implements AutoCloseable { this.floating = floating; } + public boolean visible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + public double x() { return x; } @@ -85,8 +110,29 @@ public final class TerminalPane implements AutoCloseable { this.height = height; } + public void resize(int columns, int rows, int pixelWidth, int pixelHeight) { + if (columns <= 0 || rows <= 0 || pixelWidth <= 0 || pixelHeight <= 0) { + return; + } + if (this.columns == columns && this.rows == rows && this.pixelWidth == pixelWidth && this.pixelHeight == pixelHeight) { + return; + } + + synchronized (terminal) { + terminal.resize(columns, rows, pixelWidth, pixelHeight); + if (session != null) { + session.resize(columns, rows); + } + this.columns = columns; + this.rows = rows; + this.pixelWidth = pixelWidth; + this.pixelHeight = pixelHeight; + refresh(); + } + } + private void refresh() { - snapshotText.set(String.valueOf(terminal.snapshot())); + renderSnapshot.set(terminal.renderSnapshot()); } @Override diff --git a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java index fc174c3..770dd45 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java +++ b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java @@ -8,6 +8,7 @@ public final class TerminalWorkspace implements AutoCloseable { private final AppConfig config; private final List panes = new ArrayList<>(); private int activeIndex; + private int hiddenFloatingFocusIndex = -1; public TerminalWorkspace(AppConfig config) { this.config = config; @@ -19,7 +20,18 @@ public final class TerminalWorkspace implements AutoCloseable { } public List panes() { - return List.copyOf(panes); + List visible = panes.stream().filter(TerminalPane::visible).toList(); + TerminalPane active = activePane(); + if (!active.visible() || !active.floating()) { + return visible; + } + + List ordered = new ArrayList<>(visible.size()); + visible.stream() + .filter(pane -> pane != active) + .forEach(ordered::add); + ordered.add(active); + return List.copyOf(ordered); } public boolean isActive(TerminalPane pane) { @@ -27,20 +39,29 @@ public final class TerminalWorkspace implements AutoCloseable { } public void layout(double width, double height) { - List tiled = panes.stream().filter(pane -> !pane.floating()).toList(); + List tiled = panes.stream() + .filter(TerminalPane::visible) + .filter(pane -> !pane.floating()) + .toList(); int tileCount = Math.max(1, tiled.size()); double tileWidth = width / tileCount; for (int i = 0; i < tiled.size(); i++) { tiled.get(i).bounds(i * tileWidth, 0, tileWidth, height); } - for (TerminalPane pane : panes) { - if (pane.floating()) { + List floating = panes.stream() + .filter(TerminalPane::visible) + .filter(TerminalPane::floating) + .toList(); + for (int i = 0; i < floating.size(); i++) { + TerminalPane pane = floating.get(i); + if (pane.visible() && pane.floating()) { double floatingWidth = Math.max(420, width * 0.58); double floatingHeight = Math.max(260, height * 0.58); + double offset = i * 28.0; pane.bounds( - (width - floatingWidth) / 2.0, - (height - floatingHeight) / 2.0, + Math.min(width - floatingWidth - 12.0, ((width - floatingWidth) / 2.0) + offset), + Math.min(height - floatingHeight - 12.0, ((height - floatingHeight) / 2.0) + offset), floatingWidth, floatingHeight ); @@ -50,7 +71,12 @@ public final class TerminalWorkspace implements AutoCloseable { public void navigate(Direction direction) { TerminalPane current = activePane(); + if (current.floating() && navigateFloatingStack(direction)) { + return; + } + panes.stream() + .filter(TerminalPane::visible) .filter(pane -> pane != current) .filter(pane -> directionFilter(direction, current, pane)) .min(Comparator.comparingDouble(pane -> distance(current, pane))) @@ -58,23 +84,160 @@ public final class TerminalWorkspace implements AutoCloseable { } public void toggleFloating() { - TerminalPane active = activePane(); - if (active.floating()) { - panes.remove(activeIndex); - active.close(); - activeIndex = Math.max(0, activeIndex - 1); + List floating = panes.stream() + .filter(TerminalPane::floating) + .toList(); + if (floating.isEmpty()) { + createFloatingPane(); return; } + boolean anyVisible = floating.stream().anyMatch(TerminalPane::visible); + if (anyVisible) { + TerminalPane active = activePane(); + hiddenFloatingFocusIndex = active.floating() ? activeIndex : firstVisibleFloatingIndex(); + floating.forEach(pane -> pane.setVisible(false)); + activeIndex = firstVisibleNonFloatingIndex(); + } else { + floating.forEach(pane -> pane.setVisible(true)); + activeIndex = visibleIndexOrFallback(hiddenFloatingFocusIndex, panes.indexOf(floating.get(floating.size() - 1))); + hiddenFloatingFocusIndex = -1; + } + } + + public void createFloatingPane() { TerminalPane pane = openPane(true); panes.add(pane); activeIndex = panes.size() - 1; } + public void nextFloatingPane() { + TerminalPane next = nextFloatingAfter(activeIndex); + next.setVisible(true); + activeIndex = panes.indexOf(next); + } + + public void closeActivePane() { + TerminalPane active = activePane(); + if (!active.floating() || panes.stream().filter(pane -> !pane.floating()).count() == 0) { + return; + } + + int removed = activeIndex; + int previous = previousVisibleIndex(removed); + panes.remove(removed); + active.close(); + activeIndex = adjustIndexAfterRemoval(previous, removed); + hiddenFloatingFocusIndex = adjustHiddenFocusAfterRemoval(hiddenFloatingFocusIndex, removed); + } + + private TerminalPane nextFloatingAfter(int index) { + for (int i = index + 1; i < panes.size(); i++) { + TerminalPane pane = panes.get(i); + if (pane.floating()) { + return pane; + } + } + for (int i = 0; i <= index && i < panes.size(); i++) { + TerminalPane pane = panes.get(i); + if (pane.floating()) { + return pane; + } + } + return createAndReturnFloatingPane(); + } + + private TerminalPane createAndReturnFloatingPane() { + TerminalPane pane = openPane(true); + panes.add(pane); + return pane; + } + + private boolean navigateFloatingStack(Direction direction) { + List floating = panes.stream() + .filter(TerminalPane::visible) + .filter(TerminalPane::floating) + .toList(); + if (floating.size() < 2) { + return false; + } + + int current = floating.indexOf(activePane()); + if (current < 0) { + return false; + } + + int next = switch (direction) { + case LEFT, UP -> current - 1; + case DOWN, RIGHT -> current + 1; + }; + if (next < 0 || next >= floating.size()) { + return false; + } + + activeIndex = panes.indexOf(floating.get(next)); + return true; + } + + private int firstVisibleFloatingIndex() { + for (int i = 0; i < panes.size(); i++) { + TerminalPane pane = panes.get(i); + if (pane.visible() && pane.floating()) { + return i; + } + } + return -1; + } + + private int firstVisibleNonFloatingIndex() { + for (int i = 0; i < panes.size(); i++) { + TerminalPane pane = panes.get(i); + if (pane.visible() && !pane.floating()) { + return i; + } + } + return 0; + } + + private int previousVisibleIndex(int index) { + for (int i = index - 1; i >= 0; i--) { + if (panes.get(i).visible()) { + return i; + } + } + for (int i = index + 1; i < panes.size(); i++) { + if (panes.get(i).visible()) { + return i; + } + } + return firstVisibleNonFloatingIndex(); + } + + private int visibleIndexOrFallback(int index, int fallback) { + if (index >= 0 && index < panes.size() && panes.get(index).visible()) { + return index; + } + return fallback; + } + + private static int adjustIndexAfterRemoval(int index, int removedIndex) { + if (index < 0) { + return 0; + } + return index > removedIndex ? index - 1 : index; + } + + private static int adjustHiddenFocusAfterRemoval(int index, int removedIndex) { + if (index < 0 || index == removedIndex) { + return -1; + } + return index > removedIndex ? index - 1 : index; + } + private TerminalPane openPane(boolean floating) { - TerminalPane pane = TerminalPane.create(config.columns(), config.rows(), config.kittyGraphics()); + TerminalPane pane = TerminalPane.create(config.columns(), config.rows()); pane.setFloating(floating); - pane.attach(ShellSession.start(config.shell(), pane, pane.graphicsRegistry())); + pane.attach(ShellSession.start(config.shell(), pane, config.columns(), config.rows())); return pane; } diff --git a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/jni-config.json b/src/main/resources/META-INF/native-image/com.gregor/jprototerm/jni-config.json deleted file mode 100644 index 79fe92b..0000000 --- a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/jni-config.json +++ /dev/null @@ -1,123 +0,0 @@ -[ - { - "name": "java.lang.Object", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.lang.String", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.lang.Runnable", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.lang.Thread", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.Buffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.ByteBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.DirectByteBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.IntBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.FloatBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.LongBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "java.nio.ShortBuffer", - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.gtk.GtkApplication", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.gtk.GtkWindow", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.gtk.GtkView", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Application", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Window", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.View", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Screen", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Pixels", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Clipboard", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.Cursor", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - }, - { - "name": "com.sun.glass.ui.CommonDialogs", - "allDeclaredConstructors": true, - "allPublicMethods": true, - "allDeclaredMethods": true - } -] diff --git a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/reflect-config.json b/src/main/resources/META-INF/native-image/com.gregor/jprototerm/reflect-config.json deleted file mode 100644 index 2d05928..0000000 --- a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/reflect-config.json +++ /dev/null @@ -1,43 +0,0 @@ -[ - { - "name": "com.gregor.jprototerm.Main", - "allDeclaredConstructors": true, - "allPublicConstructors": true - }, - { - "name": "com.sun.javafx.tk.quantum.QuantumToolkit", - "allDeclaredConstructors": true, - "allPublicConstructors": true - }, - { - "name": "com.sun.glass.ui.gtk.GtkPlatformFactory", - "allDeclaredConstructors": true, - "allPublicConstructors": true - }, - { - "name": "com.sun.glass.ui.gtk.GtkApplication", - "allDeclaredConstructors": true, - "allPublicConstructors": true - }, - { - "name": "com.sun.prism.es2.ES2Pipeline", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.prism.es2.X11GLFactory", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - }, - { - "name": "com.sun.prism.sw.SWPipeline", - "allDeclaredConstructors": true, - "allPublicConstructors": true, - "allDeclaredMethods": true, - "allPublicMethods": true - } -] diff --git a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/resource-config.json b/src/main/resources/META-INF/native-image/com.gregor/jprototerm/resource-config.json deleted file mode 100644 index f127be5..0000000 --- a/src/main/resources/META-INF/native-image/com.gregor/jprototerm/resource-config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "resources": [ - { "pattern": ".*\\.css$" }, - { "pattern": ".*\\.toml$" } - ] -}