From cf218e2afd1fa7914f331104744304af7f1ebdeb Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Thu, 28 May 2026 12:48:28 +0200 Subject: [PATCH] scrollback --- .gitignore | 1 + .gradle/9.4.1/checksums/checksums.lock | Bin 39 -> 39 bytes .gradle/9.4.1/checksums/md5-checksums.bin | Bin 22047 -> 22097 bytes .gradle/9.4.1/checksums/sha1-checksums.bin | Bin 30917 -> 30971 bytes .../executionHistory/executionHistory.bin | Bin 49514 -> 49514 bytes .../executionHistory/executionHistory.lock | Bin 39 -> 39 bytes .gradle/9.4.1/fileHashes/fileHashes.bin | Bin 27747 -> 27897 bytes .gradle/9.4.1/fileHashes/fileHashes.lock | Bin 39 -> 39 bytes .../9.4.1/fileHashes/resourceHashesCache.bin | Bin 20775 -> 21251 bytes .../buildOutputCleanup.lock | Bin 39 -> 39 bytes .../com/gregor/jprototerm/AppConfig.class | Bin 12866 -> 0 bytes .../com/gregor/jprototerm/Direction.class | Bin 1206 -> 0 bytes .../com/gregor/jprototerm/KeyBinding.class | Bin 4509 -> 0 bytes .../com/gregor/jprototerm/KeyEncoder$1.class | Bin 2064 -> 0 bytes .../com/gregor/jprototerm/KeyEncoder.class | Bin 2841 -> 0 bytes .../main/com/gregor/jprototerm/Main$1.class | Bin 924 -> 0 bytes .../main/com/gregor/jprototerm/Main.class | Bin 9697 -> 0 bytes .../com/gregor/jprototerm/ShellSession.class | Bin 6338 -> 0 bytes .../TerminalCanvasView$FontMetrics.class | Bin 1861 -> 0 bytes .../jprototerm/TerminalCanvasView.class | Bin 13288 -> 0 bytes .../com/gregor/jprototerm/TerminalPane.class | Bin 5221 -> 0 bytes .../jprototerm/TerminalWorkspace$1.class | Bin 841 -> 0 bytes .../gregor/jprototerm/TerminalWorkspace.class | Bin 11312 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 29095 -> 0 bytes config.example.toml | 1 + .../java/com/gregor/jprototerm/AppConfig.java | 17 ++ src/main/java/com/gregor/jprototerm/Main.java | 1 - .../gregor/jprototerm/TerminalCanvasView.java | 209 +++++++++++++++++- .../com/gregor/jprototerm/TerminalPane.java | 45 +++- .../gregor/jprototerm/TerminalWorkspace.java | 9 +- 30 files changed, 275 insertions(+), 8 deletions(-) delete mode 100644 build/classes/java/main/com/gregor/jprototerm/AppConfig.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/Direction.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyBinding.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyEncoder$1.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/KeyEncoder.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/Main$1.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/Main.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/ShellSession.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView$FontMetrics.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalCanvasView.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalPane.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class delete mode 100644 build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace.class delete mode 100644 build/tmp/compileJava/previous-compilation-data.bin diff --git a/.gitignore b/.gitignore index 7f46a51..0c7bb71 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ devenv.local.yaml # pre-commit .pre-commit-config.yaml build +build diff --git a/.gradle/9.4.1/checksums/checksums.lock b/.gradle/9.4.1/checksums/checksums.lock index 21b162513b700802a14a23ae389273ff91634be5..f74a924e8cd944af8b3608144e38f2bf2aa3579a 100644 GIT binary patch literal 39 scmZSnqqyGv@x_|y3}C=m&CI~iux^dv0jDqPALcW#8XB1!8!|8e01i3~U;qFB literal 39 scmZSnqqyGv@x_|y3}C=m%FMvfux^I9-O&f%C66<(8XB1!8!|8e00(>v@c;k- diff --git a/.gradle/9.4.1/checksums/md5-checksums.bin b/.gradle/9.4.1/checksums/md5-checksums.bin index 6c6e39ea37191162ce333579cf4f0b10a86b8880..9f1f3c5e2e05e15f8102163c46ddd2499f182874 100644 GIT binary patch delta 61 zcmbQghVkMW#tkMCj2@d!B{Y}>u7AutWxqn)m;nsJG{EV+Js&IJ%it{xl!s&W(yc#5WowFl~19 LXfc@FUttCSsWuia delta 36 ucmV+<0Nelj@d3s00kAX}0p_zc7}y50B_G2M0im%W_!qG-cmlIQNQ5vg%ntkj diff --git a/.gradle/9.4.1/executionHistory/executionHistory.bin b/.gradle/9.4.1/executionHistory/executionHistory.bin index b89587b22af05f28cb06610690323b4b0088c75d..f5d8b1dae0770daa096526bc508f5f3ea1b99f3d 100644 GIT binary patch delta 902 zcmaFW#Qds>d4pG`gPhUqQlpBT@(d%RyrRU^jDmth^R)C#^PJ>LlT-n_&^c)<&)RcH z@@JVR&RX3ThaocgLZ<8H^O@h+6f%kp3z93UOe`x6(u#_5Gcz&`s&Y&!O^YiFO*5(r z(kH+4&lNZ-ZollxqlY)A=<3H^v;OsGvSX>;<^_eFtc10DmgfjmEdHc?V%uuxy9%%F z>n{-Mo&2!WWb&D6&dCc3{Wk|zII#*jZP}u`wm9?SU3Z(a?=9vXV_Z6!v0iNQya>L{ zCu<)v3TZQ}H7I>}e2)L)V>g^X37ltK0G6L$&pG*a{Zj$vgZ%p%f+ud;|8|;_#UtDO zlP@$h3EdJn{Z~ZK)}vzGFX8J8WQ7@5OrF>vHz}5La(82d(B`G#Q$M`8qIJ{mMAyB~ z^A<3!1<6i66Kf&R7n=3ANI1vGCui*gR`wp($Gfyu$C$YGgL7>$C z)8tt8}7kMc1t z#bTsyera)PNMccXY6;Bn&wr&&wMFMn|IX%k@MYEh*-*pz8D~yj7$fWl^+g|FZNlF0 zm+reJ=FAIiXD^1RYFWa_I2mS5Kw@4h%uu89ru%Ot<}GLY71Z)Sp`Z6M*q_(UCZA}L z6`2s5dPLtlwto64c4tjSxmkySl9PY7$fqbb+_}H)oX+b{|Mt8|-Pv~+B=OAnRwOfn z02}k4r*{e~nHw*vr=JY{90U~lw0nY^(cu;Q65r1%kM7&@1SoV#vp(W4^O5yYkCyK# zv9Q_=6l!>SWY^d4Rl&EWEHQqQICIYC#yB~~$+OymR0W@jv)jFhs_DMeRk~YXxpyZx b`mQ}=WMO1rkh2Gqu9GjsD{NlTe#jC48UCZ8 delta 797 zcmaFW#Qds>d4pG`gY53vrKMF#<%tE^#d&Gz83mPvi6+KLNlE6V6{P|*SFq-u5q4MUK8-~c_3z@E)&u4yPQ!uH@HpnnYN=!2D*0Ung8i+8kXu*|F4a^Mb-oR>Imn%X0*ZE^$h(KXf>jxnTR0 zV-_xFCqFDTnS7?2bMk^h|IL9FPOL(b7hEN7M2M`ky!2rHewLIH#-)=P>%}I|i{RUQ zvi2dP5c`oyT6@0i|NLUzs*gebN47970L#y>=bU`I{;9z2=MUG-YA(AenH-SgTKUgp z@`Z*bp_-%rTqV+KytTU-GL{}FKgPIX^27$YNwJ)hyBi~f{1uhoOgzza(N{AnXUUq| zix}5}WGA1AwGd!;zqL(y%k^`Uw`nOXyRBC^Il8G$f@2=u>(9c?qoQq4(q;&1xL&^Ou6mGn^dLq9GODwI@vf%e}m!H&?Z0 zZEBu>46O1fALGo)3uA=kq2~1^{QlftmHSY)fB*EqfloXjs$Qf|7Hk!hc(SNW*X88$ z3$a@SFW0OpeANs#|Eb1g`&LF>n%}@`E*%n(K-VOB3Tx*V2m(2}Rfr=jAoT_Tf!nkpx;t%nS1{rLV9X%Wr-tFDGZr`F6hh0;zSRJ~i zBErDHI4{p|#w>^)w~3P%dXxn@mmdm`*W7r#mht$-;7l!ckfQ8Qw{JldiM0S}J!2rD z3B-yZEHG8>!;fwbQMKYtq6ZiqYrlex)%~vklmr4*p2?Y>E5?!KaQN2;~t#Etqb3%-~f35Do*F9XpbDlqxKXSqCIZNlF0 zm+reJ=FAIiXDDMu3Hupk8?Ldx@|SOAPpkB)0a^+2_Al1SAHC{= zlpF5c-*!&t^{0P(-lXpAy9<`o_dX0UK?me*GC+X{kIbH zmb3i|YWbhg&kHs3GDMMd_~hL_Ewb|pg^nif#Y*w jhC_9#Ve0t&SK3rtbnf);Y>o$CidXHQjjDxx8AuBN6)F3i delta 608 zcmex)lkxEl#tkMCj5{}*O8j8l>?-w;WwV`pJlp22s@g1!nHv>@!$G0B zJZmZc$~pB{e!E04*_+uiFfh)`zJDx;0Swe7Col9U3p!}BAZC+^SoVkZ)0&fBGdO@1 zoi|?%Q6%;RNb4B`2~8kY1YrT`oCUhupDa8imi!_%&PVexSVtd|1W*zPRGcPfdb$M3 zeW_KwXVokIrG&dfB}Q}~SkbxpAd`SVsUAq68EX~O=5#c0Pm|Tmx%zruS0ceWP6XWp zYhd7CHu=A2xqQO!&+S#Y4|V(ZPyZYE!~?A60k0cGjq!`gQ@vayo^?p^m#mG_e_;PY z%iDkcGpHiJ$sfJyf}Uu@@sD&1;*b~j!!yWlX*&D&13z|-+`e94D$!P z&@fkhI62(MMd8V!GF_LG%P+)k5xiWps_+$9(MkVih>;?xlXv^L1f{+g+Wk)Ds&9sR zSj@KA@^Dm_GJ9gWR9(^2K&oS3w}bHH&1&3cHBh_5AjTFh-yG<>M@}NVYfqT|mwS0d TZ?0<1+SEKBs>*G$YK|QMO)|$Q diff --git a/.gradle/9.4.1/fileHashes/fileHashes.lock b/.gradle/9.4.1/fileHashes/fileHashes.lock index 547b775bb179d46001f1969855a15a8f4ae084c5..682cde668175771448520870f0839e7559944c62 100644 GIT binary patch literal 39 rcmZQJN)8L&J8{xS1~6c*XJ%k%SSS1;+`hKRY&rw0p^>?*6zVB;Uj-6ou15f?`P|%!sL3(EG#ZriPpyy;)i46j?IyGK+ z+>1K^75qH;t;7R?tv{rTZ zYbGO9uy=B(REEIgx9=Y>21yy0y^v09alApmVgRgoa`&ppkWcX+d5Ioi47{44fB-6-2CO&nm4#YjTN1I zR3?x=wa|BcN5^ESnE7O0Sp@;-yL(s^^lyEK3htk*Dtkg8w6DhV{OQ^zs9@yer?QKf z*jH{;{2{*4pg>@=qsKFjdSjrhBoGUNu)yTbx0wx}8*d(K{ySY_mMthar<$XE<0-F&&uR3X7zLO zMsMMIrcW_O^VwJaUmJSXR^K5DQ`=E-`(;-iJ-j(ZS3mBW^{+peDtLXkW}RDqH+iMW zaR(#a;+2>x<{Mch-Y=j3L3rk_g!q}MPZ28WVPSC7IOy$vQ_rt_+kf6XChzao0J9u@0;3143zD~zdP^V0CCA6{J1x@mW! z>)z*i3m6nJ3<=FrsCXS2?o`BjZg%G$r^3k-J%xo2^6zU1p15iM+i6Y~k8JmY3zVB;Uj-6ou15f?Qu@W05t4iLOEGp$OxfF=6N+nG8m9Ch4 v7l?CZR!r8Ft(bgO)^oC%ocQEaxdW4JVzfZ%3Fk7pbJXZa%) diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 1b09cf3b2e3eb6a1b1a88c078ca87a8f924e39b7..5b7c9de230b38384ac2dd0fd66b69689bb3e42bc 100644 GIT binary patch literal 39 rcmZSHJzwb8v8RV>7{Gu@jhTU=VI8B!)3>%9>kAlI4UNo=4H*~!0yql} literal 39 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 diff --git a/build/classes/java/main/com/gregor/jprototerm/Direction.class b/build/classes/java/main/com/gregor/jprototerm/Direction.class deleted file mode 100644 index e540aa08c0275ccbf8dba5fa7fa9d6ae4b6ca77a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 zcmah{ZBNrs6n^g7u3arK$BQySV4`fGOytFv5(0stBol~*nZ-|~)KSv4rgVJvC+SFp zXf%BGM;Xt(Ox$A3nzX0Sz2`jVKIc9^e|`M{pafGzf?>=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# diff --git a/build/classes/java/main/com/gregor/jprototerm/KeyBinding.class b/build/classes/java/main/com/gregor/jprototerm/KeyBinding.class deleted file mode 100644 index 017b2da70d4a6b4c8850d81b0379f1bf640b6797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4509 zcmb_f?N=1n8UI~&c4t@yfkiNjfU7YI3ucM2n6PNXRRa~o0AeI*a9Bnd+1=Uf4#qT1 z)1>K3`u>{6#K=haUlf>f^=eux0RW+GE?L-QjUNalbow` zR7o~9X=j|AoswfUIzn>HpP#mlIdWvRjylu}C`o(L6lm<1IvqP1%O}l@8M89kSx4@W z;A~vOT>@o~w*}FFwJI8QG@*Hk8N*J_)x)39rYvf*xy6;|+2~EiTOYf5OiGOCSdR_V zgfh|st6N%cURREdxJSh%9h=co+QLKht zI(o31(=%Q;1UgFP7QO2lzCr+1>=D?oh`PR1%A7J%J-Mmbw3%`Co=loq$Fega!gZgH zhtVsrCT+}^2|JTCoWqtwn=^UG$T&2s=r$L?OSWGU?;sNRphW!s|M5hTWmH->AXglq zb}eILW4E%QmCFy}5fwu^hQUy;T^_M}PtYQPax34Ha`xCyW!y-ON#;=NoZy}1C-6+L~Fu3Pl9XY1}+D>Z56f*6NS zLz2;zL1#XV!_;vM%;11QTxM7awyYT3QtuWdGBqtihyZNUFheOWYA863j0#&vR%TYi z@}BYxlBOLn(xyakPDdVeo|-eWDI-ac*S91R%cjIQPUv__O4l6Qvr@y;wCv%bp3%J; zp5esqp2Yr8eLt?_MHl8LjMS_-cubCc zQpcy{SdcmvictsxFUe&5jKDoD{kJQP@zy@c@j02ApBLDE2OK5U=SI%TGIkyZC+v~jU? zSeX+HV$5@eSBUo+NypAH%U&r3Mq#0+WUrB#OquzO{kA8x2g zSy*0*gkn0B2rY<67^&2-<(P4rbTx>d;}3AEz6j--tQf@ZmSZOon2`YG%wR)oH zXo2(pPs^lDd(3rq68G`6EaL&K@G8f9A$uWt(Q{i~?%bAFI<^(8csx|O`U|8| zZ2fE-qL(3}YcD~KHeNzywCNJ6qhaL|YR_}F3}56sKu&OV?Tz}KnPsda(Z@Tai9PTkt2g|&ICyMVjr(b`oWF7FDKbykFf^VsrZ3g+*5 zJ~Z$@FR|T*bqh0WN3d~~G@D6@l){3(3a7oJUQ<@Mrq@uc*b}up0lMzyA%E7lef$4Wbr}Za90Pa_u{K8Q&o9 zX8aMau&2p5;1qidjA$-|SP_kd5C=pt#N}d*{9@q#-{jgyvFbX)&{Xaqgo?C^R|WUH z&U=);bdZ$y&*>`u^bLxlT&E2;G5-sGd02l7-}aEg$d>UB*xELa!RSS(XVAj#A$BXz zpo!f_*{wc<5WA1DTl+dxWe$q(4RU$Dt9M}>q1V=94L0!aZl+Si^+~-a{RYIh;yXCQ zy`_bIly&UlDIza91$8dcc&X08s~A6W8AiX<;}n8zp^14+9ww!_)O3NWcB$i%YLm*% zBjv%kI#NA8k0;%UdCV>bdJ{tfv@k5K3_z6bZs)hw7JmK2_yN;_t^C`M`%9ERSWsR= zFV5n%g7QK5-b1~L@ybdB!OsWJ0E_CZxN;Xx(^OfyBIG&E2!0pea|3qPMLjrIgYVO+UW7Lz_&!rYqP4QJGT7|DPF7;M zLB7)OA;9+@l?v3zZ$Hn2gpR}nSVR}73M9^ME}go!q!5}K`B_+C@8)U=AuZarfX}YP z@8MFrflCdqW6s^Uf|bp!qEyLK#4llYD>eKDF}&+6%UpS9%%NqOtM81t4o@tjcC7^d zO5Q7~t>6dlsvklkse$nI4!`2jr*qUh_T+JJ7v){#R&QWIRv7#Q=Wreu@D_f>*&t_r Kjo-2ghW`s<`}>yw diff --git a/build/classes/java/main/com/gregor/jprototerm/KeyEncoder$1.class b/build/classes/java/main/com/gregor/jprototerm/KeyEncoder$1.class deleted file mode 100644 index 09505a7fe7bf1545384c7763c9efcc9a12ec6dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2064 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 diff --git a/build/classes/java/main/com/gregor/jprototerm/Main.class b/build/classes/java/main/com/gregor/jprototerm/Main.class deleted file mode 100644 index e05e6bd12da4e3353aa50703e66c7df25d4b51b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9697 zcmbVS33yyp^*?7a$(u}W+cZtngqG5llqPA?&;@Ks|J{<5rX+1?LQ0AdUuIsC*G^`J znU|zNpe!Pl9Ra0PL=Zs`l@^$m1`t6}5f?;pLq$*&P*L2K#ou|$WG0=oe*b*^=Dm0C zx#ynqJIg)y-ahm0;m3)n*;f%HALVJ}SCmf$OtW|BLwfJ7dOaSGm?7OVW6}DxWA97_ zE6u2Btzycns_qO@fC@DVDk>tybV4XLP~Vp@`eKRt9q~lWidjZtK*l%5qP=DxlRpyE z!%QbuRkt34wxN(F(-e)06-}iQrsHzcx9MgSLWNxZbC1bZqf({?xtVo9S~IFgw#5=V zlW{#{1Zf(T2{JR7DyxpkySh_^u26Iw&15PZ_Si5@r0x+jHfVG_Q`OPsYt*Adda~0r zhJ!SVP7nd-Fttr2;E|L3kDAO=bRtzUDKVn}BU3WfOfcM=XG}b3a}v|>u1_UHM%1W} z=p(T~tG?aRLp!(VQA49Drm0yZn_^)=KZ|Mm8udOh=6MmCL>2%aPGd2WiJ}nY7 z>X~L#os&%}OdG^y7t<1rmMU6Cr@*ZyX2&#X*bH0!TN1Ijk+4Q!ma*x33_Y5xhmYG` z^-ZzCo`~U5+Jd}KW?0U2@`Qu78hUthG%|9;;L`}etyJ`XggC2oB|Pekh^!tnipW|} z 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 E0mMDHEdT%j diff --git a/build/classes/java/main/com/gregor/jprototerm/ShellSession.class b/build/classes/java/main/com/gregor/jprototerm/ShellSession.class deleted file mode 100644 index 95437f4a86d75c71ff83cf2ae3937d37416590f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6338 zcmcIod0Z6t761NVVb*mxTor>TqN2hgZcI#?fJFmpBmq$%Aew7f1{hs-wzIPc>20sH zO>5(RFYVXE0f`J^pk2Fn>r1yOv>D{Jj+BE6+H#55ou$cVOe)zC6^PBg3zxTfH z``+*U=7FcC?gOw}Yz-j~`3eFm3Q#CedPE!5qH!%T6z%9gqQ`83!tF-Fu$u((YifHI zA&5l^LMj$R6<8NDN1{WPK4e_JQihojQ1~Lo2Z6FSDW9~* zw;hS@x5xLp^01&|4pN` za+!+dC=)11*#icxD9bGxCJg7OD91{HMG5^__b_!22yD#gPTNL28Z#5Iv}NfDJL(GT z(PFk~jnnj1SgoK^#TrxzR66F&ow9pOkEJP21Xgf~E+a7%*IhlCR|0J{u7PtW&tA`S zc&<=JO_y$s8Zq4gV4aHfsAl}6L%KzmaxXA1+JC9{#REygy87J>`)UsR3?hLkN5`ee zUKOplOrSWW+q)B^hGiy3NHl>h^MJ~kKAtVaxDD+J_NnN={!9cNXIm4tJ|r2SjB4?; z-Z3ccY4yY5Nl-@L8F;w@%8J(3`O&+`MFnN<4>W;LNlMXyvTUG!9T zn#WQ>^bziKO1HKQnXtn&lQ9Q)^M|DM*QmG_nt;lsb{Q5c z7}Hc>YfcSk39SP~OvM0nr-o=2BO(h{$93jH82NayikIM}OlvDmD6V#qJp2CA=%77c z#_wCBpX;6JM8a8eFq0 z)0SJ8U#;Rbcr6vh;$}+cRwE86cpdX?hFQHvqRY6B32_77Ab~u=;MBCX%6d_ZH>r3t z-a?{~;hvz(XCLXjQDV9XZ^PRa+^FIv+$^xxaWTQ|GB&JPoF8TQ5(Anw(BeKb#S53^#$2EJ~pP>z|WMtg;Vm2 zD!zmVxCNw!)AoRQEV0jI1q)~5=d?a;M#^UBit(U|uSfUW~#{expWfP^sH=_)%u&WHg~rX3*y^kNlG@j^`_H}*1P>x2#?^qGFiVTP@5Av zUvPX4z$5s9iXY-fB$M2-G<`(&%z>Ii(t@8b3{E;YCHE3Gku9=l$nr&*7IT1?k~Slu z?@N#L>sGh>BHU)iw0MtZ8S>d14A{d4leBt)a_Mi`*%Pt!&aCTMyTHs@p=Oa|koXhQq zAeGGqa6Fj-@q*cQZlAyY{E;SlQ^YzOJ4(;IV5ljZ4Mite$v)6&(NnDVT;JBmxV04Y zyA?I>a5G=_rw0dRulWRt7uQDm2ej%LK3B7I-u|o@?OHZB3wv@ZJ=fu|+>oAOW0m!r zaq`UadsR&xsyEIA_ zeUBj%Wr?4ATO_ZU*v+PCvt($=cHJH}2U4XXucT0@EE}Ro6++|%MG1GoL5(T~s%*2$ zajwc?UPF~A3I)XyW@n3;jt^8NOxypyN|d6oq(Cf_+LrU2jEDKOLO$`V`4pb!N-O14 zg^DNfpP*RHx?B`;bXU1mh3d>?QXg=ZqWGGSs1j=xu}&511y6PBX42D0jG9OFXq!U~ zdZP`xhf|i&5&zSJe)zpfuJe1@1jO}Jb(?7(O(*?Fr%dY4Tg{!=&D8LV&(eCk9^+l ze>RtxFRh7$ZneaICXm?C(tcE3IN-Jca)W{ewNY~{|F$1}u_*@cAV zcN~5K3CoWq&XwN`cx{$FDz7Rfd8(oGPx;i(r#xOOBa;x3y39)Fbvl-C7vz!aSMGXZCwKEg zzB@jR4Si>@X%h7ff$~83-0*pKV_QCYdEXG;?%q$MsjuK(?Ci^rboB+o&0Uk&RUVkY zrK`^1@(CPR?Od)1A3TFY6S#T;{S5`v2=c z_q|X!uLr-zZ>a4cLXPhRl&QpT@jH&uXFQ7E^D6KDfIm9xAIG2YXD0&3@fY6ZYSvr!6rwg~(KCp^7zMme9e%BlDIn-Dm~t1^un`YKjU;`I}Fqg0>ofF>JX@Jo(@ zi)mydf!ppZQ{^hiE>rF}Dj_d-9L;mw%7>t5xE05|m3Mg_sgb%n@zx2vV*N@8$E-37kBMV0&Z&A38<(AX&YV7`v{m z<1^4g*LLylQj}sZ-(OCNR#XuCHT*myc`se9APh3j66>n0JyrN8o}gYgg89J%3}ApV zY+*SnBlsARmKk+mNfqv)A;ftCAKg5GQ+-W&w_uYr`sSw}U42imA+R~WJdjV$Pew@W zDNM`kyzk`G51qvFeU2Q8>guQPS!Z0jQ^EL3a}VQp zn6etBufh&ojXk&q`$=-?UK3}mXEBkk1hACJaM~g24pK_GEWtgHb@_ltr$PetFV1k| zT#UezC{*z8ZOw#W32oyk&x4?yGLjc7B7xJmo{p@&8($FUb+P#JO!Qr<4HB;*l(2%8 z(KTtH%oa{}O(+e?{nu07Ow}?X#j>ce5Ip1*f*Fm{1khEfrOcId%;zIdBGNfgnkRR6 zPv4c4k?t0`a0lxcsISiCLb3C*mxMV;qYh=s!3kM>in6I+&RD5c1hwAXMOSrap*NR)Bq_XLE1e?m`a_Is?ZxHNoo(i_ws1=2`!HW)s zpUBG+cM9CI^>?`0tEx7|a<{wM5oM^YRat(`Jzf*ke!?0}btq|*Kr0N%ROj%S)B(0S z5oXpj%MmlyWy33pC0i#lewbl%+LD^JDtxspeP!S}L+ZGEpz7`OJ^oBe#ZYDK919L8~@2GJ7}) zd?)d+zX00^{f*EoG}FO+9Qb-H^K(dr<_qLZ*D98o-NTvx*^dP}2kFL;rV{A52QeEW zS)`-$h-QAk_;y4X(GZ4FIXW2+9nUz?(Kvn_<0!5+YTr^F^9RC#YQHbM$rr0`G+!RFC@YupNLw^SQ$7_imHQ)I)g945MTwzO}i_*AZy+`8xxsF>I?%FZ8GrNxhm%X(Utb=16oytlQ@YT}8|B zWj;GeYB-c>8cipN^pS9Tu!CvbAl>V`yBiHjorlKKIE%(>nm`ko#tb}Mik`{S9tp?i z`MQFktxUz`74}5TLamHPgW(P%$%(>mGE>p9%`#$zrb?<}$`NKOgBM|@Sk$?qg{jgs zjfv;V5}u@KI-SfkEEb5*i}-tDtD?S5foROv8bTje`MDLVh3phfry718f%w_Mws@yh zp04Q(smw*?f7v6BvY(%%zqt&~zcK!>V@s!hsmjnuN2l%a&j) zUYAF$gT79AVPf{aC@24<`7TZ0l<_s1TY}+$@mTKJ zzcmDgVvnY8%M3j+(_75UL-)|V7JXOKeRMy-mSNZ_lw%I!QkkaOi)%+v$1%_C=QmQl zjA8B7^Z@O1oPpsnsvki5=*4{UXuqZdlmMi=0=`&JG$7W!IDjDFhb=7|yz{3hvM&x# zOygMRo^yt+pjN@#vcfUoLKQFJ!a7lH2shsPnx(1Xp4bZ zm}Hl4i+Fzc-DVm4Nlj15z@8A+E*V%Jr5|bfF+BsqXrw3HW`k*=fbm&PKc$}m!O=j> zggQ%ncyq;S_nh*+8NHzC=fX9=)fWp0=cVoKz=tsSg{EK9|Dq`x2)6~IE5p9-SZ4%_ zEJ3C%u&H`|DA?N38Hpjus9s^y#C`EVk`T-LGX2V;Uu$|r+}(uF&?ujvo;M+hbC8+)QLak$I> zUn8u{P*HNIvGiw6e-Ym?#3XIWSSfRSQ`1}YHZndDVv(eD$<|}xKGJvKMqN9EC^rP_5qs%ZV zR$@C?N91##uuF5ccykM5Ee?j)ZH;^O^O937e+#=9Mv6S2p~SHg z-TJ2*=|FPN{ves@yv#w(>v;oHo;~c!_*U82O&TFnXlY*3B(+;LUnI5J4J}I> z7a?x*C5R+Es)!VSP8`Q&OwmtEBKxux6a6x+agdmj4*!%jrFoWZe1*kVYQ9Qr^Mw9N zGI4BK2&WBQ#WZ)FLd~v3U#}#s(p@Mv0=C4?Mr{=Hn*I-kF%V&20 zvX?EH52YPPGKaOr-@vh!*@Xrp)eT$Yf%<6Fx3xLk-6NZofUir${-)-;`CFKAn=kIe z7kqq!hriC)nPl^~C8V!y5Kp#)?~$5&v96A{1Jg8KvNZ&|`>?O$`ypj{1#;p?d9UUN z7@G}GJklJFH*N9B0iUaUVFd!ob&QS04!+-F>@CJ->~n0ioE;6unKe5grnu zB&`-lyoJ<-ABv*O-Bh5c%Y$rT8 z_VKNX2rqz0w7#|>kDukATKqH3&+-2pN1)^!WglwzBU)FP%}1tVNt?0*lC=#mXKan>$$*nc*we|(;Zn{reX_~K1Gsoo^IMEf zNM2h&k}zWfOmoUV`;_`2-EaWL-{rqq{GR5&OR_zBK!?+}-SKoMBSuWX`cKX8^S|W0 zM1luanrY@B5~V_oqu@cL*~TAe{?KHT_CB;Z+#a#`KS&=36wTiD3K4t~_7eDWx`&VO zQLRW)m;6mQ*O#0Jr>WQzph+pMvZN_5*(6(8)Msnu7IfxyM1yTMc}(haw91uwPq*qikE3YBi z;+z41Xrxx7Ox@Pxxxhj-TB{S(7~~&^VB%4#;XbF8IR1{f+@;^ z)f~HEwo*-d|J6!Q=)h-Xup{h?;|z$YE)CVNg_-?r*8Cn&zFA247k`=+r%vSuJD5z} zRUq_0sf{oa*rVibOM1Fm1JPCX-9b@H#P18O_CZKM@-v@MLE;no`*kNx zvr{<`3{SWGnJiPZ7hM7Ql;k_>Vb2A0$ zG54&D^hEsu-0{H|j!0hJ^cm(f859w33C=Gqt_rBEK3~$0kPIZehAZWzbj!jD>iUX}YxWc|)&!!LQbg~t=z!z={1!5Ch zB9RR}-Av(R4UB`a+?V*dGDWx;Y#UL>oiCSWK=+ z^U|(lEVToH=NJtQG+9gSboMFsDRjmR9K9eQ+M2PPWq%4mKOgo&lIuR67`(?_)f1)!h4-!`%CTq<> z$~{0H6bn%-IzYoJs}9hJ$|(nEROOTejX6M*m8uHAAcDO4AT}kL3bIwoS5q88tMN

1NKlPkF}pUqG`mp# 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 diff --git a/build/classes/java/main/com/gregor/jprototerm/TerminalPane.class b/build/classes/java/main/com/gregor/jprototerm/TerminalPane.class deleted file mode 100644 index b860482c352e118dc65ea5ac875fe183695031b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5221 zcmb7Hi(3@e75@$F?%*;CA}{5kMvSn4Ym6q1t0sW)kpNmD7&NgC%g7EcJDc4BA=*eD zHc8WmX`7@;8*88GJK6@c+Qu}twqL*gMg8(M{hd1ltjl7fe#@P?_uO-S_nhB3=gz$uOr1~h3{yOhR*Y1ei{N0D<4&Hj@!FWyh@!*Ui{NA&qZBBUDk4!Qp4~sKG9Obv6g`_gY%GZ`e6oQ@y-!Q`GTG-z(eWDgiL(6~I+~Z*F$Z4qB(^vbhuo0fiL6mk_np&T`ag}#yxDA!*q;>Orza|F%28?*>u<|8m{SDbCp9v`K*EC z_=<+*r)=i-zKoep*l{wsdQP({W?r(HNtN=Zfgvd#B`1@P>GDVt)?ot{n6%m?e|uym zVZc^1Q}TAoKvLd^brOVrmrd4)asTiw0i8%XBwM zlE-te3;2{cZ{TZ^CBb;o$+EO>!FdVa>k_^W9dEEOEySr~+;zG{&Qzs$S)V=C?yJMtJmorT5W!-kl>Kz{&vNHXi?TT(EZYBrJj4ki}WWY_>q`*>n zc}JGf`|*rLQfX*b^}28_=j{okRVNF$)+F6pk;7rXdXSKPt{FeoW2O}-9q--If;}-E zKh&^l!Lj`bb{p?t!J#Qtk&BLX>bOXhrb~T^yJTN(&N8YR9xj*yi=F;tZsx?q-MkMR zC0)sxy?%-?1kFc9X_%7(b4{0WdkAgF8BYz<;d=8P{u8OPq&YS;Y&LnIo3?Pxzf4d= zpEI6`TYGJ3+beS&yIDLzH+4FWn{}DWJ(inrhO_0k%xD&1eSVvWm4)z!F#d>-bj%o- zm3`~-3rYSaqMc+-9qV$&(kut0Q8_xwg7}kkn(GFB&9@N#9L8Vpv5uPtKEYpEI2WR3 zrzV_JRo>|w`$jhM`S<=NPu0}k)coW~@8!f1FYU)W4 z7O5w}Sd3-(F23g@Izx1VXv3PiYgl^?8++QWqZQ_FEgjvj4UZH#-7pPl+G)6u` zC{?E)>5yG#W|Q-x!Oi2wKI5|X(_5ORjcDS z&O4_OZ{r=>{l3yt^f}e=E2mV)yE-K`9Y6RFu?V`3yQ6#b-q39&x(A7F8_{hix`&oP z_dYHbLieLP(OtrieRNL~wFJ0UDAXyQi(JQE3F3iPBJ5e9QibyIBaGh;M(#1DLPrjU z+IbJvs&wErMy_7Im8X0wKQZLVcp$i@^$x;7*;XREB*yn#<=km*@DN43He; zjl?&xouhD8bcbg#@ClACur8#Qo={p1Pt4b<$^DJ!B*oGk1x2;EVX#~AXco`3-n!h= zdaLawS9O$QB_&oekz~xp-pkd4oIR9drP{Y5Y~dCBb1oMtws=(WOUO@%Xb3;$UqKP& zCm(AgY!rD8Gi0>-c4xKnvhj%!2nt_{hZ zR2i-)2&6n8$TJ0j{Gu?B@_ZmC2*g|hh!jupfQ1kILq!RG&Li;;^E@(K5QtrH^GN>Y zM8VC;f}2P4Hzx~jb_#AD%io+XxcQg(m4D_ba%&lnS`*ncgLtH61|yN$;0#71wfYRk z798poRF@7NM;H?%=xG+qNu_=pXQ^U7$~E$lpn@_a{vwQqizulIypO;Y(zCYi5*j$x*Iz;v$8^IbEa#Z53S9CeDhGE2RUXyV zH&g{?F~L<907Hhl`dK_LJgt?^RWF?@9jRhF%Svfn9c1M$-4WurI;4vCPPjZ9_&cjc zFZp(}TmWa7S!bDIFR)0SW08CbJMl91vuhs2dGh{MJd4-J@z*iJUOt95@Enux9J{x4 zK+jLp^M0CEEl4Ogty+-e&a`}6DUVId=M;;fm(-z^SpOL|u)ZEw#a{|7zxe$y?((Ty z#si1>tDMDGXED7HJ})sZu#ml(!-z5;iYA{$zN+KCsyfewqOo%puS7JzZqMRXQJdS+ z-eT3grQVErjp0?X4X=Ay5Z9%`+3}R%* zPSSK2Z9J-Uuk*Ied$J5(Lkg0czhP-FQeG>8_8C^_{K6}SS6F_B-_x8l+Z&ww5Lft< Vr>nTe-=|y)6WT5O9sj`U{{ggwem(#I diff --git a/build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class b/build/classes/java/main/com/gregor/jprototerm/TerminalWorkspace$1.class deleted file mode 100644 index 2bd6d75b30a1c6778146b43e297138033cdd1977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 841 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 a^6ut{M>xO!(cfGAMrD~iDv!%P)cpy53F?vn diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index 50a8bb1848a1f4cb3110637dd3227089383901f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29095 zcmYIwc_38%_y62G+npKJZQu84uW8>`Gxkg-Bid^)7>yatP_)|jU81s8B1#A)p_Da5 zNm){sqNq?J*?#Bh`FwxRACH;2_rBlfefIM@=QfHYM1&}Z%%O0oBo`C86^-O>t`M8c z6?BrfrL{tCBexMNtT2)zgXC%lR4G7xwo%FwusrG~1I zJS7UTi4Af2*hOu@gm`luFW0DNDwl?nMzKd5jWIxRk_W6Ok%^>ZNuF}W38l5jL_Ch< zv>F$8jC=fpUB$OpWO(?&k<&)w`RD|ai%25Fk^W1CK_%xTFYvp~D^q)yOjMt=8=XvY z7TZrDxywxCreXzdW%x#MMdR!0BZEUVemb50Qw3wD!P7D^{^`c46>7zC6-Uy>R-Q{Z z**2XwLlvD#a<;afMRJqN%p~SG7CGwmto81(Pjc@J&YsxxcDCUh-k7;0H<9d=NI8$> zA`zd){f_tlazA6$xWfNQ=-}Q@TJyP+*d%v}%v2&X$J^AGt#bRaAidQzIsbiD^wkCI ziQ{l_taudryZki-l8T~{6G7^5N*6@W6*1u8Zg8J9!Fy1jsU(s+B3R*p zkUXVex>h5yhGl0XSZq_#T>nt%pgyd{v?+*(p_IO9&Mvk!~YA^>|``sT`<;9}*D39YpmmqQ*&t z&BdoACgOVt$;$?e+St}ctV{yJ74lOO(DIQ}B_qNRB!%FlL?-)BjqW3woK*PfpS6zM zmWHUMBL)u;&O?MF&Hyf(%1vwuE@QGsu;PDTMns&67(7OFvfw@pla2h6jTqd5eYn2 zPmg@9L4>s+9jp#SLAa}th2A3u^$0fv`2bJa+StftA7K}J>wgy;5cNiczoChcovl** zPeGayjgy~+Tg0OSR_-n18oopt;GuPr{6|sgL8Zz zk?zQkBP9GlG&&H&PDI#+sQpCPzYvXX#4s884Z9LH-vc}pnb^qTc;7$?ej_~~Bw#@= zB0Q-zvi~1M*oPQ-BY)wn5?MdNrZaE=5XJ%onMfiHfc_1_uMmSr?jJ%lh7o}S%5g-& zkWo;7!cAb#C@8s|So-Oo61boOS5(shaYIQi3W@1I>vl(Z9w^5Xp7Vm|tRckOVDbO% z_eKqUPy=6-V~WXs!%yIg{7|(J#GlweB$b#OLH{Kqp6Q>#Tt*E-QDF=chLSw3Geh@2n)ZF>j)fMdCW3jEN2G+srG zhQTe29Q7CcfjwOR-Eoi)1o6L>wZH+(1cQ|M%@C5GA$&GlMI5)wUI$w>D;}4)sy8Vq1wr)dJ4Md zKFUc&IcX>-9pyYgIn;-+xzbj)IRhm*E6pDf;!{YJR@k;o_-JMZCifVqA>ub)_@}}v zZu+xM_IqS$SBN(?3)Rj>x%ZJAxPdVBX9!-@yXDETAY-TXS7x%r_bwlJf~r47)i&f3 z$|5r7;y&8TMv;R49tcI8I|2{(n℞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 qZs-%^i^OPb-1HKKdW0 terminalView.canvas().requestFocus()); Scene scene = new Scene(root, config.windowWidth(), config.windowHeight()); scene.addEventFilter(KeyEvent.KEY_PRESSED, this::handlePressed); diff --git a/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java b/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java index 9b1a0d0..80d84cb 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java +++ b/src/main/java/com/gregor/jprototerm/TerminalCanvasView.java @@ -5,6 +5,10 @@ import dev.jlibghostty.KittyImageFormat; import dev.jlibghostty.KittyImageSnapshot; import dev.jlibghostty.KittyPlacement; import dev.jlibghostty.KittyRenderInfo; +import dev.jlibghostty.KeyModifiers; +import dev.jlibghostty.MouseButton; +import dev.jlibghostty.MouseEncoderSize; +import dev.jlibghostty.MouseInput; import dev.jlibghostty.RenderCell; import dev.jlibghostty.RenderColor; import dev.jlibghostty.RenderCursorStyle; @@ -15,6 +19,10 @@ import javafx.scene.canvas.GraphicsContext; import javafx.scene.image.Image; import javafx.scene.image.PixelFormat; import javafx.scene.image.WritableImage; +import javafx.scene.input.InputEvent; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.ScrollEvent; +import javafx.scene.input.ScrollEvent.VerticalTextScrollUnits; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontSmoothingType; @@ -34,6 +42,8 @@ public final class TerminalCanvasView { private final Map kittyImageCache = new HashMap<>(); private String fontFamily; private double fontSize; + private boolean mouseButtonPressed; + private MouseButton pressedButton = MouseButton.UNKNOWN; public TerminalCanvasView(TerminalWorkspace workspace, AppConfig config) { this.workspace = workspace; @@ -41,6 +51,11 @@ public final class TerminalCanvasView { this.fontFamily = config.fontFamily(); this.fontSize = config.fontSize(); canvas.setFocusTraversable(true); + canvas.setOnMousePressed(this::handleMousePressed); + canvas.setOnMouseReleased(this::handleMouseReleased); + canvas.setOnMouseDragged(this::handleMouseDragged); + canvas.setOnMouseMoved(this::handleMouseMoved); + canvas.setOnScroll(this::handleScroll); } public Canvas canvas() { @@ -119,12 +134,187 @@ public final class TerminalCanvasView { double lineHeight = Math.max(1.0, text.getLayoutBounds().getHeight()); double baselineOffset = -text.getLayoutBounds().getMinY(); - Text cell = new Text("M"); + String sample = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + Text cell = new Text(sample); cell.setFont(font); - double cellWidth = Math.max(1.0, cell.getLayoutBounds().getWidth()); + double cellWidth = Math.max(1.0, cell.getLayoutBounds().getWidth() / sample.length()); return new FontMetrics(cellWidth, lineHeight, baselineOffset); } + private void handleMousePressed(MouseEvent event) { + canvas.requestFocus(); + TerminalPane pane = paneAt(event.getX(), event.getY()); + if (pane == null) { + return; + } + + workspace.focus(pane); + pressedButton = mouseButton(event); + mouseButtonPressed = true; + sendMouse(pane, MouseInput.press(pressedButton, eventX(pane, event.getX()), eventY(pane, event.getY()), modifiers(event)), true, event); + } + + private void handleMouseReleased(MouseEvent event) { + TerminalPane pane = paneAt(event.getX(), event.getY()); + if (pane == null) { + pane = workspace.activePane(); + } + + MouseButton button = pressedButton == MouseButton.UNKNOWN ? mouseButton(event) : pressedButton; + sendMouse(pane, MouseInput.release(button, eventX(pane, event.getX()), eventY(pane, event.getY()), modifiers(event)), false, event); + mouseButtonPressed = false; + pressedButton = MouseButton.UNKNOWN; + } + + private void handleMouseDragged(MouseEvent event) { + TerminalPane pane = paneAt(event.getX(), event.getY()); + if (pane == null) { + pane = workspace.activePane(); + } + + MouseButton button = pressedButton == MouseButton.UNKNOWN ? mouseButton(event) : pressedButton; + sendMouse(pane, MouseInput.drag(button, eventX(pane, event.getX()), eventY(pane, event.getY()), modifiers(event)), true, event); + } + + private void handleMouseMoved(MouseEvent event) { + TerminalPane pane = paneAt(event.getX(), event.getY()); + if (pane == null) { + return; + } + + sendMouse(pane, MouseInput.motion(eventX(pane, event.getX()), eventY(pane, event.getY()), modifiers(event)), mouseButtonPressed, event); + } + + private void handleScroll(ScrollEvent event) { + TerminalPane pane = paneAt(event.getX(), event.getY()); + if (pane == null) { + return; + } + + canvas.requestFocus(); + workspace.focus(pane); + int direction = scrollDirection(event); + if (direction == 0) { + return; + } + + MouseButton wheelButton = direction > 0 ? MouseButton.FOUR : MouseButton.FIVE; + int rows = scrollRows(event); + boolean sent = false; + for (int i = 0; i < rows; i++) { + sent |= sendMouse( + pane, + MouseInput.press(wheelButton, eventX(pane, event.getX()), eventY(pane, event.getY()), modifiers(event)), + mouseButtonPressed, + event + ); + } + if (!sent) { + pane.scrollViewport(direction > 0 ? -rows : rows); + event.consume(); + } + } + + private boolean sendMouse(TerminalPane pane, MouseInput input, boolean anyButtonPressed, InputEvent event) { + MouseTarget target = mouseTarget(pane); + if (target == null) { + return false; + } + + boolean sent = pane.sendMouse(input, target.size(), anyButtonPressed); + if (sent) { + event.consume(); + } + return sent; + } + + private TerminalPane paneAt(double x, double y) { + java.util.List panes = workspace.panes(); + for (int i = panes.size() - 1; i >= 0; i--) { + TerminalPane pane = panes.get(i); + if (x >= pane.x() && x < pane.x() + pane.width() && y >= pane.y() && y < pane.y() + pane.height()) { + return pane; + } + } + return null; + } + + private MouseTarget mouseTarget(TerminalPane pane) { + if (pane.width() <= 24.0 || pane.height() <= 24.0) { + return null; + } + + FontMetrics metrics = measureFontMetrics(Font.font(fontFamily, fontSize)); + int columns = Math.max(1, (int) ((pane.width() - 24.0) / metrics.cellWidth)); + int rows = Math.max(1, (int) ((pane.height() - 24.0) / metrics.lineHeight)); + long cellWidth = Math.max(1L, Math.round(metrics.cellWidth)); + long cellHeight = Math.max(1L, Math.round(metrics.lineHeight)); + long screenWidth = Math.max(1L, Math.round(columns * metrics.cellWidth)); + long screenHeight = Math.max(1L, Math.round(rows * metrics.lineHeight)); + return new MouseTarget(MouseEncoderSize.of(screenWidth, screenHeight, cellWidth, cellHeight), screenWidth, screenHeight); + } + + private double eventX(TerminalPane pane, double canvasX) { + MouseTarget target = mouseTarget(pane); + if (target == null) { + return 0.0; + } + return clamp(canvasX - pane.x() - 12.0, 0.0, target.screenWidth() - 1.0); + } + + private double eventY(TerminalPane pane, double canvasY) { + MouseTarget target = mouseTarget(pane); + if (target == null) { + return 0.0; + } + return clamp(canvasY - pane.y() - 12.0, 0.0, target.screenHeight() - 1.0); + } + + private static double clamp(double value, double min, double max) { + return Math.max(min, Math.min(max, value)); + } + + private static KeyModifiers modifiers(MouseEvent event) { + return KeyModifiers.of(event.isShiftDown(), event.isControlDown(), event.isAltDown(), event.isMetaDown()); + } + + private static KeyModifiers modifiers(ScrollEvent event) { + return KeyModifiers.of(event.isShiftDown(), event.isControlDown(), event.isAltDown(), event.isMetaDown()); + } + + private static int scrollRows(ScrollEvent event) { + double rows; + if (event.getTextDeltaYUnits() == VerticalTextScrollUnits.LINES && event.getTextDeltaY() != 0.0) { + rows = Math.abs(event.getTextDeltaY()); + } else if (event.getTextDeltaYUnits() == VerticalTextScrollUnits.PAGES && event.getTextDeltaY() != 0.0) { + rows = Math.abs(event.getTextDeltaY()) * 24.0; + } else if (event.getMultiplierY() > 0.0) { + rows = Math.abs(event.getDeltaY()) / event.getMultiplierY(); + } else { + rows = Math.abs(event.getDeltaY()) / 40.0; + } + return Math.max(1, Math.min(64, (int) Math.ceil(rows))); + } + + private static int scrollDirection(ScrollEvent event) { + if (event.getDeltaY() != 0.0) { + return event.getDeltaY() > 0.0 ? 1 : -1; + } + if (event.getTextDeltaYUnits() != VerticalTextScrollUnits.NONE && event.getTextDeltaY() != 0.0) { + return event.getTextDeltaY() > 0.0 ? 1 : -1; + } + return 0; + } + + private static MouseButton mouseButton(MouseEvent event) { + return switch (event.getButton()) { + case PRIMARY -> MouseButton.LEFT; + case SECONDARY -> MouseButton.RIGHT; + case MIDDLE -> MouseButton.MIDDLE; + default -> MouseButton.UNKNOWN; + }; + } + private static void drawRow( GraphicsContext gc, RenderRow row, @@ -139,11 +329,11 @@ public final class TerminalCanvasView { double cellTop = top + (row.row() * lineHeight); cell.background().ifPresent(background -> { gc.setFill(toFxColor(background)); - gc.fillRect(x, cellTop, cellWidth, lineHeight); + fillCellRect(gc, x, cellTop, cellWidth, lineHeight); }); if (cell.selected()) { gc.setFill(SELECTED_BACKGROUND); - gc.fillRect(x, cellTop, cellWidth, lineHeight); + fillCellRect(gc, x, cellTop, cellWidth, lineHeight); } if (cell.codepoints().length == 0) { continue; @@ -156,6 +346,14 @@ public final class TerminalCanvasView { } } + private static void fillCellRect(GraphicsContext gc, double x, double y, double width, double height) { + double x1 = Math.floor(x); + double y1 = Math.floor(y); + double x2 = Math.ceil(x + width); + double y2 = Math.ceil(y + height); + gc.fillRect(x1, y1, Math.max(1.0, x2 - x1), Math.max(1.0, y2 - y1)); + } + private static Color toFxColor(RenderColor color) { return Color.rgb(color.red(), color.green(), color.blue()); } @@ -253,4 +451,7 @@ public final class TerminalCanvasView { private record FontMetrics(double cellWidth, double lineHeight, double baselineOffset) { } + + private record MouseTarget(MouseEncoderSize size, long screenWidth, long screenHeight) { + } } diff --git a/src/main/java/com/gregor/jprototerm/TerminalPane.java b/src/main/java/com/gregor/jprototerm/TerminalPane.java index 2ce4e00..f6e179d 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalPane.java +++ b/src/main/java/com/gregor/jprototerm/TerminalPane.java @@ -2,7 +2,12 @@ package com.gregor.jprototerm; import dev.jlibghostty.Ghostty; import dev.jlibghostty.KittyGraphics; +import dev.jlibghostty.MouseAction; +import dev.jlibghostty.MouseEncoder; +import dev.jlibghostty.MouseEncoderSize; +import dev.jlibghostty.MouseInput; import dev.jlibghostty.RenderStateSnapshot; +import dev.jlibghostty.ScrollViewport; import dev.jlibghostty.Terminal; import dev.jlibghostty.TerminalOptions; import dev.jlibghostty.DeviceAttributes; @@ -12,6 +17,7 @@ import java.util.concurrent.atomic.AtomicReference; public final class TerminalPane implements AutoCloseable { private final Terminal terminal; + private final MouseEncoder mouseEncoder = new MouseEncoder(); private final AtomicReference renderSnapshot = new AtomicReference<>(); private ShellSession session; private boolean floating; @@ -31,8 +37,8 @@ public final class TerminalPane implements AutoCloseable { this.rows = rows; } - public static TerminalPane create(int columns, int rows) { - Terminal terminal = Ghostty.open(TerminalOptions.of(columns, rows)); + public static TerminalPane create(int columns, int rows, long maxScrollback) { + Terminal terminal = Ghostty.open(new TerminalOptions(columns, rows, maxScrollback)); terminal.setDeviceAttributesProvider(DeviceAttributes::xtermCompatible); TerminalPane pane = new TerminalPane(terminal, columns, rows); pane.refresh(); @@ -65,11 +71,45 @@ public final class TerminalPane implements AutoCloseable { } public void send(String text) { + scrollViewportToBottom(); if (session != null) { session.send(text); } } + public boolean sendMouse(MouseInput input, MouseEncoderSize size, boolean anyButtonPressed) { + synchronized (terminal) { + mouseEncoder.syncFromTerminal(terminal); + mouseEncoder.setSize(size); + mouseEncoder.setAnyButtonPressed(anyButtonPressed); + mouseEncoder.setTrackLastCell(input.action() == MouseAction.MOTION && input.button().isEmpty()); + + byte[] encoded = mouseEncoder.encode(input); + if (encoded.length == 0) { + return false; + } + + if (session != null) { + session.send(encoded); + } + return true; + } + } + + public void scrollViewport(long rows) { + synchronized (terminal) { + terminal.scrollViewport(ScrollViewport.delta(rows)); + refresh(); + } + } + + public void scrollViewportToBottom() { + synchronized (terminal) { + terminal.scrollViewport(ScrollViewport.bottom()); + refresh(); + } + } + public RenderStateSnapshot renderSnapshot() { return renderSnapshot.get(); } @@ -150,6 +190,7 @@ public final class TerminalPane implements AutoCloseable { session.close(); session = null; } + mouseEncoder.close(); terminal.close(); } } diff --git a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java index 770dd45..e0ad305 100644 --- a/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java +++ b/src/main/java/com/gregor/jprototerm/TerminalWorkspace.java @@ -38,6 +38,13 @@ public final class TerminalWorkspace implements AutoCloseable { return activePane() == pane; } + public void focus(TerminalPane pane) { + int index = panes.indexOf(pane); + if (index >= 0 && pane.visible()) { + activeIndex = index; + } + } + public void layout(double width, double height) { List tiled = panes.stream() .filter(TerminalPane::visible) @@ -235,7 +242,7 @@ public final class TerminalWorkspace implements AutoCloseable { } private TerminalPane openPane(boolean floating) { - TerminalPane pane = TerminalPane.create(config.columns(), config.rows()); + TerminalPane pane = TerminalPane.create(config.columns(), config.rows(), config.maxScrollback()); pane.setFloating(floating); pane.attach(ShellSession.start(config.shell(), pane, config.columns(), config.rows())); return pane;