From 72a4c00e72a33aef3b4ea6b8f1986afaa266d2d9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 21 Jun 2024 19:58:36 +0200 Subject: [PATCH] Window decorations: fixed black line sometimes painted on top of (native) window border on Windows 11 (issue #852) Windows binaries built and signed locally in clean workspace --- CHANGELOG.md | 2 ++ .../flatlaf/natives/flatlaf-windows-arm64.dll | Bin 23272 -> 23272 bytes .../flatlaf/natives/flatlaf-windows-x86.dll | Bin 21224 -> 21736 bytes .../natives/flatlaf-windows-x86_64.dll | Bin 23784 -> 23784 bytes .../FlatWindowsNativeWindowBorder.java | 23 ++++++++++++++++++ .../src/main/cpp/FlatWndProc.cpp | 17 +++++++++++++ .../src/main/cpp/FlatWndProc.h | 1 + 7 files changed, 43 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67cb672b..7b9e2745 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ FlatLaf Change Log updated when table width changed and was painted on wrong side in right-to-left component orientation). - Theme Editor: Fixed occasional empty window on startup on macOS. +- FlatLaf window decorations: Fixed black line sometimes painted on top of + (native) window border on Windows 11. (issue #852) #### Incompatibilities diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-arm64.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-arm64.dll index ea7d69bd5a221923010365dc32bf0b9402c7422b..b91c3210dabde9ecfe177cf8b7f9cd2a80483abd 100644 GIT binary patch delta 3849 zcmeHIX;_oT7M}T%U;>iFumxmE03o6xA_xj-Sc`k0h`68#sKmA+h!wonM5u~_)Ho<; z)ykq`L_`BhtfFD2LuvXz0oLF?`1HZm+ST4rY_4f_xb$t&o9*(W;*9~HQf9D|H9mH^HTmtC>s3i#o zAYMraY1JE64Rf8qUSLG91;7e3ydgFpK{%1n??&#>mDM>JJJA7%KvL)oJ&*!UCL~ZH zv_h?r36G*z(3u!%tl|;xAS#F4b95$zHHgJPumBxq1i~XK4I_#MS!f!|9$rDwtSmSS zy<%0tXjEv}1w+sQqopuR)n#M=2{{`Lj5LQa$jmq}B$Nd_TWO}s7yxn;48&?~JDC6a zI#6h^Nc_QR7GN4lSaLt6fjnGl0My#aK+Oc;9y3_nBM0(u0B1DCu+S0X(Vh<23kw%} zaYuoECPN;sHKME+iF-)Pwm|=GA@+KHUEEDZHHPS&v4uBgSA53OAjoA}gD*1y@JL{b z)hq@Gld^%D^oF0=^&mesUxrEl&&c<<5YkyoU}rhW^e?eYmfu7f{A!Q3Y9(a=nktu*t&z~spe3WmZEV?Y5zAt%sNo;hcb)=)Gw zKrK8^SqTBuG~8%1Sg1j_S0-EBqXnQ6jF2~s#TCj8K!shOK2OdDJz@r^D8Y@*gupY? z9?uGHK6$2SsugI1S_braf8&(RXrMxl<7jAR zY^5oAIDrE)JESAoC^N=SIGt`(Z(_sa4<5~2 zFf^`Oy}lFmnK;th^?D2BVd@W~Ro|L!Bw!eNXC46U(IksAa2L{8j3eIkA~xT`k~QRb z%N7U3Vkl&};EO0{8l&m_So~rO_$Kg6RLOUMRp=2v0kTv9me-)w`#!zJ0LQMIytvPL zQ7)RQvK_sKkp1p6^vxLldx+9A|G~%j4q42jFr7jt3fUBXr2O(Jy_mve3a3+8K7_L2 zxZwOh0HM5YbiWW;c*JH2Qd&|7DcS1FqT3Ig<=YW zr~tzmYpF`^p{aH{;qW)v7;m>@k+@?KP_|qEj-oJu$u|-RfU7iqMal|CPjXK(3I8Fv zWRe^5BE5%n$4#3y#mBD3x(EJ?vO2gg8BtBOtXNPzZNsRrkY#y+H_HSTU#5F2t}+MAm@^$>_l6IasRy}JznGi zd+;$hYcP@$KGs9Aq+;QV@Jn+7K;(>dEOIQhSfU&Oh{4i~r4vi*7>rm-v5yvu7jDQ7 zEH|*QrvMO*r5uZq7cc_RUI3iK!thqDvVTgGrA{T&7+Rb0z2v*$!*Hd;s}yrw%q4tg zSBtq!%#j@#UhU+aVvhNl-8Fo#BFyordmps*1HhZStD&WEG5-I<`QIOoiY2lkI5TKp ztW1eqnY><_xHdR-AsXW{8_8X~Ew~_P<2QI~p>%D0;zs|Jlw@h_hLn}63ocd=!SN0< zU;HQ%@Q*L~IQCFjMPVz2Oj7{9#{26qdeV;*C44-QSZ}ogU=gr~-lOr4I@SfYc;diO zLXI&A>*WHh6Jr@%2LLvJBAAIW3iIRyr-5RKC)gK!08Rus!WwXbAVB#NrIvQr!O}&9^q_Hk2jeu4lQUum8+bcUwSN} zaEs*G{3YM36t2&BvKZftOGl!2?w_jzP3B10-5t+>KQ{0RVST5T` zx9f}{gbYAWC%~5HH>JGMPJT8;6Rs=>nmOjxp62w$v(KDMZhtl_W0~}3@#<5d34M(j zWgO#5ok8xJ+9}6e3*$7+rN`tUCHjceyR3>E(f$MQ!Q;xsvW|S=fs^x#S9WCaukYIO z@L+6>6_|HxTjA09y&CJY>&O1O?W~XE>KEC$$GrBjON>@kH_(MIwJz?3`=k|)Ei~?7 zSy@?z=Go)BJ-WRvE!}4;YRV&`PMwZzH0kiTLx1V`lK)-$iA|5zb>~-)uFDd}BsG1T zerBofrTHC`>-v9qDch{OUE&~0n`rao`?OyoO}V8FLCul{UQ13|FSvxxzYfih?wz|q zmuyvCKUbF8uzyii%BEv`=zkYFEh^3Ko%teii&N|9`gJj^uKH>HH)xei!^&U%`?&Zd z>o1?N+*EW6ZCAgvDc>LJ#r2+lT*YI=p+^hAlDtc_ht5C6wA`AW_Gw|$;mr!?5a;`< zxXw=}K17^Uhwt?V$LdbcsVWXWg^B{x{KGCRIk$FK$*ojR<$ic4GGm!{^PyQ~bJrJn zAE@dbn`29GX_x#XI}ZGuC?4q>7t&IHoX>H0bN6tY;y!7Tm#3$@Dmv(a33FIO)1t(J z+j%~1Qwtno#eck;;4S)hY$AxbSX1V^A>&O395>Jvf(}N_ky(x#V;VW*$?KQd2c6zt z{4UP#&tB=Bt0g1LT}Djd{>!Y@NwhoWGB0uUv`s}H16GL|ouB3`JpUrLm{Awy)l?bo zCtmQ_N4@mOzIJ#(TdHnNfl<;ZWw&TrvyW0IU1HeCstmGTUi|55NN;Vi@8$=Qhff$c zecT;f--KSw`Z?l(EX&8|hdDw;i{PmST=STD@cqL|r$&9ZFsm~-u=k}PR&Fsy_4eYf zuB!7N@^ytrY}0(o=C&o?shKT*wB64@-7G&$GcTui_R&ta+^btAIh1g2 zu|@80j#uwCFg%{nYo9Qk~Z9P79+(eIaZd~*W`0iDR>9SGXZbjxBfU?KW`N|H1AB#=70Q?7q C6U-`V@@bNAWjuJm1i zeHY*%ci1lT@b)}Y^^SXcVg^?>HGG(uvKuB^F`o#p`!GDkw?Dj{;-)DMjE;yRV`Mz; z+yHL?HdiVEUqkRYpvGHZW~xf4n*x0-XibZzvUhfbSurw$w#+Uk9HRul5)=xp;5@V& zIuX85#?wbFkO8ex2ecv{tH}xCHT*$|0bw~}(h=N)PSC|rD(|L;&>#yfWSYSuw1Ig5 zFYtnS8LmXdD(`XdH>&I52KjqcWk{H+p-HvbP>6I`;!muZK+r|wR4xbLNR+a$mfZ_h z^q&T@Zj1mCIL8DG)c~f{gP|-9j8+D5WJG>W$AqdI_z&T1? zSj(h?mC@>;mW+lU`TYlZsB^_w6n!K<`8ZgG3RVHN07zREd!TGmTR1wjPE;`%R9{|4 z`>c&T2h^pW1H({^hB^I~vdkw}hW@jFdy~kOGX|QsLMpWtnsa8212=r*^x|YFw5nVQjXU%zZ8RK8V z(QcY{WfyIBC0SQ;Me}&NOa=4e-E^6hK(^YmHKyd7l-x~6Hrj$v20juR030%DxzdPB zwz_b%4}c3`mbBFbzeJr9sBxN5H;+9I?1!`rI0(&JCUAh~P^3YfdTwH=xgT7vqMm(5-^UP$<_%pE<6` zBa1Z%LCq$8vQ zujt)^a2)M2;6fw$F@qQaNr^Pc)kV{ncjg&K*?a$?`?*hhxKbQPu{y=?DgRE2rIema z@mh*4DbAl}$xL2w@*fEUDO;K1v4zvFLdxb+HkY#dDZ7*628ydGK1uOc6emqF4vwOP z5Q_aMcBR;w;(1h}nH^t7B9r0ZnU5k1%e@%Bju@tt4;uh$d?{>`BGZyAwr-nJ?eRRs zTJ+|yq%aEssrfqK2dO2H8n)3vQ{Aw6_!C-#Cv4NE)tOJKZRE7Q#1()va(;RxoELzr zSmXSy;T7;D!rDg}ok@)>UIU`@yf_jdWq*d1bd0vfJ4!!gTKA$5o;7nPo*-W;1?BJ} zBnmvR0i-w_?-Zy}U|`!7BMPI?3V;wx+?W^u|7KtWV04)S(1)?f0&f^2Y7SRwgJZu|pDrhV4i%l;6_foC7KdvyX#q-Y~sY)@u~*N>@2y=_IE9b>Ie1E zfC3eR&Kny%HD0~?Iq-|?JMQ+DzMa?{FYwtGmtxOSX7aOqvxZp^LOM{&BtX=)E#pPS zzna~LlYKeB(bg~`-S*gF^NI&mvZrOkTkH2>Mq&E3CxyQFKOufJtoPqT&6vcsRk zTFIN9hEXSn)2C8P4@CU9Zq{0HcvWSze-+!ADfoUqZ~ItMlw#j6bqUWJFV#ub1pd&w z=grk5c6j>2QtxlRWR_$$T8$Z;cvo^ScC%MQLPnIMMz2=-m&eavrr*q6LpSG-#P53Z z+-+NH-Q>97>lgOjzbPkpm-%{}DtVqPw%uf#oKa+CdHyoT&5u8k8c-CWy52veRrm$tMqRvS>Ypja9oh^MWVu>I(}K(#erKX#;XGV{Q70H>dw{4 zF@i`PyPI>vzDplIv_~`C#QA%_w5GKVyqqwopA6z4hS?mW8@IRL)2x1M?w;LL9voh<|Hdkv#Cr!9RjLpEu=}=) z>mc3Jgm0ix>?ZWObo2b`bbYz++EvD{muluuMilEJroHivz5iUZde*mNv)%Ybor-m0`}l(ek22XyYUbpn zq&{^$kgMg@Z1w5+OKYzrU07c_P*zp^X_HD*Zr7MtWY#ktv&)e6ey?7F=_?aS$^G&| z1?ZN)U$xMuPM6I=E&)%hu#$T#1Cq;Iz=YZ{_^zL3KO?>d{yD1 zQEQW4b$Fvksd4{Lv3EsYgL<0>fAx5Juu!+=**WDbEw}vvnOEcDGfJCx{?=X^w0w&< zVMN5pgG)YR65*C{&G~o!sF*z7sx4W{d%5U-^<0O_fc~<`^^eYM(GC<`xzT9-F0J)Z zhs&}L6Zfh!Mx3=?qzT2PjD9usieQHkCVPTEoKSWqaCQ7OPoD~}$ZNME3+(39cOK+7 z|Nd)8Yi{gr5uN+f;wdm|K0R9Vy<9js# diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86.dll index 37c592cd6ca3bb0da5f5822fc8c73b79c0ca2943..ba214bf0155cc529c225482299bb48b88f3e4179 100644 GIT binary patch delta 4022 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 WUnWl2;BUvVYg)sw@PGFRLjMM6xK<$m delta 3772 zcmd5;iCYub7QYh$gv|s|vQuxhE+h`8bcC{@%dE>B~NB3K0!oOcG)&-cB5;N9>0&6)c<_bm6!nLDFBglP|8 zo4v5RMc#qq48)llo5;ODJYvFJMNgU zK!k!ZI-1Nw3()7$j%ap9*f3kf27)z2mO2!5yEt=CBSb^Kx`Xtf1}>jhP-3$Xp{;a; zY&{U#SY*d$jYdf81d1?(=omsOVmT(l%8Tqq5E_gzuEP9t04fleeLHLsigj5rKTZ{g zkeLx^1OQ_Im-vJY*WrS!U#H}gw|+ClrcPLTMUT@j2~!^^$8P$VhdvdV&Nt%U&M;k ziu*}YX)Dv7GpRjeP>HD%`LQx3MymLUcr-ndT+Jdm8)12lhM6-CwiuZoO(!`SLrk_k zF!)4zK@2@dlWc+OD`*Hq)5CBE?#CsYaGe~DY9#5-fI#GGMwmAL14%MZXtElNDR=*d zP2e}R|A4@P=uEk$Ab`&zUKly+mjR`uMG_;7eK3NUW6Z-=5h=zz(Ja_^wnjxG^_Z*x zzGqek3%`jsC}~Vnr1c)s>5w4|ktQZOYED)|a6JnVdL~je8xqLs;K^_mpD(9EM^bs~ zDLP;qGTfI+wKs=kX4?(Y(-laFSPDnD;28}-$z`zMZq9vXHc6$dr*H$64A0mNA<3q& z>2jHNavw?Jy;%(`%1ztgDmi#w2ZqBGqCtPYU=)V0&j#gJf5(RWP5K{y_lUP9LbV&@ zmk&kB(WHlpuGCRaz2^yY^SPcjqs!si*#-z@HPG>1cvvjCl8jU$#mfOmi9^{*!7iDl zWGIoGCi<}Nys2JQr)SP{k5}qMjF%xnjIc&-j*t)gk}d)h5(cg>A1VYBf1@Y|J4F>- zWOzPR2|3xUI7P*x!)oZC)09e%XHYt_NpX!*QSAe&rvFl9c~cgs%owf&i^Z252a7Ck zs;5!%XeD1eUw^PVkW=?680ajwAI4P z%bF_n0U}$IY)8EtPxUBYjF@PVX3qJT=u5hTVZZ}5$Mva%6LqMBaeZp)fVqGh0BYR+Y_|dAcz`Ql z6(GzL0MZ^{2Iz;m7Vrn)BB06>*`QLm*$l`8ECa*>;$bm0UQ3Am!|$oToX;jeJpcrZ z16WfFpsX+`DR6~@0wi@xQaA;tu@=AuKFk61_TV0H4A2B%0q1KA;Q+?~O@L)~kP09e zY;eFsfU5{uqm?2!X94DJaP$DK0Bqb5N&(!g9mTVuM|nX`371J^-upO5@6UlNyup-%vx*k@~LMeUl}{m?3YYHI5I_=PaH zC7Nx`op-`lhfQgR{6ex&U*Nup1xXJ*lX}9`&Rk7>MO@-nuB6yrSoviXL-B(lqvPLj zSAk;y_vRb!IdB2MQBl4O8r2cNX};mwfrAqRO@aseW#~x}QD$fL|K5GI(e`FEB7;AL zDb|^oppqr5Sh*-^X<&++xWX3`!$-X!meHK(Ea)CWcXYVA&cn!)=jrcx$McEjD^E;p zB^HXuiNnPi;v8|Q_?eg|ahAABLM1aL(UN(RC6ZN=G)azRwA4>JTbd+QNwcIIq=nKw z(lTkKv`(s#UY52>+oi9iOfP{~o>!&UO|OSu$lJ)=WcO%O}m}kWal2RMi$C zH)oK;1Y-p8f(${apib~e&@Ipt8ViNOIl>phnXWrrpSrq>6rvVm7B6_5HZpchm?lJT&576BJSy!Uvrn!#u;Eis z$B1jCPs7WK9L)?P1)0Oc;U`0&AgWztM3+RZ{xIQD>yD)8n6#!U`(RJrfvg4hq*9st zOpEJjrq7PGMF>p3M#L~(M9-w5-}V(AnN&EY`Oa-Z;8pO&?y@<>?0L3Og!#ZU;U%2^U0qN8U6*5Gd1pBHHN3uF{ic# zukPA^>shgN7U$T-{T_v3zb@(c_fF5<0t8E;viKQJ+z@CGHB5^(2O;ymwhfi`5=Z54Vpc<;?MG zOnuX19x^75ZExrn-IYwQu=bVgk&Sp@aB87}CHK8^-_fOtBO;;oU+d%@&F_8xWx6bP zUdriGGqNYI>UBgx(WsS+jkBBgc?L>@#fo>OZkLj4U4uIQ>|VPqAnklb+>zuNQ-ZIl zf7;W%Zko@-gLYeYOLo3p*U0)1@z*=U`^D}OZS^KEKg~MF`WcgD_3uZs^8D&9V)y>8 zEc|}g+@H6f=EZEan$V*SMkYk+d(<(pQja>7{2lRu7|NnI1Yi zm@w1Q2{^~E4MVl4r4>*d8m1#;Qmqu5I|)nBfgfF6BuLRS8p9fDW&;*RFI_}mC`cea zdfWMD+9u!XNNealX=-`C_?f)zZ0Agmr=mx9S$k_uTSncjq?w{)o#uTt8!|UVw9Gu( zPK?uXnXUp?H-X62P3S5Ti#%$h$KN(L_&Oz|5k9sp#~sMtn8x!Pio9c_(~?BCch-Eo z`EK3I^|YGr{Ee&@6U7n1YVpqauH>pittCx0-d!&?$ba2}?=E>B_fZ`DYV~iqb+=co z&@qTxJiOMn{^#v;=3EG!G3&&m-ORq40Jk71wP91*U%deo( zw=mm&>vE8tJm)A+;z0R$In*C1a`X{)IQJQa_l*DwiF6^>FRk#IgJ(9VP80(knYH^IY?{^_XXO{ryU}94{}o zJ}z53&|P!z)Lu^7j>SKn4C0x*F~6nu3RvYp+T~jPJvQ}v%&DpnOOEmP{>xRfM-;r9 zaicmQDry@ZZ*Aeroz|byeu6FCm^a|kb0o8rqbr^~Ei+`xemva0gsd@J`TK(fp^;Bq z_AeS(pZ9UG=h9!L3ojkk9*%8n=b$n%@P^Dn#nw95WLjM5{+7KH6 diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86_64.dll b/flatlaf-core/src/main/resources/com/formdev/flatlaf/natives/flatlaf-windows-x86_64.dll index d3ccf1b66ea24151f825df7d7451480c3568741d..d4e2233af52165506d6960a17e1b44882ca1d667 100644 GIT binary patch delta 5416 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 G;ppGgse#b| delta 5315 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 diff --git a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java index bdf31aa7..77dac5cb 100644 --- a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java +++ b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java @@ -60,8 +60,11 @@ import com.sun.jna.platform.win32.WinDef.LRESULT; import com.sun.jna.platform.win32.WinDef.RECT; import com.sun.jna.platform.win32.WinDef.UINT_PTR; import com.sun.jna.platform.win32.WinDef.WPARAM; +import com.sun.jna.platform.win32.WinError; import com.sun.jna.platform.win32.WinUser.HMONITOR; import com.sun.jna.platform.win32.WinUser.WindowProc; +import com.sun.jna.ptr.IntByReference; +import com.sun.jna.win32.StdCallLibrary; import com.sun.jna.win32.W32APIOptions; // @@ -615,6 +618,14 @@ public class FlatWindowsNativeWindowBorder if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) ) params.rgrc[0].right--; } + } else if( SystemInfo.isWindows_11_orLater ) { + // For Windows 11, add border thickness to top, which is necessary to make the whole Java area visible. + // This also avoids that a black line is sometimes painted on top window border. + // Note: Do not increase top on Windows 10 because this would not hide Windows title bar. + IntByReference borderThickness = new IntByReference(); + if( DWMApi.INSTANCE.DwmGetWindowAttribute( hwnd, DWMApi.DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, + borderThickness.getPointer(), 4 ) == WinError.S_OK.intValue() ) + params.rgrc[0].top += borderThickness.getValue(); } // write changed params back to native memory @@ -898,6 +909,18 @@ public class FlatWindowsNativeWindowBorder HBRUSH CreateSolidBrush( DWORD color ); } + //---- interface DWMApi --------------------------------------------------- + + private interface DWMApi + extends StdCallLibrary + { + DWMApi INSTANCE = Native.load( "dwmapi", DWMApi.class, W32APIOptions.DEFAULT_OPTIONS ); + + int DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37; + + int DwmGetWindowAttribute( HWND hwnd, int dwAttribute, Pointer pvAttribute, int cbAttribute ); + } + //---- class NCCALCSIZE_PARAMS -------------------------------------------- @FieldOrder( { "rgrc" } ) diff --git a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp index 8af6061b..6ce6af91 100644 --- a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp +++ b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include "FlatWndProc.h" @@ -76,6 +77,7 @@ jmethodID FlatWndProc::isFullscreenMID; jmethodID FlatWndProc::fireStateChangedLaterOnceMID; HWNDMap* FlatWndProc::hwndMap; +DWORD FlatWndProc::osBuildNumber = 0; #define java_awt_Frame_ICONIFIED 1 #define java_awt_Frame_MAXIMIZED_BOTH (4 | 2) @@ -107,6 +109,14 @@ HWND FlatWndProc::install( JNIEnv *env, jobject obj, jobject window ) { return 0; } + // get OS build number + if( osBuildNumber == 0 ) { + OSVERSIONINFO info; + info.dwOSVersionInfoSize = sizeof( info ); + if( ::GetVersionEx( &info ) ) + osBuildNumber = info.dwBuildNumber; + } + // get window handle HWND hwnd = getWindowHandle( env, window ); if( hwnd == NULL || hwndMap->get( hwnd ) != NULL ) @@ -391,6 +401,13 @@ LRESULT FlatWndProc::WmNcCalcSize( HWND hwnd, int uMsg, WPARAM wParam, LPARAM lP if( hasAutohideTaskbar( ABE_RIGHT, monitorInfo.rcMonitor ) ) params->rgrc[0].right--; } + } else if( osBuildNumber >= 22000 ) { + // For Windows 11, add border thickness to top, which is necessary to make the whole Java area visible. + // This also avoids that a black line is sometimes painted on top window border. + // Note: Do not increase top on Windows 10 because this would not hide Windows title bar. + UINT borderThickness = 0; + if( ::DwmGetWindowAttribute( hwnd, DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, &borderThickness, sizeof( borderThickness ) ) == S_OK ) + params->rgrc[0].top += borderThickness; } return lResult; diff --git a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h index 96e255d1..a5870f94 100644 --- a/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h +++ b/flatlaf-natives/flatlaf-natives-windows/src/main/cpp/FlatWndProc.h @@ -35,6 +35,7 @@ private: static jmethodID fireStateChangedLaterOnceMID; static HWNDMap* hwndMap; + static DWORD osBuildNumber; JavaVM* jvm; JNIEnv* env; // attached to AWT-Windows/Win32 thread