From a82a7ab370be51c86e17af574343c0c8ca14e6d6 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 3 Oct 2025 04:27:44 +0000 Subject: [PATCH 01/30] added linux core --- include/pal/pal_config.h | 8 +++---- pal_config.lua | 8 +++---- premake/premake5 | Bin 0 -> 2667824 bytes premake5.lua | 4 ++++ src/pal_core.c | 46 ++++++++++++++++++++++++++++++++++++++- tests/time_test.c | 11 ++++++---- 6 files changed, 64 insertions(+), 13 deletions(-) create mode 100755 premake/premake5 diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index 65d5ee9..a51caab 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -2,7 +2,7 @@ // Auto Generated Config Header From pal_config.lua // Must not be edited manually -#define PAL_HAS_SYSTEM 1 -#define PAL_HAS_THREAD 1 -#define PAL_HAS_VIDEO 1 -#define PAL_HAS_OPENGL 1 +#define PAL_HAS_SYSTEM 0 +#define PAL_HAS_THREAD 0 +#define PAL_HAS_VIDEO 0 +#define PAL_HAS_OPENGL 0 diff --git a/pal_config.lua b/pal_config.lua index a912de3..60c4999 100644 --- a/pal_config.lua +++ b/pal_config.lua @@ -6,13 +6,13 @@ PAL_BUILD_STATIC = false PAL_BUILD_TESTS = true -- build system module -PAL_BUILD_SYSTEM = true +PAL_BUILD_SYSTEM = false -- build thread module -PAL_BUILD_THREAD = true +PAL_BUILD_THREAD = false -- build video module -PAL_BUILD_VIDEO = true +PAL_BUILD_VIDEO = false -- build opengl module -PAL_BUILD_OPENGL = true \ No newline at end of file +PAL_BUILD_OPENGL = false \ No newline at end of file diff --git a/premake/premake5 b/premake/premake5 new file mode 100755 index 0000000000000000000000000000000000000000..1b601b0ae3bb7d86522ab766db7f0ba935a380d9 GIT binary patch literal 2667824 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 z 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

|zk-sdpY({wv4z@&IxAaQR;i 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
_;Du4w`!%UmtN!ru==L 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 Bx#-E8lY6SirAKRqf^LJ>Tl}QWMqZ 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�@ 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

-xLMYt$FsRke+KpdF2}E*yCGK!d5FpN8 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�P#OOc8sF#92JzFl8annF0&*Tl-{ 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%0D~f@SZ#u(qZ{$^)d%YEWbGfBJX+R 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%0DvlQ-}Gakxx=;B}-LWNvFxJ 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ⅇ;+n05Z4mBLiQ-Dv7Kl4Y+}~E*xSnXa zp=9w@ej{B+GBdTt*5*r)Q}tN-WYp#v<696AYG|_M1Kry7g))MD(nzgFIXv0 zVbfrPV5M<@`r}Ek5wIuwy7l8BaE@AW2w?)6Hnf`cNdD+&3^@D9E zT#w@A!484F&=8010-FJ|HPb#`KUn=6%CSMP0$6F>BDp;VwjZot^suJ1Gg)T~D(o;} zvxE(m!VoE1)4iU*PY~8|`(p4$h2hta+x47s;`v%fmpi?(O8imce@gM;2`@*G(0)CV z48Q&5Vnltq?J4v}(!I#*)q6BI8b61eQ;9ek675_jflM!}z6O;3j;IdRZu`O7?pzGs z$9v3{jO=;StD!y5;((NPV{D*0nt|3{Xh~LD{cWa>$X$7#C2X3ol6+}VoL{Z3ItBKA zy_=1!WtG?jItiV6&jYU`PJUp~%~NrPL&e=us;gHdzBoM7(b-4+&^QQ<4=EqhHwYWQ zo+Yx6bW>lMhPC|ys`p9KpZ#y9Zzuf<={w%&c_+%BI*y;ulDVxsdpF;?4rMd+-$*NY z+e_Nxq`irECvPL4SmwGCU%EOPC2sATD(Wa%#v9Y>$ofC&dr1FrpI6-f#eI$bEMU(^ z=6+4#Bl=S(>6=;@??S7zPV1M@x;>30#dE#TIS-w#sXyc^$Y zHv_G&utS7R5N6|S$pk-7C;G<-tJxdTZvi_6)&_Pn?~bQ;kcf>D(%tkE#aSiJAaQJs zgYi9X{a75)Zhk8BQ^a{1?|Sy|YXd8S{SQRG{2Y(c{MeCBo-%~XOj%Qvfbx*6dK&WkEsO3>j;LRt zGe&FB4E`QlEusHFrN13rA-&rPjr?1^Pen9&RDZj{$H7Z$8pNXmU@H2_D zlv#GhVbY#>$71l~Fkc4BquJg)`|G17FtdolQ; z^ebuNYa60DE?Y;5yC7>L${l7WA|_!alHj^vUiTUmj)lJo^X8hmtevM`Y4|u_L&G!B zpYL4^W%jW2_`Mf;=ikpbi+9(5v7vqcy{5De4_Q~Xs#yo$ zmaThsGV(CA3L}f|u2&n=a&9D(>C%rU2pc7=TWuHF-|%GScsOp^Qs-CvnO~A~a_R8A z%2ud-Ci?jUi@^z{kK};qo=6U4zTrw5t7s^etti45_@#2h`9Gmw{~_!QPyap*HY(~h zv~hk+<5kWyq7PKoBhcy|^}g-IzFxB>%(vlgwvA6@ed$Uvg)>hRk!Tp z%i#3KG<@h`D{JGk&`1#gh?bPyi#eNU{>MWb|?}fTIlwR|spCf%A>EBtNe`HfwT`}Iu z{Cny+zXclWTG78B@w(Y`WoDCUXSdhT_T3bSbAdQ#*J@w#3D2-&J%$8(Wgp}aJI!8I zPAXk3nIaiAMLzp~e=+#0wepGE%2?tzU!;GEUe&Xy-#do;B8)~BU^E6b+ysg)|@TK%c!Iq2_?F9uAF zRLCfJROb-o?T)bcge&$vEQ?``a#|baZ9ee)S@o(=+4X|sh>w**ZAQe zvsU18j9bvUeiIti9Mar;P@C*3KfBmaA~Vc7dV zm>=-x(Mrg2?qJg8Nl8_&lh8N~jqAdCy@>tP%W~F~-lp=XUe818+&9X7jJ0j(Z?O2f z(Ppq!u+qLSrELQ{4;J@jcY=xD9N~JzGd*BOzv+DuR5 z+qb;mBWeSr?CZn0+v}KNj@7Hu9VOk!|7AMy&3V$zk?se)Yp;l3m*&oZyT)Y$kA!+* z-Sgr9W6Vv2V-l9$Wd0#Yc4bPseKMad; zwY!GO^)lPjw+}kg&^ZmAj!;iT{VbZd_v7eZ?GkBcn3OP4cf^*S(nI+wr^zwH#!@@x z&N}72;RV=(Cl+I8OIqGmAC|YR-7Kg+m^svv(iCRotPy%xO2GEISEj+rm){h5_x;sk z@LAqne>GpbrjFl1l_6^Bu!TBxNNU%0UiF_9(w!#Vi^RBu+{e5@Y5Y-PgA8Q9hXXgo z2-#ux@NIY@{_ThT`W@P3n8j$dkX8TaChR<6rFk9Y-3M0n$f7$J#PnNQ-`!f;8#ta? zEy!ZoYE#fU0IiREIZ)w$LRT_{UMBJx_fR)}_K|Ogw+nTC+ebJb3Ad|$8#Z8n%q#|f z!h6~Lm!0|J>$g+K|N6V{=)`%V7D(6i{Y7`iEoUgk=asH4X-{^UMz`Q*MjVUZB=gO_ zZ4?@-&^Y`=2wEFOJRQyR`#tqjne5pbYKreoa5a}1@2Sg8Gvj=WNniaxl`;Bfpp0aklo?bm^8WwxKy$JpAlSQ{j(Bzo$rpDmh zuhzs2n(0)OlhZ5WjUmz;AkBFBoO(jG_2%$C!w|SQ$KgY9Ei6E@R-Kt zG%(TQ=71d!PC1(R)xQ|~_uu>)H1jX8y>8nBww|Dsu=Rv}o_Mjldy$#<)Kv7JyiU?g zsj01Xtl+nC_9N|(8HDBtG+!&4Yn1nQ;oAq8Hh&P=bQ0Emh@RF%^l8!_Chgs!K8*Tv z#4EnuxZ*w6vnkhWTMP#{p*o{EluFLQHtK_R<8PuL{(UjF{|gR|`zqr0DC4fOsk^2~girL_}SGi6IBv>`#V@F;0l zN&9e^mJGdb&8KZM-#Gb(a&D82TjL0anO6*3Z4RXQCHR*wus+_?PhX3^ja4X8muh~# zIs8B~G0i{T2c3rh6U|YGT%O+`csuy5Y8NUhz77Rq{(L&;0tPQ?=yI$gsO>zsIBnqwsmMqRrnd z`E?RHtC=Nt)|KUP$nsFwiprl&536A^XQHMuO#QHhu)UWo1;MtItDG<*J*Y@>3q!6iNhs3z#YmgT{uFT^^aW&&z6k$ zFYkkEvsuEp;GlC0rEURx;*JxWfK|i{ z&3-kLTg|eIqUKfn&pN{_H=(R%xj4P1kQ?DQR%MqUrHd*Qu#-rw+g-I@~-t}!)!{LgXw)9Srb zD{$VLK7ccQr2e)Fz4dKN&Q^zBMW2y72C16VW_i+X*vNWh(*7&&&IY0`M@0PFFd|TdwX2WXcvk2cn+-~ABg&uE5(ir0zL+QUAavbjYZ8iGT!LM2e8ILxi)Nf`fm&N-}WW9z7jrQ zdWL0%Os$ibzHuGlQ-tqSAxy5m*}hWc&J$K7%<7WARqkD24Li^!yvx6+OV$*34|ps1 zI^jIM{D#0f!EP^a`)K?heT)3<-=&2?5-q&74sDR)uA(87Z;?E@cP@o{{Uv`^!Mebv zc$W-Ik$>)<=D6%8pX5kMv^uv^KhP?zJB!=zl+>>w(kc378{D~bp?sl$>SYXCHC@<} zDp$laTC2k0NX~Dfx}GLp2k{On9%}&N6xQ^YC+kl^tPI-5BLP1+B4{(a$ut ziEM>*THV=~s=SpG&Yf~1rz}O-tRt3Fa7?;RJSUZF7i>J&za9CuYbnTt-^;))@Q-?`EBT;(QjG`h9Tw7lhkTH6kXSY`ZVK@9^&jF&LPE#iY!l- zn}ADHtskBv{f3*Dg0axwZa#xF*}%EA+3fmkZpFrw*W3SdSuK4^v07yhwNj++tMOml zwiG)%mGy&ueveZ<`BrOw`@TWqju5vrzuHFnF|hq$1NuJWADcs1UJiIYPpQH+zHQlO&@sx?qMPe4gWxII7w4eY`Mc<{@-iR;Ibw)0 zC%Ya@HZ@&~eMCIxFVp7I8WUKsEPoh8Z81RFBcyE+U7mgX z_JbV*`y1aD6=T83?vM?LKuux5PW7J@+>f)au23djwuYptoBd#SE(O)f8#z15(aZ2F zcPS0m+!=Bl6T%-2|1f#8p6DH?QZ6m z)ycup?R3-_aT?#a6ns%~s$6bda3!#TC@R>`?_vRo?@y3!^sc4gvl2j&e2er&Bullf z{GZnlZ$_(;#VhCDNqdOrj8>YAFuAN=@(<9eG#?n}%g*bC*8ZWTV2O9p^8L*C*X&e@ zPKFa@>*fk-%QEf>?Yt@It$UC6kw8*;90$vTEu`p?gm1^zZBM1^5%cYcUgOL0C+uGe zewsqB!VbpQGM8>Zh4lKMH#UOI_WT|9>1y_bb@uUd%rhV0)Rk?Vy0XQey0Vp1S8$Y7 zzn-}2Lr0)D^8xSga4ltircNkR;L&@mYS1{lFiKXCvDeHuMiTu8PY&cP!L3XCtqnxi$Rm0J-I)13r zpE0!2pE0x%Zr{ooL!0~=L$A>BvbHDU5P8oXS_^zG93>t0EFPb~%CQ~xcm)9<_9V`B`vCXcG& zkIiN$?k3&HmzUgm5TqNnja%F5u++>hZG_wqan^lh$*n`=ETsmP9H@_vgC7L9wE_Gs z8GjgT1&n15z75j$X4twT$z`0cDf-a+Uss`Z`p8o70qL2jJrj1IUz0<7YN2AKkl$+S zfjY0Ru4?((Qh5I#_bZ0um|nvA2)nmDpQx`yx}7p-7u8pQXjY063X-jMrukuLO@3o3 z_!>o)&m%5JGk;iqrn&0tH1XTNxfHu=Z-?f`&BhCTBuPz!>6BO=Yc^(U5B4IoG8ze&f&^J?Z_5w2vQ0**PI{ zD&z3doW8TCy$x`ZG_$0+TXmf%L)1sT-X6$)H@&Xixu{LA!vFmJrSQB{>BaS6?O@;M zeGOfnPp-Y9IvL|=ojj#=TEXlg@%|w6PC(E0aLeyVU5fV)fX{$$RX#k@VUu9>e}jKS zG8Z~=f0yYBZQ=Mwa-x@qIU)1+61_;;fxle}{z`}A7_T!BjnAh=@|sEZ#_Z5q6_Z`K zA~)W+EjQ8lI{xRRzsBr0GQ1T)uJZ_4=+SrVel_3slgRHVJv{(+9ISL-#BgSh>1o9u zC2WPT$MLR5JUjt*9;{8{wKdx`^vV5RYM;kq?IHPDXwCj~DfqdUA8|Qqy4==Eh`XfA zLE;jVv#S`mCRgX0u2R_xOnwjkdsKF{?{2UWuwUn0^9wierTV75;1l3)O5xLly+(UH zCNrMeRop#O$DnoU=S%KR-8JP{SU>4&F)>KiQLg&k?AKde3VuiBH93!b9nQkLx0Lj) z#oIudt9PBXI2LxDI zZ2hn-BKZtTgGIAxjuW@x7fa!J)DXk(!g@{k@gn`F zvF!u7o-MiFF1rwbw`|qrOUxRwfvFRN8@$C zIkGI3OKArVWx6MWjd&e4VlV&eT*~Z^g}f4^kN-D<=vz*aUp}{7wnl#itOKmH7hCZz zfVC&$HT2>i11r^o^xitKHn2x{SNZ)qHSWocpIyu5Dh*U(HcJLGx=e;LBFsZ#FZ8CM z_tLOlqdCVNu`vki>gemqiY?d~Fw@XD{Mco;&KlXO3lG(oX26ete}Z?%llYc6NFc-U z^^(2k2;b1K96ZnG9ltj&A$zyw&Rw4QLTX!VGv7(ajf~$Ow;cS7@}gc+baFm(ETNOJ zRiw}Nk@h5Me|oXB_a)N8_xgq-q#e6*IX1tMkX6P{ex3BWYFqqY*@?E9?OJsc{_4js z2U>FN>dW1?RoihZj^G(an zcWH9o{JD(RxM|8sd6UnR#B2VQ45#`OBg0Azo?*D}cR}cg>UGfwggq{#5_zAiSUOD+TZf>jv8k=6b)I z5AFjS0Q(h1q8_iN9>oKL;QPSeE!_BrZz?}a22Z>k0CA(v%`;4s_9$s>Zrth(AFTPo zv0bDP%uVLcCAabk_C6%>^sRdD6|1E-(8lO&&+Q#A!ZRot%;KSP_pW&5};=km94)b#ba>B~EF$1ca$arw^N%;lV? z%x{k03cqvwR{0IpQCNOs{Ki=vFj2QHH_7`HziEEQ_?_T4!*7=GIese`T<7?EmG_}~ z((@bRH(pPAev|c_$y{H^P4j-Nesk^wVKe+@`OWcL;dhR(RsJ8kqBA#g#rE9T6{P1k z!Ech^6u)VH$M~J#H*>`>$`U*dXsQ`M^CF;Ta`U)po#1e36E^UCmBEP5N2VZ&Z5gA0^r9 zW}*-g<~yzFr_r}92T%3!hMA~W)93lM5Y|Z8+Z6^c#C;ClONOI!OC5W;G;L#^Q+8sw zSCZ)4`k>Jb4I3};_ZYu@V1r=&+9>9ko+xg$Fn*4dr zBL)7KM=kTwL=;XTc4=W3FsA;29;mht~`1Ol~Dr522F{1A$ZObjo!IQ*v>AsD;E(<7AgZRO}k}Gg! z#WouP zWgeRyt4Ub-K#)J?6Q7NJ@7UT^sSUs4=kxr*_I|Q%#yYY7!?+~_GVU!`x z%jP%53vp99Ls>puq$`lFw5Cilq8F?)hDpxs1gkuQ5!vEQ7Zap}t8X15{t)rs zp!n?Z@%qKHvR)Qutjbf` z<~!hz{mbs2aH|Jw7{9-YHnn{P+25$_TV15>A?@J%mV*bL>hg{I9ung$o0Gf>GAW{k zU9V2APD1a(=YP3umK;1q-2DB^!5{EmuJ`0v@rI!-3~@H%ZlcxR$#{}9FDv(zM1K0X zO~@Gi0g78WreTc!l4?fc1+>m9{D|C@zhCsfuli@wXzG25Z?C1qN9}r^^i!n& zqyW-a^i>vd_#J$q$*qP^-L?&25B$+`@aIZvHU)y#=FBwX=<9YTJL>$ac%hFp6Qof$ zRDPZp((2aM?mtnyP+7TVaPNY|5$GK|yd18jt0+HhWp^9tgt0bGl|_Y8+ekQimCdau z#m`0?&)2^Z{rShp9+lJd5bIMszx#C^z1gZHzi+I|6TLv%Jzv77q_pvR$!lGb*W+7rruYB~5-U&nD@ zL^#)jmMBwkXdB79nm1ve{poV>+dgevM%bZ3D!)}7ZS7vo570rno-Z#4H%E6)BWChAF0ryXDQCH}VbiI`4YK&l|v|z-|obN4|&(+18t_y@;x}JoZCx=3C2UdkV(E zPJ*dw^)&K340Zyn-VpbX`$R6ra^|pt!`~DJtg0HtYf18b9=40Mxa%D7xTg2ftK$BaeJ$xO|gY;#{lfb z0NlZ_nh7z+8SY}(?F_56riGCvL+lxT^3=LneMXv`CqUwxQstZ3e(NdA0m@SK-DS5I z(PYUECu6%ay`eC1!#v}kR9ll@Z>tJE)6|LXINZ>2te5X}$BPuU8#2kc_| z5)`kSc!!90J?}Bw16xg#WKIt#kA1{DO}x0RI0`lkroN^}@g~4dfvNxNQQaK@n*+1C zu}FU>^hC)q5Y~Kw(-(Z>kVx`e1ZmK9r131t*CEXe>7S){@H=VkvUeW4p6N7p;d%d!{0Bv z`vF-u5w}Gv_#>K z2)#Mzm3U3{y9#z1?1Q0vh;*3MNz_)lL-_;~N8hpA(|cbz4=3zi zFXOtiS4clqR`O1p@0x_x*?%tg;kS~o#9O-&?_ECgd#N99<9NxzN%A`UFU#TmXiZ>8!A^iZpZ6*|ucnuIXLo+eEMaE} z8?Pbk;ykI9Gha&09qrdi@^$aTp8U7v;P;h}^;@>0*_h|nTv;wzdg_yhfYrGJ*~bHea>{A$+YaxYbtu1@zfMF`hL!Qng6c%{TWf;U`tGO z_7>D!Wv3u(J(5Qkpw<7M%fX8UM0N(ciaR^}+?)7#-MjEV5bp)zV=Fgu>)x#Kal$rY zv;A6UySlr;2B5X~!gBDrN5eB?mu26XuK3L^QQ3|`@6><6gJIbsJrT((yOoWv)@bZoP>L-CeyBY)-MQ6K&p!`O6i_RBWYMWCfZl zU%%*OSAv|%!lUmT1nU8NNI>+R9K=7&9ctVK_R08{x^eatY0i`8GGDIv7-DB^?Z8Zp zPU}jt|4x&G=b>@zl9h1Xb;Z3!Q9oods3vnZm1oQ~<=X!}%;#Lb;?6DLQ`834Yl9~(ILC?8%e(8tS69S2Pn@cz zi_>WuroR(sEjoF~cMxYEab6ns5xXDyI-N zx|rTNO}rDtGoM&O-$r8yv%e(6G6(7BX~RPCd@DxW!Dp`oPg+aQL^6YQL)DqZRGG2G zB0-Em<$Q1aq9^jg-hxO=ah-hwTh-kKxq0AU-6S7mzZ zc8n6Iw=NKNf-qa(LU5j61DkZtgFQiIqpjld)yDa>m3*tHd8#WZUpLxX!Clapc`h^{ zp-26^AM7;P;|=lhA8Z9|QJBep>#V)`H z!?=*K`XQb5w)w$a%l4Bvz5N{rOdhxb#M}XICtiVg+laTFc%9sZpu8JL=wDk_f)l*! z5!MPexOFA;L$rc*fQ^8iQ6$Dz=&75@n{7|zrF&L6SU|Q%3%`Eic5Pd6`{1}IyWwV{ zY|*7?L>zGUw2cy{sjw1^t8J6}8}1C%5$7siUTtEJXe!%r(hY52aciJGHVd|U$BJ7U z>anw6D_|evZ#_y|^#SDXPHZ>j$z$ISHqf;ap2ue24>p*1K2nq5*$+YNRAtlnd7 z{ND#Q2KM*DYz%7S2i7U+b~Eo3;)b4^^-)Aoe&eL+xVqd{JPg(kRyrq6a_Jb@Ua*V% z&HWhjT&+1>Dp}e2&FeqN{N=USV=~&TUnFelNXD4}_;_l!*lIGM2U;gz?fV4e^8EII z^}l8%xJ`8p{kRV?8oOu;NJj&!yTx6JJME0qDQFzny%KB}jk59lJHo1Tt5G&Gsm8IP zTKoAGSFx(EbEH4?+Lhqiu}@%oNrdFE>g z!4Tda6^aU0md{v+d+1^GHqW8uXccu^Y;&X8@wdT!P75ljg zg`m0|BW>TCR)WupzthuBT&3gr%53XS>vJbbJNxEH_Q*Dv13Lv4jazTFy=mgX3xur_ zCL2wU#sm%jA8+pi9@kOb{Y$&Dqh!^^DK1ru+lu100t|>&6aj9LY{`~o*_LC)Q4+=3 z1SL@tg$OX9BqkBDF#?oCv<3vYt)QkDFrXF#1`HVD1_1(8a6vC|Ta~)4{^NoH)2h9{ z&-dKfd+*-8a>D!4-#(ADcfWV$%>OfI&YU^(F#58+)BZUx*Nz zWvS%<)W8*uL(rJ|f1uF=jY(*%zh~O}AIEE>cJ85G#LWvi-BwnIrax9+*bg1dcDH1E z&2e(>6^ZPoDU&0;<{|j~z0>~P%}Ha@WGYKf{%x4e6WXUq^^t&6F-qeYY1G~Kzn6yU zZPnYDA4ubSLA@>8&!jgTw(8lP?QY2C*y&2hI|l&Yn^D6TmAZJ??t4okM)1B z`WSW;tOu;q4`$&`f}H?+y2G?~o&Y-y_B>(OnV^ESu+!jY!SnNt!Y+YLN8&4rc)@Bm zUCx6)E`YXl_D@X42g{rtM4LPw7x*k_GM@$TgkVR)<{|N*F6ce&J!gGgShg*H>7ngC z_w%mney8iQwVbnysn=mG4GeZgprrgBBkXtIou^Z8%t!Tg8hivA)jaD{!`~#>Nw6&f zjIP;+OSc)2H4`AW?;<)Ce+vI3PITQ;1$GWha=tzaR|~f4f$6}Hp0H-H3b5!|w@$Ef zFs)hjQMg{PwXwJdz^Y<#hr!lFFe^V;C7880dXeq4Z4R2JUHp&n?9YeG>Xp@JlgHkM z46G@k|1wRg&s86y|B<%FNFyvv^>RsN^Jj)5KEIW9BA zbOD&kVngckPXVb+CSucrCFfuCo8Qj(DyE-QKhVDi`o-*4?)8%DCkOqb(68v9_I)WD ze@$v*tAEXZjGcrPYwPlDtU0#g9q408<4rur+c=yv%=S{|#H?Ks`U~rHwLu584nr$H z9@J(%V8dYXHrBfV7e1*ykMM4kc=`4e{S#m(WAw+tPJq?$UV1}}CG5P8!cX&VoOk)T zT5YxjHU{?mfY*n08tS;MPBC1)Jk^^WxcpiUTr-ZxA? z!Tnn@n4v1;suZV(AAv^WgVWx>EO!RS=2g=b$pdnFllE4NB_ESb)yC(ccWz+Xdq}dg z$-3eEW@Roo+flmAMGn6G@Ol>N)o*286UfaWt+2mX{cUBvV)wliuRXVB_K}qVXsvm8 z+IvbuzKm9Z3|^W-8JbW`E}#4WhBq8B2@G#Kl=4;w%EyMRaX2@E|Bdsd*YlFDLi*+J zfzL+nfwnU-)V#^ZtffICvTQZ|WZ--X@+orwaPb{n2-pOW;$&}v0nH(7r zHAoY=A+dC5RQ`$(+;vlWb3WuN9dNw^UeEV70(9`r36|1Z-S2DM@6?|-;A*~=7WoxV zFMl`u^zG z&EeU^zarbm_$jshD&?>8J@DIiv8Lr&{ox_qSL*U-dmI|J&Mqw~@rd`d6Ss}HXBC$* z=6q@)d+aZ3p=+i-6qWk7W)x?DI7`GirZ}V*jU$f)oV5uT3h-FTX(x%(_wH%0RO2sJ z53w<0Hr5BVZcQ41L|?;S#bNc^ynHoO8eJGEy>+~={4-=o=db9Jb{=*(IWaw3cq_eq z(EBygdp^%4)JrtIMxevIAA9e#cUteQ4dBnt&e_({tyD}?w)uu^+YTKCsn=1-sEz@- zQTaXxowoO}-{bmPRHw~8%|X1cn@&5II#A4qv0%$~@6IoQte$HB41LE?zMgUg`Vh@! z?Yyu5%W2>Dw)wSeGucEkTrcn1dG}JDOFFYv*E#uo0DK>~wn+3*{Tv4C1AC(Y_L9`! z%rO-|HK(2A{WR~#)c$;gO@JNw0Q4PJ4R#J};zQHkjVeD9wL52IeC(f)hW#y*&89O{%{#DaqUj1Lmll7cqoWm3^oyN^L{%_o>YdDchRS+L3&b{=ds z*o!oV`6yf&vq1f4LVbS?SS8pJ*fs^Sb8NOQ!!KY*epQCqRGWcnabsg_J2)jgBJA;BLP?VqRESu}Nfz8_h z;d?$m?TxDro`{#{WFwt8{n~vXXP|Zd3vNHe>H&3XYO`NusKYsItemp^^`Xc^Nj=H0 zejoGesZcJC>W%4}&em6+J_m~VB_(QC`JplRMfN{?v^HhbCzhZ!_L$SXaR1nTZCEuuY8Dr@ykCP7cAEE})Pe|MOa>m z2^=;_AjUkXe9c3v{44D5EJrKMmrUAIUrVezpV!tMp?$wP9r49xyq1oZa7TJu>Ich^ zvV0wYR{z(WzWj;$KKc6dWr%6qO+f3&_;loK9nx9;-etTWxp8OfA@zZh_p=@%y!kw` zK7f~t&3+%y+*QTw70!*%$RN>loQ=Lw_b;)5{R*1qj{_5ub7YjZrXc5@{Q&M(Sedd>H6F|%TS@ZoIV4%Sbbod9%omI8G{J_r51-=n`Il*#%Y za?U|)x$Ul4>gPBWC1pXIt1z7!D=yC_$`cDmTH~ZO@c6X1uQ09T_RpnWZEiAr-F;7D zv%rKk53Kzl`lqvQE@yUd^8n(frqRurJN<`N-NxiZ0Q2wKNxaH`Ko6j?687!n{Pd<@ zS(@$B@t}MiZb69rpTvA22M!j6^<|U^((IaYc{P4UHW8f=Wti~EAkvIHedNf}5@9C^ z`?3VS5U!&gU&vvWmF?b|?cHLV9UL!B=*L?!yDZEm3)4j!xesyv`1{k|hQc}s_g2IH z#p(LgHxkLxzy8J-u=91Z32lPZ8wlF0FGy#MbPoS3`VXuaMEImMCI;%*h z=EL;o>B4=$MzG!()&bT7R!$s!6t@SgJA&1N^@DYRea`jSWLZm7J4>y&PeSw|;-ROZ zF*Sod8PAb^7S?feUa!aGCZXl>>xfmyu&QRe@i8#px$b*W$E) zHVGc_L~+y}$B9#Oe%kv%;kXUk!^V{9gr%iQ=50)9_0TH$DE0wAbT*QtpWOc>>o*to zKPT@tLSytt(;nNiMg7lw9a;Y~KBBX`Wy$@+mn(;$b>YHv;IAMmI~z}m(rQbMEYsC& zJ$M#cbw6?T)}d@?^U_7$b@J}-&kwZ;qYmj}riod##vwu-Z9q_EX%dve$7HsqvjzHD? zbrR+xVK%Fd3-kx+QhKUW8sM~r*8_xI^XoI-7PYPNPAh1P|2 zGu}-S43@2@CVxG_ok?Y-*^8;G@Zz_HZwi#s);o0>Ygg05DgUcJ!FvDqXM(#i#e3F* ztpc-lw6PcN1-Y?jGf}~~b?2CK#9jLbGv4!pet3y}wVW?I6|-mGKKB^3%3nC+z3@rV zk{5==YBXPG7ooNEhcmt(7i>chrcf#G=hECNY#%CpRi?AxeoS>x{Ym7V7r{e$RvSk5 zP|UuMOz&TLyU&0qB29zEgnzECi?|cSeV!W!`21!avN=-^seay_tD8x@OVw=JjjrU6 zw-@UgS)ZxRPD5kp#WVhSIex3pO@b|fz0&cws2maFE1Gk^omf|l_FibM{S^G}r88br zFbBl=U9|u9m+Bsbgf7;SNe`u%VsYsWhsiHr2!68zckzu`0XEpAIZT=rFPrgJUNZlA z8Sj?F6veEDpmh#f6VSr+*^R&0-E+oU9IbjuI>n4{lRW$-*sQQL+sliVq7elvNsNHZ zD4D451p2M|8GrBU(mX-u&%fm_%eH3w8u+yf%1MI+y6O*Spk3cMQ((t64b}?wtGw4o z;g-NUz<$>d|GdnqPqV%QQ@z>Qvz^veef>Z0rg=Bw`f;$2R+IWbz|L8diFOBJJ2!>A zu^OxgtQ+ha(Jq(|-1g<^4eOjQ4Gx3(F^aTsPf08KRG{>$l8!<4?@X zuy;tC0=bxN`)B-5L+jMm8Sg_uy2i`UMe9s}zdb4ao%q;!!Zx|_8IR$P^U3j%Er0dv#d{>Kb+z^ZMJ=u%9HFzw=vHKv~1o=)?L*n^B?IH z)GxZAHFDLAZySEI*0}5y9MnA|`^(Usspm3RG}syJA;O*`>@$d`K9u)GDmuq_caeAE zA0;t5>=p)es(3v~*mb*HSfhi+3O$(bbst?TVU`HfO_(!*>=~9ZHb-oiE*k~d39ger zRdyTSXmiWVkxwzNY{;aasi1hgEyH6he-mZh1m6X=1q?5^h9OpQ&UvaV$GZdMXAmXO ziQSB^V4g|JkMU{C&jVV^6(`@ENk3c3H<8qh`JBGW0r~tW%?^j<^CL|CX!Yl5uj^*K zNjFB^+?gcbZ(;6C)}=Y!Kn_~9o&WE&to@-ib^|g!c@%GEv#We(hUId3tNX7l-Oc7N zW0J6)duDv!)?7`w6P>4MoCn_vZoc)P(Pgo>@qerCb>;sS+cT~r?3yo-9$|mLv)>o- zD=JNZl)Nxn(W@uSp&K1fFrIGvi+&G#KsW2#h=}(e zB3v)wY^}@hF8+>!oxOR+`#X(ClY7Il4c{8%zQ(*BeG@W-zwc5!M{*!H;F zt&_bo{uzFoD=5oDX`3rdUZ%Z#ABAwhxa}vCmGXHQ8g;L9`P}W_aiDqQICu^`)Z4en z&Ly_@>ekHXOVfXm+#YrURrJcfgniVjXS^2$<&Mz{`H%*CkJ|C}gSCVGrULO%xetNm!1DT5;cA~_;2q%a6JTS&&XLF3$M_=_MfWCl z!u+1-MQELbR%oAKGBM`r55YL|=)h}?JG7%C9UN*$%cRxVZtE62<4q<7q_w_y4^PV zPO+0i=+^?a1BS+_HRSsUX}0Z~3H&}BlO_dP5H|uLR>Qti!PH zx$(=MC~Ccgy!kfRr=V5);EeZgh2;$AYFnGSzSnDWbunjlb6Le>><8|j@$VgLkxszQ z%)nQ!&5O}nbwIg|a?}xaiLmBh(CQ>CLvfvyrVoo}6w4|S%k5Le|3PSu9h~uW2HKx* zvGPV{gVAEB<=5RPVfMZWexbU9C%XL-Oyc&J>4c*1cz%24HV&d!a{SjkAv5#bQ_Al~ z_nW9%3oJpa`OP!lcX%$jLFEnnIzh=_H*At$@Jb5El;5O->QsQ@)_ocOQu(+yayJTj z%u5hXjsV&0WC|x=&^N_z_Y!yLE#Z1Rs>==Zz;tb`83H|ULxv;@5aYL^cN%&VZ=La~ zq!Y8YShlar|6vLzjS0-m@1LT#dJOq*XvXU+JadrLr))mxN}dmFT`0My3wjgpnDOsR z#x9U`V?6?tuPc?>lrTznkZ{fKobk@Oz8qbfIX#=N<1V!EO#Xwo=QG}QW#l*P7hyZvyl#A}oh3^8tI6%i?BS2Sbzj9E`F+S|h3lml z?>Ao4B5t01M#J|P-v_Ow_s@76R8I3{Ve(OIK9kZfwsKDIEpGFN1 z-i&6WV~O>=+5Zvu#0O`*pOA$T*HyMczLeyzk@v#td_b$TaaqNdr+P4|u;x$Kz zJ92EsD+}TxpAAahbAG%u?Z>%;TYpUvckf4LypJo7)(5O_S|14K8tVg_SZ{ zVcj_TBWOLb41&@uE`v}O$#A{UX#6O8rC_WWuZra-Kli0lUm`=r6Bb+>Iy&PW3-TO}@30P?tk|oTNXRla zJBR&~D7!2j^54#1KeUhk^^C_BWwd=_W6Ih`dg_OuT`Y$}yF1&xJ==SO+1+$QY7)8? zA4gVxa&)y z7ahxPucDW@dq3@DENE%XeE@7Uh7E(wgGFs!j)6^s<OHhXdr_y~N z43&RJ|NX*@_e|HuMg51-;`g7wEar8{)5>QjG%i9z+n)Lu{{y=K_6JWqF69DiC~;gm zetZ&I)2C*GY~F^IW!jTef#&wyz21)(Z1L(;#`$SGUq1s}%2B?ALzL z$uu^{Np;26%_>$>q@z5qCCn6IES+WN5Xb*=w)`n(+0asZ^+M~=mu9@qC#cun?rh&( zG~kF%<)-8+Z}e^e+;^ZA9eGbmE)#t{T{m@Xro;a#7#Z>e9c`jCod7F z`t*!%V@>@fjGcO|gyVB^J!#f`8+{yc&+x3ekNP{YGi8pyw5ij@83{R1|JVnOzQ1*K z&u?KvV5h-;pJ#o99RWKJ_OFKc*a@)l$7Z~l2sRFO^viC~5L{z!3hc<(OmK%ITW2dKXdHZTI*=ym6rF5<-sfq_@*zFRAA_xDkhi}w<8=r0!g(?#yY7;Y zyyUHTTQ*p^4@2+bSHn3(bukLI`fD=<{*_LHRe_n08^S2uBv>n$)*t$)yz^k)V6#u- zhxOx7PZP@@HX*6>=bn~0lWWQ{z3BSCXFvY?=zTQD{4e=es)6(o(mC}ntYdgqzTN%_ zyiI;mYb4l&E|QS56lan+J?Cb8UuPC4>Q@Pa7rJE_$@i;N@g3TaIFAHtkC;tnF+q zV{)VXA3Tys3gw^XnhVfcH9OIqZ+En*3{~Gnze3o5Elk(svrzW4 zF=9u1lXX9vY;D&At;u=zpj~}L?Z2Sq&ruk^6!4oSOsWeUt@!iE31}T#nDKrmXsd9n z#qx#CcIy8mHWhrRlQNdE(KGY|C%@UaxP(kzFOR{A@-3BLyse-*?9xWk`5EsUJgff} z*^U^mG|M+6CdxtkvLU#I`;H2(j*x6H3atasx-%&EvSWBR(}rDNlOQo;+QRZIA-`Cm zCgK|OT65I=ALO?m&IJA^A4%C5G2MGu@2*cX%=)2LELfBL4|xH9rHJ&Upv74!1jCV)COP5WDsa~A4I2Fv6S){Tu()43vpCNz!j7ikz;>wkuvq`dJFPdf(I z4YpGNHg}E>(r5OUacaj2HjNAz`NZ|-fhpn~B93^rKAIaYfDOg4^2f1n0?Yd=QMff= z17Laitrn~X>;RbA8W>+iqBHiVIyT(f?l0Bw<*ZjroB8sA(F*I=Xt{E5$MlC)ze(jtf2)kUr7`qMzcM?VZpHyMmsF&U zfAo^ZgZCdpPU9-i^GYDOBhpGCP`=fDYO2WYTDL~#iX*xzDj#i z#U&w?5A&j>h)uO*l*amhq(5Fc>-|b$-6yA!lZ{kD8V#AN!Rcu+PKX$>hBQV<;~Z%; z@m$iS0fma6t0dG!*8aR-{mZl7kAnH&5^XkdxgDrVTAYYh#XqtCuzJ?}?31B|2gm!# zI72R$@n-Yq(E+XXzdGyfQNGc2aB7}q-@CvlUBHpm;-$IJLhv>&tD{4^6hPK4No% zjVU|diJjNw>8a%YZtFbN%P91^o<8gQW80mrM2%o3Ju2%s?*@4H^q{Qf!za`&hT~US zkp~kC3wKmHmH*6s>zY~rUX`9~C6^M&gv82J%exWYg=gBVOxQC;&pw+Cvd&YaQ^{qr zxn5}<5WU};_1?>~^P_z5Q4%}K&k^3$R?T`fQUqOk9J3cw#`TklrNU?OyHeSUW#~Cq zT+KI@&}FaS8-MF7xXTvnk)ai=$;#3@u$PwO)fLycQ0&QGEW?0$#Z`QBgIU?D_}S6|g_0K! zZ91=LO+#zx*|XkxWj5@GVc!VnPSHY~NZ?h>Q0mjQ|3Z5`XVyENP|lc~qq7CnX=2XI zR$ufEK(FfgvtC)icS8Bw<^=1vZVu}&P5nb6xp3Wl26|I9vw`kayki<{2`uWDcnPfh z1+xX~=2hqDZ(wVQqmS~p7OV~ICMg~--3Pghy)<3>)Wi%1>*l@C>usF?12h?T)G`wvggz3 zt1FhzU=9-N{|$Z9?pg0y>bK}WoQ%;D=#RpFD@D811t3M!WopuG=zVizwm#|uY8_-p zNMmoutnUw*JiGmVl$6NZ9}k57U@T1#{=&7hz71KZC$Kz)@|E!*cws7SHk8F&!|W0? z=T-eX>37chdgU;E)4eomlN0rCs7KlA-+w@ynj2;d)*Rhn>%j8<2gQ^2fmMUOHP~kl z=f-f{TV5M6ib>zSGN}Un_8x;)&&y|n^^*F)S+HTSXkR%Gb_DDlyw^wJ%BIP0*R1yi zLwvca66`G4Hv^s&^4^fgIbPnJzCV@NReYcAUC_$iHtRjb@$slGJ+wR0a46V?F-4O4 z?Gfd#d)E6Gt$VCZTMA{Ea9m+ddqw)CWr>*y)~OeuH_peA?-^`vZmy!YK8rmZ*wd63^Q+Gl&im7; ze>2OMEp{(~+M0oxl2>}~#oCW>x|!2wj>syXEAeY4)}n(LGLp2-c4 zpA4nbFG?N=Cet)Rq8EC{ADHzHCyWKt15i5MZHW4L4`M@nzr)6a+Vuo+fL{a~1k;{OWWS9XU=2{orSO>LG~y}3JsO>L^T>C^iT1C0 zuybIlXML*qYX@8P;HO_o{ru;H}`B zg!2)03~T`GS%&!7DX=48>cjeo<{7Y4VEMadge(3$_!xMd>Yh(d{}z}p_OnjbGwDZp zQ`jD{ zO}2im;$1)Qx_I|;<;nJ~Qm1VZg`>`Lph5nQ5N7m^v)+|u{8*M>xiQzqZCM>X+1yp; znf%Ud+f9i>W@9FOq%_;XwxI6;N3mM6IUM0MWZO1fk?p{;-;Qu~Y|Z9caktXZoXwHE z+P8L*{ogku5Av*e|6q!t<37B7}|@{Wa!kx9QTc|C%%_Adw$ zO~8(o8sVFGa|1+L`PTi;sYiL>q8+!oHbS{-f~iV_*Q-?_IdsW ze}H}S+h@JAK|R=fU~A=29AG0o#xo*c^#02Mn6kJOju`myMs`7@Xhg+bh;wN({_++`BqZ2-X!UU0M!Q~ z(s#MjWGApv$KV*9+G8A^2S++ySr=Fsj2oqBjiI`C+FEoS87dVvND^&7V!iP3S??8rEBJKKTV1@fYLoFYH%C&GHH1-k&21N$V;e*fW)z=P>F z>pxvVcWcbt9QGyATXzBZl6X~atVVs+q$r$R)OOf-z*58Y*{00R!Shz#3l`wMf3SXN z9{)7@OGh&*n=${&zaHK-vvtjk(Q9qUVGUm}AU9@S9z%@F6b#EIvlpBvt%1)V2Nlkv zG5+e-G;Qe@QMWh=%Q3rkFe#=adlt*z9DqJ;ZAImCv&nkusr|={=g-gj=R|FMQNR1) zzE!&@zb{+ixisfj27_%oZWmN9Jc=J2B7WN!X1!^ii`oYVZ;>jrK6je%t4_^&<3S&{ zdniL5+8Wun$46wgd3(0)x@@ytrd**3qqtPMszIS{&NgqL=5NS0Z_Bp5)|@P-|0tDh zrtd-km&>Wgv&~zmoCXVsS+vUk6Y~EUa++jjE5AFBTf?ka2k&gn)@{hvgym+>E8Ba%ebX#V8*Y{)?vqUwI3>5*Osl{X{3-zNNSvP%fB+~y)Z~O&vWm| zR^OJb*C1dgkvPZbnC> zxLAq=)o+rBi6ox@VbdoBaJ7*zQ8i`mZ~;5{HUXl62i(A!Fe5;;C3|%7ZKO}~fZjI6 zgzd-Z;X&er1yPjr%ap@*Ae6U$q{n%X!FUUT&@Kd_YYB!y>cvvLouxt%=t_wuzQE)n zz7;^Cl%yrmmcWDhH+3K1mK|>M_K7GPhM*yaZT6>bB|ib%`0_3L!a|Q=65GsJd8-me(nyP$1;0WW>fBB{2Hu@b!ND5$jA#= z0YtZMDTeS;y`6hhtf$wI-ci!4xG?K|n&*Oh@1pjR*z01oXKQuMmuHDHOq?x>gAB4i z^;&H!*t~F&cjLT^`a`JrPxS2(OtL~1*g3GfRNtYjAS1!h=>T(|=9*T*R{tbiiwVnt zHGXT|IvAbYQv%;!tP-Pq0!T}1y%KvND`?2OP>>rBkE8v|6v1vA0xh?e* zI1UKA;LHR;4}_(*`7dIM*iD)Ajp@7=#dIHQmZ(o})@zn5Lp`~<89kZPZ81vj_PcIi z6Tn8(VMcqAfk-DLdPJ{m&U?&_U3Vv0^8AaSm24lfC36>&*ft%cc{>mCstWB6{>GtS zzH-iM3h0OHr;v}k`MuZ9Iuy4m!x58NxO-_=-cDb0OZ9)#9?;&(vp**@WxIRbxcJLW z$+jEn3+n{aT%IG|>dWT5Idw|j;AiKTR&IDC-STkRLn{VX?!PSkv(yz8mod5dWf&s- znJa(sWl;UkLwoF(pJe^Bwpzaa{X0ge|KJW0(Qo}9>`7M7d2g2-k~FSN_I3TU7tif| z%#iT*0j9Gdj$ibqpR*jxwY~0R(0|7B^Y`mRQ>QLtLDQ<`_+$DF16PPUSz z9|{7Bf~WZg7DXsTM~czr48mjiwoDJnUxd!F-MFo)Jn`U*PKDhMwW@k9xF1t<{TSFfuscK_qX;{( zftJ0VpXYej&%2N69cd5hY>nexJDG1;@`Y2Z-QySjl%l?hXw|7y$viYph=$+qHq)6n zdDLn1obu30n1N@_c{hh)aH#K(gKplP?%y$dQt3TsF0jv2-Eh3MgF+=_Inqz^2wKNnU7wihhw zv!E6%POlkE^rH5IosM1<>vi;^*a5I!;^y_$N_W`NtFYYpb$HCti{|;1qgNFPcLq%P zi{^P6Y!FPtT_2^f1g83n(p!ZQg6c1yuI8|{V50YaMYR6Ibnp6)gb6qK*`BHBw#$%V z-CS@^Nmw^n1=z2P1|QMg2UZCd>amQj?X9N5b*}B5h{iF(A0>QLW<3RV98B-^(f1j! zQLtzoPlFwcVM~tQi!G+VAFyggs^kpe`qlr8FUD*!qH|bV>g$Po4jGFvmB0XfJNvz) zasIh;-f^Xi{yb_29_TzUE)y#V1gj1HrMu%_FFdQH@}7oX?s|DgVrOCmMcG8%gL26B~H>7XnD3~b{7J~RoPEL>j<=>efSL62w1)k zE8H~LVX$c5Spqv6!&Y5Je~Msr#9a$^3haA4tL#n=4)+f!d+H6b_F`XF>E?*rRU7t2 zD?eBcY~OP9vdMr@=;JX-tA01IzOpg_{RE0VXpheT0=#F_G~@#5w;p^3hbGN_*gaAQVd%U zR{6p?-=C9<+XmJJb~qBZ3+z1DpGL4guzi0x7o1@fKO6)b1N$?_d!p-NX&)V*4fcRf z627jkFfB}6OHPAD^L`F&3T(AYU%cQV*gTl|!LoUlwUW)VD4r^P-xsxntGXgp()i*z z-*=>igCp%vYyJOPa^wd@3OL3OU$eP6qq1}m@9;~I1z;tSIm74eKMTrYw&+S{fbeJ6 z&-prmaE`I?>9l5kU;b&yplWm#QBAy4#9RHxbKXCw&RBB{qLj<)veU;)^FfX8%oBF( zWz08jJ?qxbvGu2|Po)3(C)TkED!Yb^@>`clm8@@?^L=#L9;nreM(!EEbZ9I&fbr?z zN0Y_tCEkI}$oYkBY-bo!XM=j#%)L~ul%z#^M~Tur&whP|<&*;q7kG0-?PWHz zZ3I6@+*MoVg0tWS{i-pD%dW$p1wWc2y86}(I`<#}e=e!3AU`dPVU@%BMc(IP>cT8gM`GAoGSyjdM_6X=SlO(&N*)=*q=$#{g{qG=j~f;IdY>>PS+>{#k%q>nVYiR*Xs5v zJ88?tIcbTHbp8_kZFiv@)(dt9EH4MQ67B$4$u;N}3hTl2&)hZXe7jkmwsEE)J(NzY z2(zitm^dSPH_Ulo;n~*}nqM1@*}utC2@@3YhgVU3TQOh9MC+m7y*RvD^zf13Bv zb!jcw1enDqjKVd8osEU-1e*qn^59;u3t-n0M<2yK09Lr>C)wCLSD=Y7hJyW}%yn1v&{#EovW7upVu zbsVxU@1oC3Z)h@5Qh#;)BbQQ7EM5b%6;F5NY&Q#5E{z|8)B)(8x^>QbWk7dVFb+c5 z%IU4p%jgnVE>{Y!i`~I*T{d)AepCF7JiHvB8T}YeC{eEv>#AisP3okkpG{&lQr z7{A^k>bw;HonOthHx&mGc-E(izX`B2V0Q_?juHKs^b}jQylHsUU*laM zOjSR+FPHyE>bESvWdFUwtX@C(T`5+XR4!)r>08QJUHil z(v|a}l(hrLNDg9QH)*m5f8j^qtGCf$#)gP#*HoM%*sq<_^wzZ;p<2r$1o8 z<19C-fMTJ;Pk%$4ZoNHoL-egCx%JRI0nNj2LWe4vX0K{ChMMEF$?k8aqdsF9?Y57% z`sYFkZt^ej_YKSiXAJl2YBL;OV9?`k$nyJo)vvG~B;2Z?9pQQI9)*qhc0~9supOn` zt4XJmxC3tv*Bd}KkL(2>0?*5=?hJ7 z44c3nYz*Ttg3j=81Hjb|u(OXnPfL|dKEnK6D0{_p&Mv*S^peJYaeC}i{hrA>p?x<*1G#dF{d_U);)I$ra!63jd^X4vUt;)Q6z;p`PRfy; zUrc=Q`DOByUbWI)b}vH$wDmAt%KR&(pgOI?1=`c>!A!B~&cg#BoA_=J@NFKN0rv3S zq)6o{o^Azc54@gTM`Ok8mMEF|1MW&DMR(`XsHjOkwq)tU@1iFrIOZq1~ zv;hQ3HvsGexXFds#kaDe7$Tb9rmV<{6Z1tM`IJh;xfM)9eT2sM?-xE-$$a&B_JG9i z85dE%r%WvF>@~*^%hI>fv*O~PS=fsQuKP9C+o$FNe>+YO1kVZlu+_-@YMd9;5VxDS zOT_&#&+)N|VPl!D(harlTkNir!^9c;;+*&QF5l64AmrU{ywG0L6nrBUusvTTcGFgI zZxIjeAR9~2Z$6FAB^dvqJQvQzb`C=RIdo6OMmFkR&A0BUke8suVW4$E$FHYK?tf~2 zudcuFZg+TTAMek8dCtpK`t?!7d&u^|mCoj7q?8?tqx7QD(!2TIAaQmB57z+f$^&k@ zJ0>ZhFL;y?aw>a!KIFG~*aooA0g|6_s9t)X``zh&b41^lh*<_6#Z=f&tclcb}|hC0OPsgToU$GlUa6R zRViOo39PkAzFrgXZ5a%fCQCaQ`RI2hsZmI5=iv?zESjkifRFINHASVj@VyNn-IBae z#zw);D;2YL-YjY|NO~jYo`k1=SF=&^8}j^c;tLXa5Nm4IT$JW^9;`GNOB;6-=abcm z6(E%XZ6O@i+E&Isz7ag9=xHwAV?3zPugwGPJlrbMO%AcW^J$zE{q!kkeVr?H6Wu&l zo0j8Hw`b*ipbPE>TLab&_9>p#w;qwtie&u^`ZBi76S%=v6j{xCvTZvh#MHy9irJCr zWd=y=Bx(Jr>&K4QCCLWz8f_QR7L(eVxrZe$9;~S!-!w$`$m;j)?zePz7f9>;Wv*Oi zlVQ3$$&N_mPN&I|Xk+lBA+wiw>wb&%M)|zAS^P34SA_i1@#Eg*CUFc*{xsXy0Rz2W zUKM+}L9j2!uTB0hyiiij{TR^oZRB#(E|NMzx@{Hnf&a;<4TH^JRD}7Wdw|IcfWZ$V zr@;`PQ8#pDn|E@i!wfVr;lx^#XPItp%r@VUZR@m_QF~WZpdGE>u`?%ur-Iv(8 zx#j5hxyP1s6_^{Ucf;>H!`^L{yE)e~Cyt$ki@L`Yl4#Rqw&_d@Dm# zvs){etkH3p>{CkrRKePSl)7lA?-jBEL|0E*YG36+sa>B39_NAUKoFmN8}{@k6h{Tm z$4MVcfhf=S^KDtIQy8g__V68)LOBc~ZAYQ6t zIJ@BjrQXZKPLO=k^p9%(4*xd#wm+Wt_Z)4U=KYbUSQA!)pkzib)JNDc!tNvNyO-1L z!=RmQoX*ZH??{yk@a*IZqr;u4d99AV?Bra_D>x~Ge3jnBNf`v9vfU6;J{zCOdVS-( zf4`0C!t-lUu@ejen`L$5?|t?X_8ejVk$B=E4~eI`^`twCC_jZ7!!RX(3~$K9t?ahi z9?MB+^)=3WZxhe#G+jq4%U3wpdF=Q|m&Fd9Z^#?@b)@tjK0mN1fEsHohB)%p6RVDGr7CwJ3SBXD$1KTj#x%f$lDr zzMXf?^Ustflq6MJ`b%(>SHMtia12Fq&=|Bkx6k|gZq%#W_eDlfq05r_B-fbiTgi1`)xwLoW2eHyUrlA$;WAdI*Y|-Gr{YLdtk@B*C`pDbRU+U z=OO7MogFa!4*Rl4%$%2Zn*Y?kQAcOm1XDf+p*6g7-n&=rX?-KihwB?{sdvWmfv#aK z!N-Vu_NsZ`AEoudK)3kb{FJ7?dY*8HcFlWl=UHh)_sdfFIq_vazpt+OUB+Mgy!VEL z{J44<;zoP!vb!14bi2Db6Fo{nMQyTk(%sN%y?WmJZ>7stUcnxe)7a1^OpZ5Yt9NB< z*zKq7*i$C>5#p}eJs5HN7$`|-OIOx_d}#PNP6X6^S(~c>M7I>+da~jf78ou%69C?=9;tJNEjSbX(pB8 zf^ZJVPUdV2g4xej`-w=@od3B+x7xS0C(-C6Uu&O*zK(pgx^a*!n_4|+{{+)Zf6>;+ zw1zf}scodRJu!!yGdbuVfPVii^O5^NQ0hB5+xj;}bNVXIeO$(Ncy{12b^(Qr( zZ*7Bts_JNCb(gp#-!OAF1r-8f6tCw7xY zUHnT9rb=Jq0zzJ6vT7am*)#9;26MKh2XB6;thMm`Bv;#|IPWxuTsOgTeGEelfa`eJ z4zMdb3CEg3`v{0yn00&@s*g;OaViF;9;{t9vzjZ8?C;^6AYYw#BXeD{9;}_&kWX*Y zlu*ne8Zx-SO~5y0B(JP_F6-Y{&U@Q~`Hwb?`bQ+otSNMG%|DumoKc|rV-JnZrvgZm z&^)yJpxyZ@)}Xl6W7r>1?pk~GVcAAQwN^wxwAylys z=^G^~J75lIbRp29T3f)VIXZlv=9nhT`P8j^@8BDSuYI#G=2GK8XF>xZX^O;6L}_y& z(`)nD$Y;#wKi$v6KKb5x5BD>!-8CQc@Or2;$G5Sk-8|?<^w;n$#l#jDKv87vznAY#?!D1`8-P-6=G*Qw7T@ZwK|eS! z?^Ub)uL)$XkS|;N8{d+&{g%WcxeJ)azy6JHav(RV!eXN5UU=V?MagNBm?XW{H_v;y zihLcKpWsl&Ytfu)eg#^xlPmAcPQi>Padtkj((cb?wx$Wf=v&$2f~E(Aur^%T z<&Z6W<7QzcS~yN(O|5(#-z=S0ivL-_YaEcigC*0-96?Y4`sw!bfc&&lL6wmS>T2W# z@cTpaUiMj(!(^gm`+}Ut^x@xvIfRisOb;G{A14l6`o>QQv5k;)P(Nt;zsh)O2D&Ma z{Bnw?2SD~XBsJ)Q^zu!oNTt5v09b`X9^qlH2s58q9@5__<*7wblY{Qzn_Z8T77s?} zb$o9GXm-CjJ30(c8DSoAM1EU&xdWsrdz84N6my759j22*XLCN-)k+JQh$G8>#8>gX zTS4+krN5?figpj*Dn$C%gedtfe5=~h9}uGI>C7V+L>Nhq(}{i<&er;cP!^5MqYAQ> zAUhnAdK(X|00?SE*B|qHaYR&ga=zf4;sDqhu+=oPKKeckRt;7qzzQ6e`pYI(x4vG)oVU2GZ?_*kPrN?j{f6S99>5cerBhZ5zlq_k1X%+<0RCHL{CJ|i z$DZ7^$&;+@pNU=%^g2$>dzfE1dM1Nn*An%c>DCkdrRgthJR|Acb7b4&M?YuXrXUgc-rL4{N;|3G=Akl3(Rz^93)e>ilI2RNL zT|#oYDa;rORI!`n7_|Ut&R}g;fS}FteXS0Y#=ghqgS(d8-i+l7x7_S9hP#DYu&I8> zi8D={-w5WrP+uRDDHx6E^p}#iI)Zib8ZOT{F+LyMS(Ut=bUeF0byv2zHQRQ*uUkgV zB7p(5MO30|$!Hx^ymQ}R^41{f4Sapxdw!v;8O{;mI-eD`F78Q~_Sju{7DivJ4snXX zEJ3|!KXMw{ofGq3JR zlETyzruOgVy)On~bS3ip3&L~}W{NP66@>XvL6`x;41R0gdutGe!pgKqI!+WsRp7@6 zbCED73&IThVX$zO4rzighrT`U-RJ7?A^1*AW<_Uno!{*u8biaP8wzBBKAyObZX z@gDXcx3*xs-<69eWQuFE|z*F+Kiw2$L1ro@ZE$ZyX!(!>bF(bD|V;uC21XUbNS%?I~x7RASQjrd)$_|_(nC^^R81!(mD%e=QY7-!+x zPm?dr{>_c+jyCC8G?G$(Y5J1QX1&Vhj=xLQ_PRtg^>3BN@6@92O@ ztZ&C;YP-|&?iGm{wYjVv5_KWH+}|I@O>6ofwlLuJ;O#$~_dK4Jhp6wW z6s$?o2zuR3cAS8EHytlQ#b@^sxAH%ojwF_UI}^*0l`llrDO$K_k+I3GDH8M}o6Kfr z0-A@Qxn1K6nod_|>*}I*Ve@ROHo3HewaXMhqosD`R4u3t!g|n8 zBZW9lBTC8TfQvjJBExfsZJC+=41zxE(GhkpeZ+LpNB@}d_LK$hXB5pZTgbDl-ow2k z*bJt*oC&|$*w!n8N<)wc20^o~F-c%KVzlBpl{jNtvuYvmKiLVk4y*(0y~+b?Sa)ub zvE|M!BADT>M2tI_S+{05AX~5>Ldu0F`^2QaUIWQN=pTjt?V@jTz3n4%xIfhpmFx3t zKygkH=Nxfv4dUd_aWMr{`X{oGy7G@E3tb>i)s+k0?sep$UfoC^ z_0?*ybzuLhK+E>6yzHJ%KSh1DnB$pjsrv1M-uSOA6!7#xu!~^-%=-vW_idT}HqT1r zd(+R;Ny4A_^#$+MB531hS^bXgJx(7;mRD?U%|W7~0e<@I1%Lm+=$ZT+%Ab@cup7;p zCbd|oUaSgJHKD3@L4O6xVB`89kuWpl^|1 z@=gBXwJnkxs`;BH-NVmac*1!_{e1NXoljoyhJ(2+xhZ%cg9l(|0eV&m^)og=+f zH4EMgo=kde5{?tn;}Xo|1;>`6^x8Kf?~~p$o?Lp@B&LUoCON%^g7h>upC-ML7c2y4 zw18~Po&`S&{>kNRB24Gz#_UvC`g+Mc#XZ{kkcQa0M&|1mg=1D&Jy;`HUS1d04%PWmB!OCJ)ip6cG%on(*vRuBf`5K(6K-cW zW%d~7Wh4?u@p_5Z_;bb+|2;~)9^$<#K^GIQ&8#h@6HYgkQ5VITx4IC$i_kmS{N(Ai zCeyRC1Zu9MnCp?w(+Y%l}-wg~s+lqvH*1)Q7&C$-nBPVl(pC_66@* zYOJJw7>*b7$G?zHtYe$wa**hRUiIz;?^Vj{6VWrvj)c+2UPDh}GR>KK$etpN#%mV5 zy)KQSH2`^*ZD3pKTgCO^^jT%itOq+5JjswxBA@q=onkJrHG{yB(Br5LjlFKtSR##* zg#KH^^Lx_|s%nc9@$E2=Lu<5i!At2Nztt=Lr<3hc(TQJ?&LsC;4z4s@mL0yLDLZln zisUQM;a-tGv(h1`Y_GuDT`Wl-@vwDU=pT14c#Q&>xAvn`F5mR1$&1ar+s8YT-CX!i zut~5tX`RjKu=G8YiZe#yk$t>tef5HO8_)WPj}L+!1$&+Nll#>1eFS{fYZv@;Zj?9L z=WU&2I)k_>(f5%vMchW>9&z-P_64vhux~}M@)r2>>k6?oV10cHzOQ=1DsBx}*}WmA z{566N-M8R-mu_(P<8cy z`ecfm46p&T133zUcE& zA2~w!e!`C$;$tVk)(k9o)efuTdmO9|Y`3u8s*9VgDkyf#qd;~1ohQs*!rbHdWptim z{@A|)8Cr*|3Knr_<&}?h+gNYBdBNMjvpy^MhbziJZUqTA=?hor}`%CH$GU zEO;zkjCV!TH=8=tzUh6mML`A{%!ck5aVG~CypABQ>2_`X8N_|0IIi+OP28o2nKyaX zN7xcr$0G~gOWoKLwhG0`fuRsnp4WnnzHK46SIy;_by;x7NlohSi?VF>lOyh-KY4QX zqxu{o{N6u(^5IVrzWvaX3oo77dBWGeeZj-!uhoC_-frWi2$uU-rvJdzVxTY39*g4F z?4Z5hfvg(DCy2Yp69+v9Ws8W;ZOX5WAiAx6RK8x~*A73q{A%7DA^hrhEqJeS>A5`^ zlUYN3lhf(6VOg3W87uE<+j(d;zk9(GU44X=w9(#R@7FV*8va&;RlR4yJ1rm_pY${B ziPfjx8`ayRSr)x!;+!N-m`}={JSR&S`F`T`&N$Qh^ANPoA71e74#V|fOowM>#t(IR zpfpKTXpvUs8{gzc)u^3-mH7hnbAP@N_yH2nE8mHH4fbN5eg1wM)~Jt`Xs%z&yCL4a zMeoQ@k&I=1MtUBGM9}0c;MicbTo6rkdZ052onKX3?kc2Xea~byEo%!1VMTOpK&YLl z$DuR&7YqKKSV{F`>!p03NR21fHOr+DNA;V~R9~pL3j53VhV>%eS_QTm>`!=(_XT>J zW_MHXDt;?r2MGHdh2^7ukpnvdwmRs))-SC8hWE3&bxWI>UKERca8J=c2CcsLIr)p< z!cKu52h+1YlB3RmjeulY#fT6zSmJ%XuDkAvmFzQgnK^18J@PEAu+FVp^3 zS0(N6Gicd7-R|22C@+=Z74Kj0KCd+R2wMks0_>Mme|&`1gB|~?1%LmO-;zn%!FoTi z;QK+fv-x&E3?^OL%;X%-oBXGSjN8t@W3|dPNWAK!l&i3>#N@twzfNz5M<=Wid_NPD z&^r0S1@F6sw8FK1bc`%_Up&06o_wvn8hP}?3%<=fdRe!}AyKwW27Yc3Y|fyma?gz! z+>-cX16dy$-OxA&jaO;z4t4#@_c7zkkyg9>3lLXvfBc3De(T}+No9(^H zD1QD~e!GlrS}y;pgX-P%hmZc>)6jV7fkrnpRt5WxpNQmA^ z=vDvqFOFWtHRy*vzTkOIzKYsAgmbOqRU@V8+fr0|vA}NmQ-AJ+-tZ^cFDUGTN%NTI z#N;EfXjoL%qtIIV)Pna%W&E%;Mr?ky{_OI`Ue2$m0~P1Z^glI_xCp)Z&n^UKJEAf; z2B%NetPyU`H<&M+bqJo#pF?+jIRwH!92=jO2N`H-e?K7$z7NbkX!Sg{;C)!MlFCE7 z2fFsrlz*{Nad~XbrulmedgI@8`yh4^iLHA~=0C@~s)>+ay0V%)qcgg$|2Jmt2%e4Z zA?Q|Ji#-ByuXr*#RO^4jM^$zUSf54P9&ow z)E`ceul0Yw;Qd545wW(2=~L`7xx1v>rH{mPqc)d`kC$IZe|UVs8{keTlV`%jbUPfjSm|GZG(<8~bE zBA8?VeU#=DSlRa%yv+g63CB%rZEhRQTsM(e1l7m7>yeNCmA>G{bCDm39VYvu^eEVG z-;pUY1#8IUptlctW6-np*QLjR_=B?{V5LWm1!86^(%~iYJVhEu{%yfKUwEcBoOcS^ zFqO_+LZ_*K`n4A9-Rso<>GYx;9w} zXf_yXkCV_F_%V8lfQN*4Ernyi?HimgO@A<%CmKDCfr=ZDFaHO5j%R&@Re|jVll-oa zuv)NDu$LI(W6fY^!MYqKp416e=Ph_|6lTXUF%K{I!}sy-81I@~c+njMn+ChtVby$( zfHjsZdJhP*Jz?A5rM^=y_qi1!6(dY-GfvoH!k$oA`qM)gB*kpMYHo@(jTHDAFXemC zr<5*wQ;M7VlnH{8<*LBXfqzdpG@a~&9W}DgA#&iKt8ByvVkNI_qeFGoLA=4#qW3zD z6_Yv4=Qy^W`^$0xo2By(20vJlU?3SVV_&~A0-e+8Men(8%(?W9PTtcdiJE>zbvU8$ zWsBZMp7jxS4yz0wb)XfTzhns*iDi{4(I zp?T^z+n> znJHMZ5F}s(Ex!E=v`$~X=zRma{=5*?C$(b=9M9LXTa1 zarR9&P?JM{am8ZftaIMpfSdT#c4n^l>cHMWnk*GptcuFvriTOj}Uf(uqA49y4Zep@v2fM{6!?vw&sE{!W{eM zMQ>j1X7UjI(&?YLLSb-)^?PeK&GYGZs$&$(lK~&8d^!B#R~7^N6!qhEV0~b3;#vLJ z@mHJsIG<{F)wx}mKv}TS_BT-|uq8mYU{%egWAB63Nod)++x8Q#HXZvqNFU-0HH5Ag2jm^Rz|Z7SZgK$r5fV{0eF@*?pQYJ-@o>y*TJw zp&S&B8@GOFOMgyFo8lh8{Whdm+eLf-`l2^0nb^kjC1_FCt2K`&4ML*V@pk}vB~^H+RNQhnoDg@tUC5_FO|jsX$(H|e=iO7-+9vLTf68z67bF# ze~Fd@rm$Q=M62#r`tR>N5iNIz`m(f|Gbf>S09qx#x9FWLF+`E-q~3-V`n(_GA! zJ(_-1b`)n5CvY-xioY@QPtn1thC6t-hj(}&!3#s-yW|x%CkE1@_!?q0#3=59;?2Cf zZW)RuH#FWx{-3kx+qT&FyVJ&|WQrW`*7B}_XJ4<(yRH77@jl*l@J`~ZJ{k){VC`UE z6F^-!`I`AB@G;k4`T#=#2NJb!I>XOL?g-Lp3Fd@QpA)8Y zb7DH1GWF1_z8(9=7c6?Cu8$U-t6)|sORo@W?_rL3RN)UR{2zwlRo|lu5B84=kM6%fm+|R9d~R^Jh4}I>ae8007~Ih=+84nN zgGu+VkFbh6=#O=a{<$)TRe_xb`%MMnqj0rg6JYsuwyr>C) zDA*Y=lMSr?!u@7vZDBG7W}=l?|MJ|DX$qdVWllrm0yL`r2-)k2=WotgrLUw@C&&WL znbvGaS2nlVRu8R-VOlc6sTS5Mg-VNbo2WA5#@^s{dl{VLnjN>~lQWs`WDolh4U68l z0^SzN4Yr>{!km9CXby~io~1#GaZ13+IO1S!UU3)t&5etm?xfd8ZBPaF?Ng6?Qd#Iz z#a}I0P2-|>OaQX0E+OZf1lmKpHrv{%gD@uv^L&@L=$;{Y3+&W#DSSJ{J&w9P)x*#@ z+O+6>LH*6<#Y@Opxzvvmn}CtDkLc6TTGPDf-{S$Tht>6?{wNUk*tfNsXcISHM5FEPC&D z^^vSwcf7dXEO&~}1Y0h@wJv;8e%p8#&ug#q&D?7SHc-uxS0N4adNg-+Y~Gtegd_1A7L~zD$Toxfm`V#aZIL()+R@ z{+`#W*U(>E7rhqA`KC`uS|gjD1aHo%^qj<)Vm*@Wt5riHCwgs*zFj;#`5>+$-2GWn zgZl;$=&+gzJ4o1W!v6Hh=xB23TT_YipTEC439U8l$l1%CsW4rl)Ax*)rk^Kb#pST| zOBH#mel7I&EPC5`7T?*AhcGVGK$6&xM~rgIe=A{{3G>Qej$c+@(TPhtCsmx}Cev39 zLu=oS=nt2pg>2{chs_6$bSuTQwq_2I-E+{&`rNIM76^08Ef>VNxQhkXB|FMUO+q(n52&bpBm&cPK;W*ymBS||qkws!caMT9)KVzBI?^uww2QxXGR6AeR} zjr<)T-QIf_y-tm}OSez@ee~0~mQG6B)kGbK&cOYP-s{z8+^2)@bKvJ6SoD4@+{U!^ zOC~tAtz{~FC8_!y0=0hh*7pgH^&talNZ-8GE(njIyXoq^|cF{VW zIA(oY{Xu9AKe!m&i&zi+5zz7cgp@ZStUf2<^Q7}6@#&4~~Pk@~Td;1gfO3r>>iLK-0mDgmau4J%IUfCq% zM?7orL1lRvxPFWB>0hi{9VxtWQ0E>%mTd-R;^wYD;YO3Xj^4kEyoQ ziL@hI{@~Nh5d!a_aL^r z;kvUeeFrmFeBrspc<<_cwC}@<{`rTb@o0OU`TLQQtq(MD)R3PXw9Y{5Wjy=)*YGa8 zXHxrx5V!q8&L{h77>jd=I8(&2xrVc3j(@SKvA?W4U|;zQagnVcJw}`*;v82xW)o}k zw&@g$bba;mU0&QHH)WEKVs6%Lc)mHY&2zP{N1l0P(W`l4e$|K_Lux;%(G}lkQJ+3y)AAaXz;P*DkvkKbe#@~9R3MvJmIqKPMsLFX8B zPCGiucJjvK{q0)cnSrddU_GTbCsrMX^BQ|=A7DHTqxTbSKEmq2)`0ziA-=6bD_Aqw z>x5C3L7c*{Z-=HHTM4?B`nW0QcwNQcKEe+Z{uMm?ZGW|7D&JD1DO;{`jS%J>VP59O z^CR--vz%Rhe`zY&erYp$ngQG_4ABex4PMP%OVA#B*P>Ut9Bu1gPAAiLPvV%7v12c^ zn)}fgyqoo*XvJ*gjqeyQOl^qurN+#TD;`CdcnqD>IAYA#siAL3XUU|SfN#mzAuaw}ES-J0!nw}+yWe3YU37-MyuJbj%!eStM zL13!Dr&V)OD1yeMWcO&Juzi8y%?e_0|w)ql3=y+dPnjTT5Vf;`lsH@h*pr zpf()A@ulz|^-(HV5mWK7X%z2S?O2BlzRv zFky!Y+n}&FWmneE+1B_ z>?58?Z(`r@W1iodn{k)Ph@){%@(TFuV~(y;QOx@;!QF~WT7lKF5l=K0cP@9|3i zW+{%QT5&YBlkWx`Px)lZjZV;nb1x><{ zrtrjgO52DDy`jsTa#$nBHJTVid+i&M$BsRD+FCyr561>>u=i9VwH=3>NIl|U|q)?u`2(}*VO2y}+ zFxd?T!D3h&08d|$C6mN?{W-tHIuk1qOW zqKsD9??SoF+RfJawH%iMehgdt6}{m zkA?n}S@I;-Ace&gYKUX#0}MoFLthp;1O2Mw=syKK5q)@3^2X7I%mz4+oH2JePE-lG zngROjCljv&n>TR|ri_NJJF5^8xf8kRozvAb>L-fZ7i zezfQBGCDvyjc;asdV;;aLf)BNw$akmXktPQnOEa(3qFed;23`s@FD+7Fx@;yEf>C& zzjocGxSN;cL37YJ`RMoz>*OFGG5NyArJIBBZ-OQ%flqOR6LZi&8aA26iV>5Te)@bL z^w+(G@pN+0dweLJI(rI@;#i7n zddzpO&vTBF_TkSjdQ0TP=kG~;!emw5P^4Yegbw8E7XQEYzC2!v;%d9O3tYH(9TgE5 zq!AQUgi+Z9#AZ`u9TpK4r9n_omJu!riAyV}B%+RriV14FgX^ehKrtDkufZkBB$~V$ zNirsUN)p42I~rf-J5}d7Gk4C+1%35N*p(F;) zj!imy!vGCI9D>i`yRM@8qI4&kbY!@S_7k1w#Ts0UQ1%@D44cSI-psf*mD0?kG-sPM zIxo5*0(qI2p%wBn=@OLg-fx)B9P3*s-BwC>9_k0*)GdxlG*@f7UToSv?PhgOPLJB& zOa{JMO!tG(@k3>&Iaec+So|aB2_3{cWikPvrkzyoY z-I2er5QFl;wRjtY)>oFdoKSYEWctx0rTzG|9r?M1?JOSS_IX;nHiK{1`1Cfq3P*ui zn=y6vCB^FSD>@&qA=2zPVUHX%g7fmBwr z|29*3r*7Sm-&Cj*+b0&^abN6@>D;HL>Nk{o`R=2);NDVG(PA3CPx*9BP)D^!A+8NqNl6?kIWoW-V!RNSjJ_ z^D}-)(l(GL>n=unk+ckHM;a&kMd{z0qR5TUB6;#x|8~o5}W6(e{wo8p-B= zfa}wC&2NgmE@}HevNe*ewK=}+{eAX)fL6R{4e26U6X`JgB{~zPo4;v|WR6{ywE1nJ zbYniGX9rAvHfE!ZY3gDd*#fc+H#S=rw*RJEpo;zXkor>^I?!`ErvEl|+TlhTZz+vA zhRyFF`qzWBHKYwTf~|{*bQi$M_4IZEd;Mh$**B8iHFi2rHt&}=`OhLfMS5{xNd7cR zcc1}xjnUVM?uR07gTJm_GJJSZYCO0e=%h@<|gV-Ki-iaL-VEG<{h`wuktxA9gg48HO!q}2Thr0WV_r-Cy$gj{GyG?x&h_aNB+wsJ_3Yu;xuFxUSi=x(&q5Os|>R3HlhL5SY zdT`(H8s*>NUvwRjvNu1|jx(gqQrgF)C7Wm-`PJP_{RL@s+1&0sj8W8XaIQGkjLD|k zf2(|4r*&d;O==9q=>HYYamE(bBP(scc`pOKIiUZf7b-6{(!o8WQtgbuWe9stwVCpJ zlk%%KWiIy1DnIngzJ0G{`TnNsTV`HScMBcwPBuTQ!n{I_edhhx_608GW64On-Y}VB zrCMYQ_o18pFo(3QO|&>^7n8P=w2tWOcCof?>g%*!)Yn+^ZG{T0i5ksxX*717I!Afl zTlGJer>Wanx6=H%I-CDVVLz#J7duYl`H^_l4BC?N{X~nZrY}uWtQTu37X9svDa^&G zFJB~GDYX%rn)9v9_WJrZlYh%>{(X~%+T|)b$CBrXW=sD$l3JF1s`9GpRaI4i8EH<$ zNMq&!t0`%ZHRk=&+59@Qzb5RaeaFm0&lUE_@OpYZX8#zqdm6~f7TKxieX-)f&+Y!i zvg6*A>qRP8q^_)7w$CrF&Deg&Ow8#f)(YhsVK4qQS1$UP_ctq-Pvx3+8_g$LXY&u5 z`m$qD@qNO@V+!T+XjH3EEUJ)sWS~hSJz+-sr_kq*skd|M6y?#_Cd<#Hm5lAwj5_ex zYTqr;ff@^qv!m;2%!Y2}US>?L`4Jtj6yqPI3Yw>*+owEuLh* zPdkm`PHmgzcS}+B%jva$QM#T>Z~Lq}ox0PiDk_U96xMZCk^h_Ie<790{MOLFkhI}@ zWcj{jdtKK)*H`T0Y}xQ^P^_7E-Oy>BIftiwD_+?d)$F^#n;&t;P}v6knELyMY?JSj z7SF|s`xpIhu8O{cRB;#E^CUB7t)h5KBia1E=npI3r$JMb3RlKPn-~3++?!1|OH0>B zu}vTRzA5is*}^xsdz0p@rR&e6tu%iZ=UI0B*}TBRG!=XP>&u^Xsf}FwQ@T}@?z+M= z1ooSzr&Rcs4}GYqrus^=?omEqm{*h8Uw8WdDvG(KeU|UXvuzpI(r69lsY0tAQa^}% zHF&l zuiA>uf}Vt+EJBL)@gdp#RfT%qMJ&I%lR1;4LqZ*-BkFyM^*+Vw-#weZyf8o9MJ#%+ zW>v*l^djuvSIUFV6Dg0_9W>uMGMoPo`kT)+=y6KyQppO^KSUiBT7V{y4QQ>>*Evi!bW8*3NqHSy~GOnsLh8+^}G-CcD3 zU{W@Jd*Rq9p1TywC1Z8t>g=8{(YR=}CG z%=7}E|B!7s*?wu9i~Tn}%ekCx+NGC{-9f`P-4M;wmLc^Xxox8~8A|gK+EUYfX5ZOr z_Zf})HC5|qE<3DrM~${Iy5C3hjm6pgjp!fB=4SRal3(vv&q^C*iN?P&SR`Hx; zl)0zJwjI1f#9LPJs2OU`5h_g9%$7&*n3j=Uq?N1?B#?viFD5jPFC!*vjk7 zey89~ikG8!jhANg%SYY))+*VQyvG=lmDgB|1P!iO2*n@)($?Qh*_?-b?`_G?5O@1S*b{zmaG-9@}h zRXp=0x8~x_qj)R7qw<-)X*0#!Lh%Ng^3l)KL7KFWzoR_Nxah8@{(faPzrtidb=q`Y zkhT>4z5UF0(*u4a-8EpUfevs!@vznUD?V-;DQ28vo@ipy&y;&5X%Cb3UDUOyn>Q)m zR+Y#5q;>egcbCVY2Wfn#cult>M%s$+FprSpZBTh^AT9SD6%W-*hh0PR%jr=v4EFT{F06bv;MS#@{O#@=FelXs(^W6vART+kz1BiZN?Bjjb@msXss z+PSs8AK_#=H@vL!@XT}TRTOL8o!R^#v;$l}Dvr%|?jq}HwbiXE-%DfLfH^L zFG|ntqc~42p0A+XwEs@4ytYQG0sO4gHk1E`Z2n0Tui5q>?^mj+?qTAUH#oY{d~Cxy zs+eRA%~xpq=#~PSr_|7-hc=i6d)_xWN#`#cv;2;irrX zZKSW*>u{{;rfVsDHT*J}{v~a=SPn}t@*hA{$6ly!gowg~PZ&{d^7VETl{7Tzu zQMIFDtYP)Oy%#d5V$8Lu?qlxPK9TN{JOg)0nu61DLI0*bPW|b#v{q>PAG#iXy;(Q9 zuG-$8Ve>3*3%!r7Axis}+9r3CBXJ!*q!_E8E1n;jdfPx+g0!aZe%M0VTGC8EZqBu7 zaeV=Wu>IgRvN=D^=BszP|LwNhe(-(T_VOwDiFQpt`UIV?KA+9^Fxy0JspKBAzqXMR zFMB_mM=rkc|9Lk52K{aPo8J3l&zGs4nQy#O_j^c=*-b8G>pHw(^DDHFn&d#xP&tUaB^WEqR?TwdP z=)H<`7a`q;*kV2jV+f5fgU}~#bb3^nZk?q+%yRKbaH#HY7GTTIKj^hHKca_+DNvdc zZlPP0DRI*Nk#4aBLiJIm0Q96VeJ+(G0f5IN5E!~>U z|IXw~Z4BR@rZ&6EoZDShYtMnJZ)jnMX?hngjcw))CuU5VLun8CQ#SuXVIA9^7Z&^C z;;~@AzkFQfMR8hT=l7&-qAis~1$4oqyZH{u$&^dJT#?h>x3gY{lm&H&8mS zMK1pw#V|k9_O_7rK50$wi`zSZmP z83-v>l>T`eseQN36~3vm%G~pF72PyWeKSp}s;airHqfnGP1oZZDUH`Am%n|N$FA8$ z=C(-Fe4CzH52-ivsErh3ZGDcP{cHBPGS{r>!ArfQN4KC)Di`f72IjbEw~5NvHkY6F zb&dfwqtg!^iIiZywU96uww`!?CFxi)F`-NO`XYC|qRr0`CUU3~X2S5uv;9L!$J zH1WPP@jB%4?My#t&qJC$UhE~&kIZ>O`Ml81x6QFRh8lAB19Q9{Y3CsH4JFb|`dS=hS@Ia4HWQ4>6{CM6pQZ7wb1px=&|ehCH+x*s z*mzY-JI5Z^5Y+O!=*#B`h35d;QOvazvqP6$K2Lwk&(zxn(w(lkyqVVg`}gk}_;(Hb zy9WMU1OKjp|IIZJn`p)-7rBzv123?jPC3s-M^w{W;E=(A{pV z_cL<=`duLY4Xh_Qxw8U#(1P_>+p_;H&{MA+Vuc6Igq(i&Ll0kJy`34)>G!ngzhHeE z^p~M~&$2!Z@!y8-|Ah5FS96@4=(i&dCPX#exxnFVtUmz%_RyWfS-&mLak`6s80*<8 z)`vjPbYzO5*4F8_KXmsw*YbX-hrZB*`&hpn+dEqP8(ANZmvNm5-8+T#7Z0}KoQ2{) zp7plK_j1vXXI)-Ea5MDGAl7?w7-zl2AISO@E!glgi8FxpPSAe~-9L`?pRv1>mH6*= zvdXfFY^Xhw>nF&tZm&U+sUvhh&H4dm;!VGS;{O8c&tpGM5&fsEzbpL`bmv~y7azcJ zu7U3TnDx8Oi4y(pfS$RM^-1QPh4gzAdTJ=^`wwIN=g`9_>+Nw;@D}voaMlmN{{0ZT zw+HJd9K>hqV-y+5%&6a7F& z^b1*k_gs$SZb5rk$oeLf{|os0lUP3p_169<_ILJVeb{i0(;K>5%ld!dB8P|gsXPZ5 zf%+T=|KL;BkA%MufA@n@|2YzWE9-wny?q~g=5f}09Kq#TE&ijqqe`8_2TXwY{t2u< zjQ%PVy&vnJqWx@<^7mlu+Gc{8{vE zI8bmLeJJJM%KB>T-^k0T|1|6Ea6C5jM0nB1#3A*#M zQvGz%H?sZ?+R0+kA7K46^cztr=Tg?cKnE8S{T$Xm!nn2+dTKiB0}(%jo;ic{=TUE4 zp!?%lpM`q3Udl6y^|5Gg_d(ALV|{B7RSqM`c()2<^FbFW!&gR@UwPxfJU_=sxrl5WhKSbqv}G z91fYt{JCQpuRF2S9_h_|A7Es5seLBqujvdoln(Io!T&OZ{r$hPJ-r<1v&;{Mf9@UT zUBF}D@4!FzXSN^Za{2)LHgNY3Y}eZ@>pZh1~y8LUA-uoBZL-1fH^ZO)! z@CU(jpRxTh@Z^6nzY9DC`v&13vV9|X0`|>f|AOr=foHyC{u+1^L7Pp8kaSTi_n}AHk!av;8mN36yWpVve8si0$u+9sGW9AN&Jw7yKdc9OB9TNTU8O zgB5ucQmmE#^@f5$$E4^;@Aw{)S0(8SykD8Z6CHfb!@*EJZC@D zOZO0q9r1@N{_q5(hrMIhQhu%S*Twu5?5_jg0%m}J1AYMf0$AOb^Jxp*7kDtR8!!s& z13V6RJa7nb1aK7aWZ*d9B;cvQX+R%13pfWj7dRhy0dOhsV&G-K*1#)(R|9VXUJqOY zd>nWu@Bv^FxC!_?@MT~cDEpx^`qw`FxIT{u4g-z>o&}V2f|H>q59RhV@IH={>CXIg z*nQZ~mN?*%quD>+mHp3$-2-1F{@}~NlU>+95P$GOIeW1Ehp=ampOjnh)&ZP<`UmX4 z7CdJk6my)rgkR0}`@s{pG2e=DFB39<2zD3g55o8s!vDm9*xt+7{|We~mor~>G1~+9 zZ-hO11=}}+$1i98G2*3HGJg^FFks#rc5f5&S6~l*&iokIbB{8YdJ&8b;_|rfvi&aj zyZ?u|#E<@^G@knobJ>59ZOku3`p9!f@iFqeDHHLi`~R-gV}!g zA&d{Azy7j6bMZR|>E=s%RM0iYvtO(wPXKQej)ekg&rUttrTr!AnBR8-@HXQvgO!}#ozDEGGni-Ke-FwZpTYK}h?kzlye;-$ZYuLZl0Wze@EG_Q za0h&n_@Bz@PY2IUVLk&qeiriul71%hA7eh7g1^j9eDI6lpTq)9PR-{htMPj`yT@tm zas7CAa{gNp-@A)>8*mr)2>jiU?Z?af9RB;k?%culj^LTwnd|bn7{A&9<@`e0-+|C| zI^o^0y^(u4{-N+s-NXDCaQ`9Z1HdznG9L;awI5@rM;pMCce7pEUx0Y0!k)X2?K8o> zb<7ulXYOad6g-ObSBn3WY`+#fv7WiKk2LbX1$H0t?h^h0`%67EhXe$koi_bc!>fWJG1 z^(Uf?j|2Yz`yYWB;9r670{;elANZlmakAh$fmOp;Zw+j&{=Nr$@H_Tj2V4&Q4&Zv= z24D)f1^%yq|0nPtz#Q!V0&h8-^Vt{J;rGmYfDZtU2A&C=2fPw^E6_vwN5NCT-vMR2 zbKmEMts1AssiS|1YlYX+eJgcMcuU8n|BCh+vPT^6YW6p8%`*0;JaB?0+$H9;5W8Vj zEu5MnuWCU&B3#NB-ofLo;pWj?EW|Uk*MRJOzvauZR5<#m@l04R#-VJ@{1^e;W7LoB})(cn(nF%?G~#xCFQicnR=w;FZ81 z0Ivn!0K6G^8}MY{2;l9&yMXrr*8?8`O8K4|&D$4!mKVw+&j7(Q>#>0TAatMyy9;y# z;olz_Y*z7;uty~RI*yx$o&(=qd>8RwMEuMqj+1$Pcp`#2Vw_~MEu_)KB$vId1I*OG`K4c3U@Y>KBLliSLrluoWkuu^gMp4 zPx-<`@IGU72V)4H0H%PFJ}v%Vuz%!VjPad}vCkP3pD`xkp8@71-ap~@A*00C82K;Q zzby4T9qY5=ANJ%6Gr4|@X>ea0Dxg^@>~t#E4|V;H`8Nx3tLSg@Z!Wm$Wz4_%;HDLr zOBaj5P3b)Pw-o$f%y&q#KeszyaB%xFMum%mLhoMQvzeZZAyC|UB7P5G<_L}(Mj2z^ zYb1ffV|Dos=XA+lj4ANu(#yE^_*qqhU*ilkGQ;<9(+MI@hNlh_Y@ahFuptcERGwUjtjn$5cn)L8q-cp+qt}R(KxUx zZ_oel^2Ja#Q@+40mhXZ%mroQg;O$Fa#TbCk5eJ2tU%?-k1WqMCb6o7o?!kwk*^0?z|30xki*^(?2q1boI7%&!Drj`8VQ@D+X8elz&( zz=wdpOtF0f_;bJ%@Hd;;{xW!77v{eOKNR-2!QI34(}P3%7xd@=BH;Ek|f1MXsf+zs9vd=vOc@HF@|@b|#K z1nOhS#f?*m@9_;(k&7AAT3am&~)+}X(7 zjJf7_AUMyy9H%e1%nBxeXs z_{=c{lo&biaIBnJvL!u%d2}4oflE56r#leeN1P-u0slaylk~pC2S$K#q?i42uZkbS zE^(T}-NiR!qWL|j;>W(D@|*F@{2oDk2iun$&Gi|Np%Gt^P1{ub|gi{SoN#g5J{Vk3tU%dMm59PH{QY z&}(bCJZ+%wgx(5z7wGN`E>CT1_CFH(NazjFyF!mcZ$%$rF!j&_`WomF=#M~8LGO+@ zk3rvF)T>OKhoMJia(NDe|D(|R7j^5u2)Ylw9sCzVPe5;v@>~Ty1-&EuuZEt3-U9#%G0sY;=an14XhMs}{VetPchj*NF zq(0gIMd(rJ?UC;Y=)U-)oGYQP6o2R!r`V8$-Vt#wfu4ch3H5wC;zZ8n@R7< zzZUuh&<}%u2>pje-TFVn;hhA^*$)12cQ!(A4}A#yGvbeOu7F-QhwH69^zR{16naO* z`9Aci&^w`?8=wc!YinEEdfpTII_RyS9}Yb&{;k>nXy`kkH$XoEx;vN4*{Tiu9|L_P z^a%8&(BshCAG0s3Lk(-Nl*`}c&t6M6)CBXswCE@wN$Spq!O_LJy#Kg#QnqC!u$O z|2l_%8R!kIdHh`u-I>SvM(BPlb9_At-GyEY|Hq(v&|ATO74-Yi&TDHq&b82g4!srh z`%-N9GxY9K9_TxZx;Z%3{MSM6QPi#fYUn=7*$)0ULthEKJ<5L_^d$6- z@V_4Vo6tMK|3L@8`CM-et$BX(5ajOABW+lJ0(uO3E&QK^z7%>Z_$Q!;;$O>gZh*c; z{GmUPV#7(Ohwf4y=sEb4ZtLfM=(7s-#_=D79$CQKbr}3_fgXk44)Je=?n7@c<%gbt z-Vy#cKu50KlC3#Pe5;n_&bQB~l(f-#Hn&2fZK87p6gv zLm!Oui;>Vn=zXA1hn_CP=kakg^qqzHte*wly^zZ@7~|b2=p&)`fj$X(9J+^j<_PF( zp!b755qhc+pXbBFp>Hq5XMH~O$VE~=+<%@6y+8DR=-=i+_n{9)e|Qe`mC*Y@ckq+z z8p4}HE`{T~ehrV02f^`=;H)~%Kfw=#{WI|Wz+0_i&-UPZfgb>VAo#xEM}oHl?*qOM z_zB>9gP#oE5quK(!QiKZgBD=>m0Ygru%8dS40s*zPT&UMbHMnmTtmMA-v;~=*zQ`? z8}LYAU*K&wv;AanAGj2_0=NeF1aLF(Rp4KN9|P;JwcV z_?zH$;O;NjKLYN9yWmw1a{eCpzTg4)8u;4_N~EQPqX0SKD8NxjZ!b=gzqrISeLpd9*&iNwYow2Yw*hy-PXdpCj|6wXPX^DO&gHEK&w#fDPlN9P zo&p~Q9s?f@?twRm|7je5Pw*tTw5JgKFxaEu-N0RNjzZVszz>Jr0Y3sfHRD>pQgd3|4o5Q zf9HWqe-{Psgza;|dw?gWaDGRDhu}TI6X3nT1Mnz#9Qg@*?B7-F;GMyJ_;&%%z<#LM!N-Vw z0>>LGcJOgxkFk9`cp5wgo&ui$o&=u=9)eE-Pk@6K;ERX&2#LHg$?ocw4}-rx(ek~8 z|8|1q2Md2OX8Ga5Ul?zBZ{a^5XL%tb{2~3b*1s-yKSmD#On<~Y2|NM$&)6_l4&9Q_ z(w~=z-+%<4a(;p_@F;MC86rVh@!-^56Rq%Vj+N@8+LDK53xNf0g9lxwAch zR!jbSxt2@*aisTwUt`m)OAP)VFape>J+4K5@zp2Vq3&_vH;u6TCE+&?xBPA4D~4IV zUHI~$mVYAriXoQE{N(GFSNo;Vegxy-F<{jr+-&2syrWIpJ%yirg5?JZpE=la9sk>w zFNt~-^uayg;mAKR`FPuu`wE{l$ns&rCl0hcCcO6m%YEU;9%p%6_%Z!04}^E^XZf|l zyY#jEN5T*3WBCK%k#@Z;-ynRSV=aGP_}<4@F7*@poR2#X7zIjwx{8Y)5gnM`$#Igv zUm?Hv>Z7gUJ>fS++3`{A-y3^bzQ6DlJuN>%`0}GHA1M5a9+t~|S<3TGF+@8P)a`GK zRYl4!rfM%paf2_MR5%C7LDoRNN6`e~_HUwh})k^dTlSN-~vz7Zht*d1H(9{x5gsWuz(4^|%1TAF!(A3(2#AW@^)B>GD zw~+NivsdXHyM?SDnp&lE<`%MkXzF8MC*#Qaq1o&0h|Bt+S?}7%NjWF1;_Weeb#LOb zerWb8om01v^+VID4yLb|H@AM6I!U&l_kW=Hn)}7hD{Y>#JDO8|=EvT&E_R}%M|{QE zyXfy}yXHtxh(AKbSG+8~wrj5A4_EOOFN?43n(O$(RD8wD;%mF+I{r`yez)9Yp&yaD!$@n@wHuZ9sdLsU-7c|+OD~dKUl?Ayez)9Yp&xTui`6S7GK*n z*YO9b_==as*LKZy{DCUI;$`u*U2`3OfQqkpS$u8RT*p67#aFy6zP4+w-O&}yQg?rd9+<~Ri4bu((A&g?kleSJ!N+l z*Zz*OXU^G8`IS9XT*nWT-B(=ud&=%AuKgWl&&=LU`IS9XT*nWT-B(=ud&=%AuKgWl z&&=9Q`IS9XT*nWT-B(=uXXZ)%yk4DBT(|#F*#pIOd|%l;#kIey?V2M&Vg7TzD!<}7 zeyHq$;@aO=c29Bb?`pf|y8P#<@++?6hsqu(uKj&w_Y~LuuC{Bg%Rg6@UvV8jRQ5n| z?e8nQr?~cawOw;ne(y>tKVJ{ZtSIHW{RhhKDz3|uT3#B@S6ur$${t=(nqK>R%AUD= z*ZzUByNc`hsh~8TuekPils&wxG`;rsls$9luKfdLcNN$1Q-eb)O5^#8 zYkx=C!+2?W?e8gjX5p^=17&v=*YQ&eO5^#8Ykx=C!}+D@wZC_(*s=bvxbFW`x0Lz^ zikHRLcFmDM<}<0AReZ(E;%mF+I{s=EU-7c|+OD~df0K%@cv*aH*IdWHQN>rhEWWmD zuH)aJ;wxSjU)wd;@e?Y(;$`u*U2`4(dKF*sviRDrxsHFGim!NCd~MfU$G=v^SG+8~ zwrj5AuTt?9FN?43n(O%2sQ8MP#n*Ptb^ITy_==as*LKZy{2!?JikHRLcFlGCl`6jC zW%0FLa~=O`6<={3KU^#RHP#d;uKRyq**(Q|d{^5wSLM(AxU@Ve#dZ8p*#pJ3zpw0` z;@aQUcFlG9f27KHD)uDLG%ZL0i=>-eFv2a0QdU)epywZE(F zn(OkfQRP=$$M^0k^>-E5?cY)MOjw#;$4@DHsJQkIl-*Zc`+LgnDz5zT$lfDRer^F{7~5g#kIe$?4IJ<-_>@_ zRr#mjdl7thyyNWrEkDtGE_8GM_o4J}h4Sn0I{RJU#IK7K<{RKxr02V%9p_>2r<%ky z;Zn-)W$-tY{*K~*2mb`ftGsjrJKm!z`PPHC2TFZ(QGPwZ`vLi>1jiW;F7d~Kp8=HT z;^!*A#oz(ZK9on>d!6!I1AZS+o^yXv`8@~z3Q(SZe-m7`_Z{#ou;v@=v!<@YRegVj zc>2A%wNLT=`ux;{PF zCjqfq=bWYd=728-@>4vV_kZXA1F-!(J8+y!5m!*Q<4Wk__XBW2e!A(Km*8l1e93b! zf-(>2zk$agsXuvsMo^wJx(?-%{Up!j2uk?}t9bH!kD#>k;mS{*6B3m2j8cB`ypEt8 zhcV?R&;1C>aX3Z!$@4^l{PdXP+=}g${UpyB-349RQBwKI^GnY_mv;2B@{{MFUWYFA z`gQkoH|$?2pS)-PktN(;%KrU}D#zc!KL^VGtwVn$_1*y99w__w>z1#hDxbXP|F9_m+d$nd@|6K$N0@ue)1iFdC*P$8NW-EpL`$S>L$AJThoLSb>zDNcSASr%J@C0 z{N#HA&p|is%J}^XTCcl20?OhvMmgq(20_4{(^Wj{!dmcs@|-X9;+J z%zt-R9}Q~!ScUZW0BxhAAWwnI@wo~7J)qfF=C?)py$1d#puAt}1LgM#c$;UqUR)cE zp49}G?K>2F0FaLg$C(T+<(mq=2q^V?weq_L{C=SHQ_m^C=fVF3G{@q1@w!Hq1Il+&&t68Jg5i-6w)O1_tZ-wa#<{Ij@s;!1g|p{wK^& z01v@Oi$C}&;NC{|pAPOk&HOy@^d{zUv2SMneeeK$1$gW^w*L^^{VDV7!BZ*btHC2L zFkcVu|BQM2ZfH*rFxTzlN%(s&vHfS@$zL#k72JJ|`6uAvubKZ-{K0<@o&tXt+)1;4 z3g4-U|AzS&ut(lvUW4++-e#`Lt9gTL-wl=h_k}&VknIP9hd4eD15YffoL;^!9yyn1 zvHRkCckw-WhW|Le|LWs=)em+?`~8sZAHkl^@eJ(l-fRzhvHkEvnES6V{}legSM2{U z@I-|3m+yUtPkp^v^(K5jHgO5hu#&ek%J)l?(9^*9TDE)m-mG^m^9=0HdY&10dPgXp z86zW+GJHdt*hgj}l@mq}+O@rMs{eV_i+2BZnclgB&%ut`(- z_=^nWm7(wY`6!8cu9S|}OK#!%>o$#1 zzW*Eil#k2ZegD_}3AblCuM3|p<*wr4Q_8-vl!u5{IR8`r!3Or1^I`WH#W$7mP}xIe zcb{edLVm@nv45pdK9Q4(M-Z>D{jf{C)6{oirGCTzN%d4)Q>mN5-3@uT?8>h9vp_%a9aWxaO59Nv!0P*L0Q z;^^o)&d&n|PoW(6{&MrF~mze$o?+)?!NCFhrjG^!RUI9 z<0FpfvY+Sk@Gr|b&P9r^0GD-XC&u#?j_NpX?9cTh?~{(V<#s9WkFG<8@_y;1u**wn z#s0}x`Gv+6(`N_SI^hXiQkiw6&>_eu|Mn}Kf$T3Xjd>SW=}%@^iS=AQY4cYK=77#*i~>Di4Cn*nzyO#4hQK5+1xy1oz#Pz-g8YFlFbed5F`y5O0|Q_J7y^^P z6fh0U0CPa+ROAnIfl;6bi~)UM92fu-zz~=OrhsW+2ABgnQ;|Q=1xA4$Fb4F2abN&U z07GCBm;$DO8DI|RoQC{?E-(u8fH9yCi~|E;0vH05z!WeI%m8yh=XB%`bb(Qz2aExI zU>q0#6TlFd1g3y#UHL5F_0rcRdEB|^C>c39vinD_kK96@2}CYrOe|(}t9T~u0exTs zm;}aJvR|y4F|5H1yahNg+M2oBhB4EMF;T~uh8}^Q0;U__zbB)!7h?(-?!!E6#~9z2 z(QD6`1E$+D59%4+Js8vb!4DYez&r{Jfsy^8AAoc~=RoEzFa~rEg5HraIG8cji80|a z#yi7)2=so8IdG>d^As?7D08P9W7wTBas;D$B(Mi#{3zIaG3J0l6!v2nW5>epM~vPr zj0xzu+n9&ou|CXwV6-puq#*X2kL?M7;Uf0SEn##PGlq?f8Tfg}F^>#n%mH1bj{^f> z0+^nMcxN+4XE6q|fx{V-F-B(sV*(hN2s_Z9#5^^gF^Y6?U~UZS!C0gNdgGuEWy}d5 z%{+>9?pe&8>5M)wGZTK;ju6|GlkGW=?YVOqlXHM4GP-kt(}0s1GgBD7(|~6%CcypE zp(7p5o9%DL4BaE`nx8X;`x`lr@IK;6BPM}Rrl(^=LNImQt7 z4AMD2Dea%*$Y0Jw{$J1||qF=>& z9GF|dJh~kI3GmAqrG8RKFXcP5nfx<%a=QQ5`M-KvwG=h}~aNhw(oM<)k9PsPr zpKgsfXn?Z*DedvESZ5UeH^oI4bk8iUzu*#%A6|)kRxn19;E}UR{r_`K4lvF0hb4+Mf%*Z=3%-h_osaMR9YH0M ze%GrnkHeDDf4YDbaJtOx_D;&1jtA^qf6s`ZWSv`=e*&3J9ZGsx2N%rj;Pj@9rtTy?_hOE78fhj=NiXZ_g0hZIF7~JEe+H@4 zH5AG(>(YYT@qmVuU-A)LKvRWf}t4beW-KT((5Gd&cLzUi{h6V_X?I!>ADt+u+PA_=H6LJNG3n2M2bDYOi zdbw^Sh}ng>+kIUi^v6?3FZcK z>HkS-P5C8#fa`Dp(mOvUW0RlTssf7c}CNHFyIMtN6X?h3ihEB-o=aue$$K^1E|F@>ZCRU;Ro00Be#{Rtu ouJ#YNlsXN_KdSV3NPnc#O +#include +#include +#include +#include +#endif // __linux__ + #include "pal/pal_core.h" #ifdef _WIN32 @@ -62,7 +71,12 @@ freely, subject to the following restrictions: #define PAL_VERSION_STRING "1.0.0" #define PAL_LOG_MSG_SIZE 4096 +#ifdef _WIN32 static volatile LONG s_TlsID = 0; +#elif defined(__linux__) +pthread_key_t s_TLSID = 0; +static pthread_once_t s_TLSCreation = PTHREAD_ONCE_INIT; +#endif // _WIN32 typedef struct { char tmp[PAL_LOG_MSG_SIZE]; @@ -75,6 +89,18 @@ typedef struct { // Internal API // ================================================== +static void destroyTlsData(void* data); + +#ifdef __linux__ +void createTLSID() +{ + if (pthread_key_create(&s_TLSID, destroyTlsData) != 0) { + // FIXME: Use a global log buffer with a mutex + return; + } +} +#endif // __linux__ + static inline void* alignedAlloc( Uint64 size, Uint64 alignment) @@ -86,7 +112,7 @@ static inline void* alignedAlloc( return aligned_alloc(alignment, size); #else void* ptr = nullptr; - posix_memalign(&ptr, alignment); + posix_memalign(&ptr, alignment, size); return ptr; #endif // _MSC_VER } @@ -112,6 +138,8 @@ static inline LogTLSData* getLogTlsData() { #ifdef _WIN32 LogTLSData* data = FlsGetValue((DWORD)s_TlsID); +#elif defined(__linux__) + LogTLSData* data = pthread_getspecific(s_TLSID); #endif // _WIN32 if (!data) { @@ -140,6 +168,9 @@ static inline LogTLSData* getLogTlsData() } } FlsSetValue(s_TlsID, data); +#elif defined(__linux__) + pthread_once(&s_TLSCreation, createTLSID); + pthread_setspecific(s_TLSID, data); #endif // _WIN32 } return data; @@ -149,6 +180,8 @@ static inline void updateLogTlsData(LogTLSData* data) { #ifdef _WIN32 FlsSetValue(s_TlsID, data); +#elif defined(__linux__) + pthread_setspecific(s_TLSID, data); #endif // _WIN32 } @@ -181,6 +214,7 @@ static inline void format( static inline void writeToConsole(LogTLSData* data) { +#ifdef _WIN32 HANDLE console = GetStdHandle(STD_ERROR_HANDLE); int len = MultiByteToWideChar(CP_UTF8, 0, data->buffer, -1, nullptr, 0); if (!len) { @@ -193,6 +227,10 @@ static inline void writeToConsole(LogTLSData* data) } else { OutputDebugStringW(data->wideBuffer); } +#elif defined (__linux__) + fprintf(stdout, "%s", data->buffer); + fflush(stdout); +#endif // _WIN32 } // ================================================== @@ -373,6 +411,10 @@ Uint64 PAL_CALL palGetPerformanceCounter() LARGE_INTEGER counter; QueryPerformanceCounter(&counter); return (Uint64)counter.QuadPart; +#elif defined(__linux__) + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (Uint64)ts.tv_sec * 1000000000LL + (Uint64)ts.tv_nsec; #endif // _WIN32 } @@ -382,5 +424,7 @@ Uint64 PAL_CALL palGetPerformanceFrequency() LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); return (Uint64)frequency.QuadPart; +#elif defined(__linux__) + return 1000000000LL; #endif // _WIN32 } \ No newline at end of file diff --git a/tests/time_test.c b/tests/time_test.c index 81ff7ec..f4898b9 100644 --- a/tests/time_test.c +++ b/tests/time_test.c @@ -37,11 +37,14 @@ bool timeTest() while (totalTime < 5.0) { double now = getTime(&timer); totalTime = now - lastTime; + palLog( - nullptr, - "Frame %d, Total Time %f seconds", - frameCount++, - totalTime); + nullptr, + "Frame %d, Total Time %f seconds", + frameCount, + totalTime); + + frameCount++; } palLog( From af2a2684de5ceeb2259cacfc0fd03090b648f286 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 3 Oct 2025 20:48:14 +0000 Subject: [PATCH 02/30] add linux system --- include/pal/pal_config.h | 2 +- pal.lua | 11 +- pal_config.lua | 2 +- src/system/pal_system_linux.c | 247 ++++++++++++++++++++++++++++++++++ tests/system_test.c | 4 +- tests/tests_main.c | 8 +- 6 files changed, 262 insertions(+), 12 deletions(-) create mode 100644 src/system/pal_system_linux.c diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index a51caab..33ca292 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -2,7 +2,7 @@ // Auto Generated Config Header From pal_config.lua // Must not be edited manually -#define PAL_HAS_SYSTEM 0 +#define PAL_HAS_SYSTEM 1 #define PAL_HAS_THREAD 0 #define PAL_HAS_VIDEO 0 #define PAL_HAS_OPENGL 0 diff --git a/pal.lua b/pal.lua index 0f77413..43921c5 100644 --- a/pal.lua +++ b/pal.lua @@ -61,25 +61,28 @@ project "PAL" if (PAL_BUILD_SYSTEM) then filter {"system:windows", "configurations:*"} - files { "src/system/pal_system_win32.c" } + files { "src/system/pal_system_win32.c" } + + filter {"system:linux", "configurations:*"} + files { "src/system/pal_system_linux.c" } filter {} end if (PAL_BUILD_THREAD) then filter {"system:windows", "configurations:*"} - files { "src/thread/pal_thread_win32.c" } + files { "src/thread/pal_thread_win32.c" } filter {} end if (PAL_BUILD_VIDEO) then filter {"system:windows", "configurations:*"} - files { "src/video/pal_video_win32.c" } + files { "src/video/pal_video_win32.c" } filter {} end if (PAL_BUILD_OPENGL) then filter {"system:windows", "configurations:*"} - files { "src/opengl/pal_opengl_win32.c" } + files { "src/opengl/pal_opengl_win32.c" } filter {} end diff --git a/pal_config.lua b/pal_config.lua index 60c4999..ba2fd81 100644 --- a/pal_config.lua +++ b/pal_config.lua @@ -6,7 +6,7 @@ PAL_BUILD_STATIC = false PAL_BUILD_TESTS = true -- build system module -PAL_BUILD_SYSTEM = false +PAL_BUILD_SYSTEM = true -- build thread module PAL_BUILD_THREAD = false diff --git a/src/system/pal_system_linux.c b/src/system/pal_system_linux.c new file mode 100644 index 0000000..907fcd6 --- /dev/null +++ b/src/system/pal_system_linux.c @@ -0,0 +1,247 @@ + +/** + +Copyright (C) 2025 Nicholas Agbo + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + */ + +// ================================================== +// Includes +// ================================================== + +#include "pal/pal_system.h" + +#include +#include +#include +#include +#include +#include +#include + +// ================================================== +// Typedefs, enums and structs +// ================================================== + +// ================================================== +// Internal API +// ================================================== + +static Uint32 parseCache(const char* path) +{ + long cacheSize = 0; + FILE* file = fopen(path, "r"); + if (!file) { + return 0; + } + char cache[16]; + if (fgets(cache, sizeof(cache), file)) { + // get and convert to KB + char unit; + if (sscanf(cache, "%ld%c", &cacheSize, &unit) == 2) { + // check if size is in MB or KB + if (unit == 'M' || unit == 'm') { + cacheSize *= 1024; + } + } + } + fclose(file); + return cacheSize; +} + +// ================================================== +// Public API +// ================================================== + +PalResult PAL_CALL palGetPlatformInfo(PalPlatformInfo* info) +{ + if (!info) { + return PAL_RESULT_NULL_POINTER; + } + + info->type = PAL_PLATFORM_LINUX; + const char* session = getenv("XDG_SESSION_TYPE"); + if (session) { + if (strcmp(session, "wayland") == 0) { + info->apiType = PAL_PLATFORM_API_WAYLAND; + } else { + info->apiType = PAL_PLATFORM_API_X11; + } + } else { + // default + info->apiType = PAL_PLATFORM_API_X11; + } + + FILE* file = fopen("/etc/os-release", "r"); + if (!file) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + char line[256]; + char name[15]; + char version[15]; + // parse version and name from the release file + while (fgets(line, sizeof(line), file)) { + if (strncmp(line, "NAME=", 5) == 0) { + sscanf(line, "NAME=\"%15[^\"]", name); + + } else if (strncmp(line, "VERSION_ID=", 11) == 0) { + sscanf(line, "VERSION_ID=\"%15[^\"]", version); + } + } + + // combine to get name + snprintf(info->name, PAL_PLATFORM_NAME_SIZE, "%s %s", name, version); + sscanf(version, "%d.%d", &info->version.major, &info->version.minor); + fclose(file); + + // get total memory and disk space for the root drive + struct sysinfo sysInfo; + sysinfo(&sysInfo); + info->totalRAM = (Uint32)(sysInfo.totalram / (1024 * 1024)); + + struct statvfs stats; + if (statvfs("/", &stats) != 0) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + Uint64 size = (stats.f_blocks * stats.f_frsize) / (1024 * 1024 * 1024); + info->totalMemory = (Uint32)size; + return PAL_RESULT_SUCCESS; +} + +PalResult PAL_CALL palGetCPUInfo( + const PalAllocator* allocator, + PalCPUInfo* info) +{ + if (!info) { + return PAL_RESULT_NULL_POINTER; + } + + // check invalid allocator + if (allocator && (!allocator->allocate || !allocator->free)) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + + FILE* file = fopen("/proc/cpuinfo", "r"); + if (!file) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + char line[1024]; + // parse cpu information + while (fgets(line, sizeof(line), file)) { + if (strncmp(line, "vendor_id", 9) == 0) { + sscanf(line, "vendor_id : %15[^\n]", info->vendor); + + } else if (strncmp(line, "model name", 10) == 0) { + sscanf(line, "model name : %63[^\n]", info->model); + + } else if (strncmp(line, "cpu cores", 9) == 0) { + sscanf(line, "cpu cores : %d", &info->numCores); + + } else if (strncmp(line, "flags", 5) == 0) { + // extensions + char* flags = strchr(line, ':'); + if (flags) { + flags++; // skip colon + char* token = strtok(flags, " \t\n"); + while (token) { + if (strcmp(token, "sse") == 0) { + info->features |= PAL_CPU_FEATURE_SSE; + + } else if (strcmp(token, "sse2") == 0) { + info->features |= PAL_CPU_FEATURE_SSE2; + + } else if (strcmp(token, "sse3") == 0) { + info->features |= PAL_CPU_FEATURE_SSE3; + + } else if (strcmp(token, "ssse3") == 0) { + info->features |= PAL_CPU_FEATURE_SSSE3; + + } else if (strcmp(token, "sse4_1") == 0) { + info->features |= PAL_CPU_FEATURE_SSE41; + + } else if (strcmp(token, "sse4_2") == 0) { + info->features |= PAL_CPU_FEATURE_SSE42; + + } else if (strcmp(token, "avx") == 0) { + info->features |= PAL_CPU_FEATURE_AVX; + + } else if (strcmp(token, "avx2") == 0) { + info->features |= PAL_CPU_FEATURE_AVX2; + + } else if (strcmp(token, "avx512f") == 0) { + info->features |= PAL_CPU_FEATURE_AVX512F; + + } else if (strcmp(token, "fma") == 0) { + info->features |= PAL_CPU_FEATURE_FMA3; + + } else if (strcmp(token, "bmi1") == 0) { + info->features |= PAL_CPU_FEATURE_BMI1; + + } else if (strcmp(token, "bmi2") == 0) { + info->features |= PAL_CPU_FEATURE_BMI2; + } + + token = strtok(nullptr, " \t\n"); + } + } + break; // all CPUs are the same + } + } + fclose(file); + + Uint32 l1 = parseCache("/sys/devices/system/cpu/cpu0/cache/index0/size"); + Uint32 l2 = parseCache("/sys/devices/system/cpu/cpu0/cache/index2/size"); + Uint32 l3 = parseCache("/sys/devices/system/cpu/cpu0/cache/index3/size"); + + info->numLogicalProcessors = (Uint32)sysconf(_SC_NPROCESSORS_ONLN); + info->cacheL1 = l1; + info->cacheL2 = l2; + info->cacheL3 = l3; + + // get architecture + struct utsname arch; + if (uname(&arch) != 0) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + if (strcmp(arch.machine, "x86_64") == 0) { + info->architecture = PAL_CPU_ARCH_X86_64; + } + + if (strcmp(arch.machine, "i386") == 0) { + info->architecture = PAL_CPU_ARCH_X86; + } + + if (strcmp(arch.machine, "i686") == 0) { + info->architecture = PAL_CPU_ARCH_X86; + } + + if (strcmp(arch.machine, "armv71") == 0) { + info->architecture = PAL_CPU_ARCH_ARM; + } + + if (strcmp(arch.machine, "aarch64") == 0) { + info->architecture = PAL_CPU_ARCH_ARM64; + } + + return PAL_RESULT_SUCCESS; +} \ No newline at end of file diff --git a/tests/system_test.c b/tests/system_test.c index 794bcb8..a6e3d2b 100644 --- a/tests/system_test.c +++ b/tests/system_test.c @@ -147,11 +147,11 @@ bool systemTest() } if (cpuInfo.features & PAL_CPU_FEATURE_AVX2) { - strcat(instructionSets, "| AVX2"); + strcat(instructionSets, " | AVX2"); } if (cpuInfo.features & PAL_CPU_FEATURE_AVX512F) { - strcat(instructionSets, "| AVX-512F"); + strcat(instructionSets, " | AVX-512F"); } if (cpuInfo.features & PAL_CPU_FEATURE_FMA3) { diff --git a/tests/tests_main.c b/tests/tests_main.c index 53f6831..19397fe 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -9,10 +9,10 @@ int main(int argc, char** argv) palLog(nullptr, "%s: %s", "PAL Version", palGetVersionString()); // core - registerTest("Logger Test", loggerTest); - registerTest("Time Test", timeTest); - registerTest("User Event Test", userEventTest); - registerTest("Event Test", eventTest); + // registerTest("Logger Test", loggerTest); + // registerTest("Time Test", timeTest); + // registerTest("User Event Test", userEventTest); + // registerTest("Event Test", eventTest); #if PAL_HAS_SYSTEM registerTest("System Test", systemTest); From 9de19a6efa8649ff2ab2e73efa63c3063fb5ef18 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 3 Oct 2025 23:28:11 +0000 Subject: [PATCH 03/30] add linux thread --- include/pal/pal_config.h | 2 +- pal.lua | 3 + pal_config.lua | 2 +- src/thread/pal_thread_linux.c | 467 ++++++++++++++++++++++++++++++++++ src/thread/pal_thread_win32.c | 2 +- tests/tests_main.c | 10 +- tests/thread_test.c | 33 --- 7 files changed, 478 insertions(+), 41 deletions(-) create mode 100644 src/thread/pal_thread_linux.c diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index 33ca292..1cfb24e 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -3,6 +3,6 @@ // Must not be edited manually #define PAL_HAS_SYSTEM 1 -#define PAL_HAS_THREAD 0 +#define PAL_HAS_THREAD 1 #define PAL_HAS_VIDEO 0 #define PAL_HAS_OPENGL 0 diff --git a/pal.lua b/pal.lua index 43921c5..9cc309a 100644 --- a/pal.lua +++ b/pal.lua @@ -71,6 +71,9 @@ project "PAL" if (PAL_BUILD_THREAD) then filter {"system:windows", "configurations:*"} files { "src/thread/pal_thread_win32.c" } + + filter {"system:linux", "configurations:*"} + files { "src/thread/pal_thread_linux.c" } filter {} end diff --git a/pal_config.lua b/pal_config.lua index ba2fd81..f752db4 100644 --- a/pal_config.lua +++ b/pal_config.lua @@ -9,7 +9,7 @@ PAL_BUILD_TESTS = true PAL_BUILD_SYSTEM = true -- build thread module -PAL_BUILD_THREAD = false +PAL_BUILD_THREAD = true -- build video module PAL_BUILD_VIDEO = false diff --git a/src/thread/pal_thread_linux.c b/src/thread/pal_thread_linux.c new file mode 100644 index 0000000..17921b6 --- /dev/null +++ b/src/thread/pal_thread_linux.c @@ -0,0 +1,467 @@ + +/** + +Copyright (C) 2025 Nicholas Agbo + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + */ + +// ================================================== +// Includes +// ================================================== + +#define _GNU_SOURCE +#define _POSIX_C_SOURCE 200112L +#include +#include +#include +#include +#include +#include + +#include "pal/pal_thread.h" + +// ================================================== +// Typedefs, enums and structs +// ================================================== + +struct PalMutex { + const PalAllocator* allocator; + pthread_mutex_t handle; +}; + +struct PalCondVar { + const PalAllocator* allocator; + pthread_cond_t handle; +}; + +// ================================================== +// Internal API +// ================================================== + + +// ================================================== +// Public API +// ================================================== + +// ================================================== +// Thread +// ================================================== + +PalResult PAL_CALL palCreateThread( + const PalThreadCreateInfo* info, + PalThread** outThread) +{ + if (!info || !outThread) { + return PAL_RESULT_NULL_POINTER; + } + + if (info->allocator) { + if (!info->allocator->allocate && !info->allocator->free) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + } + + pthread_t thread; + if (info->stackSize == 0) { + if (pthread_create(&thread, nullptr, info->entry, info->arg) != 0) { + return PAL_RESULT_PLATFORM_FAILURE; + } + } else { + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, info->stackSize); + + if (pthread_create(&thread, nullptr, info->entry, info->arg) != 0) { + return PAL_RESULT_PLATFORM_FAILURE; + } + pthread_attr_destroy(&attr); + } + + *outThread = (PalThread*)thread; + return PAL_RESULT_SUCCESS; +} + +PalResult PAL_CALL palJoinThread( + PalThread* thread, + void* retval) +{ + if (!thread) { + return PAL_RESULT_NULL_POINTER; + } + + int ret = 0; + if (retval) { + ret = pthread_join((pthread_t)thread, &retval); + } else { + ret = pthread_join((pthread_t)thread, nullptr); + } + + if (ret == 0) { + return PAL_RESULT_SUCCESS; + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } +} + +void PAL_CALL palDetachThread(PalThread* thread) +{ + if (thread) { + pthread_detach((pthread_t)thread); + } +} + +void PAL_CALL palSleep(Uint64 milliseconds) +{ + usleep(milliseconds * 1000); +} + +void PAL_CALL palYield() +{ + sched_yield(); +} + +PalThread* PAL_CALL palGetCurrentThread() +{ + return (PalThread*)pthread_self(); +} + +PalThreadFeatures PAL_CALL palGetThreadFeatures() +{ + PalThreadFeatures features = 0; + features |= PAL_THREAD_FEATURE_STACK_SIZE; + features |= PAL_THREAD_FEATURE_PRIORITY; + features |= PAL_THREAD_FEATURE_AFFINITY; + features |= PAL_THREAD_FEATURE_NAME; + return features; +} + +PalThreadPriority PAL_CALL palGetThreadPriority(PalThread* thread) +{ + if (!thread) { + return 0; + } + + int policy; + struct sched_param param; + if (pthread_getschedparam((pthread_t)thread, &policy, ¶m) != 0) { + return 0; + } + + // set priority + if (policy == SCHED_OTHER || policy == SCHED_RR) { + if (param.sched_priority == 10) { + return PAL_THREAD_PRIORITY_LOW; + + } else if (param.sched_priority == 0) { + return PAL_THREAD_PRIORITY_NORMAL; + } + + } else { + return PAL_THREAD_PRIORITY_HIGH; + } +} + +Uint64 PAL_CALL palGetThreadAffinity(PalThread* thread) +{ + if (!thread) { + return 0; + } + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + if (pthread_getaffinity_np((pthread_t)thread, sizeof(cpuset), &cpuset) != 0) { + return 0; + } + + Uint64 mask = 0; + for (int i = 0; i < 64; ++i) { + if (CPU_ISSET(i, &cpuset)) { + mask |= (1ULL << 1); + } + } + return mask; +} + +PalResult PAL_CALL palGetThreadName( + PalThread* thread, + Uint64 bufferSize, + Uint64* outSize, + char* outBuffer) +{ + if (!thread) { + return PAL_RESULT_NULL_POINTER; + } + + // see if user provided a buffer and write to it + if (outBuffer && bufferSize > 0) { + if (pthread_getname_np((pthread_t)thread, outBuffer, bufferSize) != 0) { + return PAL_RESULT_INVALID_THREAD; + } + } + + return PAL_RESULT_SUCCESS; +} + +PalResult PAL_CALL palSetThreadPriority( + PalThread* thread, + PalThreadPriority priority) +{ + if (!thread) { + return PAL_RESULT_NULL_POINTER; + } + + switch (priority) { + case PAL_THREAD_PRIORITY_LOW: { + setpriority(PRIO_PROCESS, 0, 10); + break; + } + + case PAL_THREAD_PRIORITY_NORMAL: { + setpriority(PRIO_PROCESS, 0, 0); + break; + } + + case PAL_THREAD_PRIORITY_HIGH: { + struct sched_param param; + param.sched_priority = 10; + int ret = pthread_setschedparam((pthread_t)thread, SCHED_FIFO, ¶m); + if (ret == EPERM) { + return PAL_RESULT_ACCESS_DENIED; + } + } + } + + return PAL_RESULT_SUCCESS; +} + +PalResult PAL_CALL palSetThreadAffinity( + PalThread* thread, + Uint64 mask) +{ + if (!thread) { + return PAL_RESULT_NULL_POINTER; + } + + cpu_set_t cpuset; + CPU_ZERO(&cpuset); + for (int i = 0; i < 64; ++i) { + // check for all bits to see which CPUs will be used + if (mask & (1ULL << i)) { + CPU_SET(i, &cpuset); + } + } + + int ret = pthread_setaffinity_np((pthread_t)thread, sizeof(cpuset), &cpuset); + if (ret == 0) { + return PAL_RESULT_SUCCESS; + } else { + return PAL_RESULT_INVALID_THREAD; + } +} + +PalResult PAL_CALL palSetThreadName( + PalThread* thread, + const char* name) +{ + if (!thread || !name) { + return PAL_RESULT_NULL_POINTER; + } + + int ret = pthread_setname_np((pthread_t)thread, name); + if (ret == 0) { + return PAL_RESULT_SUCCESS; + } else { + return PAL_RESULT_INVALID_THREAD; + } +} + +// ================================================== +// TLS +// ================================================== + +PalTLSId PAL_CALL palCreateTLS(PaTlsDestructorFn destructor) +{ + pthread_key_t key; + if (pthread_key_create(&key, destructor) != 0) { + return 0; + } + return (PalTLSId)key; +} + +void PAL_CALL palDestroyTLS(PalTLSId id) +{ + pthread_key_delete((pthread_key_t)id); +} + +void* PAL_CALL palGetTLS(PalTLSId id) +{ + return pthread_getspecific((pthread_key_t)id); +} + +void PAL_CALL palSetTLS( + PalTLSId id, + void* data) +{ + pthread_setspecific((pthread_key_t)id, data); +} + +// ================================================== +// Mutex +// ================================================== + +PalResult PAL_CALL palCreateMutex( + const PalAllocator* allocator, + PalMutex** outMutex) +{ + if (!outMutex) { + return PAL_RESULT_NULL_POINTER; + } + + if (allocator) { + if (!allocator->allocate && !allocator->free) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + } + + PalMutex* mutex = palAllocate(allocator, sizeof(PalMutex), 0); + if (!mutex) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + pthread_mutex_init(&mutex->handle, nullptr); + mutex->allocator = allocator; + *outMutex = mutex; + return PAL_RESULT_SUCCESS; +} + +void PAL_CALL palDestroyMutex(PalMutex* mutex) +{ + if (mutex) { + pthread_mutex_destroy(&mutex->handle); + palFree(mutex->allocator, mutex); + } +} + +void PAL_CALL palLockMutex(PalMutex* mutex) +{ + if (mutex) { + pthread_mutex_lock(&mutex->handle); + } +} + +void PAL_CALL palUnlockMutex(PalMutex* mutex) +{ + if (mutex) { + pthread_mutex_unlock(&mutex->handle); + } +} + +// ================================================== +// Condition Variable +// ================================================== + +PalResult PAL_CALL palCreateCondVar( + const PalAllocator* allocator, + PalCondVar** outCondVar) +{ + if (!outCondVar) { + return PAL_RESULT_NULL_POINTER; + } + + if (allocator) { + if (!allocator->allocate && !allocator->free) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + } + + PalCondVar* condVar = palAllocate(allocator, sizeof(PalCondVar), 0); + if (!condVar) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + pthread_cond_init(&condVar->handle, nullptr); + condVar->allocator = allocator; + *outCondVar = condVar; + return PAL_RESULT_SUCCESS; +} + +void PAL_CALL palDestroyCondVar(PalCondVar* condVar) +{ + if (condVar) { + pthread_cond_destroy(&condVar->handle); + palFree(condVar->allocator, condVar); + } +} + +PalResult PAL_CALL palWaitCondVar( + PalCondVar* condVar, + PalMutex* mutex) +{ + if (!condVar || !mutex) { + return PAL_RESULT_NULL_POINTER; + } + + int ret = pthread_cond_wait(&condVar->handle, &mutex->handle); + if (ret == 0) { + return PAL_RESULT_SUCCESS; + } else if (ret == ETIMEDOUT) { + return PAL_RESULT_TIMEOUT; + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } +} + +PalResult PAL_CALL palWaitCondVarTimeout( + PalCondVar* condVar, + PalMutex* mutex, + Uint64 milliseconds) +{ + if (!condVar || !mutex) { + return PAL_RESULT_NULL_POINTER; + } + + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + + if (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000; + } + + if (pthread_cond_timedwait(&condVar->handle, &mutex->handle, &ts) != 0) { + return PAL_RESULT_TIMEOUT; + } + return PAL_RESULT_SUCCESS; +} + +void PAL_CALL palSignalCondVar(PalCondVar* condVar) +{ + if (condVar) { + pthread_cond_signal(&condVar->handle); + } +} + +void PAL_CALL palBroadcastCondVar(PalCondVar* condVar) +{ + if (condVar) { + pthread_cond_broadcast(&condVar->handle); + } +} \ No newline at end of file diff --git a/src/thread/pal_thread_win32.c b/src/thread/pal_thread_win32.c index e9976e4..e55a3c2 100644 --- a/src/thread/pal_thread_win32.c +++ b/src/thread/pal_thread_win32.c @@ -139,7 +139,7 @@ PalResult PAL_CALL palCreateThread( } } - *outThread = thread; + *outThread = (PalThread*)thread; return PAL_RESULT_SUCCESS; } diff --git a/tests/tests_main.c b/tests/tests_main.c index 19397fe..ba2e879 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -15,14 +15,14 @@ int main(int argc, char** argv) // registerTest("Event Test", eventTest); #if PAL_HAS_SYSTEM - registerTest("System Test", systemTest); + // registerTest("System Test", systemTest); #endif // PAL_HAS_SYSTEM #if PAL_HAS_THREAD - registerTest("Thread Test", threadTest); - registerTest("TLS Test", tlsTest); - registerTest("Mutex Test", mutexTest); - registerTest("Condvar Test", condvarTest); + // // registerTest("Thread Test", threadTest); + // // registerTest("TLS Test", tlsTest); + // // registerTest("Mutex Test", mutexTest); + // registerTest("Condvar Test", condvarTest); #endif // PAL_HAS_THREAD #if PAL_HAS_VIDEO diff --git a/tests/thread_test.c b/tests/thread_test.c index f5168ab..f016c8f 100644 --- a/tests/thread_test.c +++ b/tests/thread_test.c @@ -5,14 +5,6 @@ #define THREAD_TIME 1000 #define THREAD_COUNT 4 -// clang-format off -static const char* g_ThreadNames[THREAD_COUNT] = { - "Thread1", - "Thread2", - "Thread3", - "Thread4"}; -// clang-format on - static void* PAL_CALL worker(void* arg) { // palLog is thread safe so there should'nt be any race conditions @@ -63,31 +55,6 @@ bool threadTest() } } - // check if we support setting thread names and set for each created thread - PalThreadFeatures features = palGetThreadFeatures(); - if (features & PAL_THREAD_FEATURE_NAME) { - for (Int32 i = 0; i < THREAD_COUNT; i++) { - result = palSetThreadName(threads[i], g_ThreadNames[i]); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to set thread name %s", error); - return false; - } - } - } - - if (features & PAL_THREAD_FEATURE_NAME) { - char buffer[64] = {0}; - for (Int32 i = 0; i < THREAD_COUNT; i++) { - palGetThreadName(threads[i], 64, nullptr, buffer); - palLog( - nullptr, - "Thread %d: (%s) finnished successfully", - i + 1, - buffer); - } - } - palLog(nullptr, "All threads finished successfully"); // detach threads From bc3c2a405291a095ccb1a641b878752eab7aab44 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 4 Oct 2025 10:08:02 +0000 Subject: [PATCH 04/30] fixed CPU architecture --- CHANGELOG.md | 19 +++++++++++++++- src/system/pal_system_win32.c | 41 +++++++++++++++++++++++------------ tests/tests_main.c | 18 +++++++-------- 3 files changed, 54 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 878f7db..1d671fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,4 +14,21 @@ ### Notes - No API or ABI changes -- Safe upgrade from **v1.0** - just rebuild your project after updating. \ No newline at end of file +- Safe upgrade from **v1.0** - just rebuild your project after updating. + +## [1.1.0] - 2025-10-01 + +### Added +- **Build:** Added Linux platform support across all modules. +- **Video:** Added X11-based backend support. +- **Thread:** Added Linux backend support. +- **Opengl:** Added Linux backend support. +- **System:** Added Linux backend support. + +### Changed +- **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. + +### Notes +- No API or ABI changes - existing Windows code remains compatible. +- Linux video support currently targets **X11** only: **Wayland** is planned for future releases. +- Safe upgrade from **v1.0.1** - just rebuild your project after updating. \ No newline at end of file diff --git a/src/system/pal_system_win32.c b/src/system/pal_system_win32.c index 0613f3f..58c5a9f 100644 --- a/src/system/pal_system_win32.c +++ b/src/system/pal_system_win32.c @@ -236,6 +236,33 @@ PalResult PAL_CALL palGetCPUInfo( GetSystemInfo(&sysInfo); info->numLogicalProcessors = sysInfo.dwNumberOfProcessors; + // get architecture + switch (sysInfo.wProcessorArchitecture) { + case PROCESSOR_ARCHITECTURE_INTEL: { + info->architecture = PAL_CPU_ARCH_X86; + break; + } + + case PROCESSOR_ARCHITECTURE_AMD64: { + info->architecture = PAL_CPU_ARCH_X86_64; + break; + } + + case PROCESSOR_ARCHITECTURE_ARM: { + info->architecture = PAL_CPU_ARCH_ARM; + break; + } + + case PROCESSOR_ARCHITECTURE_ARM64: { + info->architecture = PAL_CPU_ARCH_ARM64; + break; + } + + default: { + info->architecture = PAL_CPU_ARCH_UNKNOWN; + } + } + // get cpu info DWORD len = 0; GetLogicalProcessorInformationEx(RelationAll, nullptr, &len); @@ -338,19 +365,5 @@ PalResult PAL_CALL palGetCPUInfo( } info->features = features; - - // check compile time architecture -#if defined(_M_X64) || defined(__x86_64__) - info->architecture = PAL_CPU_ARCH_X86_64; -#elif defined(_M_IX86) || defined(__I386__) - info->architecture = PAL_CPU_ARCH_X86; -#elif defined(_M_ARM64) || defined(__aarch64__) - info->architecture = PAL_CPU_ARCH_ARM64; -#elif defined(_M_ARM) || defined(__arm__) - info->architecture = PAL_CPU_ARCH_ARM; -#else - info->architecture = PAL_CPU_ARCH_UNKNOWN; -#endif // check compile time architecture - return PAL_RESULT_SUCCESS; } \ No newline at end of file diff --git a/tests/tests_main.c b/tests/tests_main.c index ba2e879..53f6831 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -9,20 +9,20 @@ int main(int argc, char** argv) palLog(nullptr, "%s: %s", "PAL Version", palGetVersionString()); // core - // registerTest("Logger Test", loggerTest); - // registerTest("Time Test", timeTest); - // registerTest("User Event Test", userEventTest); - // registerTest("Event Test", eventTest); + registerTest("Logger Test", loggerTest); + registerTest("Time Test", timeTest); + registerTest("User Event Test", userEventTest); + registerTest("Event Test", eventTest); #if PAL_HAS_SYSTEM - // registerTest("System Test", systemTest); + registerTest("System Test", systemTest); #endif // PAL_HAS_SYSTEM #if PAL_HAS_THREAD - // // registerTest("Thread Test", threadTest); - // // registerTest("TLS Test", tlsTest); - // // registerTest("Mutex Test", mutexTest); - // registerTest("Condvar Test", condvarTest); + registerTest("Thread Test", threadTest); + registerTest("TLS Test", tlsTest); + registerTest("Mutex Test", mutexTest); + registerTest("Condvar Test", condvarTest); #endif // PAL_HAS_THREAD #if PAL_HAS_VIDEO From 8dcbbe07053b2619530e3367ea9e481c68e6f8e6 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 4 Oct 2025 12:22:09 +0000 Subject: [PATCH 05/30] system cursors --- CHANGELOG.md | 6 +- include/pal/pal_config.h | 2 +- include/pal/pal_video.h | 42 ++++++++++++++ pal_config.lua | 2 +- src/video/pal_video_win32.c | 54 +++++++++++++++++- tests/system_cursor_test.c | 109 ++++++++++++++++++++++++++++++++++++ tests/tests.h | 1 + tests/tests.lua | 3 +- tests/tests_main.c | 19 ++++--- tests/video_test.c | 62 ++++++++++---------- 10 files changed, 255 insertions(+), 45 deletions(-) create mode 100644 tests/system_cursor_test.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d671fa..acaff2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,16 +18,20 @@ ## [1.1.0] - 2025-10-01 -### Added +### Features - **Build:** Added Linux platform support across all modules. - **Video:** Added X11-based backend support. - **Thread:** Added Linux backend support. - **Opengl:** Added Linux backend support. - **System:** Added Linux backend support. +- **Video:** Added **palCreateCursorFrom()** to create system cursors. ### Changed - **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. +### Fixed +- Fixed a bug where **enter modal mode and exit modal mode** operations triggered only one event. + ### Notes - No API or ABI changes - existing Windows code remains compatible. - Linux video support currently targets **X11** only: **Wayland** is planned for future releases. diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index 1cfb24e..ebe01c8 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -4,5 +4,5 @@ #define PAL_HAS_SYSTEM 1 #define PAL_HAS_THREAD 1 -#define PAL_HAS_VIDEO 0 +#define PAL_HAS_VIDEO 1 #define PAL_HAS_OPENGL 0 diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index 5ecae08..b4d6db2 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -466,6 +466,26 @@ typedef enum { PAL_MOUSE_BUTTON_MAX } PalMouseButton; +/** + * @enum PalCursorType + * @brief System cursor types. + * + * All cursor types follow the format `PAL_CURSOR_**` for + * consistency and API use. + * + * @since 1.1 + * @ingroup pal_video + */ +typedef enum { + PAL_CURSOR_ARROW, + PAL_CURSOR_HAND, + PAL_CURSOR_CROSS, + PAL_CURSOR_IBEAM, + PAL_CURSOR_WAIT, + + PAL_CURSOR_MAX +} PalCursorType; + /** * @struct PalMonitorInfo * @brief Information about a monitor. @@ -1531,6 +1551,28 @@ PAL_API PalResult PAL_CALL palCreateCursor( const PalCursorCreateInfo* info, PalCursor** outCursor); +/** + * @brief Create a system cursor. + * + * The video system must be initialized before this call. + * + * @param[in] type The system cursor type to create. Must not be nullptr. + * @param[out] outCursor Pointer to a PalCursor to recieve the created + * cursor. Must not be nullptr. + * + * @return `PAL_RESULT_SUCCESS` on success or a result code on + * failure. Call palFormatResult() for more information. + * + * Thread safety: This function must only be called from the main thread. + * + * @since 1.1 + * @ingroup pal_video + * @sa palDestroyCursor + */ +PAL_API PalResult PAL_CALL palCreateCursorFrom( + PalCursorType type, + PalCursor** outCursor); + /** * @brief Destroy the provided cursor. * diff --git a/pal_config.lua b/pal_config.lua index f752db4..c50620d 100644 --- a/pal_config.lua +++ b/pal_config.lua @@ -12,7 +12,7 @@ PAL_BUILD_SYSTEM = true PAL_BUILD_THREAD = true -- build video module -PAL_BUILD_VIDEO = false +PAL_BUILD_VIDEO = true -- build opengl module PAL_BUILD_OPENGL = false \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 4c8041a..0f42e6b 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -316,7 +316,7 @@ LRESULT CALLBACK videoProc( s_Mouse.push = true; if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; - PalEventType type = PAL_EVENT_WINDOW_MODAL_BEGIN; + PalEventType type = PAL_EVENT_WINDOW_MODAL_END; mode = palGetEventDispatchMode(driver, type); if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; @@ -2673,6 +2673,58 @@ PalResult PAL_CALL palCreateCursor( return PAL_RESULT_SUCCESS; } +PalResult PAL_CALL palCreateCursorFrom( + PalCursorType type, + PalCursor** outCursor) { + + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!outCursor) { + return PAL_RESULT_NULL_POINTER; + } + + HCURSOR cursor = nullptr; + switch (type) { + case PAL_CURSOR_ARROW: { + cursor = LoadCursorW(nullptr, IDC_ARROW); + break; + } + + case PAL_CURSOR_HAND: { + cursor = LoadCursorW(nullptr, IDC_HAND); + break; + } + + case PAL_CURSOR_CROSS: { + cursor = LoadCursorW(nullptr, IDC_CROSS); + break; + } + + case PAL_CURSOR_IBEAM: { + cursor = LoadCursorW(nullptr, IDC_IBEAM); + break; + } + + case PAL_CURSOR_WAIT: { + cursor = LoadCursorW(nullptr, IDC_WAIT); + break; + } + + default: { + return PAL_RESULT_INVALID_ARGUMENT; + } + } + + if (!cursor) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + *outCursor = (PalCursor*)cursor; + return PAL_RESULT_SUCCESS; +} + void PAL_CALL palDestroyCursor(PalCursor* cursor) { if (s_Video.initialized && cursor) { diff --git a/tests/system_cursor_test.c b/tests/system_cursor_test.c new file mode 100644 index 0000000..8650326 --- /dev/null +++ b/tests/system_cursor_test.c @@ -0,0 +1,109 @@ + +#include "pal/pal_video.h" +#include "tests.h" + +bool systemCursorTest() +{ + palLog(nullptr, ""); + palLog(nullptr, "==========================================="); + palLog(nullptr, "System Cursor Test"); + palLog(nullptr, "==========================================="); + palLog(nullptr, ""); + + PalResult result; + PalWindow* window = nullptr; + PalCursor* cursor = nullptr; + PalWindowCreateInfo createInfo = {0}; + bool running = false; + + // event driver + PalEventDriver* eventDriver = nullptr; + PalEventDriverCreateInfo eventDriverCreateInfo = {0}; + + // fill the event driver create info + eventDriverCreateInfo.allocator = nullptr; // default allocator + eventDriverCreateInfo.callback = nullptr; // for callback dispatch + eventDriverCreateInfo.queue = nullptr; // default queue + eventDriverCreateInfo.userData = nullptr; // null + + // create the event driver + result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create event driver %s", error); + return false; + } + + // initialize the video system. We pass the event driver to recieve video + // related events the video does not copy this, this must be valid till the + // video system is shutdown + result = palInitVideo(nullptr, eventDriver); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to initialize video %s", error); + return false; + } + + // create system cursor + result = palCreateCursorFrom(PAL_CURSOR_CROSS, &cursor); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create window cursor %s", error); + return false; + } + + // fill the create info struct + createInfo.monitor = nullptr; // use primary monitor + createInfo.height = 480; + createInfo.width = 640; + createInfo.show = true; + createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; + createInfo.title = "PAL System Cursor Window - Cross"; + + // create the window with the create info struct + result = palCreateWindow(&createInfo, &window); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create window %s", error); + return false; + } + + // set the dispatch mode for window close event to recieve it + palSetEventDispatchMode( + eventDriver, + PAL_EVENT_WINDOW_CLOSE, + PAL_DISPATCH_POLL); // polling + + // set the cursor + palSetWindowCursor(window, cursor); + + running = true; + while (running) { + // update the video system to push video events + palUpdateVideo(); + + PalEvent event; + while (palPollEvent(eventDriver, &event)) { + switch (event.type) { + case PAL_EVENT_WINDOW_CLOSE: { + running = false; + break; + } + } + } + } + + // destroy the window + palDestroyWindow(window); + + // destroy cursor + palDestroyCursor(cursor); + + // shutdown the video system + palShutdownVideo(); + + // destroy the event driver + palDestroyEventDriver(eventDriver); + + return true; +} \ No newline at end of file diff --git a/tests/tests.h b/tests/tests.h index 0f3c3e4..d4ca572 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -35,6 +35,7 @@ bool windowTest(); bool iconTest(); bool cursorTest(); bool inputWindowTest(); +bool systemCursorTest(); // opengl test bool openglTest(); diff --git a/tests/tests.lua b/tests/tests.lua index 25c8109..dc369d8 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -38,7 +38,8 @@ project "tests" "window_test.c", "icon_test.c", "cursor_test.c", - "input_window_test.c" + "input_window_test.c", + "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index 53f6831..f3fbb16 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -9,20 +9,20 @@ int main(int argc, char** argv) palLog(nullptr, "%s: %s", "PAL Version", palGetVersionString()); // core - registerTest("Logger Test", loggerTest); - registerTest("Time Test", timeTest); - registerTest("User Event Test", userEventTest); - registerTest("Event Test", eventTest); + // registerTest("Logger Test", loggerTest); + // registerTest("Time Test", timeTest); + // registerTest("User Event Test", userEventTest); + // registerTest("Event Test", eventTest); #if PAL_HAS_SYSTEM - registerTest("System Test", systemTest); + // registerTest("System Test", systemTest); #endif // PAL_HAS_SYSTEM #if PAL_HAS_THREAD - registerTest("Thread Test", threadTest); - registerTest("TLS Test", tlsTest); - registerTest("Mutex Test", mutexTest); - registerTest("Condvar Test", condvarTest); + // registerTest("Thread Test", threadTest); + // registerTest("TLS Test", tlsTest); + // registerTest("Mutex Test", mutexTest); + // registerTest("Condvar Test", condvarTest); #endif // PAL_HAS_THREAD #if PAL_HAS_VIDEO @@ -33,6 +33,7 @@ int main(int argc, char** argv) registerTest("Icon Test", iconTest); registerTest("Cursor Test", cursorTest); registerTest("Input Window Test", inputWindowTest); + registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL diff --git a/tests/video_test.c b/tests/video_test.c index 423ece9..8bdd4fd 100644 --- a/tests/video_test.c +++ b/tests/video_test.c @@ -25,127 +25,127 @@ bool videoTest() features = palGetVideoFeatures(); palLog(nullptr, "Supported Video Features:"); if (features & PAL_VIDEO_FEATURE_HIGH_DPI) { - palLog(nullptr, "High DPI windows"); + palLog(nullptr, " High DPI windows"); } if (features & PAL_VIDEO_FEATURE_MONITOR_SET_ORIENTATION) { - palLog(nullptr, "Setting monitor orientation"); + palLog(nullptr, " Setting monitor orientation"); } if (features & PAL_VIDEO_FEATURE_MONITOR_GET_ORIENTATION) { - palLog(nullptr, "Getting monitor orientation"); + palLog(nullptr, " Getting monitor orientation"); } if (features & PAL_VIDEO_FEATURE_BORDERLESS_WINDOW) { - palLog(nullptr, "Borderless windows"); + palLog(nullptr, " Borderless windows"); } if (features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW) { - palLog(nullptr, "Transparent windows"); + palLog(nullptr, " Transparent windows"); } if (features & PAL_VIDEO_FEATURE_TOOL_WINDOW) { - palLog(nullptr, "Tool windows"); + palLog(nullptr, " Tool windows"); } if (features & PAL_VIDEO_FEATURE_MONITOR_SET_MODE) { - palLog(nullptr, "Setting monitor display mode"); + palLog(nullptr, " Setting monitor display mode"); } if (features & PAL_VIDEO_FEATURE_MONITOR_GET_MODE) { - palLog(nullptr, "Getting monitor display mode"); + palLog(nullptr, " Getting monitor display mode"); } if (features & PAL_VIDEO_FEATURE_MULTI_MONITORS) { - palLog(nullptr, "Multi monitors"); + palLog(nullptr, " Multi monitors"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_SIZE) { - palLog(nullptr, "Setting window size"); + palLog(nullptr, " Setting window size"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_SIZE) { - palLog(nullptr, "Getting window size"); + palLog(nullptr, " Getting window size"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_POS) { - palLog(nullptr, "Setting window position"); + palLog(nullptr, " Setting window position"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_POS) { - palLog(nullptr, "Getting window position"); + palLog(nullptr, " Getting window position"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE) { - palLog(nullptr, "Setting window state"); + palLog(nullptr, " Setting window state"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_STATE) { - palLog(nullptr, "Getting window state"); + palLog(nullptr, " Getting window state"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY) { - palLog(nullptr, "Setting window visibility"); + palLog(nullptr, " Setting window visibility"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY) { - palLog(nullptr, "Getting window visibility"); + palLog(nullptr, " Getting window visibility"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_TITLE) { - palLog(nullptr, "Setting window title"); + palLog(nullptr, " Setting window title"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_TITLE) { - palLog(nullptr, "Getting window title"); + palLog(nullptr, " Getting window title"); } if (features & PAL_VIDEO_FEATURE_NO_MINIMIZEBOX) { - palLog(nullptr, "No minimize box for windows"); + palLog(nullptr, " No minimize box for windows"); } if (features & PAL_VIDEO_FEATURE_NO_MAXIMIZEBOX) { - palLog(nullptr, "No maximize box for windows"); + palLog(nullptr, " No maximize box for windows"); } if (features & PAL_VIDEO_FEATURE_CLIP_CURSOR) { - palLog(nullptr, "Clipping cursor (mouse)"); + palLog(nullptr, " Clipping cursor (mouse)"); } if (features & PAL_VIDEO_FEATURE_WINDOW_FLASH_CAPTION) { - palLog(nullptr, "Window titlebar flashing"); + palLog(nullptr, " Window titlebar flashing"); } if (features & PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY) { - palLog(nullptr, "Window icon on taskbar flashing"); + palLog(nullptr, " Window icon on taskbar flashing"); } if (features & PAL_VIDEO_FEATURE_WINDOW_FLASH_INTERVAL) { - palLog(nullptr, "Setting window flash interval"); + palLog(nullptr, " Setting window flash interval"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS) { - palLog(nullptr, "Setting input window"); + palLog(nullptr, " Setting input window"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS) { - palLog(nullptr, "Getting input window"); + palLog(nullptr, " Getting input window"); } if (features & PAL_VIDEO_FEATURE_WINDOW_SET_STYLE) { - palLog(nullptr, "Setting window style"); + palLog(nullptr, " Setting window style"); } if (features & PAL_VIDEO_FEATURE_WINDOW_GET_STYLE) { - palLog(nullptr, "Getting window style"); + palLog(nullptr, " Getting window style"); } if (features & PAL_VIDEO_FEATURE_CURSOR_SET_POS) { - palLog(nullptr, "Setting cursor position"); + palLog(nullptr, " Setting cursor position"); } if (features & PAL_VIDEO_FEATURE_CURSOR_GET_POS) { - palLog(nullptr, "Getting cursor position"); + palLog(nullptr, " Getting cursor position"); } // shutdown the video system From d02adaa741c343abf06510c9229d3cbc2168e27b Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 4 Oct 2025 18:46:55 +0000 Subject: [PATCH 06/30] x11 features --- pal.lua | 27 +++++ src/video/pal_video_linux.c | 201 ++++++++++++++++++++++++++++++++++++ src/video/pal_video_win32.c | 1 - tests/tests.lua | 14 +-- tests/tests_main.c | 14 +-- tests/video_test.c | 1 + 6 files changed, 243 insertions(+), 15 deletions(-) create mode 100644 src/video/pal_video_linux.c diff --git a/pal.lua b/pal.lua index 9cc309a..bf2b63d 100644 --- a/pal.lua +++ b/pal.lua @@ -74,12 +74,39 @@ project "PAL" filter {"system:linux", "configurations:*"} files { "src/thread/pal_thread_linux.c" } + filter {} end if (PAL_BUILD_VIDEO) then filter {"system:windows", "configurations:*"} files { "src/video/pal_video_win32.c" } + + filter {"system:linux", "configurations:*"} + files { "src/video/pal_video_linux.c" } + + -- check for wayland support. This is cross compiler + local paths = { + "/usr/include/wayland-client.h", + "/usr/include/x86_64-linux-gnu/wayland-client.h" + } + + local found = false + for _, path in ipairs(paths) do + local file = io.open(path, "r") + if file then + file:close() + found = true + break + end + end + + if found then + defines { "PAL_HAS_WAYLAND=1" } + else + defines { "PAL_HAS_WAYLAND=0" } + end + filter {} end diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c new file mode 100644 index 0000000..0b84454 --- /dev/null +++ b/src/video/pal_video_linux.c @@ -0,0 +1,201 @@ + +/** + +Copyright (C) 2025 Nicholas Agbo + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + */ + +// ================================================== +// Includes +// ================================================== + +#include "pal/pal_video.h" + +#include +#include +#include + +// X11 headers +#include + +#if PAL_HAS_WAYLAND +#include +#endif // PAL_HAS_WAYLAND + +// ================================================== +// Typedefs, enums and structs +// ================================================== + +typedef struct { + void (*shutdownVideo)(); +} Backend; + +typedef struct { + bool initialized; + PalVideoFeatures features; + const PalAllocator* allocator; + PalEventDriver* eventDriver; + const Backend* backend; + + // we combine both since its not taking that much memory + void* xDisplay; + void* xRootWindow; + + void* wlDisplay; + void* wlCompositor; +} VideoLinux; + +static VideoLinux s_Video = {0}; + +// ================================================== +// X11 +// ================================================== + +typedef Display* (*XOpenDisplayFn)(const char*); +typedef int (*XCloseDisplayFn)(Display*); + +typedef struct { + void* handle; + XOpenDisplayFn openDisplay; + XCloseDisplayFn closeDisplay; +} X11; + +static X11 s_X11 = {0}; + +static void xShutdownVideo() { + s_X11.closeDisplay((Display*)s_Video.xDisplay); +} + +// ================================================== +// Internal API +// ================================================== + +// X11 +static Backend s_XBackend = { + .shutdownVideo = xShutdownVideo +}; + +// TODO: will be iplmented layer +static Backend s_WlBackend = { + .shutdownVideo = nullptr +}; + +// ================================================== +// Public API +// ================================================== + +PalResult PAL_CALL palInitVideo( + const PalAllocator* allocator, + PalEventDriver* eventDriver) +{ + if (s_Video.initialized) { + return PAL_RESULT_SUCCESS; + } + + if (allocator && (!allocator->allocate || !allocator->free)) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + + // get backend type + bool x11 = true; + const char* session = getenv("XDG_SESSION_TYPE"); + if (session) { + if (strcmp(session, "wayland") == 0) { + x11 = false; + } + } + + if (x11) { + // load X11 library + s_X11.handle = dlopen("libX11.so", RTLD_LAZY); + if (!s_X11.handle) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + // load procs + s_X11.openDisplay = (XOpenDisplayFn)dlsym(s_X11.handle, "XOpenDisplay"); + s_X11.closeDisplay = (XCloseDisplayFn)dlsym(s_X11.handle, "XCloseDisplay"); + + // X11 server + Display* display = s_X11.openDisplay(nullptr); + if (!display) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + Window rootWindow = DefaultRootWindow(display); + + // set feature flags + s_Video.features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; + s_Video.features |= PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW; + s_Video.features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; // partial + s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_SET_MODE; + s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_MODE; + s_Video.features |= PAL_VIDEO_FEATURE_MULTI_MONITORS; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_SIZE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_SIZE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_POS; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_POS; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; + + s_Video.features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; + s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; + + s_Video.allocator = allocator; + s_Video.eventDriver = eventDriver; + s_Video.backend = &s_XBackend; + s_Video.initialized = true; + s_Video.xDisplay = display; + s_Video.xRootWindow = (void*)(UintPtr)rootWindow; + + return PAL_RESULT_SUCCESS; + + } else { + // wayland + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } +} + +void PAL_CALL palShutdownVideo() +{ + if (s_Video.initialized) { + s_Video.backend->shutdownVideo(); + } +} + +void PAL_CALL palUpdateVideo(); + +PalVideoFeatures PAL_CALL palGetVideoFeatures() +{ + if (!s_Video.initialized) { + return 0; + } + + return s_Video.features; +} \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 0f42e6b..7d86d87 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1235,7 +1235,6 @@ PalResult PAL_CALL palInitVideo( s_Video.features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_CAPTION; s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_INTERVAL; s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; diff --git a/tests/tests.lua b/tests/tests.lua index dc369d8..862d920 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -33,13 +33,13 @@ project "tests" if (PAL_BUILD_VIDEO) then files { "video_test.c", - "monitor_test.c", - "monitor_mode_test.c", - "window_test.c", - "icon_test.c", - "cursor_test.c", - "input_window_test.c", - "system_cursor_test.c" + -- "monitor_test.c", + -- "monitor_mode_test.c", + -- "window_test.c", + -- "icon_test.c", + -- "cursor_test.c", + -- "input_window_test.c", + -- "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index f3fbb16..1031717 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -27,13 +27,13 @@ int main(int argc, char** argv) #if PAL_HAS_VIDEO registerTest("Video Test", videoTest); - registerTest("Monitor Test", monitorTest); - registerTest("Monitor Mode Test", monitorModeTest); - registerTest("Window Test", windowTest); - registerTest("Icon Test", iconTest); - registerTest("Cursor Test", cursorTest); - registerTest("Input Window Test", inputWindowTest); - registerTest("System Cursor Test", systemCursorTest); + // registerTest("Monitor Test", monitorTest); + // registerTest("Monitor Mode Test", monitorModeTest); + // registerTest("Window Test", windowTest); + // registerTest("Icon Test", iconTest); + // registerTest("Cursor Test", cursorTest); + // registerTest("Input Window Test", inputWindowTest); + // registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL diff --git a/tests/video_test.c b/tests/video_test.c index 8bdd4fd..eb12f09 100644 --- a/tests/video_test.c +++ b/tests/video_test.c @@ -150,5 +150,6 @@ bool videoTest() // shutdown the video system palShutdownVideo(); + return true; } \ No newline at end of file From fddb4aa6d9f90053f966076d13c5ca0c43a83684 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 4 Oct 2025 23:33:48 +0000 Subject: [PATCH 07/30] x11 monitor --- src/thread/pal_thread_linux.c | 35 ++- src/video/pal_video_linux.c | 421 +++++++++++++++++++++++++++++----- tests/monitor_test.c | 1 + tests/tests.lua | 2 +- tests/tests_main.c | 4 +- 5 files changed, 385 insertions(+), 78 deletions(-) diff --git a/src/thread/pal_thread_linux.c b/src/thread/pal_thread_linux.c index 17921b6..c622d3c 100644 --- a/src/thread/pal_thread_linux.c +++ b/src/thread/pal_thread_linux.c @@ -40,6 +40,9 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== +#define TO_HANDLE(type, val) ((type*)(UintPtr)(val)) +#define FROM_HANDLE(type, handle) ((type)(UintPtr)(handle)) + struct PalMutex { const PalAllocator* allocator; pthread_mutex_t handle; @@ -82,6 +85,7 @@ PalResult PAL_CALL palCreateThread( if (pthread_create(&thread, nullptr, info->entry, info->arg) != 0) { return PAL_RESULT_PLATFORM_FAILURE; } + } else { pthread_attr_t attr; pthread_attr_init(&attr); @@ -92,8 +96,8 @@ PalResult PAL_CALL palCreateThread( } pthread_attr_destroy(&attr); } - - *outThread = (PalThread*)thread; + + *outThread = TO_HANDLE(PalThread, thread); return PAL_RESULT_SUCCESS; } @@ -106,10 +110,11 @@ PalResult PAL_CALL palJoinThread( } int ret = 0; + pthread_t _thread = FROM_HANDLE(pthread_t, thread); if (retval) { - ret = pthread_join((pthread_t)thread, &retval); + ret = pthread_join(_thread, &retval); } else { - ret = pthread_join((pthread_t)thread, nullptr); + ret = pthread_join(_thread, nullptr); } if (ret == 0) { @@ -122,7 +127,7 @@ PalResult PAL_CALL palJoinThread( void PAL_CALL palDetachThread(PalThread* thread) { if (thread) { - pthread_detach((pthread_t)thread); + pthread_detach(FROM_HANDLE(pthread_t, thread)); } } @@ -138,7 +143,7 @@ void PAL_CALL palYield() PalThread* PAL_CALL palGetCurrentThread() { - return (PalThread*)pthread_self(); + return TO_HANDLE(PalThread, pthread_self()); } PalThreadFeatures PAL_CALL palGetThreadFeatures() @@ -159,7 +164,8 @@ PalThreadPriority PAL_CALL palGetThreadPriority(PalThread* thread) int policy; struct sched_param param; - if (pthread_getschedparam((pthread_t)thread, &policy, ¶m) != 0) { + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + if (pthread_getschedparam(_thread, &policy, ¶m) != 0) { return 0; } @@ -185,7 +191,8 @@ Uint64 PAL_CALL palGetThreadAffinity(PalThread* thread) cpu_set_t cpuset; CPU_ZERO(&cpuset); - if (pthread_getaffinity_np((pthread_t)thread, sizeof(cpuset), &cpuset) != 0) { + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + if (pthread_getaffinity_np(_thread, sizeof(cpuset), &cpuset) != 0) { return 0; } @@ -210,7 +217,8 @@ PalResult PAL_CALL palGetThreadName( // see if user provided a buffer and write to it if (outBuffer && bufferSize > 0) { - if (pthread_getname_np((pthread_t)thread, outBuffer, bufferSize) != 0) { + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + if (pthread_getname_np(_thread, outBuffer, bufferSize) != 0) { return PAL_RESULT_INVALID_THREAD; } } @@ -240,7 +248,8 @@ PalResult PAL_CALL palSetThreadPriority( case PAL_THREAD_PRIORITY_HIGH: { struct sched_param param; param.sched_priority = 10; - int ret = pthread_setschedparam((pthread_t)thread, SCHED_FIFO, ¶m); + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + int ret = pthread_setschedparam(_thread, SCHED_FIFO, ¶m); if (ret == EPERM) { return PAL_RESULT_ACCESS_DENIED; } @@ -267,7 +276,8 @@ PalResult PAL_CALL palSetThreadAffinity( } } - int ret = pthread_setaffinity_np((pthread_t)thread, sizeof(cpuset), &cpuset); + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + int ret = pthread_setaffinity_np(_thread, sizeof(cpuset), &cpuset); if (ret == 0) { return PAL_RESULT_SUCCESS; } else { @@ -283,7 +293,8 @@ PalResult PAL_CALL palSetThreadName( return PAL_RESULT_NULL_POINTER; } - int ret = pthread_setname_np((pthread_t)thread, name); + pthread_t _thread = FROM_HANDLE(pthread_t, thread); + int ret = pthread_setname_np(_thread, name); if (ret == 0) { return PAL_RESULT_SUCCESS; } else { diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 0b84454..8f064bc 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -33,6 +33,7 @@ freely, subject to the following restrictions: // X11 headers #include +#include #if PAL_HAS_WAYLAND #include @@ -42,8 +43,20 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== +#define TO_HANDLE(type, val) ((type*)(UintPtr)(val)) +#define FROM_HANDLE(type, handle) ((type)(UintPtr)(handle)) + typedef struct { void (*shutdownVideo)(); + PalResult (*enumerateMonitors)( + Int32* count, + PalMonitor** outMonitors); + + PalResult (*getPrimaryMonitor)(PalMonitor** outMonitor); + PalResult (*getMonitorInfo)( + PalMonitor* monitor, + PalMonitorInfo* info); + } Backend; typedef struct { @@ -70,30 +83,312 @@ static VideoLinux s_Video = {0}; typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); +typedef XRRScreenResources* (*XRRGetScreenResourcesFn)( + Display*, + Window); + +typedef RROutput (*XRRGetOutputPrimaryFn)( + Display*, + Window); + +typedef XRROutputInfo* (*XRRGetOutputInfoFn)( + Display*, + XRRScreenResources*, + RROutput); + +typedef XRRCrtcInfo* (*XRRGetCrtcInfoFn)( + Display*, + XRRScreenResources*, + RRCrtc); + +typedef void (*XRRFreeScreenResourcesFn)( + XRRScreenResources*); + +typedef void (*XRRFreeOutputInfoFn)( + XRROutputInfo*); + +typedef void (*XRRFreeCrtcInfoFn)( + XRRCrtcInfo*); + typedef struct { void* handle; + void* xrandr; XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; + + XRRGetScreenResourcesFn getScreenResources; + XRRGetOutputPrimaryFn getOutputPrimary; + XRRGetOutputInfoFn getOutputInfo; + XRRGetCrtcInfoFn getCrtcInfo; + XRRFreeScreenResourcesFn freeScreenResources; + XRRFreeOutputInfoFn freeOutputInfo; + XRRFreeCrtcInfoFn freeCrtcInfo; } X11; static X11 s_X11 = {0}; -static void xShutdownVideo() { +static PalResult xInitVideo() +{ + // load X11 library + s_X11.handle = dlopen("libX11.so", RTLD_LAZY); + if (!s_X11.handle) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + s_X11.xrandr = dlopen("libXrandr.so.2", RTLD_LAZY); + if (!s_X11.xrandr) { + s_X11.xrandr = dlopen("libXrandr.so", RTLD_LAZY); + } + + // load procs + s_X11.openDisplay = (XOpenDisplayFn)dlsym( + s_X11.handle, + "XOpenDisplay"); + + s_X11.closeDisplay = (XCloseDisplayFn)dlsym( + s_X11.handle, + "XCloseDisplay"); + + // X11 server + Display* display = s_X11.openDisplay(nullptr); + if (!display) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + Window rootWindow = DefaultRootWindow(display); + + // load Xrandr functions + s_X11.getScreenResources = (XRRGetScreenResourcesFn)dlsym( + s_X11.xrandr, + "XRRGetScreenResources"); + + s_X11.getOutputPrimary = (XRRGetOutputPrimaryFn)dlsym( + s_X11.xrandr, + "XRRGetOutputPrimary"); + + s_X11.getOutputInfo = (XRRGetOutputInfoFn)dlsym( + s_X11.xrandr, + "XRRGetOutputInfo"); + + s_X11.getCrtcInfo = (XRRGetCrtcInfoFn)dlsym( + s_X11.xrandr, + "XRRGetCrtcInfo"); + + s_X11.freeScreenResources = (XRRFreeScreenResourcesFn)dlsym( + s_X11.xrandr, + "XRRFreeScreenResources"); + + s_X11.freeOutputInfo = (XRRFreeOutputInfoFn)dlsym( + s_X11.xrandr, + "XRRFreeScreenResources"); + + s_X11.freeCrtcInfo = (XRRFreeCrtcInfoFn)dlsym( + s_X11.xrandr, + "XRRFreeCrtcInfo"); + + // set feature flags + if (s_X11.getScreenResources) { + s_Video.features |= PAL_VIDEO_FEATURE_MULTI_MONITORS; + } + + s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_ORIENTATION; + s_Video.features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; + s_Video.features |= PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW; + s_Video.features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; // partial + s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_SET_MODE; + s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_MODE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_SIZE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_SIZE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_POS; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_POS; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; + + s_Video.features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; // partial + s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; + s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; + + s_Video.xDisplay = display; + s_Video.xRootWindow = TO_HANDLE(void, rootWindow); + return PAL_RESULT_SUCCESS; +} + +static void xShutdownVideo() +{ s_X11.closeDisplay((Display*)s_Video.xDisplay); + dlclose(s_X11.handle); + dlclose(s_X11.xrandr); +} + +PalResult xEnumerateMonitors( + Int32* count, + PalMonitor** outMonitors) +{ + int _count = 0; + int maxCount = outMonitors ? *count : 0; + XRRScreenResources* resources = s_X11.getScreenResources( + (Display*)s_Video.xDisplay, + FROM_HANDLE(Window, s_Video.xRootWindow)); + + for (int i = 0; i < resources->noutput; ++i) { + RROutput output = resources->outputs[i]; + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + (Display*)s_Video.xDisplay, + resources, + output); + + if (outputInfo->connection == RR_Connected && + outputInfo->crtc != None) { + // a monitor + if (outMonitors) { + if (_count < maxCount) { + outMonitors[_count] = TO_HANDLE(PalMonitor, output); + } + } + _count++; + } + } + + if (!outMonitors) { + *count = _count; + } + return PAL_RESULT_SUCCESS; +} + +PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) +{ + // get the primary monitor + RROutput primary = s_X11.getOutputPrimary( + (Display*)s_Video.xDisplay, + FROM_HANDLE(Window, s_Video.xRootWindow)); + + if (primary) { + *outMonitor = TO_HANDLE(PalMonitor, primary); + return PAL_RESULT_SUCCESS; + } + + // primary monitor not set + XRRScreenResources* resources = s_X11.getScreenResources( + (Display*)s_Video.xDisplay, + FROM_HANDLE(Window, s_Video.xRootWindow)); + + if (resources->noutput > 0) { + *outMonitor = TO_HANDLE(PalMonitor, resources->outputs[0]); + } + + s_X11.freeScreenResources(resources); + return PAL_RESULT_SUCCESS; +} + +PalResult xGetMonitorInfo( + PalMonitor* monitor, + PalMonitorInfo* info) +{ + XRRScreenResources* resources = s_X11.getScreenResources( + (Display*)s_Video.xDisplay, + FROM_HANDLE(Window, s_Video.xRootWindow)); + + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + (Display*)s_Video.xDisplay, + resources, + FROM_HANDLE(RROutput, monitor)); + + strcpy(info->name, outputInfo->name); + + // check if its primary monitor + RROutput primary = s_X11.getOutputPrimary( + (Display*)s_Video.xDisplay, + FROM_HANDLE(Window, s_Video.xRootWindow)); + + if (!primary) { + if (resources->noutput > 0) { + primary = resources->outputs[0]; + } + } + + if (monitor == TO_HANDLE(PalMonitor, primary)) { + info->primary = true; + } + + // get monitor pos and size + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + (Display*)s_Video.xDisplay, + resources, + outputInfo->crtc); + + info->x = crtc->x; + info->y = crtc->y; + info->width = crtc->width; + info->height = crtc->height; + + // get refresh rate + double rate = 0; + for (int i = 0; i < resources->nmode; ++i) { + // check for our monitor + if (resources->modes[i].id == crtc->mode) { + XRRModeInfo* mode = &resources->modes[i]; + double tmp = (double)mode->hTotal * (double)mode->vTotal; + rate = (double)mode->dotClock / tmp; + info->refreshRate = rate + 0.5; + break; + } + } + + // orientation + switch (crtc->rotation) { + case RR_Rotate_0: { + info->orientation = PAL_ORIENTATION_LANDSCAPE; + break; + } + + case RR_Rotate_90: { + info->orientation = PAL_ORIENTATION_PORTRAIT; + break; + } + + case RR_Rotate_180: { + info->orientation = PAL_ORIENTATION_LANDSCAPE_FLIPPED; + break; + } + + case RR_Rotate_270: { + info->orientation = PAL_ORIENTATION_PORTRAIT_FLIPPED; + break; + } + + default: { + info->orientation = PAL_ORIENTATION_LANDSCAPE; + } + } + + // get dpi + double tmp = (double)(crtc->width * 25.4) / (double)outputInfo->mm_width; + info->dpi = (Uint32)tmp; + + s_X11.freeCrtcInfo(crtc); + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + return PAL_RESULT_SUCCESS; } // ================================================== // Internal API // ================================================== -// X11 static Backend s_XBackend = { - .shutdownVideo = xShutdownVideo -}; - -// TODO: will be iplmented layer -static Backend s_WlBackend = { - .shutdownVideo = nullptr + .shutdownVideo = xShutdownVideo, + .enumerateMonitors = xEnumerateMonitors, + .getMonitorInfo = xGetMonitorInfo, + .getPrimaryMonitor = xGetPrimaryMonitor }; // ================================================== @@ -122,64 +417,17 @@ PalResult PAL_CALL palInitVideo( } if (x11) { - // load X11 library - s_X11.handle = dlopen("libX11.so", RTLD_LAZY); - if (!s_X11.handle) { - return PAL_RESULT_PLATFORM_FAILURE; + PalResult ret = xInitVideo(); + if (ret != PAL_RESULT_SUCCESS) { + return ret; } - - // load procs - s_X11.openDisplay = (XOpenDisplayFn)dlsym(s_X11.handle, "XOpenDisplay"); - s_X11.closeDisplay = (XCloseDisplayFn)dlsym(s_X11.handle, "XCloseDisplay"); - - // X11 server - Display* display = s_X11.openDisplay(nullptr); - if (!display) { - return PAL_RESULT_PLATFORM_FAILURE; - } - - Window rootWindow = DefaultRootWindow(display); - - // set feature flags - s_Video.features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; - s_Video.features |= PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW; - s_Video.features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; // partial - s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_SET_MODE; - s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_MODE; - s_Video.features |= PAL_VIDEO_FEATURE_MULTI_MONITORS; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_SIZE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_SIZE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_POS; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_POS; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; - - s_Video.features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; - s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; - - s_Video.allocator = allocator; - s_Video.eventDriver = eventDriver; s_Video.backend = &s_XBackend; - s_Video.initialized = true; - s_Video.xDisplay = display; - s_Video.xRootWindow = (void*)(UintPtr)rootWindow; - - return PAL_RESULT_SUCCESS; - - } else { - // wayland - return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } + + s_Video.allocator = allocator; + s_Video.eventDriver = eventDriver; + s_Video.initialized = true; + return PAL_RESULT_SUCCESS; } void PAL_CALL palShutdownVideo() @@ -198,4 +446,51 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() } return s_Video.features; +} + +PalResult PAL_CALL palEnumerateMonitors( + Int32* count, + PalMonitor** outMonitors) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!count) { + return PAL_RESULT_NULL_POINTER; + } + + if (count == 0 && outMonitors) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + + return s_Video.backend->enumerateMonitors(count, outMonitors); +} + +PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!outMonitor) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getPrimaryMonitor(outMonitor); +} + +PalResult PAL_CALL palGetMonitorInfo( + PalMonitor* monitor, + PalMonitorInfo* info) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!info) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getMonitorInfo(monitor, info); } \ No newline at end of file diff --git a/tests/monitor_test.c b/tests/monitor_test.c index 256e53a..fecbff0 100644 --- a/tests/monitor_test.c +++ b/tests/monitor_test.c @@ -106,5 +106,6 @@ bool monitorTest() // free monitors array palFree(nullptr, monitors); + return true; } \ No newline at end of file diff --git a/tests/tests.lua b/tests/tests.lua index 862d920..9c2f547 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -33,7 +33,7 @@ project "tests" if (PAL_BUILD_VIDEO) then files { "video_test.c", - -- "monitor_test.c", + "monitor_test.c", -- "monitor_mode_test.c", -- "window_test.c", -- "icon_test.c", diff --git a/tests/tests_main.c b/tests/tests_main.c index 1031717..ff5cd0e 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -26,8 +26,8 @@ int main(int argc, char** argv) #endif // PAL_HAS_THREAD #if PAL_HAS_VIDEO - registerTest("Video Test", videoTest); - // registerTest("Monitor Test", monitorTest); + // registerTest("Video Test", videoTest); + registerTest("Monitor Test", monitorTest); // registerTest("Monitor Mode Test", monitorModeTest); // registerTest("Window Test", windowTest); // registerTest("Icon Test", iconTest); From 9427f0321126b887a88352210a53414499a04e45 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sun, 5 Oct 2025 16:02:47 +0000 Subject: [PATCH 08/30] linux monitor mode --- src/thread/pal_thread_linux.c | 24 +- src/video/pal_video_linux.c | 431 +++++++++++++++++++++++++++++----- src/video/pal_video_win32.c | 6 +- tests/monitor_mode_test.c | 1 + tests/tests.lua | 2 +- tests/tests_main.c | 4 +- 6 files changed, 398 insertions(+), 70 deletions(-) diff --git a/src/thread/pal_thread_linux.c b/src/thread/pal_thread_linux.c index c622d3c..50dd7ae 100644 --- a/src/thread/pal_thread_linux.c +++ b/src/thread/pal_thread_linux.c @@ -40,8 +40,8 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== -#define TO_HANDLE(type, val) ((type*)(UintPtr)(val)) -#define FROM_HANDLE(type, handle) ((type)(UintPtr)(handle)) +#define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) +#define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) struct PalMutex { const PalAllocator* allocator; @@ -97,7 +97,7 @@ PalResult PAL_CALL palCreateThread( pthread_attr_destroy(&attr); } - *outThread = TO_HANDLE(PalThread, thread); + *outThread = TO_PAL_HANDLE(PalThread, thread); return PAL_RESULT_SUCCESS; } @@ -110,7 +110,7 @@ PalResult PAL_CALL palJoinThread( } int ret = 0; - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); if (retval) { ret = pthread_join(_thread, &retval); } else { @@ -127,7 +127,7 @@ PalResult PAL_CALL palJoinThread( void PAL_CALL palDetachThread(PalThread* thread) { if (thread) { - pthread_detach(FROM_HANDLE(pthread_t, thread)); + pthread_detach(FROM_PAL_HANDLE(pthread_t, thread)); } } @@ -143,7 +143,7 @@ void PAL_CALL palYield() PalThread* PAL_CALL palGetCurrentThread() { - return TO_HANDLE(PalThread, pthread_self()); + return TO_PAL_HANDLE(PalThread, pthread_self()); } PalThreadFeatures PAL_CALL palGetThreadFeatures() @@ -164,7 +164,7 @@ PalThreadPriority PAL_CALL palGetThreadPriority(PalThread* thread) int policy; struct sched_param param; - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); if (pthread_getschedparam(_thread, &policy, ¶m) != 0) { return 0; } @@ -191,7 +191,7 @@ Uint64 PAL_CALL palGetThreadAffinity(PalThread* thread) cpu_set_t cpuset; CPU_ZERO(&cpuset); - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); if (pthread_getaffinity_np(_thread, sizeof(cpuset), &cpuset) != 0) { return 0; } @@ -217,7 +217,7 @@ PalResult PAL_CALL palGetThreadName( // see if user provided a buffer and write to it if (outBuffer && bufferSize > 0) { - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); if (pthread_getname_np(_thread, outBuffer, bufferSize) != 0) { return PAL_RESULT_INVALID_THREAD; } @@ -248,7 +248,7 @@ PalResult PAL_CALL palSetThreadPriority( case PAL_THREAD_PRIORITY_HIGH: { struct sched_param param; param.sched_priority = 10; - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); int ret = pthread_setschedparam(_thread, SCHED_FIFO, ¶m); if (ret == EPERM) { return PAL_RESULT_ACCESS_DENIED; @@ -276,7 +276,7 @@ PalResult PAL_CALL palSetThreadAffinity( } } - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); int ret = pthread_setaffinity_np(_thread, sizeof(cpuset), &cpuset); if (ret == 0) { return PAL_RESULT_SUCCESS; @@ -293,7 +293,7 @@ PalResult PAL_CALL palSetThreadName( return PAL_RESULT_NULL_POINTER; } - pthread_t _thread = FROM_HANDLE(pthread_t, thread); + pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); int ret = pthread_setname_np(_thread, name); if (ret == 0) { return PAL_RESULT_SUCCESS; diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 8f064bc..f166d9e 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -43,20 +43,17 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== -#define TO_HANDLE(type, val) ((type*)(UintPtr)(val)) -#define FROM_HANDLE(type, handle) ((type)(UintPtr)(handle)) +#define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) +#define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) typedef struct { void (*shutdownVideo)(); - PalResult (*enumerateMonitors)( - Int32* count, - PalMonitor** outMonitors); - - PalResult (*getPrimaryMonitor)(PalMonitor** outMonitor); - PalResult (*getMonitorInfo)( - PalMonitor* monitor, - PalMonitorInfo* info); - + PalResult (*enumerateMonitors)(Int32*, PalMonitor**); + PalResult (*getPrimaryMonitor)(PalMonitor**); + PalResult (*getMonitorInfo)(PalMonitor*, PalMonitorInfo*); + PalResult (*enumerateMonitorModes)(PalMonitor*, Int32*, PalMonitorMode*); + PalResult (*getCurrentMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*setMonitorMode)(PalMonitor*, PalMonitorMode*); } Backend; typedef struct { @@ -65,24 +62,30 @@ typedef struct { const PalAllocator* allocator; PalEventDriver* eventDriver; const Backend* backend; - - // we combine both since its not taking that much memory - void* xDisplay; - void* xRootWindow; - - void* wlDisplay; - void* wlCompositor; } VideoLinux; static VideoLinux s_Video = {0}; -// ================================================== -// X11 -// ================================================== - typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); +typedef int (*XGetWindowAttributesFn)( + Display*, + Window, + XWindowAttributes*); + +typedef int (*XRRSetCrtcConfigFn)( + Display*, + XRRScreenResources*, + RRCrtc, + Time, + int, + int, + RRMode, + Rotation, + RROutput*, + int); + typedef XRRScreenResources* (*XRRGetScreenResourcesFn)( Display*, Window); @@ -111,10 +114,15 @@ typedef void (*XRRFreeCrtcInfoFn)( XRRCrtcInfo*); typedef struct { + int bpp; void* handle; void* xrandr; + Display* display; + Window root; XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; + XGetWindowAttributesFn getWindowAttributes; + XRRSetCrtcConfigFn setCrtcConfig; XRRGetScreenResourcesFn getScreenResources; XRRGetOutputPrimaryFn getOutputPrimary; @@ -127,6 +135,57 @@ typedef struct { static X11 s_X11 = {0}; +// ================================================== +// Internal API +// ================================================== + +static int compareModes(const void* a, const void* b) +{ + const PalMonitorMode* mode1 = (const PalMonitorMode*)a; + const PalMonitorMode* mode2 = (const PalMonitorMode*)b; + + // compare fields + if (mode1->width != mode2->width) { + return mode1->width - mode2->width; + } + + if (mode1->height != mode2->height) { + return mode1->height - mode2->height; + } + + if (mode1->refreshRate != mode2->refreshRate) { + return mode1->refreshRate - mode2->refreshRate; + } + + if (mode1->bpp != mode2->bpp) { + return mode1->bpp - mode2->bpp; + } +} + +static RRMode xFindMode( + XRRScreenResources* resources, + const PalMonitorMode* mode) +{ + for (int i = 0; i < resources->nmode; ++i) { + XRRModeInfo* info = &resources->modes[i]; + + double tmp = (double)info->hTotal * (double)info->vTotal; + double rate = (double)info->dotClock / tmp; + + // compare with width, height and refresh rate + if (info->width == mode->width && + info->height == mode->height && + (Uint32)(rate + 0.5) == mode->refreshRate) { + return info->id; + } + } + return None; +} + +// ================================================== +// X11 +// ================================================== + static PalResult xInitVideo() { // load X11 library @@ -149,13 +208,21 @@ static PalResult xInitVideo() s_X11.handle, "XCloseDisplay"); + s_X11.getWindowAttributes = (XGetWindowAttributesFn)dlsym( + s_X11.handle, + "XGetWindowAttributes"); + + s_X11.setCrtcConfig = (XRRSetCrtcConfigFn)dlsym( + s_X11.handle, + "XRRSetCrtcConfig"); + // X11 server - Display* display = s_X11.openDisplay(nullptr); - if (!display) { + s_X11.display = s_X11.openDisplay(nullptr); + if (!s_X11.display) { return PAL_RESULT_PLATFORM_FAILURE; } - Window rootWindow = DefaultRootWindow(display); + s_X11.root = DefaultRootWindow(s_X11.display); // load Xrandr functions s_X11.getScreenResources = (XRRGetScreenResourcesFn)dlsym( @@ -217,32 +284,35 @@ static PalResult xInitVideo() s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; - s_Video.xDisplay = display; - s_Video.xRootWindow = TO_HANDLE(void, rootWindow); + // get root window bpp + XWindowAttributes attr; + s_X11.getWindowAttributes(s_X11.display, s_X11.root, &attr); + s_X11.bpp = attr.depth; + return PAL_RESULT_SUCCESS; } static void xShutdownVideo() { - s_X11.closeDisplay((Display*)s_Video.xDisplay); + s_X11.closeDisplay(s_X11.display); dlclose(s_X11.handle); dlclose(s_X11.xrandr); } -PalResult xEnumerateMonitors( +static PalResult xEnumerateMonitors( Int32* count, PalMonitor** outMonitors) { int _count = 0; int maxCount = outMonitors ? *count : 0; XRRScreenResources* resources = s_X11.getScreenResources( - (Display*)s_Video.xDisplay, - FROM_HANDLE(Window, s_Video.xRootWindow)); + s_X11.display, + s_X11.root); for (int i = 0; i < resources->noutput; ++i) { RROutput output = resources->outputs[i]; XRROutputInfo* outputInfo = s_X11.getOutputInfo( - (Display*)s_Video.xDisplay, + s_X11.display, resources, output); @@ -251,7 +321,7 @@ PalResult xEnumerateMonitors( // a monitor if (outMonitors) { if (_count < maxCount) { - outMonitors[_count] = TO_HANDLE(PalMonitor, output); + outMonitors[_count] = TO_PAL_HANDLE(PalMonitor, output); } } _count++; @@ -264,50 +334,50 @@ PalResult xEnumerateMonitors( return PAL_RESULT_SUCCESS; } -PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) +static PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) { // get the primary monitor RROutput primary = s_X11.getOutputPrimary( - (Display*)s_Video.xDisplay, - FROM_HANDLE(Window, s_Video.xRootWindow)); + s_X11.display, + s_X11.root); if (primary) { - *outMonitor = TO_HANDLE(PalMonitor, primary); + *outMonitor = TO_PAL_HANDLE(PalMonitor, primary); return PAL_RESULT_SUCCESS; } // primary monitor not set XRRScreenResources* resources = s_X11.getScreenResources( - (Display*)s_Video.xDisplay, - FROM_HANDLE(Window, s_Video.xRootWindow)); + s_X11.display, + s_X11.root); if (resources->noutput > 0) { - *outMonitor = TO_HANDLE(PalMonitor, resources->outputs[0]); + *outMonitor = TO_PAL_HANDLE(PalMonitor, resources->outputs[0]); } s_X11.freeScreenResources(resources); return PAL_RESULT_SUCCESS; } -PalResult xGetMonitorInfo( +static PalResult xGetMonitorInfo( PalMonitor* monitor, PalMonitorInfo* info) { XRRScreenResources* resources = s_X11.getScreenResources( - (Display*)s_Video.xDisplay, - FROM_HANDLE(Window, s_Video.xRootWindow)); + s_X11.display, + s_X11.root); XRROutputInfo* outputInfo = s_X11.getOutputInfo( - (Display*)s_Video.xDisplay, + s_X11.display, resources, - FROM_HANDLE(RROutput, monitor)); + FROM_PAL_HANDLE(RROutput, monitor)); strcpy(info->name, outputInfo->name); // check if its primary monitor RROutput primary = s_X11.getOutputPrimary( - (Display*)s_Video.xDisplay, - FROM_HANDLE(Window, s_Video.xRootWindow)); + s_X11.display, + s_X11.root); if (!primary) { if (resources->noutput > 0) { @@ -315,13 +385,13 @@ PalResult xGetMonitorInfo( } } - if (monitor == TO_HANDLE(PalMonitor, primary)) { + if (monitor == TO_PAL_HANDLE(PalMonitor, primary)) { info->primary = true; } // get monitor pos and size XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - (Display*)s_Video.xDisplay, + s_X11.display, resources, outputInfo->crtc); @@ -377,18 +447,210 @@ PalResult xGetMonitorInfo( s_X11.freeCrtcInfo(crtc); s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); + return PAL_RESULT_SUCCESS; } -// ================================================== -// Internal API -// ================================================== +static PalResult xEnumerateMonitorModes( + PalMonitor* monitor, + Int32* count, + PalMonitorMode* modes) +{ + Int32 modeCount = 0; + int maxModeCount = modes ? *count : 0; + + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + // get the monitor info + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + // get supported display modes + for (int i = 0; i < outputInfo->nmode; ++i) { + for (int j = 0; j < resources->nmode; ++j) { + // get the display mode and check if its for our monitor + XRRModeInfo* info = &resources->modes[j]; + if (info->id == outputInfo->modes[i]) { + // check if user supplied a PalMonitorMode array + if (modes) { + if (modeCount < maxModeCount) { + PalMonitorMode* mode = &modes[modeCount]; + mode->width = info->width; + mode->height = info->height; + mode->bpp = s_X11.bpp; + + double tmp = (double)info->hTotal * (double)info->vTotal; + double rate = (double)info->dotClock / tmp; + mode->refreshRate = rate + 0.5; + } + } + modeCount++; + } + } + } + + if (!modes) { + *count = modeCount; + } + + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + + return PAL_RESULT_SUCCESS; +} + +static PalResult xGetCurrentMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + // get the monitor info + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + // get the current display mode + if (outputInfo->crtc) { + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + outputInfo->crtc); + + if (crtc) { + // find the display mode + XRRModeInfo* info = nullptr; + for (int i = 0; i < resources->nmode; ++i) { + if (resources->modes[i].id == crtc->mode) { + // found + info = &resources->modes[i]; + break; + } + } + + if (mode) { + mode->width = info->width; + mode->height = info->height; + mode->bpp = s_X11.bpp; + + double tmp = (double)info->hTotal * (double)info->vTotal; + double rate = (double)info->dotClock / tmp; + mode->refreshRate = rate + 0.5; + + s_X11.freeCrtcInfo(crtc); + } + } + } + + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + + return PAL_RESULT_SUCCESS; +} + +static PalResult xSetMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + // get the monitor info + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + // find the monitor display mode + RRMode displayMode = xFindMode(resources, mode); + if (displayMode == None) { + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR_MODE; + } + + // apply the display mode + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + outputInfo->crtc); + + RROutput output = FROM_PAL_HANDLE(RROutput, monitor); + int ret = s_X11.setCrtcConfig( + s_X11.display, + resources, + outputInfo->crtc, + CurrentTime, + crtc->x, + crtc->y, + displayMode, + crtc->rotation, + &output, + 1); + + s_X11.freeCrtcInfo(crtc); + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + + if (ret != Success) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + return PAL_RESULT_SUCCESS; +} static Backend s_XBackend = { .shutdownVideo = xShutdownVideo, .enumerateMonitors = xEnumerateMonitors, .getMonitorInfo = xGetMonitorInfo, - .getPrimaryMonitor = xGetPrimaryMonitor + .getPrimaryMonitor = xGetPrimaryMonitor, + .enumerateMonitorModes = xEnumerateMonitorModes, + .getCurrentMonitorMode = xGetCurrentMonitorMode, + .setMonitorMode = xSetMonitorMode }; // ================================================== @@ -460,7 +722,7 @@ PalResult PAL_CALL palEnumerateMonitors( return PAL_RESULT_NULL_POINTER; } - if (count == 0 && outMonitors) { + if (*count == 0 && outMonitors) { return PAL_RESULT_INSUFFICIENT_BUFFER; } @@ -493,4 +755,65 @@ PalResult PAL_CALL palGetMonitorInfo( } return s_Video.backend->getMonitorInfo(monitor, info); +} + +PalResult PAL_CALL palEnumerateMonitorModes( + PalMonitor* monitor, + Int32* count, + PalMonitorMode* modes) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !count) { + return PAL_RESULT_NULL_POINTER; + } + + if (*count == 0 && modes) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + + PalResult ret = s_Video.backend->enumerateMonitorModes( + monitor, + count, + modes + ); + + if (ret == PAL_RESULT_SUCCESS && modes) { + // sort the modes so that they are lowest to highest + qsort(modes, *count, sizeof(PalMonitorMode), compareModes); + } + + return ret; +} + +PalResult PAL_CALL palGetCurrentMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getCurrentMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palSetMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->setMonitorMode(monitor, mode); } \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 7d86d87..623eb0c 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1335,7 +1335,7 @@ PalResult PAL_CALL palEnumerateMonitors( return PAL_RESULT_NULL_POINTER; } - if (count == 0 && outMonitors) { + if (*count == 0 && outMonitors) { return PAL_RESULT_INSUFFICIENT_BUFFER; } @@ -1455,6 +1455,10 @@ PalResult PAL_CALL palEnumerateMonitorModes( return PAL_RESULT_NULL_POINTER; } + if (*count == 0 && modes) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + Int32 modeCount = 0; Int32 maxModes = 0; PalMonitorMode* monitorModes = nullptr; diff --git a/tests/monitor_mode_test.c b/tests/monitor_mode_test.c index c3f81e2..9d375c4 100644 --- a/tests/monitor_mode_test.c +++ b/tests/monitor_mode_test.c @@ -128,5 +128,6 @@ bool monitorModeTest() // free monitors array palFree(nullptr, monitors); + return true; } \ No newline at end of file diff --git a/tests/tests.lua b/tests/tests.lua index 9c2f547..a676ea9 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -34,7 +34,7 @@ project "tests" files { "video_test.c", "monitor_test.c", - -- "monitor_mode_test.c", + "monitor_mode_test.c", -- "window_test.c", -- "icon_test.c", -- "cursor_test.c", diff --git a/tests/tests_main.c b/tests/tests_main.c index ff5cd0e..decf5f6 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -27,8 +27,8 @@ int main(int argc, char** argv) #if PAL_HAS_VIDEO // registerTest("Video Test", videoTest); - registerTest("Monitor Test", monitorTest); - // registerTest("Monitor Mode Test", monitorModeTest); + // registerTest("Monitor Test", monitorTest); + registerTest("Monitor Mode Test", monitorModeTest); // registerTest("Window Test", windowTest); // registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); From d31547c833998b6d8fd48210bfeaf0de19b2315e Mon Sep 17 00:00:00 2001 From: nichcode Date: Mon, 6 Oct 2025 16:42:11 +0000 Subject: [PATCH 09/30] simple x11 window --- include/pal/pal_video.h | 1 + src/video/pal_video_linux.c | 779 +++++++++++++++++++++++++++++++++--- src/video/pal_video_win32.c | 1 + tests/tests.lua | 2 +- tests/tests_main.c | 4 +- tests/window_test.c | 2 +- 6 files changed, 723 insertions(+), 66 deletions(-) diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index b4d6db2..7bf6330 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -111,6 +111,7 @@ typedef enum { PAL_VIDEO_FEATURE_WINDOW_GET_STYLE = PAL_BIT(28), PAL_VIDEO_FEATURE_CURSOR_SET_POS = PAL_BIT(29), PAL_VIDEO_FEATURE_CURSOR_GET_POS = PAL_BIT(30), + PAL_VIDEO_FEATURE_TOPMOST_WINDOW = PAL_BIT(31), } PalVideoFeatures; /** diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index f166d9e..41fc166 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -33,6 +33,8 @@ freely, subject to the following restrictions: // X11 headers #include +#include +#include #include #if PAL_HAS_WAYLAND @@ -45,15 +47,21 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) +#define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) typedef struct { void (*shutdownVideo)(); + void (*updateVideo)(); PalResult (*enumerateMonitors)(Int32*, PalMonitor**); PalResult (*getPrimaryMonitor)(PalMonitor**); PalResult (*getMonitorInfo)(PalMonitor*, PalMonitorInfo*); PalResult (*enumerateMonitorModes)(PalMonitor*, Int32*, PalMonitorMode*); PalResult (*getCurrentMonitorMode)(PalMonitor*, PalMonitorMode*); PalResult (*setMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*validateMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*setMonitorOrientation)(PalMonitor*, PalOrientation); + PalResult (*createWindow)(const PalWindowCreateInfo*, PalWindow**); + void (*destroyWindow)(PalWindow*); } Backend; typedef struct { @@ -74,6 +82,97 @@ typedef int (*XGetWindowAttributesFn)( Window, XWindowAttributes*); +typedef int (*XGetWindowPropertyFn)( + Display*, + Window, + Atom, + long, + long, + Bool, + Atom, + Atom*, + int*, + unsigned long*, + unsigned long*, + unsigned char**); + +typedef Atom (*XInternAtomFn)( + Display*, + _Xconst char*, + Bool); + +typedef Window (*XGetSelectionOwnerFn)( + Display*, + Atom); + +typedef Window (*XCreateWindowFn)( + Display*, + Window, + int, + int, + unsigned int, + unsigned int, + unsigned int, + int, + unsigned int, + Visual*, + unsigned long, + XSetWindowAttributes*); + +typedef int (*XChangePropertyFn)( + Display*, + Window, + Atom, + Atom, + int, + int, + _Xconst unsigned char*, + int); + +typedef int (*XFlushFn)(Display*); + +typedef Colormap (*XCreateColormapFn)( + Display*, + Window, + Visual*, + int); + +typedef int (*XFreeColormapFn)( + Display*, + Colormap); + +typedef int (*XDestroyWindowFn)( + Display*, + Window); + +typedef int (*XStoreNameFn)( + Display*, + Window, + _Xconst char*); + +typedef int (*XMapWindowFn)( + Display*, + Window); + +typedef int (*XMatchVisualInfoFn)( + Display*, + int, + int, + int, + XVisualInfo*); + +typedef int (*XPendingFn)(Display*); + +typedef int (*XSetWMProtocolsFn)( + Display*, + Window, + Atom*, + int); + +typedef int (*XNextEventFn)( + Display*, + XEvent*); + typedef int (*XRRSetCrtcConfigFn)( Display*, XRRScreenResources*, @@ -113,17 +212,58 @@ typedef void (*XRRFreeOutputInfoFn)( typedef void (*XRRFreeCrtcInfoFn)( XRRCrtcInfo*); +typedef struct +{ + bool unicodeTitle; + + Atom WM_DELETE_WINDOW; + Atom _NET_SUPPORTED; + Atom _NET_WM_STATE; + Atom _NET_WM_STATE_ABOVE; + Atom _NET_WM_STATE_HIDDEN; + Atom _NET_WM_STATE_MAXIMIZED_VERT; + Atom _NET_WM_STATE_MAXIMIZED_HORZ; + Atom _NET_WM_WINDOW_TYPE_UTILITY; + Atom _NET_WM_DESKTOP; + Atom _NET_WM_STATE_DEMANDS_ATTENTIONS; + Atom _NET_WM_WINDOW_OPACITY; + + Atom _NET_WM_NAME; + Atom UTF8_STRING; + Atom _MOTIF_WM_HINTS; +} X11Atoms; + typedef struct { int bpp; + int transparentDepth; void* handle; void* xrandr; Display* display; Window root; + Colormap transparentColormap; + Visual* transparentVisual; + XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; XGetWindowAttributesFn getWindowAttributes; - XRRSetCrtcConfigFn setCrtcConfig; + XGetWindowPropertyFn getWindowProperty; + XInternAtomFn internAtom; + XGetSelectionOwnerFn getSelectionOwner; + XFreeColormapFn freeColormap; + XStoreNameFn storeName; + XChangePropertyFn changeProperty; + XFlushFn flush; + XCreateColormapFn createColormap; + XMapWindowFn mapWindow; + + XCreateWindowFn createWindow; + XDestroyWindowFn destroyWindow; + XMatchVisualInfoFn matchVisualInfo; + XPendingFn pending; + XSetWMProtocolsFn setWMProtocols; + XNextEventFn nextEvent; + XRRSetCrtcConfigFn setCrtcConfig; XRRGetScreenResourcesFn getScreenResources; XRRGetOutputPrimaryFn getOutputPrimary; XRRGetOutputInfoFn getOutputInfo; @@ -134,6 +274,7 @@ typedef struct { } X11; static X11 s_X11 = {0}; +static X11Atoms s_X11Atoms = {0}; // ================================================== // Internal API @@ -182,6 +323,113 @@ static RRMode xFindMode( return None; } +static void xcheckFeatures() +{ + // cache this atoms + X_INTERN(WM_DELETE_WINDOW); + X_INTERN(_NET_SUPPORTED); + X_INTERN(_NET_WM_STATE); + X_INTERN(_NET_WM_STATE_ABOVE); + X_INTERN(_NET_WM_STATE_MAXIMIZED_VERT); + X_INTERN(_NET_WM_STATE_MAXIMIZED_HORZ); + X_INTERN(_NET_WM_NAME); + X_INTERN(UTF8_STRING); + X_INTERN(_MOTIF_WM_HINTS); + X_INTERN(_NET_WM_WINDOW_TYPE_UTILITY); + X_INTERN(_NET_WM_DESKTOP); + X_INTERN(_NET_WM_STATE_DEMANDS_ATTENTIONS); + X_INTERN(_NET_WM_WINDOW_OPACITY); + + // check for support from the window manager + Atom type; + int format; + unsigned long count, bytesAfters; + Atom* supportedAtoms = nullptr; + s_X11.getWindowProperty( + s_X11.display, + s_X11.root, + s_X11Atoms._NET_SUPPORTED, + 0, + (~0L), + False, + XA_ATOM, + &type, + &format, + &count, + &bytesAfters, + (unsigned char**)&supportedAtoms); + + PalVideoFeatures features = 0; + for (unsigned long i = 0; i < count; ++i) { + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT) { + features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ) { + features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_HIDDEN) { + features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; + } + + if (supportedAtoms[i] == s_X11Atoms._MOTIF_WM_HINTS) { + features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; + features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_ABOVE) { + features |= PAL_VIDEO_FEATURE_TOPMOST_WINDOW; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_NAME) { + s_X11Atoms.unicodeTitle = true; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_DEMANDS_ATTENTIONS) { + features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; + } + + if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE_UTILITY) { + features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; + } + + } + + // check for transparent windows + Atom compositor = s_X11.internAtom(s_X11.display, "_NET_WM_CM_S0", True); + if (compositor != None) { + Window owner = s_X11.getSelectionOwner(s_X11.display, compositor); + if (owner != None) { + features |= PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW; + } + } + + // general features + features |= PAL_VIDEO_FEATURE_MULTI_MONITORS; + features |= PAL_VIDEO_FEATURE_MONITOR_GET_ORIENTATION; + features |= PAL_VIDEO_FEATURE_MONITOR_SET_MODE; + features |= PAL_VIDEO_FEATURE_MONITOR_GET_MODE; + features |= PAL_VIDEO_FEATURE_WINDOW_SET_SIZE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_SIZE; + features |= PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY; + + features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; + features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; + features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; + features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; + features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; + features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; + + s_Video.features = features; +} + // ================================================== // X11 // ================================================== @@ -216,6 +464,66 @@ static PalResult xInitVideo() s_X11.handle, "XRRSetCrtcConfig"); + s_X11.getWindowProperty = (XGetWindowPropertyFn)dlsym( + s_X11.handle, + "XGetWindowProperty"); + + s_X11.internAtom = (XInternAtomFn)dlsym( + s_X11.handle, + "XInternAtom"); + + s_X11.getSelectionOwner = (XGetSelectionOwnerFn)dlsym( + s_X11.handle, + "XGetSelectionOwner"); + + s_X11.freeColormap = (XFreeColormapFn)dlsym( + s_X11.handle, + "XFreeColormap"); + + s_X11.storeName = (XStoreNameFn)dlsym( + s_X11.handle, + "XStoreName"); + + s_X11.changeProperty = (XChangePropertyFn)dlsym( + s_X11.handle, + "XChangeProperty"); + + s_X11.flush = (XFlushFn)dlsym( + s_X11.handle, + "XFlush"); + + s_X11.createColormap = (XCreateColormapFn)dlsym( + s_X11.handle, + "XCreateColormap"); + + s_X11.mapWindow = (XMapWindowFn)dlsym( + s_X11.handle, + "XMapWindow"); + + s_X11.createWindow = (XCreateWindowFn)dlsym( + s_X11.handle, + "XCreateWindow"); + + s_X11.destroyWindow = (XDestroyWindowFn)dlsym( + s_X11.handle, + "XDestroyWindow"); + + s_X11.matchVisualInfo = (XMatchVisualInfoFn)dlsym( + s_X11.handle, + "XMatchVisualInfo"); + + s_X11.pending = (XPendingFn)dlsym( + s_X11.handle, + "XPending"); + + s_X11.setWMProtocols = (XSetWMProtocolsFn)dlsym( + s_X11.handle, + "XSetWMProtocols"); + + s_X11.nextEvent = (XNextEventFn)dlsym( + s_X11.handle, + "XNextEvent"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -253,47 +561,73 @@ static PalResult xInitVideo() s_X11.xrandr, "XRRFreeCrtcInfo"); - // set feature flags - if (s_X11.getScreenResources) { - s_Video.features |= PAL_VIDEO_FEATURE_MULTI_MONITORS; - } - - s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_ORIENTATION; - s_Video.features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; - s_Video.features |= PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW; - s_Video.features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; // partial - s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_SET_MODE; - s_Video.features |= PAL_VIDEO_FEATURE_MONITOR_GET_MODE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_SIZE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_SIZE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_POS; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_POS; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STATE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_VISIBILITY; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_VISIBILITY; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; - - s_Video.features |= PAL_VIDEO_FEATURE_CLIP_CURSOR; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_INPUT_FOCUS; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_INPUT_FOCUS; - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; // partial - s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; - s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; - + xcheckFeatures(); // get root window bpp XWindowAttributes attr; s_X11.getWindowAttributes(s_X11.display, s_X11.root, &attr); s_X11.bpp = attr.depth; + // create a transparent colormap + XVisualInfo visualInfo; + s_X11.matchVisualInfo(s_X11.display, 0, 32, TrueColor, &visualInfo); + s_X11.transparentDepth = visualInfo.depth; + s_X11.transparentVisual = visualInfo.visual; + + // create color map + s_X11.transparentColormap = s_X11.createColormap( + s_X11.display, + s_X11.root, + visualInfo.visual, + AllocNone); + return PAL_RESULT_SUCCESS; } +static void xUpdateVideo() +{ + XEvent event; + PalDispatchMode mode = PAL_DISPATCH_NONE; + while (s_X11.pending(s_X11.display)) { + s_X11.nextEvent(s_X11.display, &event); + + switch (event.type) { + case ClientMessage: { + // check for window close + Atom windowClose = event.xclient.data.l[0]; + if (windowClose == s_X11Atoms.WM_DELETE_WINDOW) { + if (s_Video.eventDriver) { + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_CLOSE; + mode = palGetEventDispatchMode(driver, type); + + PalWindow* window = TO_PAL_HANDLE( + PalWindow, + event.xclient.window); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + + } + break; + } + + } + } + + s_X11.flush(s_X11.display); +} + static void xShutdownVideo() { + if (s_X11.transparentColormap) { + s_X11.freeColormap(s_X11.display, s_X11.transparentColormap); + } + s_X11.closeDisplay(s_X11.display); dlclose(s_X11.handle); dlclose(s_X11.xrandr); @@ -542,37 +876,32 @@ static PalResult xGetCurrentMonitorMode( } // get the current display mode - if (outputInfo->crtc) { - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - outputInfo->crtc); - - if (crtc) { - // find the display mode - XRRModeInfo* info = nullptr; - for (int i = 0; i < resources->nmode; ++i) { - if (resources->modes[i].id == crtc->mode) { - // found - info = &resources->modes[i]; - break; - } - } - - if (mode) { - mode->width = info->width; - mode->height = info->height; - mode->bpp = s_X11.bpp; - - double tmp = (double)info->hTotal * (double)info->vTotal; - double rate = (double)info->dotClock / tmp; - mode->refreshRate = rate + 0.5; - - s_X11.freeCrtcInfo(crtc); - } + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + outputInfo->crtc); + + // find the display mode + XRRModeInfo* info = nullptr; + for (int i = 0; i < resources->nmode; ++i) { + if (resources->modes[i].id == crtc->mode) { + // found + info = &resources->modes[i]; + break; } } + if (mode) { + mode->width = info->width; + mode->height = info->height; + mode->bpp = s_X11.bpp; + + double tmp = (double)info->hTotal * (double)info->vTotal; + double rate = (double)info->dotClock / tmp; + mode->refreshRate = rate + 0.5; + } + + s_X11.freeCrtcInfo(crtc); s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); @@ -643,14 +972,278 @@ static PalResult xSetMonitorMode( return PAL_RESULT_SUCCESS; } +static PalResult xValidateMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + // get the monitor info + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + // find the monitor display mode + RRMode displayMode = xFindMode(resources, mode); + if (displayMode == None) { + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR_MODE; + } + + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + + return PAL_RESULT_SUCCESS; +} + +static PalResult xSetMonitorOrientation( + PalMonitor* monitor, + PalOrientation orientation) +{ + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + // get the monitor info + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + // get the current display mode + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + outputInfo->crtc); + + // check if the new orientation is supported + Rotation rotation = 0; + switch (orientation) { + case PAL_ORIENTATION_LANDSCAPE: { + rotation = RR_Rotate_0; + break; + } + + case PAL_ORIENTATION_PORTRAIT: { + rotation = RR_Rotate_90; + break; + } + + case PAL_ORIENTATION_LANDSCAPE_FLIPPED: { + rotation = RR_Rotate_180; + break; + } + + case PAL_ORIENTATION_PORTRAIT_FLIPPED: { + rotation = RR_Rotate_270; + break; + } + + default: { + return PAL_RESULT_INVALID_ORIENTATION; + } + } + + if (!(crtc->rotations & rotation)) { + return PAL_RESULT_INVALID_ORIENTATION; + } + + RROutput output = FROM_PAL_HANDLE(RROutput, monitor); + int ret = s_X11.setCrtcConfig( + s_X11.display, + resources, + outputInfo->crtc, + CurrentTime, + crtc->x, + crtc->y, + crtc->mode, + rotation, + &output, + 1); + + s_X11.freeCrtcInfo(crtc); + s_X11.freeOutputInfo(outputInfo); + s_X11.freeScreenResources(resources); + + if (ret != Success) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + return PAL_RESULT_SUCCESS; +} + +static PalResult xCreateWindow( + const PalWindowCreateInfo* info, + PalWindow** outWindow) +{ + Window window = None; + PalMonitor* monitor = nullptr; + PalMonitorInfo monitorInfo; + Colormap colormap = None; + Visual* visual = DefaultVisual(s_X11.display, 0); + int depth = DefaultDepth(s_X11.display, 0); + + // get monitor + if (info->monitor) { + monitor = info->monitor; + + } else { + // get primary monitor + xGetPrimaryMonitor(&monitor); + if (!monitor) { + return PAL_RESULT_PLATFORM_FAILURE; + } + } + + // get monitor info + PalResult result = palGetMonitorInfo(monitor, &monitorInfo); + if (result != PAL_RESULT_SUCCESS) { + return result; + } + + Int32 x, y = 0; + // the position and size must be scaled with the dpi before this call + if (info->center) { + x = monitorInfo.x + (monitorInfo.width - info->width) / 2; + y = monitorInfo.y + (monitorInfo.height - info->height) / 2; + + } else { + // we set 100 for each axix + x = monitorInfo.x + 100; + y = monitorInfo.y + 100; + } + + // check and set transparency + if (info->style & PAL_WINDOW_STYLE_TRANSPARENT) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + colormap = s_X11.transparentColormap; + + } else { + // use default color map + colormap = DefaultColormap(s_X11.display, 0); + } + + long mask = ExposureMask | StructureNotifyMask | KeyPressMask; + mask |= KeyReleaseMask; + mask |= ButtonPressMask; + mask |= ButtonReleaseMask; + mask |= PointerMotionMask; + + XSetWindowAttributes attrs = {0}; + attrs.colormap = colormap; + attrs.event_mask = mask; + attrs.background_pixel = WhitePixel(s_X11.display, 0); + attrs.border_pixel = BlackPixel(s_X11.display, 0); + + // create window + window = s_X11.createWindow( + s_X11.display, + s_X11.root, + x, + y, + info->width, + info->height, + 0, // border width + depth, + InputOutput, // class + visual, + CWEventMask | CWColormap | CWBorderPixel | CWBackPixel, + &attrs); + + if (window == None) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + if (s_X11Atoms.unicodeTitle) { + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_NAME, + s_X11Atoms.UTF8_STRING, + 8, // unsigned char + PropModeReplace, + info->title, + strlen(info->title)); + + } else { + s_X11.storeName(s_X11.display, window, info->title); + } + + // borderless + + // tool window + + // topmost + + // resizable + + // min, max + s_X11.setWMProtocols( + s_X11.display, + window, + &s_X11Atoms.WM_DELETE_WINDOW, + True); + + s_X11.flush(s_X11.display); + + s_X11.mapWindow(s_X11.display, window); + s_X11.flush(s_X11.display); // we need the window to show + + *outWindow = TO_PAL_HANDLE(PalWindow, window); + return PAL_RESULT_SUCCESS; +} + +static void xDestroyWindow(PalWindow* window) +{ + s_X11.destroyWindow( + s_X11.display, + FROM_PAL_HANDLE(Window, window)); +} + static Backend s_XBackend = { .shutdownVideo = xShutdownVideo, + .updateVideo = xUpdateVideo, .enumerateMonitors = xEnumerateMonitors, .getMonitorInfo = xGetMonitorInfo, .getPrimaryMonitor = xGetPrimaryMonitor, .enumerateMonitorModes = xEnumerateMonitorModes, .getCurrentMonitorMode = xGetCurrentMonitorMode, - .setMonitorMode = xSetMonitorMode + .setMonitorMode = xSetMonitorMode, + .validateMonitorMode = xValidateMonitorMode, + .setMonitorOrientation = xSetMonitorOrientation, + .createWindow = xCreateWindow, + .destroyWindow = xDestroyWindow }; // ================================================== @@ -699,7 +1292,12 @@ void PAL_CALL palShutdownVideo() } } -void PAL_CALL palUpdateVideo(); +void PAL_CALL palUpdateVideo() +{ + if (s_Video.initialized) { + s_Video.backend->updateVideo(); + } +} PalVideoFeatures PAL_CALL palGetVideoFeatures() { @@ -816,4 +1414,61 @@ PalResult PAL_CALL palSetMonitorMode( } return s_Video.backend->setMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palValidateMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->validateMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palSetMonitorOrientation( + PalMonitor* monitor, + PalOrientation orientation) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->setMonitorOrientation(monitor, orientation); +} + +// ================================================== +// Window +// ================================================== + +PalResult PAL_CALL palCreateWindow( + const PalWindowCreateInfo* info, + PalWindow** outWindow) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!info || !outWindow) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->createWindow(info,outWindow); +} + +void PAL_CALL palDestroyWindow(PalWindow* window) +{ + if (s_Video.initialized && window) { + return s_Video.backend->destroyWindow(window); + } } \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 623eb0c..205fef5 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1242,6 +1242,7 @@ PalResult PAL_CALL palInitVideo( s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; + s_Video.features |= PAL_VIDEO_FEATURE_TOPMOST_WINDOW; if (s_Video.getDpiForMonitor && s_Video.setProcessAwareness) { s_Video.features |= PAL_VIDEO_FEATURE_HIGH_DPI; diff --git a/tests/tests.lua b/tests/tests.lua index a676ea9..6224b64 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -35,7 +35,7 @@ project "tests" "video_test.c", "monitor_test.c", "monitor_mode_test.c", - -- "window_test.c", + "window_test.c", -- "icon_test.c", -- "cursor_test.c", -- "input_window_test.c", diff --git a/tests/tests_main.c b/tests/tests_main.c index decf5f6..f868b1e 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -28,8 +28,8 @@ int main(int argc, char** argv) #if PAL_HAS_VIDEO // registerTest("Video Test", videoTest); // registerTest("Monitor Test", monitorTest); - registerTest("Monitor Mode Test", monitorModeTest); - // registerTest("Window Test", windowTest); + // registerTest("Monitor Mode Test", monitorModeTest); + registerTest("Window Test", windowTest); // registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); // registerTest("Input Window Test", inputWindowTest); diff --git a/tests/window_test.c b/tests/window_test.c index 070180e..335affd 100644 --- a/tests/window_test.c +++ b/tests/window_test.c @@ -18,7 +18,7 @@ // remove the maximize box if supported #define NO_MAXIMIZEBOX 0 -#define UNICODE_NAME 0 +#define UNICODE_NAME 1 #define DISPATCH_MODE_POLL 1 // use polling dispatch mode #if DISPATCH_MODE_POLL From f9c0cd19934bec982b1e8d77bb090e12bd4c19d3 Mon Sep 17 00:00:00 2001 From: nichcode Date: Tue, 7 Oct 2025 11:44:13 +0000 Subject: [PATCH 10/30] maximized window --- src/video/pal_video_linux.c | 174 +++++++++++++++++++++++++++++++++--- tests/window_test.c | 1 + 2 files changed, 165 insertions(+), 10 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 41fc166..b07baa2 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -173,6 +173,30 @@ typedef int (*XNextEventFn)( Display*, XEvent*); +typedef int (*XSetWMNormalHintsFn)( + Display*, + Window, + XSizeHints*); + +typedef int (*XSendEventFn)( + Display*, + Window, + Bool, + long, + XEvent*); + +typedef int (*XMoveWindowFn)( + Display*, + Window, + int, + int); + +typedef int (*XResizeWindowFn)( + Display*, + Window, + unsigned int, + unsigned int); + typedef int (*XRRSetCrtcConfigFn)( Display*, XRRScreenResources*, @@ -230,7 +254,8 @@ typedef struct Atom _NET_WM_NAME; Atom UTF8_STRING; - Atom _MOTIF_WM_HINTS; + Atom _NET_WM_WINDOW_TYPE; + Atom _NET_WM_WINDOW_TYPE_SPLASH; } X11Atoms; typedef struct { @@ -262,6 +287,10 @@ typedef struct { XPendingFn pending; XSetWMProtocolsFn setWMProtocols; XNextEventFn nextEvent; + XSetWMNormalHintsFn setWMNormalHints; + XSendEventFn sendEvent; + XMoveWindowFn moveWindow; + XResizeWindowFn resizeWindow; XRRSetCrtcConfigFn setCrtcConfig; XRRGetScreenResourcesFn getScreenResources; @@ -334,11 +363,12 @@ static void xcheckFeatures() X_INTERN(_NET_WM_STATE_MAXIMIZED_HORZ); X_INTERN(_NET_WM_NAME); X_INTERN(UTF8_STRING); - X_INTERN(_MOTIF_WM_HINTS); X_INTERN(_NET_WM_WINDOW_TYPE_UTILITY); X_INTERN(_NET_WM_DESKTOP); X_INTERN(_NET_WM_STATE_DEMANDS_ATTENTIONS); X_INTERN(_NET_WM_WINDOW_OPACITY); + X_INTERN(_NET_WM_WINDOW_TYPE); + X_INTERN(_NET_WM_WINDOW_TYPE_SPLASH); // check for support from the window manager Atom type; @@ -376,12 +406,15 @@ static void xcheckFeatures() features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; } - if (supportedAtoms[i] == s_X11Atoms._MOTIF_WM_HINTS) { - features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; + if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE) { features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; } + if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE_SPLASH) { + features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; + } + if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_ABOVE) { features |= PAL_VIDEO_FEATURE_TOPMOST_WINDOW; } @@ -397,7 +430,6 @@ static void xcheckFeatures() if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE_UTILITY) { features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; } - } // check for transparent windows @@ -524,6 +556,22 @@ static PalResult xInitVideo() s_X11.handle, "XNextEvent"); + s_X11.setWMNormalHints = (XSetWMNormalHintsFn)dlsym( + s_X11.handle, + "XSetWMNormalHints"); + + s_X11.sendEvent = (XSendEventFn)dlsym( + s_X11.handle, + "XSendEvent"); + + s_X11.moveWindow = (XMoveWindowFn)dlsym( + s_X11.handle, + "XMoveWindow"); + + s_X11.resizeWindow = (XResizeWindowFn)dlsym( + s_X11.handle, + "XResizeWindow"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -1165,6 +1213,7 @@ static PalResult xCreateWindow( attrs.event_mask = mask; attrs.background_pixel = WhitePixel(s_X11.display, 0); attrs.border_pixel = BlackPixel(s_X11.display, 0); + attrs.override_redirect = False; // create window window = s_X11.createWindow( @@ -1201,14 +1250,115 @@ static PalResult xCreateWindow( } // borderless + if (info->style & PAL_WINDOW_STYLE_BORDERLESS) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_BORDERLESS_WINDOW)) { + s_X11.destroyWindow(s_X11.display, window); + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_WINDOW_TYPE, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char*)&s_X11Atoms._NET_WM_WINDOW_TYPE_SPLASH, + 1); + + } // tool window + if (info->style & PAL_WINDOW_STYLE_TOOL) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_TOOL_WINDOW)) { + s_X11.destroyWindow(s_X11.display, window); + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_WINDOW_TYPE, + XA_ATOM, + 32, + PropModeReplace, + (unsigned char*)&s_X11Atoms._NET_WM_WINDOW_TYPE_UTILITY, + 1); + + } // topmost + if (info->style & PAL_WINDOW_STYLE_TOPMOST) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_TOPMOST_WINDOW)) { + s_X11.destroyWindow(s_X11.display, window); + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_STATE, + XA_ATOM, + 32, + PropModeAppend, + (unsigned char*)&s_X11Atoms._NET_WM_STATE_ABOVE, + 1); + + } // resizable + if (!(info->style & PAL_WINDOW_STYLE_RESIZABLE)) { + XSizeHints hints = {0}; + hints.flags = PMinSize | PMaxSize; + hints.min_width = hints.max_width = info->width; + hints.min_height = hints.max_height = info->height; + s_X11.setWMNormalHints(s_X11.display, window, &hints); + } + + // show window + s_X11.mapWindow(s_X11.display, window); + s_X11.flush(s_X11.display); + + // maximize + if (info->maximized) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { + s_X11.destroyWindow(s_X11.display, window); + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + // wait till the window is mapped + for (;;) { + XEvent event; + s_X11.nextEvent(s_X11.display, &event); + if (event.type == MapNotify && event.xmap.window == window) { + break; + } + } + + Atom data[2]; + data[0] = s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT; + data[1] = s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ; + + XEvent e = {0}; + e.xclient.type = ClientMessage; + e.xclient.send_event = True; + e.xclient.window = window; + e.xclient.message_type = s_X11Atoms._NET_WM_STATE; + e.xclient.format = 32; + e.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD + e.xclient.data.l[1] = data[0]; + e.xclient.data.l[2] = data[1]; + e.xclient.data.l[3] = 1; + e.xclient.data.l[4] = 0; + + s_X11.sendEvent( + s_X11.display, + s_X11.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &e); + } - // min, max s_X11.setWMProtocols( s_X11.display, window, @@ -1216,10 +1366,6 @@ static PalResult xCreateWindow( True); s_X11.flush(s_X11.display); - - s_X11.mapWindow(s_X11.display, window); - s_X11.flush(s_X11.display); // we need the window to show - *outWindow = TO_PAL_HANDLE(PalWindow, window); return PAL_RESULT_SUCCESS; } @@ -1463,6 +1609,14 @@ PalResult PAL_CALL palCreateWindow( return PAL_RESULT_NULL_POINTER; } + if (info->style & PAL_WINDOW_STYLE_NO_MINIMIZEBOX) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + if (info->style & PAL_WINDOW_STYLE_NO_MAXIMIZEBOX) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + return s_Video.backend->createWindow(info,outWindow); } diff --git a/tests/window_test.c b/tests/window_test.c index 335affd..db85314 100644 --- a/tests/window_test.c +++ b/tests/window_test.c @@ -198,6 +198,7 @@ bool windowTest() createInfo.width = 640; createInfo.show = true; createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; + createInfo.maximized = true; #if UNICODE_NAME createInfo.title = "PAL Test Window Unicode - àà"; From 1d01db86a8952328bfbc6301e0272703c9bb9d7a Mon Sep 17 00:00:00 2001 From: nichcode Date: Tue, 7 Oct 2025 16:39:45 +0000 Subject: [PATCH 11/30] window styles --- src/video/pal_video_linux.c | 281 ++++++++++++++++++++++++++++-------- src/video/pal_video_win32.c | 8 + tests/window_test.c | 5 +- 3 files changed, 229 insertions(+), 65 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index b07baa2..8e52724 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -29,7 +29,9 @@ freely, subject to the following restrictions: #include #include +#include #include +#include // X11 headers #include @@ -49,31 +51,6 @@ freely, subject to the following restrictions: #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) #define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) -typedef struct { - void (*shutdownVideo)(); - void (*updateVideo)(); - PalResult (*enumerateMonitors)(Int32*, PalMonitor**); - PalResult (*getPrimaryMonitor)(PalMonitor**); - PalResult (*getMonitorInfo)(PalMonitor*, PalMonitorInfo*); - PalResult (*enumerateMonitorModes)(PalMonitor*, Int32*, PalMonitorMode*); - PalResult (*getCurrentMonitorMode)(PalMonitor*, PalMonitorMode*); - PalResult (*setMonitorMode)(PalMonitor*, PalMonitorMode*); - PalResult (*validateMonitorMode)(PalMonitor*, PalMonitorMode*); - PalResult (*setMonitorOrientation)(PalMonitor*, PalOrientation); - PalResult (*createWindow)(const PalWindowCreateInfo*, PalWindow**); - void (*destroyWindow)(PalWindow*); -} Backend; - -typedef struct { - bool initialized; - PalVideoFeatures features; - const PalAllocator* allocator; - PalEventDriver* eventDriver; - const Backend* backend; -} VideoLinux; - -static VideoLinux s_Video = {0}; - typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); @@ -197,6 +174,17 @@ typedef int (*XResizeWindowFn)( unsigned int, unsigned int); +typedef int (*XIconifyWindowFn)( + Display*, + Window, + int); + +typedef XErrorHandler (*XSetErrorHandlerFn)(XErrorHandler); + +typedef int (*XSyncFn)( + Display*, + Bool); + typedef int (*XRRSetCrtcConfigFn)( Display*, XRRScreenResources*, @@ -256,17 +244,21 @@ typedef struct Atom UTF8_STRING; Atom _NET_WM_WINDOW_TYPE; Atom _NET_WM_WINDOW_TYPE_SPLASH; + Atom _NET_WM_PID; + Atom _WM_CLASS; } X11Atoms; typedef struct { int bpp; int transparentDepth; + int screen; void* handle; void* xrandr; Display* display; Window root; Colormap transparentColormap; Visual* transparentVisual; + GC gc; XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; @@ -291,6 +283,10 @@ typedef struct { XSendEventFn sendEvent; XMoveWindowFn moveWindow; XResizeWindowFn resizeWindow; + XIconifyWindowFn iconifyWindow; + + XSetErrorHandlerFn setErrorHandler; + XSyncFn sync; XRRSetCrtcConfigFn setCrtcConfig; XRRGetScreenResourcesFn getScreenResources; @@ -302,8 +298,36 @@ typedef struct { XRRFreeCrtcInfoFn freeCrtcInfo; } X11; +typedef struct { + void (*shutdownVideo)(); + void (*updateVideo)(); + PalResult (*enumerateMonitors)(Int32*, PalMonitor**); + PalResult (*getPrimaryMonitor)(PalMonitor**); + PalResult (*getMonitorInfo)(PalMonitor*, PalMonitorInfo*); + PalResult (*enumerateMonitorModes)(PalMonitor*, Int32*, PalMonitorMode*); + PalResult (*getCurrentMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*setMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*validateMonitorMode)(PalMonitor*, PalMonitorMode*); + PalResult (*setMonitorOrientation)(PalMonitor*, PalOrientation); + PalResult (*createWindow)(const PalWindowCreateInfo*, PalWindow**); + void (*destroyWindow)(PalWindow*); + PalResult (*setWindowOpacity)(PalWindow*, float); +} Backend; + +typedef struct { + bool initialized; + PalVideoFeatures features; + const PalAllocator* allocator; + PalEventDriver* eventDriver; + const Backend* backend; + char className[64]; + Int32 classNameLen; +} VideoLinux; + static X11 s_X11 = {0}; static X11Atoms s_X11Atoms = {0}; +static VideoLinux s_Video = {0}; +static bool s_XErrorOccurred = false; // ================================================== // Internal API @@ -369,6 +393,8 @@ static void xcheckFeatures() X_INTERN(_NET_WM_WINDOW_OPACITY); X_INTERN(_NET_WM_WINDOW_TYPE); X_INTERN(_NET_WM_WINDOW_TYPE_SPLASH); + X_INTERN(_NET_WM_PID); + X_INTERN(_WM_CLASS); // check for support from the window manager Atom type; @@ -462,6 +488,12 @@ static void xcheckFeatures() s_Video.features = features; } +static int xErrorHandler(Display*, XErrorEvent* e) { + // this is use for simple success and failure + s_XErrorOccurred = true; + return 0; +} + // ================================================== // X11 // ================================================== @@ -572,6 +604,18 @@ static PalResult xInitVideo() s_X11.handle, "XResizeWindow"); + s_X11.iconifyWindow = (XIconifyWindowFn)dlsym( + s_X11.handle, + "XIconifyWindow"); + + s_X11.setErrorHandler = (XSetErrorHandlerFn)dlsym( + s_X11.handle, + "XSetErrorHandler"); + + s_X11.sync = (XSyncFn)dlsym( + s_X11.handle, + "XSync"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -579,6 +623,7 @@ static PalResult xInitVideo() } s_X11.root = DefaultRootWindow(s_X11.display); + s_X11.screen = DefaultScreen(s_X11.display); // load Xrandr functions s_X11.getScreenResources = (XRRGetScreenResourcesFn)dlsym( @@ -616,18 +661,31 @@ static PalResult xInitVideo() s_X11.bpp = attr.depth; // create a transparent colormap - XVisualInfo visualInfo; - s_X11.matchVisualInfo(s_X11.display, 0, 32, TrueColor, &visualInfo); - s_X11.transparentDepth = visualInfo.depth; - s_X11.transparentVisual = visualInfo.visual; + XVisualInfo info; + s_X11.matchVisualInfo(s_X11.display, s_X11.screen, 32, TrueColor, &info); + s_X11.transparentDepth = info.depth; + s_X11.transparentVisual = info.visual; // create color map s_X11.transparentColormap = s_X11.createColormap( s_X11.display, s_X11.root, - visualInfo.visual, + info.visual, AllocNone); + // set class + const char* instance = "pal_window"; + const char* class = "PAL"; + snprintf( + s_Video.className, + sizeof(s_Video.className), + "%s%c%s%c", + instance, + '\0', + class, + '\0'); + + s_Video.classNameLen = strlen(instance) + strlen(class) + 2; return PAL_RESULT_SUCCESS; } @@ -718,7 +776,6 @@ static PalResult xEnumerateMonitors( static PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) { - // get the primary monitor RROutput primary = s_X11.getOutputPrimary( s_X11.display, s_X11.root); @@ -726,19 +783,9 @@ static PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) if (primary) { *outMonitor = TO_PAL_HANDLE(PalMonitor, primary); return PAL_RESULT_SUCCESS; + } else { + return PAL_RESULT_PLATFORM_FAILURE; } - - // primary monitor not set - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - - if (resources->noutput > 0) { - *outMonitor = TO_PAL_HANDLE(PalMonitor, resources->outputs[0]); - } - - s_X11.freeScreenResources(resources); - return PAL_RESULT_SUCCESS; } static PalResult xGetMonitorInfo( @@ -753,6 +800,18 @@ static PalResult xGetMonitorInfo( s_X11.display, resources, FROM_PAL_HANDLE(RROutput, monitor)); + + if (!outputInfo) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } + + if (outputInfo->connection != RR_Connected) { + // invalid monitor + s_X11.freeScreenResources(resources); + return PAL_RESULT_INVALID_MONITOR; + } strcpy(info->name, outputInfo->name); @@ -760,12 +819,6 @@ static PalResult xGetMonitorInfo( RROutput primary = s_X11.getOutputPrimary( s_X11.display, s_X11.root); - - if (!primary) { - if (resources->noutput > 0) { - primary = resources->outputs[0]; - } - } if (monitor == TO_PAL_HANDLE(PalMonitor, primary)) { info->primary = true; @@ -1155,9 +1208,12 @@ static PalResult xCreateWindow( Window window = None; PalMonitor* monitor = nullptr; PalMonitorInfo monitorInfo; - Colormap colormap = None; - Visual* visual = DefaultVisual(s_X11.display, 0); - int depth = DefaultDepth(s_X11.display, 0); + + Visual* visual = DefaultVisual(s_X11.display, s_X11.screen); + int depth = DefaultDepth(s_X11.display, s_X11.screen); + unsigned long bgPixel = WhitePixel(s_X11.display, s_X11.screen); + unsigned long borderPixel = BlackPixel(s_X11.display, s_X11.screen); + Colormap colormap = DefaultColormap(s_X11.display, s_X11.screen); // get monitor if (info->monitor) { @@ -1195,11 +1251,11 @@ static PalResult xCreateWindow( return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } + bgPixel = 0; + borderPixel = 0; + visual = s_X11.transparentVisual; + depth = s_X11.transparentDepth; colormap = s_X11.transparentColormap; - - } else { - // use default color map - colormap = DefaultColormap(s_X11.display, 0); } long mask = ExposureMask | StructureNotifyMask | KeyPressMask; @@ -1211,8 +1267,8 @@ static PalResult xCreateWindow( XSetWindowAttributes attrs = {0}; attrs.colormap = colormap; attrs.event_mask = mask; - attrs.background_pixel = WhitePixel(s_X11.display, 0); - attrs.border_pixel = BlackPixel(s_X11.display, 0); + attrs.background_pixel = bgPixel; + attrs.border_pixel = borderPixel; attrs.override_redirect = False; // create window @@ -1234,6 +1290,29 @@ static PalResult xCreateWindow( return PAL_RESULT_PLATFORM_FAILURE; } + // set window pid + pid_t pid = getpid(); + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_PID, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)&pid, + 1); + + // set class name + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._WM_CLASS, + XA_STRING, + 8, + PropModeReplace, + (unsigned char*)&s_Video.className, + s_Video.classNameLen); + if (s_X11Atoms.unicodeTitle) { s_X11.changeProperty( s_X11.display, @@ -1316,11 +1395,15 @@ static PalResult xCreateWindow( } // show window - s_X11.mapWindow(s_X11.display, window); - s_X11.flush(s_X11.display); + if (info->show) { + s_X11.mapWindow(s_X11.display, window); + // move the window if window manager didnt + s_X11.moveWindow(s_X11.display, window, x, y); + s_X11.flush(s_X11.display); + } // maximize - if (info->maximized) { + if (info->maximized && info->show) { if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { s_X11.destroyWindow(s_X11.display, window); return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; @@ -1359,6 +1442,25 @@ static PalResult xCreateWindow( &e); } + // minimize + if (info->minimized && info->show) { + if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { + s_X11.destroyWindow(s_X11.display, window); + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + // wait till the window is mapped + for (;;) { + XEvent event; + s_X11.nextEvent(s_X11.display, &event); + if (event.type == MapNotify && event.xmap.window == window) { + break; + } + } + + s_X11.iconifyWindow(s_X11.display, window, s_X11.screen); + } + s_X11.setWMProtocols( s_X11.display, window, @@ -1377,6 +1479,33 @@ static void xDestroyWindow(PalWindow* window) FROM_PAL_HANDLE(Window, window)); } +static PalResult xSetWindowOpacity( + PalWindow* window, + float opacity) +{ + XErrorHandler old = s_X11.setErrorHandler(xErrorHandler); + unsigned long value = (unsigned long)(opacity * 0xFFFFFFFFUL + 0.5f); + + s_X11.changeProperty( + s_X11.display, + FROM_PAL_HANDLE(Window, window), + s_X11Atoms._NET_WM_WINDOW_OPACITY, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)&value, + 1); + + s_X11.sync(s_X11.display, False); + s_X11.setErrorHandler(old); + if (s_XErrorOccurred) { + // technically, this is the only error that can occur + return PAL_RESULT_INVALID_WINDOW; + } + + return PAL_RESULT_SUCCESS; +} + static Backend s_XBackend = { .shutdownVideo = xShutdownVideo, .updateVideo = xUpdateVideo, @@ -1389,7 +1518,8 @@ static Backend s_XBackend = { .validateMonitorMode = xValidateMonitorMode, .setMonitorOrientation = xSetMonitorOrientation, .createWindow = xCreateWindow, - .destroyWindow = xDestroyWindow + .destroyWindow = xDestroyWindow, + .setWindowOpacity = xSetWindowOpacity }; // ================================================== @@ -1625,4 +1755,31 @@ void PAL_CALL palDestroyWindow(PalWindow* window) if (s_Video.initialized && window) { return s_Video.backend->destroyWindow(window); } +} + +PalResult PAL_CALL palSetWindowOpacity( + PalWindow* window, + float opacity) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + if (!(s_Video.features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + if (opacity < 0.0f) { + opacity = 0.0f; + } + + if (opacity > 1.0f) { + opacity = 1.0f; + } + + return s_Video.backend->setWindowOpacity(window, opacity); } \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 205fef5..d083c0a 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -2264,6 +2264,14 @@ PalResult PAL_CALL palSetWindowOpacity( return PAL_RESULT_NULL_POINTER; } + if (opacity < 0.0f) { + opacity = 0.0f; + } + + if (opacity > 1.0f) { + opacity = 1.0f; + } + bool ret = SetLayeredWindowAttributes( (HWND)window, 0, diff --git a/tests/window_test.c b/tests/window_test.c index db85314..70d4a42 100644 --- a/tests/window_test.c +++ b/tests/window_test.c @@ -7,7 +7,7 @@ // make the window transparent if supported #define MAKE_TRANSPARENT 0 -#define OPACITY 0.5 // if transparent window is supported +#define OPACITY 0.8f // if transparent window is supported // make the window a tool window if supported #define MAKE_TOOL 0 @@ -198,7 +198,6 @@ bool windowTest() createInfo.width = 640; createInfo.show = true; createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; - createInfo.maximized = true; #if UNICODE_NAME createInfo.title = "PAL Test Window Unicode - àà"; @@ -246,7 +245,7 @@ bool windowTest() #if MAKE_TRANSPARENT if (features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW) { - result = palSetWindowOpacity(window, OPACITY); + //result = palSetWindowOpacity(window, OPACITY); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set window opacity %s", error); From 63bfebeecf0aa387a3de0ee3ab34c3c690b53cb4 Mon Sep 17 00:00:00 2001 From: nichcode Date: Wed, 8 Oct 2025 10:53:19 +0000 Subject: [PATCH 12/30] resize and move event --- src/video/pal_video_linux.c | 213 +++++++++++++++++++++++++++++++++++- 1 file changed, 209 insertions(+), 4 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 8e52724..bec4ad7 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -50,6 +50,7 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) #define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) +#define MAX_WINDOW_STATE 128 typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); @@ -224,6 +225,16 @@ typedef void (*XRRFreeOutputInfoFn)( typedef void (*XRRFreeCrtcInfoFn)( XRRCrtcInfo*); +typedef struct { + int x; + int y; + int width; + int height; + bool skipFirst; + bool used; + PalWindow* window; +} WindowState; + typedef struct { bool unicodeTitle; @@ -246,6 +257,7 @@ typedef struct Atom _NET_WM_WINDOW_TYPE_SPLASH; Atom _NET_WM_PID; Atom _WM_CLASS; + Atom _NET_ACTIVE_WINDOW; } X11Atoms; typedef struct { @@ -320,6 +332,7 @@ typedef struct { const PalAllocator* allocator; PalEventDriver* eventDriver; const Backend* backend; + WindowState* states; char className[64]; Int32 classNameLen; } VideoLinux; @@ -376,7 +389,7 @@ static RRMode xFindMode( return None; } -static void xcheckFeatures() +static void xCheckFeatures() { // cache this atoms X_INTERN(WM_DELETE_WINDOW); @@ -395,6 +408,7 @@ static void xcheckFeatures() X_INTERN(_NET_WM_WINDOW_TYPE_SPLASH); X_INTERN(_NET_WM_PID); X_INTERN(_WM_CLASS); + X_INTERN(_NET_ACTIVE_WINDOW); // check for support from the window manager Atom type; @@ -494,6 +508,35 @@ static int xErrorHandler(Display*, XErrorEvent* e) { return 0; } +static WindowState* getFreeWindowState() { + for (int i = 0; i < MAX_WINDOW_STATE; ++i) { + if (!s_Video.states[i].used) { + s_Video.states[i].used = true; + return &s_Video.states[i]; + } + } + // TODO: FIXME + // maybe expand window states array + return nullptr; +} + +static WindowState* findWindowState(PalWindow* window) { + for (int i = 0; i < MAX_WINDOW_STATE; ++i) { + if (s_Video.states[i].used && s_Video.states[i].window == window) { + return &s_Video.states[i]; + } + } + return nullptr; +} + +static void freeWindowState(PalWindow* window) { + for (int i = 0; i < MAX_WINDOW_STATE; ++i) { + if (s_Video.states[i].used && s_Video.states[i].window == window) { + s_Video.states[i].used = false; + } + } +} + // ================================================== // X11 // ================================================== @@ -654,7 +697,7 @@ static PalResult xInitVideo() s_X11.xrandr, "XRRFreeCrtcInfo"); - xcheckFeatures(); + xCheckFeatures(); // get root window bpp XWindowAttributes attr; s_X11.getWindowAttributes(s_X11.display, s_X11.root, &attr); @@ -719,9 +762,154 @@ static void xUpdateVideo() } } - break; + return; + } + + case ConfigureNotify: { + // window resize or move + PalWindow* window = TO_PAL_HANDLE( + PalWindow, + event.xconfigure.window); + + WindowState* state = findWindowState(window); + if (state->skipFirst) { + state->skipFirst = false; + state->width = event.xconfigure.width; + state->height = event.xconfigure.height; + state->x = event.xconfigure.x; + state->y = event.xconfigure.y; + return; + } + + // real configure event + if (s_Video.eventDriver) { + // check if its a resize event + if (state->width != event.xconfigure.width || + state->height != event.xconfigure.height) { + state->width = event.xconfigure.width; + state->height = event.xconfigure.height; + + // push a resize event + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_SIZE; + mode = palGetEventDispatchMode(driver, type); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackUint32(state->width, state->height); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + + // check if its a move event + if (state->x != event.xconfigure.x || + state->y != event.xconfigure.y) { + state->x = event.xconfigure.x; + state->y = event.xconfigure.y; + + // push a move event + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_MOVE; + mode = palGetEventDispatchMode(driver, type); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackInt32(state->x, state->y); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + } + return; } + case FocusIn: { + // window has gained focus + if (s_Video.eventDriver) { + int mode = event.xfocus.mode; + if (mode == NotifyGrab || mode == NotifyUngrab) { + // ignore dragging and popup focus events + return; + } + + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_FOCUS; + mode = palGetEventDispatchMode(driver, type); + + PalWindow* window = TO_PAL_HANDLE( + PalWindow, + event.xfocus.window); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = true; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + return; + } + + case FocusOut: { + // window has lost focus + if (s_Video.eventDriver) { + int mode = event.xfocus.mode; + if (mode == NotifyGrab || mode == NotifyUngrab) { + // ignore dragging and popup focus events + break; + } + + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_FOCUS; + mode = palGetEventDispatchMode(driver, type); + + PalWindow* window = TO_PAL_HANDLE( + PalWindow, + event.xfocus.window); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = false; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + return; + } + + //case PropertyNotify: { + // check for active window + // if (event.xproperty.atom == s_X11Atoms._NET_ACTIVE_WINDOW) { + // Window window = None; + // Atom type; + // int format; + // unsigned long count, bytesAfter; + // unsigned char* property = nullptr; + + // s_X11.getWindowProperty( + // s_X11.display, + // s_X11.root, + // s_X11Atoms._NET_ACTIVE_WINDOW, + // 0, + // 1, + // False, + // XA_WINDOW, + // &type, + // &format, + // &count, + // &bytesAfter, + // &property); + + // window = *(Window*)property; + + // } + // break; + // } } } @@ -1263,6 +1451,10 @@ static PalResult xCreateWindow( mask |= ButtonPressMask; mask |= ButtonReleaseMask; mask |= PointerMotionMask; + mask |= FocusChangeMask; + mask |= EnterWindowMask; + mask |= LeaveWindowMask; + mask |= PropertyChangeMask; XSetWindowAttributes attrs = {0}; attrs.colormap = colormap; @@ -1468,7 +1660,12 @@ static PalResult xCreateWindow( True); s_X11.flush(s_X11.display); - *outWindow = TO_PAL_HANDLE(PalWindow, window); + + WindowState* state = getFreeWindowState(); + state->skipFirst = true; + state->window = TO_PAL_HANDLE(PalWindow, window); + + *outWindow = state->window; return PAL_RESULT_SUCCESS; } @@ -1538,6 +1735,13 @@ PalResult PAL_CALL palInitVideo( return PAL_RESULT_INVALID_ALLOCATOR; } + // allocate an array for window states + s_Video.states = palAllocate(s_Video.allocator, sizeof(WindowState), 0); + if (!s_Video.states) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + // get backend type bool x11 = true; const char* session = getenv("XDG_SESSION_TYPE"); @@ -1565,6 +1769,7 @@ void PAL_CALL palShutdownVideo() { if (s_Video.initialized) { s_Video.backend->shutdownVideo(); + palFree(s_Video.allocator, s_Video.states); } } From 775987beec98fe195069270347d4c2f811426362 Mon Sep 17 00:00:00 2001 From: nichcode Date: Wed, 8 Oct 2025 14:26:53 +0000 Subject: [PATCH 13/30] window state event --- src/video/pal_video_linux.c | 266 +++++++++++++++++++++++++++--------- src/video/pal_video_win32.c | 2 + 2 files changed, 207 insertions(+), 61 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index bec4ad7..0b1304a 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -50,6 +50,8 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) #define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) + +#define MAX_MONITOR_STATE 16 #define MAX_WINDOW_STATE 128 typedef Display* (*XOpenDisplayFn)(const char*); @@ -226,12 +228,20 @@ typedef void (*XRRFreeCrtcInfoFn)( XRRCrtcInfo*); typedef struct { + bool used; + int dpi; + PalMonitor* monitor; +} MonitorState; + +typedef struct { + bool skipState; + bool skipConfigure; + bool used; int x; int y; int width; int height; - bool skipFirst; - bool used; + PalWindowState state; PalWindow* window; } WindowState; @@ -328,13 +338,15 @@ typedef struct { typedef struct { bool initialized; + Int32 classNameLen; + Int32 monitorCount; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; const Backend* backend; - WindowState* states; + WindowState* windowStates; + MonitorState* monitorStates; char className[64]; - Int32 classNameLen; } VideoLinux; static X11 s_X11 = {0}; @@ -502,17 +514,19 @@ static void xCheckFeatures() s_Video.features = features; } -static int xErrorHandler(Display*, XErrorEvent* e) { +static int xErrorHandler(Display*, XErrorEvent* e) +{ // this is use for simple success and failure s_XErrorOccurred = true; return 0; } -static WindowState* getFreeWindowState() { +static WindowState* getFreeWindowState() +{ for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (!s_Video.states[i].used) { - s_Video.states[i].used = true; - return &s_Video.states[i]; + if (!s_Video.windowStates[i].used) { + s_Video.windowStates[i].used = true; + return &s_Video.windowStates[i]; } } // TODO: FIXME @@ -520,21 +534,98 @@ static WindowState* getFreeWindowState() { return nullptr; } -static WindowState* findWindowState(PalWindow* window) { +static MonitorState* getFreeMonitorState() +{ + for (int i = 0; i < MAX_MONITOR_STATE; ++i) { + if (!s_Video.monitorStates[i].used) { + s_Video.monitorStates[i].used = true; + return &s_Video.monitorStates[i]; + } + } + // TODO: FIXME + // maybe expand monitor states array + return nullptr; +} + +static WindowState* findWindowState(PalWindow* window) +{ for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (s_Video.states[i].used && s_Video.states[i].window == window) { - return &s_Video.states[i]; + if (s_Video.windowStates[i].used && + s_Video.windowStates[i].window == window) { + return &s_Video.windowStates[i]; + } + } + return nullptr; +} + +static MonitorState* findMonitorState(PalMonitor* monitor) +{ + for (int i = 0; i < MAX_MONITOR_STATE; ++i) { + if (s_Video.monitorStates[i].used && + s_Video.monitorStates[i].monitor == monitor) { + return &s_Video.monitorStates[i]; } } return nullptr; } -static void freeWindowState(PalWindow* window) { +static void freeWindowState(PalWindow* window) +{ for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (s_Video.states[i].used && s_Video.states[i].window == window) { - s_Video.states[i].used = false; + if (s_Video.windowStates[i].used && + s_Video.windowStates[i].window == window) { + s_Video.windowStates[i].used = false; + } + } +} + +static void freeMonitorState(PalMonitor* monitor) +{ + for (int i = 0; i < MAX_MONITOR_STATE; ++i) { + if (s_Video.monitorStates[i].used && + s_Video.monitorStates[i].monitor == monitor) { + s_Video.monitorStates[i].used = false; + } + } +} + +static PalWindowState xQueryWindowState(Window xWindow) +{ + Atom type; + int format; + unsigned long count, bytesAfter; + Atom* atoms = nullptr; + PalWindowState state = PAL_WINDOW_STATE_RESTORED; + + s_X11.getWindowProperty( + s_X11.display, + xWindow, + s_X11Atoms._NET_WM_STATE, + 0, + 1024, + False, + XA_ATOM, + &type, + &format, + &count, + &bytesAfter, + (unsigned char**)&atoms); + + for (unsigned int i = 0; i < count; i++) { + if (atoms[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ) { + state = PAL_WINDOW_STATE_MAXIMIZED; + } + + if (atoms[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT) { + state = PAL_WINDOW_STATE_MAXIMIZED; + } + + if (atoms[i] == s_X11Atoms._NET_WM_STATE_HIDDEN) { + state = PAL_WINDOW_STATE_MINIMIZED; } } + + return state; } // ================================================== @@ -729,10 +820,22 @@ static PalResult xInitVideo() '\0'); s_Video.classNameLen = strlen(instance) + strlen(class) + 2; + return PAL_RESULT_SUCCESS; } -static void xUpdateVideo() +static void xShutdownVideo() +{ + if (s_X11.transparentColormap) { + s_X11.freeColormap(s_X11.display, s_X11.transparentColormap); + } + + s_X11.closeDisplay(s_X11.display); + dlclose(s_X11.handle); + dlclose(s_X11.xrandr); +} + +static void xUpdateVideo() { XEvent event; PalDispatchMode mode = PAL_DISPATCH_NONE; @@ -772,8 +875,9 @@ static void xUpdateVideo() event.xconfigure.window); WindowState* state = findWindowState(window); - if (state->skipFirst) { - state->skipFirst = false; + // skip the first configure event + if (state->skipConfigure) { + state->skipConfigure = false; state->width = event.xconfigure.width; state->height = event.xconfigure.height; state->x = event.xconfigure.x; @@ -801,6 +905,29 @@ static void xUpdateVideo() event.data2 = palPackPointer(window); palPushEvent(driver, &event); } + + // we check window state and push event some window + // managers do not update the state PropertyNotify + // so we update that if it was not called + PalWindowState winState; + winState = xQueryWindowState(event.xconfigure.window); + if (winState != state->state) { + // state has changed even if PropertyNotify was called + state->state = winState; + + // push event + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_STATE; + mode = palGetEventDispatchMode(driver, type); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = state->state; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } } // check if its a move event @@ -882,51 +1009,48 @@ static void xUpdateVideo() return; } - //case PropertyNotify: { - // check for active window - // if (event.xproperty.atom == s_X11Atoms._NET_ACTIVE_WINDOW) { - // Window window = None; - // Atom type; - // int format; - // unsigned long count, bytesAfter; - // unsigned char* property = nullptr; - - // s_X11.getWindowProperty( - // s_X11.display, - // s_X11.root, - // s_X11Atoms._NET_ACTIVE_WINDOW, - // 0, - // 1, - // False, - // XA_WINDOW, - // &type, - // &format, - // &count, - // &bytesAfter, - // &property); - - // window = *(Window*)property; + case PropertyNotify: { + PalWindow* window = TO_PAL_HANDLE( + PalWindow, + event.xproperty.window); + + // check window state (maximize, minimize) + if (event.xproperty.atom == s_X11Atoms._NET_WM_STATE) { + WindowState* state = findWindowState(window); + + PalWindowState winState; + winState = xQueryWindowState(event.xproperty.window); + if (winState != state->state) { + state->state = winState; + + // skip the first state event + if (state->skipState) { + state->skipState = false; + return; + } + + // push event + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_WINDOW_STATE; + mode = palGetEventDispatchMode(driver, type); - // } - // break; - // } + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = state->state; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + } + break; + } } } s_X11.flush(s_X11.display); } -static void xShutdownVideo() -{ - if (s_X11.transparentColormap) { - s_X11.freeColormap(s_X11.display, s_X11.transparentColormap); - } - - s_X11.closeDisplay(s_X11.display); - dlclose(s_X11.handle); - dlclose(s_X11.xrandr); -} - static PalResult xEnumerateMonitors( Int32* count, PalMonitor** outMonitors) @@ -1662,7 +1786,8 @@ static PalResult xCreateWindow( s_X11.flush(s_X11.display); WindowState* state = getFreeWindowState(); - state->skipFirst = true; + state->skipConfigure = true; + state->skipState = true; state->window = TO_PAL_HANDLE(PalWindow, window); *outWindow = state->window; @@ -1736,11 +1861,23 @@ PalResult PAL_CALL palInitVideo( } // allocate an array for window states - s_Video.states = palAllocate(s_Video.allocator, sizeof(WindowState), 0); - if (!s_Video.states) { + s_Video.windowStates = palAllocate( + s_Video.allocator, + sizeof(WindowState) * MAX_WINDOW_STATE, + 0); + + // allocate an array for monitor states + s_Video.monitorStates = palAllocate( + s_Video.allocator, + sizeof(MonitorState) * MAX_MONITOR_STATE, + 0); + + if (!s_Video.windowStates || !s_Video.monitorStates) { return PAL_RESULT_OUT_OF_MEMORY; } - + + memset(s_Video.windowStates, 0, sizeof(WindowState) * MAX_WINDOW_STATE); + memset(s_Video.monitorStates, 0, sizeof(MonitorState) * MAX_MONITOR_STATE); // get backend type bool x11 = true; @@ -1756,6 +1893,11 @@ PalResult PAL_CALL palInitVideo( if (ret != PAL_RESULT_SUCCESS) { return ret; } + + // get monitor count. X11 does not provide an event for this + int count = 0; + xEnumerateMonitors(&count, nullptr); + s_Video.monitorCount = count; s_Video.backend = &s_XBackend; } @@ -1769,7 +1911,8 @@ void PAL_CALL palShutdownVideo() { if (s_Video.initialized) { s_Video.backend->shutdownVideo(); - palFree(s_Video.allocator, s_Video.states); + palFree(s_Video.allocator, s_Video.windowStates); + palFree(s_Video.allocator, s_Video.monitorStates); } } @@ -1958,6 +2101,7 @@ PalResult PAL_CALL palCreateWindow( void PAL_CALL palDestroyWindow(PalWindow* window) { if (s_Video.initialized && window) { + freeWindowState(window); return s_Video.backend->destroyWindow(window); } } diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index d083c0a..035a70a 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -210,6 +210,8 @@ LRESULT CALLBACK videoProc( } } + // TODO: Dont send restored events continously + if (mode == PAL_DISPATCH_CALLBACK) { PalEvent event = {0}; event.data = state; From a01b674dd6e07092b325b8068291376117f6b4b7 Mon Sep 17 00:00:00 2001 From: nichcode Date: Wed, 8 Oct 2025 18:07:12 +0000 Subject: [PATCH 14/30] stable window --- src/video/pal_video_linux.c | 309 ++++++++++++++++-------------------- src/video/pal_video_win32.c | 4 +- 2 files changed, 136 insertions(+), 177 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 0b1304a..5456910 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -35,8 +35,9 @@ freely, subject to the following restrictions: // X11 headers #include -#include #include +#include +#include #include #if PAL_HAS_WAYLAND @@ -51,8 +52,9 @@ freely, subject to the following restrictions: #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) #define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) -#define MAX_MONITOR_STATE 16 -#define MAX_WINDOW_STATE 128 +// monitors are pluggable so we keep a static array +// to get dpi and count since X11 does not provide those for us +#define MAX_MONITOR_DATA 32 typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); @@ -188,6 +190,20 @@ typedef int (*XSyncFn)( Display*, Bool); +typedef int (*XSaveContextFn)( + Display*, + XID, + XContext, + _Xconst char*); + +typedef int (*XFindContextFn)( + Display*, + XID, + XContext, + XPointer*); + +typedef XrmQuark (*XrmUniqueQuarkFn)(void); + typedef int (*XRRSetCrtcConfigFn)( Display*, XRRScreenResources*, @@ -227,23 +243,26 @@ typedef void (*XRRFreeOutputInfoFn)( typedef void (*XRRFreeCrtcInfoFn)( XRRCrtcInfo*); -typedef struct { - bool used; - int dpi; - PalMonitor* monitor; -} MonitorState; +typedef void (*XRRSelectInputFn)( + Display*, + Window, + int); typedef struct { - bool skipState; bool skipConfigure; - bool used; + bool skipState; int x; int y; - int width; - int height; + Uint32 w; + Uint32 h; PalWindowState state; - PalWindow* window; -} WindowState; +} WindowData; + +typedef struct { + bool used; + int dpi; + PalMonitor* monitor; +} MonitorData; typedef struct { @@ -281,6 +300,7 @@ typedef struct { Colormap transparentColormap; Visual* transparentVisual; GC gc; + XContext dataID; XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; @@ -309,6 +329,9 @@ typedef struct { XSetErrorHandlerFn setErrorHandler; XSyncFn sync; + XSaveContextFn saveContext; + XFindContextFn findContext; + XrmUniqueQuarkFn uniqueContext; XRRSetCrtcConfigFn setCrtcConfig; XRRGetScreenResourcesFn getScreenResources; @@ -318,6 +341,7 @@ typedef struct { XRRFreeScreenResourcesFn freeScreenResources; XRRFreeOutputInfoFn freeOutputInfo; XRRFreeCrtcInfoFn freeCrtcInfo; + XRRSelectInputFn selectRRInput; } X11; typedef struct { @@ -338,21 +362,21 @@ typedef struct { typedef struct { bool initialized; + bool error; Int32 classNameLen; Int32 monitorCount; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; const Backend* backend; - WindowState* windowStates; - MonitorState* monitorStates; + + MonitorData monitorData[MAX_MONITOR_DATA]; char className[64]; } VideoLinux; static X11 s_X11 = {0}; static X11Atoms s_X11Atoms = {0}; static VideoLinux s_Video = {0}; -static bool s_XErrorOccurred = false; // ================================================== // Internal API @@ -517,79 +541,44 @@ static void xCheckFeatures() static int xErrorHandler(Display*, XErrorEvent* e) { // this is use for simple success and failure - s_XErrorOccurred = true; + s_Video.error = true; return 0; } -static WindowState* getFreeWindowState() -{ - for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (!s_Video.windowStates[i].used) { - s_Video.windowStates[i].used = true; - return &s_Video.windowStates[i]; - } - } - // TODO: FIXME - // maybe expand window states array - return nullptr; -} - -static MonitorState* getFreeMonitorState() +static MonitorData* getFreeMonitorData() { - for (int i = 0; i < MAX_MONITOR_STATE; ++i) { - if (!s_Video.monitorStates[i].used) { - s_Video.monitorStates[i].used = true; - return &s_Video.monitorStates[i]; + for (int i = 0; i < MAX_MONITOR_DATA; ++i) { + if (!s_Video.monitorData[i].used) { + s_Video.monitorData[i].used = true; + return &s_Video.monitorData[i]; } } - // TODO: FIXME - // maybe expand monitor states array + //, It will be weird to see a 32 monitor setup return nullptr; } -static WindowState* findWindowState(PalWindow* window) +static MonitorData* findMonitorData(PalMonitor* monitor) { - for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (s_Video.windowStates[i].used && - s_Video.windowStates[i].window == window) { - return &s_Video.windowStates[i]; + for (int i = 0; i < MAX_MONITOR_DATA; ++i) { + if (s_Video.monitorData[i].used && + s_Video.monitorData[i].monitor == monitor) { + return &s_Video.monitorData[i]; } } return nullptr; } -static MonitorState* findMonitorState(PalMonitor* monitor) -{ - for (int i = 0; i < MAX_MONITOR_STATE; ++i) { - if (s_Video.monitorStates[i].used && - s_Video.monitorStates[i].monitor == monitor) { - return &s_Video.monitorStates[i]; - } - } - return nullptr; -} - -static void freeWindowState(PalWindow* window) -{ - for (int i = 0; i < MAX_WINDOW_STATE; ++i) { - if (s_Video.windowStates[i].used && - s_Video.windowStates[i].window == window) { - s_Video.windowStates[i].used = false; - } - } -} - -static void freeMonitorState(PalMonitor* monitor) +static void freeMonitorData(PalMonitor* monitor) { - for (int i = 0; i < MAX_MONITOR_STATE; ++i) { - if (s_Video.monitorStates[i].used && - s_Video.monitorStates[i].monitor == monitor) { - s_Video.monitorStates[i].used = false; + for (int i = 0; i < MAX_MONITOR_DATA; ++i) { + if (s_Video.monitorData[i].used && + s_Video.monitorData[i].monitor == monitor) { + s_Video.monitorData[i].used = false; } } } -static PalWindowState xQueryWindowState(Window xWindow) +static PalWindowState xQueryWindowState(Window xWin) { Atom type; int format; @@ -599,7 +588,7 @@ static PalWindowState xQueryWindowState(Window xWindow) s_X11.getWindowProperty( s_X11.display, - xWindow, + xWin, s_X11Atoms._NET_WM_STATE, 0, 1024, @@ -750,6 +739,18 @@ static PalResult xInitVideo() s_X11.handle, "XSync"); + s_X11.saveContext = (XSaveContextFn)dlsym( + s_X11.handle, + "XSaveContext"); + + s_X11.findContext = (XFindContextFn)dlsym( + s_X11.handle, + "XFindContext"); + + s_X11.uniqueContext = (XrmUniqueQuarkFn)dlsym( + s_X11.handle, + "XrmUniqueQuark"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -788,6 +789,10 @@ static PalResult xInitVideo() s_X11.xrandr, "XRRFreeCrtcInfo"); + s_X11.selectRRInput = (XRRSelectInputFn)dlsym( + s_X11.xrandr, + "XRRSelectInput"); + xCheckFeatures(); // get root window bpp XWindowAttributes attr; @@ -807,6 +812,12 @@ static PalResult xInitVideo() info.visual, AllocNone); + // subscribe for monitor events + s_X11.selectRRInput( + s_X11.display, + s_X11.root, + RRScreenChangeNotifyMask); + // set class const char* instance = "pal_window"; const char* class = "PAL"; @@ -820,6 +831,7 @@ static PalResult xInitVideo() '\0'); s_Video.classNameLen = strlen(instance) + strlen(class) + 2; + s_X11.dataID = (XContext)s_X11.uniqueContext(); return PAL_RESULT_SUCCESS; } @@ -842,6 +854,11 @@ static void xUpdateVideo() while (s_X11.pending(s_X11.display)) { s_X11.nextEvent(s_X11.display, &event); + Window xWin = event.xany.window; + PalWindow* window = TO_PAL_HANDLE(PalWindow, xWin); + WindowData* data = nullptr; + s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&data); + switch (event.type) { case ClientMessage: { // check for window close @@ -851,11 +868,6 @@ static void xUpdateVideo() PalEventDriver* driver = s_Video.eventDriver; PalEventType type = PAL_EVENT_WINDOW_CLOSE; mode = palGetEventDispatchMode(driver, type); - - PalWindow* window = TO_PAL_HANDLE( - PalWindow, - event.xclient.window); - if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; @@ -863,35 +875,30 @@ static void xUpdateVideo() palPushEvent(driver, &event); } } - } return; } case ConfigureNotify: { // window resize or move - PalWindow* window = TO_PAL_HANDLE( - PalWindow, - event.xconfigure.window); - WindowState* state = findWindowState(window); // skip the first configure event - if (state->skipConfigure) { - state->skipConfigure = false; - state->width = event.xconfigure.width; - state->height = event.xconfigure.height; - state->x = event.xconfigure.x; - state->y = event.xconfigure.y; + if (data->skipConfigure) { + data->skipConfigure = false; + data->w = event.xconfigure.width; + data->h = event.xconfigure.height; + data->x = event.xconfigure.x; + data->y = event.xconfigure.y; return; } // real configure event if (s_Video.eventDriver) { // check if its a resize event - if (state->width != event.xconfigure.width || - state->height != event.xconfigure.height) { - state->width = event.xconfigure.width; - state->height = event.xconfigure.height; + if (data->w != event.xconfigure.width || + data->h != event.xconfigure.height) { + data->w = event.xconfigure.width; + data->h = event.xconfigure.height; // push a resize event PalEventDriver* driver = s_Video.eventDriver; @@ -901,40 +908,17 @@ static void xUpdateVideo() if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; - event.data = palPackUint32(state->width, state->height); + event.data = palPackUint32(data->w, data->h); event.data2 = palPackPointer(window); palPushEvent(driver, &event); } - - // we check window state and push event some window - // managers do not update the state PropertyNotify - // so we update that if it was not called - PalWindowState winState; - winState = xQueryWindowState(event.xconfigure.window); - if (winState != state->state) { - // state has changed even if PropertyNotify was called - state->state = winState; - - // push event - PalEventDriver* driver = s_Video.eventDriver; - PalEventType type = PAL_EVENT_WINDOW_STATE; - mode = palGetEventDispatchMode(driver, type); - - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = state->state; - event.data2 = palPackPointer(window); - palPushEvent(driver, &event); - } - } } // check if its a move event - if (state->x != event.xconfigure.x || - state->y != event.xconfigure.y) { - state->x = event.xconfigure.x; - state->y = event.xconfigure.y; + if (data->x != event.xconfigure.x || + data->y != event.xconfigure.y) { + data->x = event.xconfigure.x; + data->y = event.xconfigure.y; // push a move event PalEventDriver* driver = s_Video.eventDriver; @@ -944,7 +928,7 @@ static void xUpdateVideo() if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; - event.data = palPackInt32(state->x, state->y); + event.data = palPackInt32(data->x, data->y); event.data2 = palPackPointer(window); palPushEvent(driver, &event); } @@ -965,11 +949,6 @@ static void xUpdateVideo() PalEventDriver* driver = s_Video.eventDriver; PalEventType type = PAL_EVENT_WINDOW_FOCUS; mode = palGetEventDispatchMode(driver, type); - - PalWindow* window = TO_PAL_HANDLE( - PalWindow, - event.xfocus.window); - if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; @@ -993,11 +972,6 @@ static void xUpdateVideo() PalEventDriver* driver = s_Video.eventDriver; PalEventType type = PAL_EVENT_WINDOW_FOCUS; mode = palGetEventDispatchMode(driver, type); - - PalWindow* window = TO_PAL_HANDLE( - PalWindow, - event.xfocus.window); - if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; @@ -1010,22 +984,16 @@ static void xUpdateVideo() } case PropertyNotify: { - PalWindow* window = TO_PAL_HANDLE( - PalWindow, - event.xproperty.window); - // check window state (maximize, minimize) if (event.xproperty.atom == s_X11Atoms._NET_WM_STATE) { - WindowState* state = findWindowState(window); - - PalWindowState winState; - winState = xQueryWindowState(event.xproperty.window); - if (winState != state->state) { - state->state = winState; + PalWindowState state; + state = xQueryWindowState(event.xproperty.window); + if (state != data->state) { + data->state = state; // skip the first state event - if (state->skipState) { - state->skipState = false; + if (data->skipState) { + data->skipState = false; return; } @@ -1037,13 +1005,19 @@ static void xUpdateVideo() if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; event.type = type; - event.data = state->state; + event.data = data->state; event.data2 = palPackPointer(window); palPushEvent(driver, &event); } } } - break; + return; + } + + case RRScreenChangeNotify: { + // TODO: + int a = 1; + return; } } } @@ -1521,6 +1495,12 @@ static PalResult xCreateWindow( PalMonitor* monitor = nullptr; PalMonitorInfo monitorInfo; + WindowData* data = nullptr; + data = palAllocate(s_Video.allocator, sizeof(WindowData), 0); + if (!data) { + return PAL_RESULT_OUT_OF_MEMORY; + } + Visual* visual = DefaultVisual(s_X11.display, s_X11.screen); int depth = DefaultDepth(s_X11.display, s_X11.screen); unsigned long bgPixel = WhitePixel(s_X11.display, s_X11.screen); @@ -1785,20 +1765,20 @@ static PalResult xCreateWindow( s_X11.flush(s_X11.display); - WindowState* state = getFreeWindowState(); - state->skipConfigure = true; - state->skipState = true; - state->window = TO_PAL_HANDLE(PalWindow, window); + // attach the window data to the window + s_X11.saveContext(s_X11.display, window, s_X11.dataID, (XPointer)data); - *outWindow = state->window; + *outWindow = TO_PAL_HANDLE(PalWindow, window); return PAL_RESULT_SUCCESS; } static void xDestroyWindow(PalWindow* window) { - s_X11.destroyWindow( - s_X11.display, - FROM_PAL_HANDLE(Window, window)); + Window xWin = FROM_PAL_HANDLE(Window, window); + WindowData* data = nullptr; + s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&data); + s_X11.destroyWindow(s_X11.display, xWin); + palFree(s_Video.allocator, data); } static PalResult xSetWindowOpacity( @@ -1820,7 +1800,7 @@ static PalResult xSetWindowOpacity( s_X11.sync(s_X11.display, False); s_X11.setErrorHandler(old); - if (s_XErrorOccurred) { + if (s_Video.error) { // technically, this is the only error that can occur return PAL_RESULT_INVALID_WINDOW; } @@ -1860,25 +1840,6 @@ PalResult PAL_CALL palInitVideo( return PAL_RESULT_INVALID_ALLOCATOR; } - // allocate an array for window states - s_Video.windowStates = palAllocate( - s_Video.allocator, - sizeof(WindowState) * MAX_WINDOW_STATE, - 0); - - // allocate an array for monitor states - s_Video.monitorStates = palAllocate( - s_Video.allocator, - sizeof(MonitorState) * MAX_MONITOR_STATE, - 0); - - if (!s_Video.windowStates || !s_Video.monitorStates) { - return PAL_RESULT_OUT_OF_MEMORY; - } - - memset(s_Video.windowStates, 0, sizeof(WindowState) * MAX_WINDOW_STATE); - memset(s_Video.monitorStates, 0, sizeof(MonitorState) * MAX_MONITOR_STATE); - // get backend type bool x11 = true; const char* session = getenv("XDG_SESSION_TYPE"); @@ -1895,6 +1856,7 @@ PalResult PAL_CALL palInitVideo( } // get monitor count. X11 does not provide an event for this + // we need this to trigger PAL_EVENT_MONITOR_LIST_CHANGED int count = 0; xEnumerateMonitors(&count, nullptr); s_Video.monitorCount = count; @@ -1911,8 +1873,6 @@ void PAL_CALL palShutdownVideo() { if (s_Video.initialized) { s_Video.backend->shutdownVideo(); - palFree(s_Video.allocator, s_Video.windowStates); - palFree(s_Video.allocator, s_Video.monitorStates); } } @@ -2101,7 +2061,6 @@ PalResult PAL_CALL palCreateWindow( void PAL_CALL palDestroyWindow(PalWindow* window) { if (s_Video.initialized && window) { - freeWindowState(window); return s_Video.backend->destroyWindow(window); } } diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 035a70a..49807e4 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1163,7 +1163,7 @@ PalResult PAL_CALL palInitVideo( return PAL_RESULT_PLATFORM_FAILURE; } - // set a flag to set if the window has been created + // set a flag to check if the window has been created SetWindowLongPtrW(s_Video.hiddenWindow, GWLP_USERDATA, (LONG_PTR)&s_Event); // register raw input for mice to get delta @@ -1806,7 +1806,7 @@ PalResult PAL_CALL palCreateWindow( SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); } - // set a flag to set if the window has been created + // set a flag to check if the window has been created SetWindowLongPtrW(handle, GWLP_USERDATA, (LONG_PTR)&s_Event); *outWindow = (PalWindow*)handle; From 3129a0d36b493dcae8babf2b188dcd7e9bd8d2b5 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 10 Oct 2025 15:32:02 +0000 Subject: [PATCH 15/30] window test X11 --- README.md | 17 +- src/video/pal_video_linux.c | 433 ++++++++++++++++++++++++------ tests/cursor_test.c | 8 +- tests/event_test.c | 2 +- tests/icon_test.c | 10 +- tests/input_window_test.c | 6 +- tests/monitor_mode_test.c | 14 +- tests/monitor_test.c | 8 +- tests/opengl_context_test.c | 8 +- tests/opengl_fbconfig_test.c | 6 +- tests/opengl_multi_context_test.c | 10 +- tests/system_cursor_test.c | 8 +- tests/system_test.c | 2 +- tests/user_event_test.c | 2 +- tests/video_test.c | 2 +- tests/window_test.c | 8 +- 16 files changed, 421 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index 57c948c..85d721a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,17 @@ PAL is a lightweight, low-level, cross-platform abstraction layer in **C**, designed to be **explicit** and as close to the **OS** as possible — similar in philosophy to Vulkan. It gives you precise control without hidden behavior, making it ideal for developers who want performance and predictability. +PAL is a transparent. All queries — window size, position, monitor info, and more — reflect the current platform state. Using PAL is like working directly with the OS: it applies no hidden logic, makes no assumptions, and leaves behavior fully in your control. + +This approach gives you total control: you handle events, manage resources, and cache state explicitly. PAL provides the building blocks; how you use them — whether for simple applications or advanced frameworks — is entirely up to you. + +Example – Get Window Size +```c +// Direct query from the platform — not cached by PAL +palGetWindowSize(window, &w, &h); +``` +> Note: palGetWindowSize queries the OS directly. If your application needs continuous updates (e.g., window moves or resizes frequently), it is more efficient to listen to PAL events rather than repeatedly querying the OS. This ensures your app stays performant. + --- ## Why PAL? @@ -60,7 +71,11 @@ For more detailed examples, see the [tests folder](./tests) tests folder, which --- ## Philosophy - +- PAL is a thin layer over the OS, not a framework or library. +- Queries return the current platform state, reflecting any changes made through direct OS calls. +- Developers are responsible for state tracking, caching, and event handling. +- PAL enables cross-platform consistency while preserving full OS behavior and control. +- Advanced users can build libraries or frameworks on top of PAL. - Minimal overhead (close to raw OS calls) - Explicit API (no hidden behavior or defaults) - Event system supporting both polling and callbacks diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 5456910..cbeb1fe 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -40,6 +40,7 @@ freely, subject to the following restrictions: #include #include +// Wayland headers #if PAL_HAS_WAYLAND #include #endif // PAL_HAS_WAYLAND @@ -50,11 +51,38 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) + +typedef struct { + bool skipConfigure; + bool skipState; + bool used; + int x; + int y; + Uint32 w; + int dpi; + Uint32 h; + PalWindowState state; +} WindowData; + +typedef struct { + bool used; + int dpi; + int x; + int y; + Uint32 w; + Uint32 h; + PalMonitor* monitor; +} MonitorData; + +// ================================================== +// X11 Typedefs, enums and structs +// ================================================== + +#pragma region X11 Typedefs #define X_INTERN(x) s_X11Atoms.x = s_X11.internAtom(s_X11.display, #x, False) -// monitors are pluggable so we keep a static array -// to get dpi and count since X11 does not provide those for us -#define MAX_MONITOR_DATA 32 +#define RANDR_SCREEN_CHANGE_EVENT 1040 +#define RANDR_NOTIFY_EVENT 1041 typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); @@ -248,21 +276,10 @@ typedef void (*XRRSelectInputFn)( Window, int); -typedef struct { - bool skipConfigure; - bool skipState; - int x; - int y; - Uint32 w; - Uint32 h; - PalWindowState state; -} WindowData; - -typedef struct { - bool used; - int dpi; - PalMonitor* monitor; -} MonitorData; +typedef int (*XRRQueryExtensionFn)( + Display*, + int*, + int*); typedef struct { @@ -290,9 +307,13 @@ typedef struct } X11Atoms; typedef struct { + bool error; + bool skipScreenEvent; + bool skipNotifyEvent; int bpp; int transparentDepth; int screen; + int rrEventBase; void* handle; void* xrandr; Display* display; @@ -342,8 +363,14 @@ typedef struct { XRRFreeOutputInfoFn freeOutputInfo; XRRFreeCrtcInfoFn freeCrtcInfo; XRRSelectInputFn selectRRInput; + XRRQueryExtensionFn queryRRExtension; } X11; +static X11 s_X11 = {0}; +static X11Atoms s_X11Atoms = {0}; + +#pragma endregion + typedef struct { void (*shutdownVideo)(); void (*updateVideo)(); @@ -362,20 +389,18 @@ typedef struct { typedef struct { bool initialized; - bool error; Int32 classNameLen; - Int32 monitorCount; + Int32 maxWindowData; + Int32 maxMonitorData; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; const Backend* backend; - - MonitorData monitorData[MAX_MONITOR_DATA]; + WindowData* windowData; + MonitorData* monitorData; char className[64]; } VideoLinux; -static X11 s_X11 = {0}; -static X11Atoms s_X11Atoms = {0}; static VideoLinux s_Video = {0}; // ================================================== @@ -405,6 +430,103 @@ static int compareModes(const void* a, const void* b) } } +static WindowData* getFreeWindowData() +{ + for (int i = 0; i < s_Video.maxWindowData; ++i) { + if (!s_Video.windowData[i].used) { + s_Video.windowData[i].used = true; + return &s_Video.windowData[i]; + } + } + + // resize the data array + // It is rare for a user to create and manage + // 32 windows at the same time + WindowData* data = nullptr; + int count = s_Video.maxWindowData * 2; // double the size + int freeIndex = s_Video.maxWindowData + 1; + data = palAllocate(s_Video.allocator, sizeof(WindowData) * count, 0); + if (data) { + memcpy( + data, + s_Video.windowData, + s_Video.maxWindowData * sizeof(WindowData)); + + palFree(s_Video.allocator, s_Video.windowData); + s_Video.windowData = data; + s_Video.maxWindowData = count; + + s_Video.windowData[freeIndex].used = true; + return &s_Video.windowData[freeIndex]; + } + return nullptr; +} + +static void resetMonitorData() +{ + memset( + s_Video.monitorData, + 0, + s_Video.maxMonitorData * sizeof(MonitorData)); +} + +static MonitorData* getFreeMonitorData() +{ + for (int i = 0; i < s_Video.maxMonitorData; ++i) { + if (!s_Video.monitorData[i].used) { + s_Video.monitorData[i].used = true; + return &s_Video.monitorData[i]; + } + } + + // resize the data array + // this will almost not reach here since most setups are 1-4 monitors + MonitorData* data = nullptr; + int count = s_Video.maxMonitorData * 2; // double the size + int freeIndex = s_Video.maxMonitorData + 1; + data = palAllocate(s_Video.allocator, sizeof(MonitorData) * count, 0); + if (data) { + memcpy( + data, + s_Video.monitorData, + s_Video.maxMonitorData * sizeof(MonitorData)); + + palFree(s_Video.allocator, s_Video.monitorData); + s_Video.monitorData = data; + s_Video.maxWindowData = count; + + s_Video.monitorData[freeIndex].used = true; + return &s_Video.monitorData[freeIndex]; + } + return nullptr; +} + +static MonitorData* findMonitorData(PalMonitor* monitor) +{ + for (int i = 0; i < s_Video.maxMonitorData; ++i) { + if (s_Video.monitorData[i].used && + s_Video.monitorData[i].monitor == monitor) { + return &s_Video.monitorData[i]; + } + } +} + +static void freeMonitorData(PalMonitor* monitor) +{ + for (int i = 0; i < s_Video.maxMonitorData; ++i) { + if (s_Video.monitorData[i].used && + s_Video.monitorData[i].monitor == monitor) { + s_Video.monitorData[i].used = false; + } + } +} + +// ================================================== +// X11 API +// ================================================== + +#pragma region X11 API + static RRMode xFindMode( XRRScreenResources* resources, const PalMonitorMode* mode) @@ -541,43 +663,10 @@ static void xCheckFeatures() static int xErrorHandler(Display*, XErrorEvent* e) { // this is use for simple success and failure - s_Video.error = true; + s_X11.error = true; return 0; } -static MonitorData* getFreeMonitorData() -{ - for (int i = 0; i < MAX_MONITOR_DATA; ++i) { - if (!s_Video.monitorData[i].used) { - s_Video.monitorData[i].used = true; - return &s_Video.monitorData[i]; - } - } - //, It will be weird to see a 32 monitor setup - return nullptr; -} - -static MonitorData* findMonitorData(PalMonitor* monitor) -{ - for (int i = 0; i < MAX_MONITOR_DATA; ++i) { - if (s_Video.monitorData[i].used && - s_Video.monitorData[i].monitor == monitor) { - return &s_Video.monitorData[i]; - } - } - return nullptr; -} - -static void freeMonitorData(PalMonitor* monitor) -{ - for (int i = 0; i < MAX_MONITOR_DATA; ++i) { - if (s_Video.monitorData[i].used && - s_Video.monitorData[i].monitor == monitor) { - s_Video.monitorData[i].used = false; - } - } -} - static PalWindowState xQueryWindowState(Window xWin) { Atom type; @@ -617,9 +706,82 @@ static PalWindowState xQueryWindowState(Window xWin) return state; } -// ================================================== -// X11 -// ================================================== +static void xCacheMonitors(bool enumerate) +{ + XRRScreenResources* resources = nullptr; + resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + for (int i = 0; i < resources->noutput; ++i) { + RROutput output = resources->outputs[i]; + XRROutputInfo* info = s_X11.getOutputInfo( + s_X11.display, + resources, + output); + + if (info->connection == RR_Connected && + info->crtc != None) { + // get monitor data and update info + PalMonitor* monitor = TO_PAL_HANDLE(PalMonitor, output); + MonitorData* data = nullptr; + + if (enumerate) { + data = getFreeMonitorData(); + if (!data) { + return; + } + + data->monitor = monitor; + + } else { + data = findMonitorData(monitor); + } + + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + info->crtc); + + double dpi = (double)(crtc->width * 25.4) / (double)info->mm_width; + data->dpi = (int)dpi; + data->w = crtc->width; + data->h = crtc->height; + data->x = crtc->x; + data->y = crtc->y; + + s_X11.freeCrtcInfo(crtc); + } + + s_X11.freeOutputInfo(info); + } + + s_X11.freeScreenResources(resources); +} + +static int xGetWindowMonitorDPI( + WindowData* data, + bool enumerate) +{ + int winX = data->x + data->w / 2; + int winY = data->y + data->w / 2; + // get the DPI from our cached monitor + for (int i = 0; i < s_Video.maxMonitorData; i++) { + if (!s_Video.monitorData->used) { + continue; + } + + // we found a monitor, check the monitor bounds with the window + MonitorData* info = &s_Video.monitorData[i]; + if (winX >= info->x && + winX < info->x + info->w && + winY >= info->y && + winY < info->y + info->h) { + // found monitor + return info->dpi; + } + } +} static PalResult xInitVideo() { @@ -793,6 +955,10 @@ static PalResult xInitVideo() s_X11.xrandr, "XRRSelectInput"); + s_X11.queryRRExtension = (XRRQueryExtensionFn)dlsym( + s_X11.xrandr, + "XRRQueryExtension"); + xCheckFeatures(); // get root window bpp XWindowAttributes attr; @@ -816,7 +982,13 @@ static PalResult xInitVideo() s_X11.selectRRInput( s_X11.display, s_X11.root, - RRScreenChangeNotifyMask); + RRScreenChangeNotifyMask | RRNotify); + + int eventBase, errorBase = 0; + s_X11.queryRRExtension(s_X11.display, &eventBase, &errorBase); + s_X11.rrEventBase = eventBase; + s_X11.skipScreenEvent = true; + s_X11.skipNotifyEvent = true; // set class const char* instance = "pal_window"; @@ -832,6 +1004,8 @@ static PalResult xInitVideo() s_Video.classNameLen = strlen(instance) + strlen(class) + 2; s_X11.dataID = (XContext)s_X11.uniqueContext(); + resetMonitorData(); + xCacheMonitors(true); return PAL_RESULT_SUCCESS; } @@ -859,6 +1033,12 @@ static void xUpdateVideo() WindowData* data = nullptr; s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&data); + if (event.type == s_X11.rrEventBase + RRScreenChangeNotify) { + event.type = RANDR_SCREEN_CHANGE_EVENT; // for switch flow + } else if (event.type == s_X11.rrEventBase + RRNotify) { + event.type = RANDR_NOTIFY_EVENT; // for switch flow + } + switch (event.type) { case ClientMessage: { // check for window close @@ -932,6 +1112,29 @@ static void xUpdateVideo() event.data2 = palPackPointer(window); palPushEvent(driver, &event); } + + /** a window has to be moved + before its can change monitors + we get the monitor the moved + window is on and check if the dpi is different + from the one it was created on */ + int monitorDPI = xGetWindowMonitorDPI(data, false); + if (monitorDPI != data->dpi) { + // window is on a different monitor + data->dpi = monitorDPI; + + // push a DPI event + type = PAL_EVENT_MONITOR_DPI_CHANGED; + mode = palGetEventDispatchMode(driver, type); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = monitorDPI; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } } } return; @@ -1014,11 +1217,51 @@ static void xUpdateVideo() return; } - case RRScreenChangeNotify: { - // TODO: - int a = 1; + case RANDR_SCREEN_CHANGE_EVENT: { + // skip the first event + if (s_X11.skipScreenEvent) { + s_X11.skipScreenEvent = false; + return; + } + + // something change on pre existing monitor + // cache the information + xCacheMonitors(false); return; } + + case RANDR_NOTIFY_EVENT: { + // skip the first event + if (s_X11.skipNotifyEvent) { + s_X11.skipNotifyEvent = false; + return; + } + + XRRNotifyEvent* e = (XRRNotifyEvent*)&event; + switch (e->subtype) { + case RRNotify_OutputChange: { + // push a event monitor list changed event + if (s_Video.eventDriver) { + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_MONITOR_LIST_CHANGED; + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + + /** enumerate monitors and cache them + these will be used to detect DPI changed + since X11 does not have a DPI changed function */ + resetMonitorData(); + xCacheMonitors(true); + return; + } + } + } } } @@ -1066,9 +1309,32 @@ static PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) s_X11.display, s_X11.root); + if (!primary) { + // primary monitor is not set, set the first one + XRRScreenResources* resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + for (int i = 0; i < resources->noutput; ++i) { + RROutput output = resources->outputs[i]; + XRROutputInfo* outputInfo = s_X11.getOutputInfo( + s_X11.display, + resources, + output); + + if (outputInfo->connection == RR_Connected && + outputInfo->crtc != None) { + primary = resources->outputs[i]; + break; + } + } + } + + // if we still did not get one, we fail if (primary) { *outMonitor = TO_PAL_HANDLE(PalMonitor, primary); return PAL_RESULT_SUCCESS; + } else { return PAL_RESULT_PLATFORM_FAILURE; } @@ -1495,8 +1761,7 @@ static PalResult xCreateWindow( PalMonitor* monitor = nullptr; PalMonitorInfo monitorInfo; - WindowData* data = nullptr; - data = palAllocate(s_Video.allocator, sizeof(WindowData), 0); + WindowData* data = getFreeWindowData(); if (!data) { return PAL_RESULT_OUT_OF_MEMORY; } @@ -1766,6 +2031,9 @@ static PalResult xCreateWindow( s_X11.flush(s_X11.display); // attach the window data to the window + data->skipConfigure = true; + data->skipState = true; + data->dpi = monitorInfo.dpi; // the current window monitor s_X11.saveContext(s_X11.display, window, s_X11.dataID, (XPointer)data); *outWindow = TO_PAL_HANDLE(PalWindow, window); @@ -1778,7 +2046,7 @@ static void xDestroyWindow(PalWindow* window) WindowData* data = nullptr; s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&data); s_X11.destroyWindow(s_X11.display, xWin); - palFree(s_Video.allocator, data); + data->used = false; } static PalResult xSetWindowOpacity( @@ -1800,7 +2068,7 @@ static PalResult xSetWindowOpacity( s_X11.sync(s_X11.display, False); s_X11.setErrorHandler(old); - if (s_Video.error) { + if (s_X11.error) { // technically, this is the only error that can occur return PAL_RESULT_INVALID_WINDOW; } @@ -1824,6 +2092,8 @@ static Backend s_XBackend = { .setWindowOpacity = xSetWindowOpacity }; +#pragma endregion + // ================================================== // Public API // ================================================== @@ -1849,17 +2119,28 @@ PalResult PAL_CALL palInitVideo( } } + s_Video.maxMonitorData = 16; // initial size + s_Video.maxWindowData = 32;// initial size + + s_Video.windowData = palAllocate( + s_Video.allocator, + sizeof(WindowData) * s_Video.maxWindowData, + 0); + + s_Video.monitorData = palAllocate( + s_Video.allocator, + sizeof(MonitorData) * s_Video.maxMonitorData, + 0); + + if (!s_Video.monitorData || !s_Video.windowData) { + return PAL_RESULT_OUT_OF_MEMORY; + } + if (x11) { PalResult ret = xInitVideo(); if (ret != PAL_RESULT_SUCCESS) { return ret; } - - // get monitor count. X11 does not provide an event for this - // we need this to trigger PAL_EVENT_MONITOR_LIST_CHANGED - int count = 0; - xEnumerateMonitors(&count, nullptr); - s_Video.monitorCount = count; s_Video.backend = &s_XBackend; } @@ -1873,6 +2154,8 @@ void PAL_CALL palShutdownVideo() { if (s_Video.initialized) { s_Video.backend->shutdownVideo(); + palFree(s_Video.allocator, s_Video.windowData); + palFree(s_Video.allocator, s_Video.monitorData); } } diff --git a/tests/cursor_test.c b/tests/cursor_test.c index d05565c..dc36e0c 100644 --- a/tests/cursor_test.c +++ b/tests/cursor_test.c @@ -31,7 +31,7 @@ bool cursorTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -41,7 +41,7 @@ bool cursorTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -77,7 +77,7 @@ bool cursorTest() result = palCreateCursor(&cursorCreateInfo, &cursor); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window cursor %s", error); + palLog(nullptr, "Failed to create window cursor: %s", error); return false; } @@ -93,7 +93,7 @@ bool cursorTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } diff --git a/tests/event_test.c b/tests/event_test.c index 073f082..2bd211a 100644 --- a/tests/event_test.c +++ b/tests/event_test.c @@ -38,7 +38,7 @@ static inline void eventDispatchTest(bool poll) result = palCreateEventDriver(&createInfo, &driver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return; } diff --git a/tests/icon_test.c b/tests/icon_test.c index f375849..48652fb 100644 --- a/tests/icon_test.c +++ b/tests/icon_test.c @@ -31,7 +31,7 @@ bool iconTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -41,7 +41,7 @@ bool iconTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -75,7 +75,7 @@ bool iconTest() result = palCreateIcon(&iconCreateInfo, &icon); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window icon %s", error); + palLog(nullptr, "Failed to create window icon: %s", error); return false; } @@ -91,7 +91,7 @@ bool iconTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } @@ -105,7 +105,7 @@ bool iconTest() result = palSetWindowIcon(window, icon); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to set window icon %s", error); + palLog(nullptr, "Failed to set window icon: %s", error); return false; } diff --git a/tests/input_window_test.c b/tests/input_window_test.c index 29f2ca1..ef83f9f 100644 --- a/tests/input_window_test.c +++ b/tests/input_window_test.c @@ -421,7 +421,7 @@ bool inputWindowTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -431,7 +431,7 @@ bool inputWindowTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -447,7 +447,7 @@ bool inputWindowTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } diff --git a/tests/monitor_mode_test.c b/tests/monitor_mode_test.c index 9d375c4..dc672da 100644 --- a/tests/monitor_mode_test.c +++ b/tests/monitor_mode_test.c @@ -18,7 +18,7 @@ bool monitorModeTest() PalResult result = palInitVideo(nullptr, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -26,7 +26,7 @@ bool monitorModeTest() result = palEnumerateMonitors(&count, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitors %s", error); + palLog(nullptr, "Failed to get query monitors: %s", error); return false; } @@ -50,7 +50,7 @@ bool monitorModeTest() result = palEnumerateMonitors(&count, monitors); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitors %s", error); + palLog(nullptr, "Failed to get query monitors: %s", error); return false; } @@ -60,7 +60,7 @@ bool monitorModeTest() result = palGetMonitorInfo(monitor, &info); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get monitor info %s", error); + palLog(nullptr, "Failed to get monitor info: %s", error); palFree(nullptr, monitors); return false; } @@ -72,7 +72,7 @@ bool monitorModeTest() result = palEnumerateMonitorModes(monitor, &modeCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitor modes %s", error); + palLog(nullptr, "Failed to get query monitor modes: %s", error); return false; } @@ -91,7 +91,7 @@ bool monitorModeTest() result = palEnumerateMonitorModes(monitor, &modeCount, modes); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitor modes %s", error); + palLog(nullptr, "Failed to get query monitor modes: %s", error); return false; } @@ -112,7 +112,7 @@ bool monitorModeTest() result = palGetCurrentMonitorMode(monitor, ¤t); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get current monitor mode %s", error); + palLog(nullptr, "Failed to get current monitor mode: %s", error); return false; } diff --git a/tests/monitor_test.c b/tests/monitor_test.c index fecbff0..20bd113 100644 --- a/tests/monitor_test.c +++ b/tests/monitor_test.c @@ -17,7 +17,7 @@ bool monitorTest() PalResult result = palInitVideo(nullptr, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -25,7 +25,7 @@ bool monitorTest() result = palEnumerateMonitors(&count, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitors %s", error); + palLog(nullptr, "Failed to get query monitors: %s", error); return false; } @@ -49,7 +49,7 @@ bool monitorTest() result = palEnumerateMonitors(&count, monitors); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get query monitors %s", error); + palLog(nullptr, "Failed to get query monitors: %s", error); return false; } @@ -59,7 +59,7 @@ bool monitorTest() result = palGetMonitorInfo(monitor, &info); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get monitor info %s", error); + palLog(nullptr, "Failed to get monitor info: %s", error); palFree(nullptr, monitors); return false; } diff --git a/tests/opengl_context_test.c b/tests/opengl_context_test.c index f1753e0..8c50003 100644 --- a/tests/opengl_context_test.c +++ b/tests/opengl_context_test.c @@ -52,7 +52,7 @@ bool openglContextTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -77,7 +77,7 @@ bool openglContextTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } @@ -103,7 +103,7 @@ bool openglContextTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); return false; } @@ -123,7 +123,7 @@ bool openglContextTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); palFree(nullptr, fbConfigs); return false; } diff --git a/tests/opengl_fbconfig_test.c b/tests/opengl_fbconfig_test.c index 6bc9176..323b6f3 100644 --- a/tests/opengl_fbconfig_test.c +++ b/tests/opengl_fbconfig_test.c @@ -43,7 +43,7 @@ bool openglFBConfigTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } @@ -63,7 +63,7 @@ bool openglFBConfigTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); return false; } @@ -83,7 +83,7 @@ bool openglFBConfigTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); palFree(nullptr, fbConfigs); return false; } diff --git a/tests/opengl_multi_context_test.c b/tests/opengl_multi_context_test.c index 3f82e26..2e98f11 100644 --- a/tests/opengl_multi_context_test.c +++ b/tests/opengl_multi_context_test.c @@ -52,7 +52,7 @@ bool openglMultiContextTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -62,7 +62,7 @@ bool openglMultiContextTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -77,7 +77,7 @@ bool openglMultiContextTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } @@ -103,7 +103,7 @@ bool openglMultiContextTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); return false; } @@ -123,7 +123,7 @@ bool openglMultiContextTest() result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to query GL FBConfigs %s", error); + palLog(nullptr, "Failed to query GL FBConfigs: %s", error); palFree(nullptr, fbConfigs); return false; } diff --git a/tests/system_cursor_test.c b/tests/system_cursor_test.c index 8650326..ce92fa5 100644 --- a/tests/system_cursor_test.c +++ b/tests/system_cursor_test.c @@ -30,7 +30,7 @@ bool systemCursorTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -40,7 +40,7 @@ bool systemCursorTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -48,7 +48,7 @@ bool systemCursorTest() result = palCreateCursorFrom(PAL_CURSOR_CROSS, &cursor); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window cursor %s", error); + palLog(nullptr, "Failed to create window cursor: %s", error); return false; } @@ -64,7 +64,7 @@ bool systemCursorTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } diff --git a/tests/system_test.c b/tests/system_test.c index a6e3d2b..126c085 100644 --- a/tests/system_test.c +++ b/tests/system_test.c @@ -86,7 +86,7 @@ bool systemTest() result = palGetCPUInfo(nullptr, &cpuInfo); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to get Cpu info %s", error); + palLog(nullptr, "Failed to get Cpu info: %s", error); return false; } diff --git a/tests/user_event_test.c b/tests/user_event_test.c index dd36b09..75fb7f6 100644 --- a/tests/user_event_test.c +++ b/tests/user_event_test.c @@ -41,7 +41,7 @@ bool userEventTest() result = palCreateEventDriver(&createInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } diff --git a/tests/video_test.c b/tests/video_test.c index eb12f09..5b03281 100644 --- a/tests/video_test.c +++ b/tests/video_test.c @@ -17,7 +17,7 @@ bool videoTest() result = palInitVideo(nullptr, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } diff --git a/tests/window_test.c b/tests/window_test.c index 70d4a42..eb48f70 100644 --- a/tests/window_test.c +++ b/tests/window_test.c @@ -175,7 +175,7 @@ bool windowTest() result = palCreateEventDriver(&eventDriverCreateInfo, &eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create event driver %s", error); + palLog(nullptr, "Failed to create event driver: %s", error); return false; } @@ -185,7 +185,7 @@ bool windowTest() result = palInitVideo(nullptr, eventDriver); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video %s", error); + palLog(nullptr, "Failed to initialize video: %s", error); return false; } @@ -239,7 +239,7 @@ bool windowTest() result = palCreateWindow(&createInfo, &window); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window %s", error); + palLog(nullptr, "Failed to create window: %s", error); return false; } @@ -248,7 +248,7 @@ bool windowTest() //result = palSetWindowOpacity(window, OPACITY); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); - palLog(nullptr, "Failed to set window opacity %s", error); + palLog(nullptr, "Failed to set window opacity: %s", error); return false; } } From b9d46e4bb60c552c11a51051768c4c7f2bfb5da5 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 11 Oct 2025 15:25:15 +0000 Subject: [PATCH 16/30] icon window --- src/video/pal_video_linux.c | 210 +++++++++++++++++++++++++++++------- src/video/pal_video_win32.c | 2 +- tests/icon_test.c | 4 +- tests/tests.lua | 2 +- tests/tests_main.c | 4 +- 5 files changed, 179 insertions(+), 43 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index cbeb1fe..adc27d4 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -164,6 +164,10 @@ typedef int (*XMapWindowFn)( Display*, Window); +typedef int (*XUnmapWindowFn)( + Display*, + Window); + typedef int (*XMatchVisualInfoFn)( Display*, int, @@ -281,6 +285,15 @@ typedef int (*XRRQueryExtensionFn)( int*, int*); +typedef XClassHint *(*XAllocClassHintFn)(void); + +typedef int (*XSetClassHintFn)( + Display*, + Window, + XClassHint*); + +typedef int (*XFreeFn)(void*); + typedef struct { bool unicodeTitle; @@ -304,6 +317,7 @@ typedef struct Atom _NET_WM_PID; Atom _WM_CLASS; Atom _NET_ACTIVE_WINDOW; + Atom _NET_WM_ICON; } X11Atoms; typedef struct { @@ -322,6 +336,7 @@ typedef struct { Visual* transparentVisual; GC gc; XContext dataID; + const char* className; XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; @@ -335,6 +350,7 @@ typedef struct { XFlushFn flush; XCreateColormapFn createColormap; XMapWindowFn mapWindow; + XUnmapWindowFn unmapWindow; XCreateWindowFn createWindow; XDestroyWindowFn destroyWindow; @@ -364,6 +380,10 @@ typedef struct { XRRFreeCrtcInfoFn freeCrtcInfo; XRRSelectInputFn selectRRInput; XRRQueryExtensionFn queryRRExtension; + + XAllocClassHintFn allocClassHint; + XSetClassHintFn setClassHint; + XFreeFn free; } X11; static X11 s_X11 = {0}; @@ -382,14 +402,18 @@ typedef struct { PalResult (*setMonitorMode)(PalMonitor*, PalMonitorMode*); PalResult (*validateMonitorMode)(PalMonitor*, PalMonitorMode*); PalResult (*setMonitorOrientation)(PalMonitor*, PalOrientation); + PalResult (*createWindow)(const PalWindowCreateInfo*, PalWindow**); void (*destroyWindow)(PalWindow*); PalResult (*setWindowOpacity)(PalWindow*, float); + + PalResult (*createIcon)(const PalIconCreateInfo*, PalIcon**); + void (*destroyIcon)(PalIcon*); + PalResult (*setWindowIcon)(PalWindow*, PalIcon*); } Backend; typedef struct { bool initialized; - Int32 classNameLen; Int32 maxWindowData; Int32 maxMonitorData; PalVideoFeatures features; @@ -398,7 +422,6 @@ typedef struct { const Backend* backend; WindowData* windowData; MonitorData* monitorData; - char className[64]; } VideoLinux; static VideoLinux s_Video = {0}; @@ -567,6 +590,7 @@ static void xCheckFeatures() X_INTERN(_NET_WM_PID); X_INTERN(_WM_CLASS); X_INTERN(_NET_ACTIVE_WINDOW); + X_INTERN(_NET_WM_ICON); // check for support from the window manager Atom type; @@ -849,6 +873,10 @@ static PalResult xInitVideo() s_X11.handle, "XMapWindow"); + s_X11.unmapWindow = (XUnmapWindowFn)dlsym( + s_X11.handle, + "XUnmapWindow"); + s_X11.createWindow = (XCreateWindowFn)dlsym( s_X11.handle, "XCreateWindow"); @@ -913,15 +941,6 @@ static PalResult xInitVideo() s_X11.handle, "XrmUniqueQuark"); - // X11 server - s_X11.display = s_X11.openDisplay(nullptr); - if (!s_X11.display) { - return PAL_RESULT_PLATFORM_FAILURE; - } - - s_X11.root = DefaultRootWindow(s_X11.display); - s_X11.screen = DefaultScreen(s_X11.display); - // load Xrandr functions s_X11.getScreenResources = (XRRGetScreenResourcesFn)dlsym( s_X11.xrandr, @@ -959,6 +978,27 @@ static PalResult xInitVideo() s_X11.xrandr, "XRRQueryExtension"); + s_X11.allocClassHint = (XAllocClassHintFn)dlsym( + s_X11.handle, + "XAllocClassHint"); + + s_X11.setClassHint = (XSetClassHintFn)dlsym( + s_X11.handle, + "XSetClassHint"); + + s_X11.free = (XFreeFn)dlsym( + s_X11.handle, + "XFree"); + + // X11 server + s_X11.display = s_X11.openDisplay(nullptr); + if (!s_X11.display) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + s_X11.root = DefaultRootWindow(s_X11.display); + s_X11.screen = DefaultScreen(s_X11.display); + xCheckFeatures(); // get root window bpp XWindowAttributes attr; @@ -990,20 +1030,8 @@ static PalResult xInitVideo() s_X11.skipScreenEvent = true; s_X11.skipNotifyEvent = true; - // set class - const char* instance = "pal_window"; - const char* class = "PAL"; - snprintf( - s_Video.className, - sizeof(s_Video.className), - "%s%c%s%c", - instance, - '\0', - class, - '\0'); - - s_Video.classNameLen = strlen(instance) + strlen(class) + 2; s_X11.dataID = (XContext)s_X11.uniqueContext(); + s_X11.className = "PAL"; resetMonitorData(); xCacheMonitors(true); @@ -1851,7 +1879,7 @@ static PalResult xCreateWindow( return PAL_RESULT_PLATFORM_FAILURE; } - // set window pid + // set pid property pid_t pid = getpid(); s_X11.changeProperty( s_X11.display, @@ -1862,18 +1890,16 @@ static PalResult xCreateWindow( PropModeReplace, (unsigned char*)&pid, 1); - - // set class name - s_X11.changeProperty( - s_X11.display, - window, - s_X11Atoms._WM_CLASS, - XA_STRING, - 8, - PropModeReplace, - (unsigned char*)&s_Video.className, - s_Video.classNameLen); + // set class property + XClassHint* hints = s_X11.allocClassHint(); + if (hints) { + hints->res_name = (char*)info->title; + hints->res_class = (char*)s_X11.className; + s_X11.setClassHint(s_X11.display, window, hints); + s_X11.free(hints); + } + if (s_X11Atoms.unicodeTitle) { s_X11.changeProperty( s_X11.display, @@ -2076,6 +2102,74 @@ static PalResult xSetWindowOpacity( return PAL_RESULT_SUCCESS; } +PalResult xCreateIcon( + const PalIconCreateInfo* info, + PalIcon** outIcon) +{ + Uint64 totalPixels = 2 + (Uint64)(info->width * info->height); + Uint64 totalBytes = sizeof(unsigned long) * totalPixels; + + unsigned long* icon = palAllocate(s_Video.allocator, totalBytes, 0); + if (!icon) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + // store width and height and populate data with icon pixels + // [width][height][pixels] + icon[0] = (unsigned long)info->width; + icon[1] = (unsigned long)info->height; + + // convert from RGBA8 to ARGB32 + for (int i = 0; i < info->width * info->height; i++) { + Uint8 r = info->pixels[i * 4 + 0]; // Red + Uint8 g = info->pixels[i * 4 + 1]; // Green + Uint8 b = info->pixels[i * 4 + 2]; // Blue + Uint8 a = info->pixels[i * 4 + 3]; // Alpha + + icon[2 + i] = ((unsigned long)a << 24) | + ((unsigned long)r << 16) | + ((unsigned long)g << 8) | + ((unsigned long)b); + } + + *outIcon = TO_PAL_HANDLE(PalIcon, icon); + return PAL_RESULT_SUCCESS; +} + +void xDestroyIcon(PalIcon* icon) +{ + if (icon) { + palFree(s_Video.allocator, icon); + } +} + +PalResult xSetWindowIcon( + PalWindow* window, + PalIcon* icon) +{ + WindowData* winData = nullptr; + Window xWin = FROM_PAL_HANDLE(Window, window); + s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&winData); + if (!winData) { + return PAL_RESULT_INVALID_WINDOW; + } + + unsigned long* iconData = FROM_PAL_HANDLE(unsigned long*, icon); + Uint64 totalPixels = 2 + iconData[0] * iconData[1]; + s_X11.changeProperty( + s_X11.display, + xWin, + s_X11Atoms._NET_WM_ICON, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)iconData, + (int)totalPixels); + + s_X11.flush(s_X11.display); + return PAL_RESULT_SUCCESS; +} + static Backend s_XBackend = { .shutdownVideo = xShutdownVideo, .updateVideo = xUpdateVideo, @@ -2087,9 +2181,14 @@ static Backend s_XBackend = { .setMonitorMode = xSetMonitorMode, .validateMonitorMode = xValidateMonitorMode, .setMonitorOrientation = xSetMonitorOrientation, + .createWindow = xCreateWindow, .destroyWindow = xDestroyWindow, - .setWindowOpacity = xSetWindowOpacity + .setWindowOpacity = xSetWindowOpacity, + + .createIcon = xCreateIcon, + .destroyIcon = xDestroyIcon, + .setWindowIcon = xSetWindowIcon }; #pragma endregion @@ -2373,4 +2472,41 @@ PalResult PAL_CALL palSetWindowOpacity( } return s_Video.backend->setWindowOpacity(window, opacity); +} + +PalResult PAL_CALL palCreateIcon( + const PalIconCreateInfo* info, + PalIcon** outIcon) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!info || !outIcon) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->createIcon(info, outIcon); +} + +void PAL_CALL palDestroyIcon(PalIcon* icon) +{ + if (s_Video.initialized && icon) { + s_Video.backend->destroyIcon(icon); + } +} + +PalResult PAL_CALL palSetWindowIcon( + PalWindow* window, + PalIcon* icon) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->setWindowIcon(window, icon); } \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 49807e4..ec21df3 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1815,7 +1815,7 @@ PalResult PAL_CALL palCreateWindow( void PAL_CALL palDestroyWindow(PalWindow* window) { - if (window) { + if (s_Video.initialized && window) { DestroyWindow((HWND)window); } } diff --git a/tests/icon_test.c b/tests/icon_test.c index 48652fb..ddfe08c 100644 --- a/tests/icon_test.c +++ b/tests/icon_test.c @@ -56,13 +56,13 @@ bool iconTest() pixels[i + 0] = 255; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 0; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } else { pixels[i + 0] = 0; // Red bit pixels[i + 1] = 255; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 0; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } } } diff --git a/tests/tests.lua b/tests/tests.lua index 6224b64..f89f130 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -36,7 +36,7 @@ project "tests" "monitor_test.c", "monitor_mode_test.c", "window_test.c", - -- "icon_test.c", + "icon_test.c", -- "cursor_test.c", -- "input_window_test.c", -- "system_cursor_test.c" diff --git a/tests/tests_main.c b/tests/tests_main.c index f868b1e..55256a2 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -29,8 +29,8 @@ int main(int argc, char** argv) // registerTest("Video Test", videoTest); // registerTest("Monitor Test", monitorTest); // registerTest("Monitor Mode Test", monitorModeTest); - registerTest("Window Test", windowTest); - // registerTest("Icon Test", iconTest); + // registerTest("Window Test", windowTest); + registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); // registerTest("Input Window Test", inputWindowTest); // registerTest("System Cursor Test", systemCursorTest); From 59322bc8b156ef38c62c93572f98fd3d3a05f65d Mon Sep 17 00:00:00 2001 From: nichcode Date: Sat, 11 Oct 2025 23:36:41 +0000 Subject: [PATCH 17/30] update API --- CHANGELOG.md | 2 + include/pal/pal_config.h | 2 +- include/pal/pal_opengl.h | 11 ++- include/pal/pal_video.h | 22 +++++- premake/premake5 | Bin src/opengl/pal_opengl_win32.c | 45 ++++++------ src/video/pal_video_win32.c | 57 +++++++++++++++- tests/opengl_context_test.c | 107 ++++++++++++++++------------- tests/opengl_fbconfig_test.c | 71 +++++++++---------- tests/opengl_multi_context_test.c | 109 +++++++++++++++++------------- 10 files changed, 256 insertions(+), 170 deletions(-) mode change 100755 => 100644 premake/premake5 diff --git a/CHANGELOG.md b/CHANGELOG.md index acaff2e..7633d73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ - **System:** Added Linux backend support. - **Video:** Added **palCreateCursorFrom()** to create system cursors. +palSetGLPixelFormat() + ### Changed - **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index ebe01c8..65d5ee9 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -5,4 +5,4 @@ #define PAL_HAS_SYSTEM 1 #define PAL_HAS_THREAD 1 #define PAL_HAS_VIDEO 1 -#define PAL_HAS_OPENGL 0 +#define PAL_HAS_OPENGL 1 diff --git a/include/pal/pal_opengl.h b/include/pal/pal_opengl.h index a247634..818f039 100644 --- a/include/pal/pal_opengl.h +++ b/include/pal/pal_opengl.h @@ -261,7 +261,7 @@ PAL_API const PalGLInfo* PAL_CALL palGetGLInfo(); * If the count is 0 and the PalGLFBConfigs array is nullptr, the function fails * and returns `PAL_RESULT_INSUFFICIENT_BUFFER`. * - * @param[in] glWindow Pointer to the opengl window. + * @param[in] glWindow Pointer to the opengl window. Set to nullptr to get driver supported formats. * @param[in] count Capacity of the PalGLFBConfig array. * @param[out] configs User allocated array of PalGLFBConfig. * @@ -312,11 +312,10 @@ PAL_API const PalGLFBConfig* PAL_CALL palGetClosestGLFBConfig( * * The opengl system must be initialized before this call. The created context * will not be made current. - * - * After this call, the provided PalGLFBConfig will be set to the window - * permanently and cannot be changed. To change it, you must destroy the window - * and recreate it. If the window already has a PalGLFBConfig, the opengl system - * will use that and discard the provided one. + * + * The provided PalGLFBConfig must be the same as the one used to create the window. + * Once set, it cannot be changed. To change it, you must destroy the window + * and recreate it. * * @param[in] info Pointer to a PalGLContextCreateInfo struct that specifies * paramters. Must not be nullptr. diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index 7bf6330..1e4b4c6 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -111,7 +111,7 @@ typedef enum { PAL_VIDEO_FEATURE_WINDOW_GET_STYLE = PAL_BIT(28), PAL_VIDEO_FEATURE_CURSOR_SET_POS = PAL_BIT(29), PAL_VIDEO_FEATURE_CURSOR_GET_POS = PAL_BIT(30), - PAL_VIDEO_FEATURE_TOPMOST_WINDOW = PAL_BIT(31), + PAL_VIDEO_FEATURE_WINDOW_SET_ICON = PAL_BIT(31), } PalVideoFeatures; /** @@ -672,6 +672,24 @@ PAL_API void PAL_CALL palUpdateVideo(); */ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); +/** + * @brief Set the pixel format (PalGLFBConfig) for the video system. + * + * The video system must be initialized before this call. + * This is used to create all windows after this call, If not set, the default will be used + * + * @param[in] pixelFormatIndex The pixel format driver ndex. + * + * @return `PAL_RESULT_SUCCESS` on success or a result code on + * failure. Call palFormatResult() for more information. + * + * Thread safety: This function must be called from the main thread. + * + * @since 1.1 + * @ingroup pal_video + */ +PAL_API PalResult PAL_CALL palSetGLPixelFormat(const int pixelFormatIndex); + /** * @brief Return a list of all connected monitors. * @@ -1472,6 +1490,7 @@ PAL_API PalResult PAL_CALL palSetFocusWindow(PalWindow* window); * @brief Create an icon. * * The video system must be initialized before this call. + * `PAL_VIDEO_FEATURE_WINDOW_SET_ICON` must be supported. * * @param[in] info Pointer to a PalIconCreateInfo struct that specifies * paramters. Must not be nullptr. @@ -1513,6 +1532,7 @@ PAL_API void PAL_CALL palDestroyIcon(PalIcon* icon); * @brief Set the icon for the provided window. * * The video system must be initialized before this call. + * `PAL_VIDEO_FEATURE_WINDOW_SET_ICON` must be supported. * * @param[in] window Pointer to the window. * @param[in] icon Pointer to the icon. diff --git a/premake/premake5 b/premake/premake5 old mode 100755 new mode 100644 diff --git a/src/opengl/pal_opengl_win32.c b/src/opengl/pal_opengl_win32.c index 33a7721..4c8ac10 100644 --- a/src/opengl/pal_opengl_win32.c +++ b/src/opengl/pal_opengl_win32.c @@ -508,12 +508,11 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( Int32* count, PalGLFBConfig* configs) { - if (!s_Wgl.initialized) { return PAL_RESULT_GL_NOT_INITIALIZED; } - if (!count || !glWindow) { + if (!count) { return PAL_RESULT_NULL_POINTER; } @@ -521,9 +520,17 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( return PAL_RESULT_INSUFFICIENT_BUFFER; } - HDC windowDC = GetDC((HWND)glWindow->window); - if (!windowDC) { - return PAL_RESULT_INVALID_GL_WINDOW; + HDC windowDC = nullptr; + bool free = true; + if (glWindow) { + windowDC = GetDC((HWND)glWindow->window); + if (!windowDC) { + return PAL_RESULT_INVALID_GL_WINDOW; + } + + } else { + windowDC = s_Wgl.hdc; + free = false; } Int32 configCount = 0; @@ -674,7 +681,10 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( } } - ReleaseDC((HWND)glWindow->window, windowDC); + if (free) { + ReleaseDC((HWND)glWindow->window, windowDC); + } + if (!configs) { *count = configCount; } @@ -804,26 +814,9 @@ PalResult PAL_CALL palCreateGLContext( return PAL_RESULT_INVALID_GL_WINDOW; } - // check if the window's pixel format has already been set - if (s_Gdi.getPixelFormat(hdc) == 0) { - // set the pixel format - Int32 pixelFormat = info->fbConfig->index; - // since we have the pixel format already - // we ask the OS (platform) to fill the pfd struct for us from that - // index - PIXELFORMATDESCRIPTOR pfd; - if (!s_Gdi.describePixelFormat( - hdc, - pixelFormat, - sizeof(PIXELFORMATDESCRIPTOR), - &pfd)) { - return PAL_RESULT_INVALID_GL_FBCONFIG; - } - - // we then set the pixel format for the hdc - if (!s_Gdi.setPixelFormat(hdc, pixelFormat, &pfd)) { - return PAL_RESULT_INVALID_GL_FBCONFIG; - } + // check if the provided pixel format is the same as the windows + if (s_Gdi.getPixelFormat(hdc) != info->fbConfig->index) { + return PAL_RESULT_INVALID_GL_FBCONFIG; } HGLRC context = nullptr; diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index ec21df3..0351ff5 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -79,8 +79,20 @@ typedef HBITMAP(WINAPI* CreateBitmapFn)( typedef BOOL(WINAPI* DeleteObjectFn)(HGDIOBJ); +typedef int(WINAPI* DescribePixelFormatFn)( + HDC, + int, + UINT, + LPPIXELFORMATDESCRIPTOR); + +typedef BOOL(WINAPI* SetPixelFormatFn)( + HDC, + int, + CONST PIXELFORMATDESCRIPTOR*); + typedef struct { bool initialized; + Int32 pixelFormat; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; @@ -92,6 +104,8 @@ typedef struct { CreateDIBSectionFn createDIBSection; CreateBitmapFn createBitmap; DeleteObjectFn deleteObject; + DescribePixelFormatFn describePixelFormat; + SetPixelFormatFn setPixelFormat; HINSTANCE instance; HWND hiddenWindow; @@ -1209,6 +1223,14 @@ PalResult PAL_CALL palInitVideo( s_Video.deleteObject = (DeleteObjectFn)GetProcAddress( s_Video.gdi, "DeleteObject"); + + s_Video.describePixelFormat = (DescribePixelFormatFn)GetProcAddress( + s_Video.gdi, + "DescribePixelFormat"); + + s_Video.setPixelFormat = (SetPixelFormatFn)GetProcAddress( + s_Video.gdi, + "SetPixelFormat"); } // clang-format on @@ -1244,7 +1266,7 @@ PalResult PAL_CALL palInitVideo( s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_SET_POS; s_Video.features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; - s_Video.features |= PAL_VIDEO_FEATURE_TOPMOST_WINDOW; + s_Video.features |= PAL_VIDEO_FEATURE_WINDOW_SET_ICON; if (s_Video.getDpiForMonitor && s_Video.setProcessAwareness) { s_Video.features |= PAL_VIDEO_FEATURE_HIGH_DPI; @@ -1254,6 +1276,7 @@ PalResult PAL_CALL palInitVideo( s_Video.initialized = true; s_Video.allocator = allocator; s_Video.eventDriver = eventDriver; + s_Video.pixelFormat = 0; return PAL_RESULT_SUCCESS; } @@ -1322,6 +1345,19 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() return s_Video.features; } +PalResult PAL_CALL palSetGLPixelFormat(const int pixelFormatIndex) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (s_Video.initialized && pixelFormatIndex) { + s_Video.pixelFormat = pixelFormatIndex; + return PAL_RESULT_SUCCESS; + } + return PAL_RESULT_INVALID_GL_FBCONFIG; +} + // ================================================== // Monitor // ================================================== @@ -1767,6 +1803,25 @@ PalResult PAL_CALL palCreateWindow( return PAL_RESULT_PLATFORM_FAILURE; } + // set the pixel format is set + if (s_Video.pixelFormat) { + HDC hdc = GetDC(handle); + // since we have the pixel format already + // we ask the OS (platform) to fill the pfd struct for us from that + // index + PIXELFORMATDESCRIPTOR pfd; + if (!s_Video.describePixelFormat( + hdc, + s_Video.pixelFormat, + sizeof(PIXELFORMATDESCRIPTOR), + &pfd)) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + s_Video.setPixelFormat(hdc, s_Video.pixelFormat, &pfd); + ReleaseDC(handle, hdc); + } + // show, maximize and minimize Int32 showFlag = SW_HIDE; // maximize diff --git a/tests/opengl_context_test.c b/tests/opengl_context_test.c index 8c50003..ffebc93 100644 --- a/tests/opengl_context_test.c +++ b/tests/opengl_context_test.c @@ -35,7 +35,7 @@ bool openglContextTest() PalGLContext* context = nullptr; PalWindowCreateInfo createInfo = {0}; PalGLContextCreateInfo contextCreateInfo = {0}; - Int32 fbCount; + Int32 fbCount = 0; bool running = false; // event driver @@ -56,51 +56,9 @@ bool openglContextTest() return false; } - // initialize the video system. We pass the event driver to recieve video - // related events the video system does not copy the event driver, it must - // be valid till the video system is shutdown - result = palInitVideo(nullptr, eventDriver); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video: %s", error); - return false; - } - - createInfo.monitor = nullptr; // use primary monitor - createInfo.height = 480; - createInfo.width = 640; - createInfo.show = true; - createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; - createInfo.title = "Pal Opengl Context Window"; - - // create the window with the create info struct - result = palCreateWindow(&createInfo, &window); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window: %s", error); - return false; - } - - // we set window close to poll - palSetEventDispatchMode( - eventDriver, - PAL_EVENT_WINDOW_CLOSE, - PAL_DISPATCH_POLL); - - // get window handle. You can use any window from any library - // so long as you can get the window handle and display (if on X11, wayland) - // If pal video system will not be used, there is no need to initialize it - PalWindowHandleInfo windowHandleInfo; - windowHandleInfo = palGetWindowHandleInfo(window); - - // PalGLWindow is just a struct to hold native handles - PalGLWindow glWindow = {0}; - // needed when using X11 or wayland - glWindow.display = windowHandleInfo.nativeDisplay; - glWindow.window = windowHandleInfo.nativeWindow; - - // use the gl window to query supported FBconfigs - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); + // enumerate supported opengl framebuffer configs + // glWindow can be nullptr + result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -120,7 +78,9 @@ bool openglContextTest() return false; } - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); + // enumerate supported opengl framebuffer configs + // glWindow can be nullptr + result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -163,6 +123,59 @@ bool openglContextTest() palLog(nullptr, " sRGB: %s", g_BoolsToSting[closest->sRGB]); palLog(nullptr, ""); + // initialize the video system. We pass the event driver to recieve video + // related events the video system does not copy the event driver, it must + // be valid till the video system is shutdown + result = palInitVideo(nullptr, eventDriver); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to initialize video: %s", error); + return false; + } + + // set the pixel format to use to create all windows with pal_video + // this must be set before creating a window + // for this example, we set the closest we desired + palSetGLPixelFormat(closest->index); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to set GL pixel format: %s", error); + return false; + } + + createInfo.monitor = nullptr; // use primary monitor + createInfo.height = 480; + createInfo.width = 640; + createInfo.show = true; + createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; + createInfo.title = "Pal Opengl Context Window"; + + // create the window with the create info struct + result = palCreateWindow(&createInfo, &window); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create window: %s", error); + return false; + } + + // we set window close to poll + palSetEventDispatchMode( + eventDriver, + PAL_EVENT_WINDOW_CLOSE, + PAL_DISPATCH_POLL); + + // get window handle. You can use any window from any library + // so long as you can get the window handle and display (if on X11, wayland) + // If pal video system will not be used, there is no need to initialize it + PalWindowHandleInfo windowHandleInfo; + windowHandleInfo = palGetWindowHandleInfo(window); + + // PalGLWindow is just a struct to hold native handles + PalGLWindow glWindow = {0}; + // needed when using X11 or wayland + glWindow.display = windowHandleInfo.nativeDisplay; + glWindow.window = windowHandleInfo.nativeWindow; + // get opengl info const PalGLInfo* info = palGetGLInfo(); diff --git a/tests/opengl_fbconfig_test.c b/tests/opengl_fbconfig_test.c index 323b6f3..8bcc6d5 100644 --- a/tests/opengl_fbconfig_test.c +++ b/tests/opengl_fbconfig_test.c @@ -21,46 +21,10 @@ bool openglFBConfigTest() return false; } - PalWindow* window = nullptr; - PalWindowCreateInfo createInfo = {0}; - Int32 fbCount; - - // initialize the video system. - result = palInitVideo(nullptr, nullptr); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video: %s", error); - return false; - } - - createInfo.monitor = nullptr; // use primary monitor - createInfo.height = 480; - createInfo.width = 640; - createInfo.show = true; - createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; - - // create the window with the create info struct - result = palCreateWindow(&createInfo, &window); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window: %s", error); - return false; - } - - // get window handle. You can use any window from any library - // so long as you can get the window handle and display (if on X11, wayland) - // If pal video system will not be used, there is no need to initialize it - PalWindowHandleInfo windowHandleInfo; - windowHandleInfo = palGetWindowHandleInfo(window); - - // PalGLWindow is just a struct to hold native handles - PalGLWindow glWindow = {0}; - // needed when using X11 or wayland - glWindow.display = windowHandleInfo.nativeDisplay; - glWindow.window = windowHandleInfo.nativeWindow; - // enumerate supported opengl framebuffer configs - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); + // glWindow can be nullptr + Int32 fbCount = 0; + result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -80,7 +44,9 @@ bool openglFBConfigTest() return false; } - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); + // enumerate supported opengl framebuffer configs + // glWindow can be nullptr + result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -88,6 +54,31 @@ bool openglFBConfigTest() return false; } + PalWindow* window = nullptr; + PalWindowCreateInfo createInfo = {0}; + + // initialize the video system. + result = palInitVideo(nullptr, nullptr); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to initialize video: %s", error); + return false; + } + + createInfo.monitor = nullptr; // use primary monitor + createInfo.height = 480; + createInfo.width = 640; + createInfo.show = true; + createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; + + // create the window with the create info struct + result = palCreateWindow(&createInfo, &window); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create window: %s", error); + return false; + } + // log configs palLog(nullptr, ""); for (Int32 i = 0; i < fbCount; i++) { diff --git a/tests/opengl_multi_context_test.c b/tests/opengl_multi_context_test.c index 2e98f11..611a5c2 100644 --- a/tests/opengl_multi_context_test.c +++ b/tests/opengl_multi_context_test.c @@ -35,7 +35,7 @@ bool openglMultiContextTest() PalGLContext* context = nullptr; PalWindowCreateInfo createInfo = {0}; PalGLContextCreateInfo contextCreateInfo = {0}; - Int32 fbCount; + Int32 fbCount = 0; bool running = false; // event driver @@ -56,51 +56,9 @@ bool openglMultiContextTest() return false; } - // initialize the video system. We pass the event driver to recieve video - // related events the video system does not copy the event driver, it must - // be valid till the video system is shutdown - result = palInitVideo(nullptr, eventDriver); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video: %s", error); - return false; - } - - createInfo.monitor = nullptr; // use primary monitor - createInfo.height = 480; - createInfo.width = 640; - createInfo.show = true; - createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; - createInfo.title = "Pal Opengl Multi Context Window"; - - // create the window with the create info struct - result = palCreateWindow(&createInfo, &window); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window: %s", error); - return false; - } - - // we set window close to poll - palSetEventDispatchMode( - eventDriver, - PAL_EVENT_WINDOW_CLOSE, - PAL_DISPATCH_POLL); - - // get window handle. You can use any window from any library - // so long as you can get the window handle and display (if on X11, wayland) - // If pal video system will not be used, there is no need to initialize it - PalWindowHandleInfo windowHandleInfo; - windowHandleInfo = palGetWindowHandleInfo(window); - - // PalGLWindow is just a struct to hold native handles - PalGLWindow glWindow = {0}; - // needed when using X11 or wayland - glWindow.display = windowHandleInfo.nativeDisplay; - glWindow.window = windowHandleInfo.nativeWindow; - - // use the gl window to query supported FBconfigs - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, nullptr); + // enumerate supported opengl framebuffer configs + // glWindow can be nullptr + result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -120,7 +78,9 @@ bool openglMultiContextTest() return false; } - result = palEnumerateGLFBConfigs(&glWindow, &fbCount, fbConfigs); + // enumerate supported opengl framebuffer configs + // glWindow can be nullptr + result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to query GL FBConfigs: %s", error); @@ -147,7 +107,7 @@ bool openglMultiContextTest() const PalGLFBConfig* closest = nullptr; closest = palGetClosestGLFBConfig(fbConfigs, fbCount, &desired); - // log the closest GL FBConfig + // log the closest GL FBConfig palLog(nullptr, "Closest GL FBConfig:"); palLog(nullptr, " Index: %d", closest->index); palLog(nullptr, " Red Bits: %d", closest->redBits); @@ -163,6 +123,59 @@ bool openglMultiContextTest() palLog(nullptr, " sRGB: %s", g_BoolsToSting[closest->sRGB]); palLog(nullptr, ""); + // initialize the video system. We pass the event driver to recieve video + // related events the video system does not copy the event driver, it must + // be valid till the video system is shutdown + result = palInitVideo(nullptr, eventDriver); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to initialize video: %s", error); + return false; + } + + // set the pixel format to use to create all windows with pal_video + // this must be set before creating a window + // for this example, we set the closest we desired + palSetGLPixelFormat(closest->index); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to set GL pixel format: %s", error); + return false; + } + + createInfo.monitor = nullptr; // use primary monitor + createInfo.height = 480; + createInfo.width = 640; + createInfo.show = true; + createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; + createInfo.title = "Pal Opengl Multi Context Window"; + + // create the window with the create info struct + result = palCreateWindow(&createInfo, &window); + if (result != PAL_RESULT_SUCCESS) { + const char* error = palFormatResult(result); + palLog(nullptr, "Failed to create window: %s", error); + return false; + } + + // we set window close to poll + palSetEventDispatchMode( + eventDriver, + PAL_EVENT_WINDOW_CLOSE, + PAL_DISPATCH_POLL); + + // get window handle. You can use any window from any library + // so long as you can get the window handle and display (if on X11, wayland) + // If pal video system will not be used, there is no need to initialize it + PalWindowHandleInfo windowHandleInfo; + windowHandleInfo = palGetWindowHandleInfo(window); + + // PalGLWindow is just a struct to hold native handles + PalGLWindow glWindow = {0}; + // needed when using X11 or wayland + glWindow.display = windowHandleInfo.nativeDisplay; + glWindow.window = windowHandleInfo.nativeWindow; + // get opengl info const PalGLInfo* info = palGetGLInfo(); From 1ce80cc250bf20450d5af4416ad24f847b3084be Mon Sep 17 00:00:00 2001 From: nichcode Date: Sun, 12 Oct 2025 07:44:37 +0000 Subject: [PATCH 18/30] fix window state bug --- CHANGELOG.md | 3 +- include/pal/pal_config.h | 2 +- include/pal/pal_video.h | 12 ++-- src/video/pal_video_win32.c | 100 +++++++++++++++++++++++++----- tests/opengl_context_test.c | 2 +- tests/opengl_multi_context_test.c | 2 +- tests/tests.lua | 6 +- tests/tests_main.c | 8 +-- 8 files changed, 101 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7633d73..52386c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,13 +26,14 @@ - **System:** Added Linux backend support. - **Video:** Added **palCreateCursorFrom()** to create system cursors. -palSetGLPixelFormat() +palSetPixelFormat() ### Changed - **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. ### Fixed - Fixed a bug where **enter modal mode and exit modal mode** operations triggered only one event. +- Fixed repeated window state event ### Notes - No API or ABI changes - existing Windows code remains compatible. diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index 65d5ee9..ebe01c8 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -5,4 +5,4 @@ #define PAL_HAS_SYSTEM 1 #define PAL_HAS_THREAD 1 #define PAL_HAS_VIDEO 1 -#define PAL_HAS_OPENGL 1 +#define PAL_HAS_OPENGL 0 diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index 1e4b4c6..7cdf24c 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -673,12 +673,12 @@ PAL_API void PAL_CALL palUpdateVideo(); PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); /** - * @brief Set the pixel format (PalGLFBConfig) for the video system. + * @brief Set the pixel format or FBConfig for the video system. * * The video system must be initialized before this call. - * This is used to create all windows after this call, If not set, the default will be used + * This is used to create all windows after this call, If not set, the default will be used. * - * @param[in] pixelFormatIndex The pixel format driver ndex. + * @param[in] pixelFormatIndex The pixel format driver index. * * @return `PAL_RESULT_SUCCESS` on success or a result code on * failure. Call palFormatResult() for more information. @@ -688,7 +688,7 @@ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); * @since 1.1 * @ingroup pal_video */ -PAL_API PalResult PAL_CALL palSetGLPixelFormat(const int pixelFormatIndex); +PAL_API PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex); /** * @brief Return a list of all connected monitors. @@ -1535,7 +1535,7 @@ PAL_API void PAL_CALL palDestroyIcon(PalIcon* icon); * `PAL_VIDEO_FEATURE_WINDOW_SET_ICON` must be supported. * * @param[in] window Pointer to the window. - * @param[in] icon Pointer to the icon. + * @param[in] icon Pointer to the icon. Set to nullptr to revert. * * @return `PAL_RESULT_SUCCESS` on success or a result code on * failure. Call palFormatResult() for more information. @@ -1709,7 +1709,7 @@ PAL_API PalResult PAL_CALL palSetCursorPos( * The video system must be initialized before this call. * * @param[in] window Pointer to the window. - * @param[in] cursor Pointer to the cursor. + * @param[in] cursor Pointer to the cursor. Set to nullptr to revert. * * @return `PAL_RESULT_SUCCESS` on success or a result code on * failure. Call palFormatResult() for more information. diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 0351ff5..8493d29 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -90,9 +90,16 @@ typedef BOOL(WINAPI* SetPixelFormatFn)( int, CONST PIXELFORMATDESCRIPTOR*); +typedef struct { + bool used; + PalWindowState state; + HCURSOR cursor; +} WindowData; + typedef struct { bool initialized; Int32 pixelFormat; + Int32 maxWindowData; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; @@ -109,6 +116,7 @@ typedef struct { HINSTANCE instance; HWND hiddenWindow; + WindowData* windowData; } VideoWin32; typedef struct { @@ -120,6 +128,7 @@ typedef struct { typedef struct { bool pendingResize; bool pendingMove; + bool pendingState; Uint32 width; Uint32 height; Int32 x; @@ -162,7 +171,7 @@ LRESULT CALLBACK videoProc( LPARAM lParam) { // check if the window has been created - void* data = (void*)(LONG_PTR)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + WindowData* data = (void*)(LONG_PTR)GetWindowLongPtrW(hwnd, GWLP_USERDATA); if (!data) { // window has not been created yet return DefWindowProcW(hwnd, msg, wParam, lParam); @@ -198,7 +207,7 @@ LRESULT CALLBACK videoProc( event.data2 = palPackPointer((PalWindow*)hwnd); palPushEvent(driver, &event); - } else { + } else if (mode == PAL_DISPATCH_POLL) { s_Event.pendingResize = true; s_Event.width = width; s_Event.height = height; @@ -224,18 +233,23 @@ LRESULT CALLBACK videoProc( } } - // TODO: Dont send restored events continously + // if state has not changed, we discard the event + if (data->state == state) { + return 0; + } if (mode == PAL_DISPATCH_CALLBACK) { PalEvent event = {0}; + event.type = PAL_EVENT_WINDOW_STATE; event.data = state; event.data2 = palPackPointer((PalWindow*)hwnd); - event.type = PAL_EVENT_WINDOW_STATE; palPushEvent(driver, &event); - } else { + } else if (mode == PAL_DISPATCH_POLL) { + s_Event.pendingState = true; s_Event.state = state; } + data->state = state; } return 0; @@ -722,10 +736,10 @@ LRESULT CALLBACK videoProc( case WM_SETCURSOR: { if (LOWORD(lParam) == HTCLIENT) { if (data) { - SetCursor((HCURSOR)data); + SetCursor(data->cursor); return TRUE; } - return TRUE; + return FALSE; } break; @@ -1122,6 +1136,38 @@ static void createScancodeTable() s_Keyboard.scancodes[0x15C] = PAL_SCANCODE_RSUPER; } +static WindowData* getFreeWindowData() +{ + for (int i = 0; i < s_Video.maxWindowData; ++i) { + if (!s_Video.windowData[i].used) { + s_Video.windowData[i].used = true; + return &s_Video.windowData[i]; + } + } + + // resize the data array + // It is rare for a user to create and manage + // 32 windows at the same time + WindowData* data = nullptr; + int count = s_Video.maxWindowData * 2; // double the size + int freeIndex = s_Video.maxWindowData + 1; + data = palAllocate(s_Video.allocator, sizeof(WindowData) * count, 0); + if (data) { + memcpy( + data, + s_Video.windowData, + s_Video.maxWindowData * sizeof(WindowData)); + + palFree(s_Video.allocator, s_Video.windowData); + s_Video.windowData = data; + s_Video.maxWindowData = count; + + s_Video.windowData[freeIndex].used = true; + return &s_Video.windowData[freeIndex]; + } + return nullptr; +} + // ================================================== // Public API // ================================================== @@ -1138,6 +1184,12 @@ PalResult PAL_CALL palInitVideo( return PAL_RESULT_INVALID_ALLOCATOR; } + s_Video.maxWindowData = 32; + s_Video.windowData = palAllocate( + s_Video.allocator, + sizeof(WindowData) * s_Video.maxWindowData, + 0); + // get the instance s_Video.instance = GetModuleHandleW(nullptr); @@ -1293,6 +1345,7 @@ void PAL_CALL palShutdownVideo() FreeLibrary(s_Video.gdi); DestroyWindow(s_Video.hiddenWindow); UnregisterClassW(PAL_VIDEO_CLASS, s_Video.instance); + palFree(s_Video.allocator, s_Video.windowData); s_Video.initialized = false; } @@ -1319,10 +1372,14 @@ void PAL_CALL palUpdateVideo() event.data2 = palPackPointer(s_Event.window); palPushEvent(s_Video.eventDriver, &event); - // push a window state event - event.type = PAL_EVENT_WINDOW_STATE; - event.data = s_Event.state; - palPushEvent(s_Video.eventDriver, &event); + if (s_Event.pendingState) { + PalEvent event = {0}; + event.data = s_Event.state; + event.data2 = palPackPointer(s_Event.window); + event.type = PAL_EVENT_WINDOW_STATE; + palPushEvent(s_Video.eventDriver, &event); + s_Event.pendingState = false; + } s_Event.pendingResize = false; @@ -1345,7 +1402,7 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() return s_Video.features; } -PalResult PAL_CALL palSetGLPixelFormat(const int pixelFormatIndex) +PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; @@ -1700,6 +1757,11 @@ PalResult PAL_CALL palCreateWindow( return PAL_RESULT_NULL_POINTER; } + WindowData* data = getFreeWindowData(); + if (!data) { + return PAL_RESULT_OUT_OF_MEMORY; + } + HWND handle = nullptr; PalMonitor* monitor = nullptr; PalMonitorInfo monitorInfo; @@ -1827,11 +1889,13 @@ PalResult PAL_CALL palCreateWindow( // maximize if (info->maximized) { showFlag = SW_MAXIMIZE; + data->state = PAL_WINDOW_STATE_MAXIMIZED; } // minimized if (info->minimized) { showFlag = SW_MINIMIZE; + data->state = PAL_WINDOW_STATE_MINIMIZED; } // shown @@ -1839,6 +1903,7 @@ PalResult PAL_CALL palCreateWindow( if (showFlag == SW_HIDE) { // change only if maximize and minimize are not set showFlag = SW_SHOW; + data->state = PAL_WINDOW_STATE_RESTORED; } } @@ -1861,9 +1926,7 @@ PalResult PAL_CALL palCreateWindow( SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); } - // set a flag to check if the window has been created - SetWindowLongPtrW(handle, GWLP_USERDATA, (LONG_PTR)&s_Event); - + SetWindowLongPtrW(handle, GWLP_USERDATA, (LONG_PTR)data); *outWindow = (PalWindow*)handle; return PAL_RESULT_SUCCESS; } @@ -2899,10 +2962,13 @@ PalResult PAL_CALL palSetWindowCursor( PalWindow* window, PalCursor* cursor) { - if (window || cursor) { + if (window) { SetLastError(0); - SetWindowLongPtrW((HWND)window, GWLP_USERDATA, (LONG_PTR)cursor); + WindowData* data = (WindowData*)GetWindowLongPtrW( + (HWND)window, + GWLP_USERDATA); + data->cursor = (HCURSOR)cursor; DWORD error = GetLastError(); if (error == 0) { return PAL_RESULT_SUCCESS; diff --git a/tests/opengl_context_test.c b/tests/opengl_context_test.c index ffebc93..5af0550 100644 --- a/tests/opengl_context_test.c +++ b/tests/opengl_context_test.c @@ -136,7 +136,7 @@ bool openglContextTest() // set the pixel format to use to create all windows with pal_video // this must be set before creating a window // for this example, we set the closest we desired - palSetGLPixelFormat(closest->index); + palSetPixelFormat(closest->index); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set GL pixel format: %s", error); diff --git a/tests/opengl_multi_context_test.c b/tests/opengl_multi_context_test.c index 611a5c2..25cda34 100644 --- a/tests/opengl_multi_context_test.c +++ b/tests/opengl_multi_context_test.c @@ -136,7 +136,7 @@ bool openglMultiContextTest() // set the pixel format to use to create all windows with pal_video // this must be set before creating a window // for this example, we set the closest we desired - palSetGLPixelFormat(closest->index); + palSetPixelFormat(closest->index); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set GL pixel format: %s", error); diff --git a/tests/tests.lua b/tests/tests.lua index f89f130..dc369d8 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -37,9 +37,9 @@ project "tests" "monitor_mode_test.c", "window_test.c", "icon_test.c", - -- "cursor_test.c", - -- "input_window_test.c", - -- "system_cursor_test.c" + "cursor_test.c", + "input_window_test.c", + "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index 55256a2..3aceac2 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -29,11 +29,11 @@ int main(int argc, char** argv) // registerTest("Video Test", videoTest); // registerTest("Monitor Test", monitorTest); // registerTest("Monitor Mode Test", monitorModeTest); - // registerTest("Window Test", windowTest); + registerTest("Window Test", windowTest); registerTest("Icon Test", iconTest); - // registerTest("Cursor Test", cursorTest); - // registerTest("Input Window Test", inputWindowTest); - // registerTest("System Cursor Test", systemCursorTest); + registerTest("Cursor Test", cursorTest); + registerTest("Input Window Test", inputWindowTest); + registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL From 850fa63e906771f0c6538e33c604385cce160e30 Mon Sep 17 00:00:00 2001 From: nichcode Date: Sun, 12 Oct 2025 10:17:46 +0000 Subject: [PATCH 19/30] resource --- premake/premake5 | Bin src/video/pal_video_linux.c | 238 +++++++++++++++++++++++++----------- src/video/pal_video_win32.c | 2 +- tests/tests.lua | 6 +- tests/tests_main.c | 6 +- 5 files changed, 175 insertions(+), 77 deletions(-) mode change 100644 => 100755 premake/premake5 diff --git a/premake/premake5 b/premake/premake5 old mode 100644 new mode 100755 diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index adc27d4..9987105 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -84,6 +84,27 @@ typedef struct { #define RANDR_SCREEN_CHANGE_EVENT 1040 #define RANDR_NOTIFY_EVENT 1041 +// optionally, needed to create visual from FBConfig +#define GLX_FBCONFIG_ID 0x8012 +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef GLXFBConfig* (*GLXGetFBConfigsFn)( + Display*, + int, + int*); + +typedef int (*GLXGetFBConfigAttribFn)( + Display*, + GLXFBConfig, + int, + int*); + +typedef XVisualInfo* (*GLXGetVisualFromFBConfigFn)( + Display*, + GLXFBConfig); + +typedef XVisualInfo* (*GLXGetProcAddressFn)(const unsigned char*); + typedef Display* (*XOpenDisplayFn)(const char*); typedef int (*XCloseDisplayFn)(Display*); @@ -325,15 +346,13 @@ typedef struct { bool skipScreenEvent; bool skipNotifyEvent; int bpp; - int transparentDepth; int screen; int rrEventBase; void* handle; void* xrandr; + void* opengl; Display* display; Window root; - Colormap transparentColormap; - Visual* transparentVisual; GC gc; XContext dataID; const char* className; @@ -384,6 +403,11 @@ typedef struct { XAllocClassHintFn allocClassHint; XSetClassHintFn setClassHint; XFreeFn free; + + // opengl + GLXGetFBConfigsFn glxGetFBConfigs; + GLXGetFBConfigAttribFn glxGetFBConfigAttrib; + GLXGetVisualFromFBConfigFn glxGetVisualFromFBConfig; } X11; static X11 s_X11 = {0}; @@ -416,6 +440,7 @@ typedef struct { bool initialized; Int32 maxWindowData; Int32 maxMonitorData; + Int32 pixelFormat; PalVideoFeatures features; const PalAllocator* allocator; PalEventDriver* eventDriver; @@ -637,10 +662,6 @@ static void xCheckFeatures() features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_ABOVE) { - features |= PAL_VIDEO_FEATURE_TOPMOST_WINDOW; - } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_NAME) { s_X11Atoms.unicodeTitle = true; } @@ -1000,24 +1021,7 @@ static PalResult xInitVideo() s_X11.screen = DefaultScreen(s_X11.display); xCheckFeatures(); - // get root window bpp - XWindowAttributes attr; - s_X11.getWindowAttributes(s_X11.display, s_X11.root, &attr); - s_X11.bpp = attr.depth; - - // create a transparent colormap - XVisualInfo info; - s_X11.matchVisualInfo(s_X11.display, s_X11.screen, 32, TrueColor, &info); - s_X11.transparentDepth = info.depth; - s_X11.transparentVisual = info.visual; - - // create color map - s_X11.transparentColormap = s_X11.createColormap( - s_X11.display, - s_X11.root, - info.visual, - AllocNone); - + // subscribe for monitor events s_X11.selectRRInput( s_X11.display, @@ -1035,18 +1039,37 @@ static PalResult xInitVideo() resetMonitorData(); xCacheMonitors(true); + // load opengl functions + s_X11.opengl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); + if (s_X11.opengl) { + + GLXGetProcAddressFn load = nullptr; + load = (GLXGetProcAddressFn)dlsym( + s_X11.opengl, + "glXGetProcAddress"); + + s_X11.glxGetFBConfigs = (GLXGetFBConfigsFn)load( + "glXGetFBConfigs"); + + s_X11.glxGetFBConfigAttrib = (GLXGetFBConfigAttribFn)load( + "glXGetFBConfigAttrib"); + + s_X11.glxGetVisualFromFBConfig = (GLXGetVisualFromFBConfigFn)load( + "glXGetVisualFromFBConfig"); + + } + return PAL_RESULT_SUCCESS; } static void xShutdownVideo() { - if (s_X11.transparentColormap) { - s_X11.freeColormap(s_X11.display, s_X11.transparentColormap); - } - s_X11.closeDisplay(s_X11.display); dlclose(s_X11.handle); dlclose(s_X11.xrandr); + if (s_X11.opengl) { + dlclose(s_X11.opengl); + } } static void xUpdateVideo() @@ -1794,11 +1817,57 @@ static PalResult xCreateWindow( return PAL_RESULT_OUT_OF_MEMORY; } - Visual* visual = DefaultVisual(s_X11.display, s_X11.screen); - int depth = DefaultDepth(s_X11.display, s_X11.screen); - unsigned long bgPixel = WhitePixel(s_X11.display, s_X11.screen); - unsigned long borderPixel = BlackPixel(s_X11.display, s_X11.screen); - Colormap colormap = DefaultColormap(s_X11.display, s_X11.screen); + Visual* visual = nullptr; + int depth = 0; + Colormap colormap = None; + unsigned long bgPixel = 0; + unsigned long borderPixel = 0; + + // check to see if the user has set a pixel format + // with palSetPixelFormat() + if (s_Video.pixelFormat) { + // this is the pixel format driver index + // we query info about it and create the visual with it + if (s_X11.opengl) { + int count = 0; + GLXFBConfig* configs = s_X11.glxGetFBConfigs( + s_X11.display, + s_X11.screen, + &count); + + GLXFBConfig fbConfig = configs[s_Video.pixelFormat]; + if (!fbConfig) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + // get a matching visual and use that to create the window + XVisualInfo* visualInfo = s_X11.glxGetVisualFromFBConfig( + s_X11.display, + fbConfig); + + if (!visualInfo) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + visual = visualInfo->visual; + depth = visualInfo->depth; + bgPixel = 0; + borderPixel = 0; + colormap = s_X11.createColormap( + s_X11.display, + s_X11.root, + visual, + AllocNone); + } + + } else { + // use a default visual + visual = DefaultVisual(s_X11.display, s_X11.screen); + depth = DefaultDepth(s_X11.display, s_X11.screen); + bgPixel = WhitePixel(s_X11.display, s_X11.screen); + borderPixel = BlackPixel(s_X11.display, s_X11.screen); + colormap = DefaultColormap(s_X11.display, s_X11.screen); + } // get monitor if (info->monitor) { @@ -1836,11 +1905,7 @@ static PalResult xCreateWindow( return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - bgPixel = 0; - borderPixel = 0; - visual = s_X11.transparentVisual; - depth = s_X11.transparentDepth; - colormap = s_X11.transparentColormap; + // we dont need to set any flag } long mask = ExposureMask | StructureNotifyMask | KeyPressMask; @@ -1894,8 +1959,19 @@ static PalResult xCreateWindow( // set class property XClassHint* hints = s_X11.allocClassHint(); if (hints) { - hints->res_name = (char*)info->title; - hints->res_class = (char*)s_X11.className; + const char* resName = getenv("RESOURCE_NAME"); + const char* resClass = getenv("RESOURCE_CLASS"); + + if (!resName || strlen(resName) == 0) { + resName = info->title; + } + + if (!resClass || strlen(resClass) == 0) { + resClass = s_X11.className; + } + + hints->res_name = (char*)resName; + hints->res_class = (char*)resClass; s_X11.setClassHint(s_X11.display, window, hints); s_X11.free(hints); } @@ -1955,21 +2031,17 @@ static PalResult xCreateWindow( // topmost if (info->style & PAL_WINDOW_STYLE_TOPMOST) { - if (!(s_Video.features & PAL_VIDEO_FEATURE_TOPMOST_WINDOW)) { - s_X11.destroyWindow(s_X11.display, window); - return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + if (s_X11Atoms._NET_WM_STATE_ABOVE) { + s_X11.changeProperty( + s_X11.display, + window, + s_X11Atoms._NET_WM_STATE, + XA_ATOM, + 32, + PropModeAppend, + (unsigned char*)&s_X11Atoms._NET_WM_STATE_ABOVE, + 1); } - - s_X11.changeProperty( - s_X11.display, - window, - s_X11Atoms._NET_WM_STATE, - XA_ATOM, - 32, - PropModeAppend, - (unsigned char*)&s_X11Atoms._NET_WM_STATE_ABOVE, - 1); - } // resizable @@ -1989,19 +2061,29 @@ static PalResult xCreateWindow( s_X11.flush(s_X11.display); } + // check if the window has been mapped + // we use this to minimize or maximize + XWindowAttributes attr; + s_X11.getWindowAttributes(s_X11.display, window, &attr); + bool windowMapped = attr.map_state = IsViewable; + // maximize - if (info->maximized && info->show) { + if (info->maximized) { if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { s_X11.destroyWindow(s_X11.display, window); return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - // wait till the window is mapped - for (;;) { - XEvent event; - s_X11.nextEvent(s_X11.display, &event); - if (event.type == MapNotify && event.xmap.window == window) { - break; + // if the window is not mapped, we wait till its mapped + if (!windowMapped) { + // wait till the window is mapped + for (;;) { + XEvent event; + s_X11.nextEvent(s_X11.display, &event); + if (event.type == MapNotify && event.xmap.window == window) { + windowMapped = true; + break; + } } } @@ -2030,21 +2112,24 @@ static PalResult xCreateWindow( } // minimize - if (info->minimized && info->show) { + if (info->minimized) { if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { s_X11.destroyWindow(s_X11.display, window); return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - // wait till the window is mapped - for (;;) { - XEvent event; - s_X11.nextEvent(s_X11.display, &event); - if (event.type == MapNotify && event.xmap.window == window) { - break; + // if the window is not mapped, we wait till its mapped + if (!windowMapped) { + // wait till the window is mapped + for (;;) { + XEvent event; + s_X11.nextEvent(s_X11.display, &event); + if (event.type == MapNotify && event.xmap.window == window) { + windowMapped = true; + break; + } } } - s_X11.iconifyWindow(s_X11.display, window, s_X11.screen); } @@ -2274,6 +2359,19 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() return s_Video.features; } +PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (pixelFormatIndex) { + s_Video.pixelFormat = pixelFormatIndex; + return PAL_RESULT_SUCCESS; + } + return PAL_RESULT_INVALID_GL_FBCONFIG; +} + PalResult PAL_CALL palEnumerateMonitors( Int32* count, PalMonitor** outMonitors) diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 8493d29..4e41284 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1408,7 +1408,7 @@ PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (s_Video.initialized && pixelFormatIndex) { + if (pixelFormatIndex) { s_Video.pixelFormat = pixelFormatIndex; return PAL_RESULT_SUCCESS; } diff --git a/tests/tests.lua b/tests/tests.lua index dc369d8..f89f130 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -37,9 +37,9 @@ project "tests" "monitor_mode_test.c", "window_test.c", "icon_test.c", - "cursor_test.c", - "input_window_test.c", - "system_cursor_test.c" + -- "cursor_test.c", + -- "input_window_test.c", + -- "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index 3aceac2..2e21cb2 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -31,9 +31,9 @@ int main(int argc, char** argv) // registerTest("Monitor Mode Test", monitorModeTest); registerTest("Window Test", windowTest); registerTest("Icon Test", iconTest); - registerTest("Cursor Test", cursorTest); - registerTest("Input Window Test", inputWindowTest); - registerTest("System Cursor Test", systemCursorTest); + // registerTest("Cursor Test", cursorTest); + // registerTest("Input Window Test", inputWindowTest); + // registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL From d8b1b9f0228e0cc70aaa140a3b294fa1fafa28a5 Mon Sep 17 00:00:00 2001 From: nichcode Date: Mon, 13 Oct 2025 16:45:42 +0000 Subject: [PATCH 20/30] cursor window --- README.md | 2 +- include/pal/pal_video.h | 16 +- src/video/pal_video_linux.c | 2009 ++++++++++++++++++++++++++++++----- src/video/pal_video_win32.c | 4 +- tests/cursor_test.c | 4 +- tests/tests.lua | 4 +- tests/tests_main.c | 6 +- 7 files changed, 1759 insertions(+), 286 deletions(-) diff --git a/README.md b/README.md index 85d721a..a3f95f0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ PAL is a lightweight, low-level, cross-platform abstraction layer in **C**, designed to be **explicit** and as close to the **OS** as possible — similar in philosophy to Vulkan. It gives you precise control without hidden behavior, making it ideal for developers who want performance and predictability. -PAL is a transparent. All queries — window size, position, monitor info, and more — reflect the current platform state. Using PAL is like working directly with the OS: it applies no hidden logic, makes no assumptions, and leaves behavior fully in your control. +PAL is transparent. All queries — window size, position, monitor info, and more — reflect the current platform state. Using PAL is like working directly with the OS: it applies no hidden logic, makes no assumptions, and leaves behavior fully in your control. This approach gives you total control: you handle events, manage resources, and cache state explicitly. PAL provides the building blocks; how you use them — whether for simple applications or advanced frameworks — is entirely up to you. diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index 7cdf24c..dcaa6e9 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -676,7 +676,19 @@ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); * @brief Set the pixel format or FBConfig for the video system. * * The video system must be initialized before this call. - * This is used to create all windows after this call, If not set, the default will be used. + * The pixel format set will be used for all created windows after this call. + * The `pixelFormatIndex` is the loop index from the drivers + * supported pixel formats or FBConfig. + * + * Example: + * + * @code + * for (int i = 0; i < count; i++) { pixelFormatIndex = i;} + * @endcode + * + * An opengl supported pixel format or FBConfig must be used + * the window will be used to create an opengl context otherwise + * this can be ignored safely. * * @param[in] pixelFormatIndex The pixel format driver index. * @@ -1613,7 +1625,7 @@ PAL_API PalResult PAL_CALL palCreateCursorFrom( PAL_API void PAL_CALL palDestroyCursor(PalCursor* cursor); /** - * @brief Show or hide the provided cursor. + * @brief Show or hide the cursor. * * The video system must be initialized before this call. * This affects all created cursors since the platform (OS) merges all cursors diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 9987105..6600e8a 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -38,6 +38,8 @@ freely, subject to the following restrictions: #include #include #include +#include +#include #include // Wayland headers @@ -62,6 +64,8 @@ typedef struct { int dpi; Uint32 h; PalWindowState state; + PalCursor* cursor; + PalWindow* window; } WindowData; typedef struct { @@ -315,6 +319,130 @@ typedef int (*XSetClassHintFn)( typedef int (*XFreeFn)(void*); +typedef Cursor (*XCreateFontCursorFn)( + Display*, + unsigned int); + +typedef int (*XFreePixmapFn)( + Display*, + Pixmap); + +typedef int (*XSetWMHintsFn)( + Display*, + Window, + XWMHints*); + +typedef int (*XGrabPointerFn)( + Display*, + Window, + Bool, + unsigned int, + int, + int, + Window, + Cursor, + Time); + +typedef Cursor (*XCreatePixmapCursorFn)( + Display*, + Pixmap, + Pixmap, + XColor*, + XColor*, + unsigned int, + unsigned int); + +typedef int (*XWarpPointerFn)( + Display*, + Window, + Window, + int, + int, + unsigned int, + unsigned int, + int, + int); + +typedef Status (*XGetWMNameFn)( + Display*, + Window, + XTextProperty*); + +typedef Bool (*XQueryPointerFn)( + Display*, + Window, + Window*, + Window*, + int*, + int*, + int*, + int*, + unsigned int*); + +typedef int (*XUngrabPointerFn)( + Display*, + Time); + +typedef XWMHints *(*XAllocWMHintsFn) (void); + +typedef int (*XMapRaisedFn)( + Display*, + Window); + +typedef int (*XUndefineCursorFn)( + Display*, + Window); + +typedef int (*XDefineCursorFn)( + Display*, + Window, + Cursor); + +typedef int (*XFreeCursorFn)( + Display*, + Cursor); + +typedef XWMHints *(*XGetWMHintsFn)( + Display*, + Window); + +typedef Cursor (*XCreatePixmapCursorFn)( + Display*, + Pixmap, + Pixmap, + XColor*, + XColor*, + unsigned int, + unsigned int); + +typedef int (*XSetInputFocusFn)( + Display*, + Window, + int, + Time); + +typedef int (*XGetInputFocusFn)( + Display*, + Window*, + int*); + +typedef Pixmap (*XCreatePixmapFn)( + Display*, + Drawable, + unsigned int, + unsigned int, + unsigned int); + +typedef Cursor (*XcursorImageLoadCursorFn)( + Display*, + const XcursorImage*); + +typedef XcursorImage* (*XcursorImageCreateFn)( + int, + int); + +typedef void (*XcursorImageDestroyFn)(XcursorImage*); + typedef struct { bool unicodeTitle; @@ -351,10 +479,11 @@ typedef struct { void* handle; void* xrandr; void* opengl; + void* libCursor; Display* display; Window root; - GC gc; XContext dataID; + Cursor hiddenCursor; const char* className; XOpenDisplayFn openDisplay; @@ -408,6 +537,28 @@ typedef struct { GLXGetFBConfigsFn glxGetFBConfigs; GLXGetFBConfigAttribFn glxGetFBConfigAttrib; GLXGetVisualFromFBConfigFn glxGetVisualFromFBConfig; + + XCreateFontCursorFn createFontCursor; + XFreePixmapFn freePixmap; + XSetWMHintsFn setWMHints; + XGrabPointerFn grabPointer; + XCreatePixmapCursorFn createPixmapCursor; + XWarpPointerFn warpPointer; + XGetWMNameFn getWMName; + XQueryPointerFn queryPointer; + XUngrabPointerFn ungrabPointer; + XAllocWMHintsFn allocWMHints; + XMapRaisedFn mapRaised; + XUndefineCursorFn undefineCursor; + XDefineCursorFn defineCursor; + XFreeCursorFn freeCursor; + XGetWMHintsFn getWMHints; + XCreatePixmapFn createPixmap; + XSetInputFocusFn setInputFocus; + XGetInputFocusFn getInputFocus; + XcursorImageLoadCursorFn cursorImageLoadCursor; + XcursorImageCreateFn cursorImageCreate; + XcursorImageDestroyFn cursorImageDestroy; } X11; static X11 s_X11 = {0}; @@ -429,11 +580,41 @@ typedef struct { PalResult (*createWindow)(const PalWindowCreateInfo*, PalWindow**); void (*destroyWindow)(PalWindow*); + PalResult (*maximizeWindow)(PalWindow*); + PalResult (*minimizeWindow)(PalWindow*); + PalResult (*restoreWindow)(PalWindow*); + PalResult (*showWindow)(PalWindow*); + PalResult (*hideWindow)(PalWindow*); + PalResult (*xFlashWindow)(PalWindow*, const PalFlashInfo*); + + PalResult (*getWindowStyle)(PalWindow*, PalWindowStyle*); + PalResult (*getWindowMonitor)(PalWindow*, PalMonitor**); + PalResult (*getWindowTitle)(PalWindow*, Uint64, Uint64*, char*); + PalResult (*getWindowPos)(PalWindow*, Int32*, Int32*); + PalResult (*getWindowSize)(PalWindow*, Uint32*, Uint32*); + PalResult (*getWindowState)(PalWindow*, PalWindowState*); + bool (*isWindowVisible)(PalWindow*); + PalWindow* (*getFocusWindow)(); + PalWindowHandleInfo (*getWindowHandleInfo)(PalWindow*); PalResult (*setWindowOpacity)(PalWindow*, float); + PalResult (*setWindowStyle)(PalWindow*, PalWindowStyle); + PalResult (*setWindowTitle)(PalWindow*, const char*); + PalResult (*setWindowPos)(PalWindow*, Int32, Int32); + PalResult (*setWindowSize)(PalWindow*, Uint32, Uint32); + PalResult (*setFocusWindow)(PalWindow*); PalResult (*createIcon)(const PalIconCreateInfo*, PalIcon**); void (*destroyIcon)(PalIcon*); PalResult (*setWindowIcon)(PalWindow*, PalIcon*); + + PalResult (*createCursor)(const PalCursorCreateInfo*, PalCursor**); + PalResult (*createCursorFrom)(PalCursorType, PalCursor**); + void (*destroyCursor)(PalCursor*); + void (*showCursor)(bool); + PalResult (*clipCursor)(PalWindow*, bool); + PalResult (*getCursorPos)(PalWindow*, Int32*, Int32*); + PalResult (*setCursorPos)(PalWindow*, Int32, Int32); + PalResult (*setWindowCursor)(PalWindow*, PalCursor*); } Backend; typedef struct { @@ -653,11 +834,6 @@ static void xCheckFeatures() features |= PAL_VIDEO_FEATURE_WINDOW_GET_STATE; } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE) { - features |= PAL_VIDEO_FEATURE_WINDOW_SET_STYLE; - features |= PAL_VIDEO_FEATURE_WINDOW_GET_STYLE; - } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE_SPLASH) { features |= PAL_VIDEO_FEATURE_BORDERLESS_WINDOW; } @@ -666,10 +842,6 @@ static void xCheckFeatures() s_X11Atoms.unicodeTitle = true; } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_STATE_DEMANDS_ATTENTIONS) { - features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; - } - if (supportedAtoms[i] == s_X11Atoms._NET_WM_WINDOW_TYPE_UTILITY) { features |= PAL_VIDEO_FEATURE_TOOL_WINDOW; } @@ -701,8 +873,10 @@ static void xCheckFeatures() features |= PAL_VIDEO_FEATURE_CURSOR_GET_POS; features |= PAL_VIDEO_FEATURE_WINDOW_SET_TITLE; features |= PAL_VIDEO_FEATURE_WINDOW_GET_TITLE; + features |= PAL_VIDEO_FEATURE_WINDOW_FLASH_TRAY; s_Video.features = features; + s_X11.free(supportedAtoms); } static int xErrorHandler(Display*, XErrorEvent* e) @@ -748,6 +922,7 @@ static PalWindowState xQueryWindowState(Window xWin) } } + s_X11.free(atoms); return state; } @@ -828,6 +1003,41 @@ static int xGetWindowMonitorDPI( } } +static void xSendWMEvent( + Window window, + Atom type, + long a, + long b, + long c, + long d, + bool add) +{ + XEvent e = {0}; + e.xclient.type = ClientMessage; + e.xclient.send_event = True; + e.xclient.window = window; + e.xclient.message_type = type; + e.xclient.format = 32; + if (add) { + e.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD + } else { + e.xclient.data.l[0] = 0; // _NET_WM_STATE_REMOVE + } + + e.xclient.data.l[1] = a; + e.xclient.data.l[2] = b; + e.xclient.data.l[3] = c; + e.xclient.data.l[4] = d; + + s_X11.sendEvent( + s_X11.display, + s_X11.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &e); + +} + static PalResult xInitVideo() { // load X11 library @@ -836,6 +1046,12 @@ static PalResult xInitVideo() return PAL_RESULT_PLATFORM_FAILURE; } + // libXCursor is needed + s_X11.libCursor = dlopen("libXcursor.so", RTLD_LAZY); + if (!s_X11.libCursor) { + return PAL_RESULT_PLATFORM_FAILURE; + } + s_X11.xrandr = dlopen("libXrandr.so.2", RTLD_LAZY); if (!s_X11.xrandr) { s_X11.xrandr = dlopen("libXrandr.so", RTLD_LAZY); @@ -1011,6 +1227,91 @@ static PalResult xInitVideo() s_X11.handle, "XFree"); + s_X11.createFontCursor = (XCreateFontCursorFn)dlsym( + s_X11.handle, + "XCreateFontCursor"); + + s_X11.freePixmap = (XFreePixmapFn)dlsym( + s_X11.handle, + "XFreePixmap"); + + s_X11.setWMHints = (XSetWMHintsFn)dlsym( + s_X11.handle, + "XSetWMHints"); + + s_X11.grabPointer = (XGrabPointerFn)dlsym( + s_X11.handle, + "XGrabPointer"); + + s_X11.createPixmapCursor = (XCreatePixmapCursorFn)dlsym( + s_X11.handle, + "XCreatePixmapCursor"); + + s_X11.warpPointer = (XWarpPointerFn)dlsym( + s_X11.handle, + "XWarpPointer"); + + s_X11.getWMName = (XGetWMNameFn)dlsym( + s_X11.handle, + "XGetWMName"); + + s_X11.queryPointer = (XQueryPointerFn)dlsym( + s_X11.handle, + "XQueryPointer"); + + s_X11.ungrabPointer = (XUngrabPointerFn)dlsym( + s_X11.handle, + "XUngrabPointer"); + + s_X11.allocWMHints = (XAllocWMHintsFn)dlsym( + s_X11.handle, + "XAllocWMHints"); + + s_X11.mapRaised = (XMapRaisedFn)dlsym( + s_X11.handle, + "XMapRaised"); + + s_X11.undefineCursor = (XUndefineCursorFn)dlsym( + s_X11.handle, + "XUndefineCursor"); + + s_X11.defineCursor = (XDefineCursorFn)dlsym( + s_X11.handle, + "XDefineCursor"); + + s_X11.freeCursor = (XFreeCursorFn)dlsym( + s_X11.handle, + "XFreeCursor"); + + s_X11.getWMHints = (XGetWMHintsFn)dlsym( + s_X11.handle, + "XGetWMHints"); + + s_X11.createPixmap = (XCreatePixmapFn)dlsym( + s_X11.handle, + "XCreatePixmap"); + + s_X11.setInputFocus = (XSetInputFocusFn)dlsym( + s_X11.handle, + "XSetInputFocus"); + + s_X11.getInputFocus = (XGetInputFocusFn)dlsym( + s_X11.handle, + "XGetInputFocus"); + + // libXcursor + s_X11.cursorImageLoadCursor = (XcursorImageLoadCursorFn)dlsym( + s_X11.libCursor, + "XcursorImageLoadCursor"); + + s_X11.cursorImageCreate = (XcursorImageCreateFn)dlsym( + s_X11.libCursor, + "XcursorImageCreate"); + + s_X11.cursorImageDestroy = (XcursorImageDestroyFn)dlsym( + s_X11.libCursor, + "XcursorImageDestroy"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -1056,9 +1357,23 @@ static PalResult xInitVideo() s_X11.glxGetVisualFromFBConfig = (GLXGetVisualFromFBConfigFn)load( "glXGetVisualFromFBConfig"); - } + // create a hidden cursor. + // This is used to simulate cursor hide and show + Pixmap map = s_X11.createPixmap(s_X11.display, s_X11.root, 1, 1, 1); + XColor dummy; + s_X11.hiddenCursor = s_X11.createPixmapCursor( + s_X11.display, + map, + map, + &dummy, + &dummy, + 0, + 0); + + s_X11.freePixmap(s_X11.display, map); + return PAL_RESULT_SUCCESS; } @@ -2044,20 +2359,25 @@ static PalResult xCreateWindow( } } + // set size hints + XSizeHints wmHints = {0}; + wmHints.flags = PPosition | PSize; + wmHints.x = x; + wmHints.y = y; + wmHints.width = info->width; + wmHints.height = info->height; + // resizable if (!(info->style & PAL_WINDOW_STYLE_RESIZABLE)) { - XSizeHints hints = {0}; - hints.flags = PMinSize | PMaxSize; - hints.min_width = hints.max_width = info->width; - hints.min_height = hints.max_height = info->height; - s_X11.setWMNormalHints(s_X11.display, window, &hints); + wmHints.flags = PMinSize | PMaxSize; + wmHints.min_width = wmHints.max_width = info->width; + wmHints.min_height = wmHints.max_height = info->height; } // show window + s_X11.setWMNormalHints(s_X11.display, window, &wmHints); if (info->show) { s_X11.mapWindow(s_X11.display, window); - // move the window if window manager didnt - s_X11.moveWindow(s_X11.display, window, x, y); s_X11.flush(s_X11.display); } @@ -2087,28 +2407,14 @@ static PalResult xCreateWindow( } } - Atom data[2]; - data[0] = s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT; - data[1] = s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ; - - XEvent e = {0}; - e.xclient.type = ClientMessage; - e.xclient.send_event = True; - e.xclient.window = window; - e.xclient.message_type = s_X11Atoms._NET_WM_STATE; - e.xclient.format = 32; - e.xclient.data.l[0] = 1; // _NET_WM_STATE_ADD - e.xclient.data.l[1] = data[0]; - e.xclient.data.l[2] = data[1]; - e.xclient.data.l[3] = 1; - e.xclient.data.l[4] = 0; - - s_X11.sendEvent( - s_X11.display, - s_X11.root, - False, - SubstructureNotifyMask | SubstructureRedirectMask, - &e); + xSendWMEvent( + window, + s_X11Atoms._NET_WM_STATE, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ, + 1, + 0, + true); // _NET_WM_STATE_ADD } // minimize @@ -2145,6 +2451,8 @@ static PalResult xCreateWindow( data->skipConfigure = true; data->skipState = true; data->dpi = monitorInfo.dpi; // the current window monitor + data->window = TO_PAL_HANDLE(PalWindow, window); + data->cursor = nullptr; s_X11.saveContext(s_X11.display, window, s_X11.dataID, (XPointer)data); *outWindow = TO_PAL_HANDLE(PalWindow, window); @@ -2160,394 +2468,1549 @@ static void xDestroyWindow(PalWindow* window) data->used = false; } -static PalResult xSetWindowOpacity( - PalWindow* window, - float opacity) +PalResult xMinimizeWindow(PalWindow* window) { - XErrorHandler old = s_X11.setErrorHandler(xErrorHandler); - unsigned long value = (unsigned long)(opacity * 0xFFFFFFFFUL + 0.5f); + if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } - s_X11.changeProperty( - s_X11.display, - FROM_PAL_HANDLE(Window, window), - s_X11Atoms._NET_WM_WINDOW_OPACITY, - XA_CARDINAL, - 32, - PropModeReplace, - (unsigned char*)&value, - 1); - - s_X11.sync(s_X11.display, False); - s_X11.setErrorHandler(old); - if (s_X11.error) { - // technically, this is the only error that can occur + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } + s_X11.iconifyWindow(s_X11.display, xWin, s_X11.screen); return PAL_RESULT_SUCCESS; } -PalResult xCreateIcon( - const PalIconCreateInfo* info, - PalIcon** outIcon) +PalResult xMaximizeWindow(PalWindow* window) { - Uint64 totalPixels = 2 + (Uint64)(info->width * info->height); - Uint64 totalBytes = sizeof(unsigned long) * totalPixels; + if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } - unsigned long* icon = palAllocate(s_Video.allocator, totalBytes, 0); - if (!icon) { - return PAL_RESULT_OUT_OF_MEMORY; + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; } - // store width and height and populate data with icon pixels - // [width][height][pixels] - icon[0] = (unsigned long)info->width; - icon[1] = (unsigned long)info->height; + xSendWMEvent( + xWin, + s_X11Atoms._NET_WM_STATE, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ, + 1, + 0, + true); // _NET_WM_STATE_ADD - // convert from RGBA8 to ARGB32 - for (int i = 0; i < info->width * info->height; i++) { - Uint8 r = info->pixels[i * 4 + 0]; // Red - Uint8 g = info->pixels[i * 4 + 1]; // Green - Uint8 b = info->pixels[i * 4 + 2]; // Blue - Uint8 a = info->pixels[i * 4 + 3]; // Alpha + return PAL_RESULT_SUCCESS; +} - icon[2 + i] = ((unsigned long)a << 24) | - ((unsigned long)r << 16) | - ((unsigned long)g << 8) | - ((unsigned long)b); +PalResult xRestoreWindow(PalWindow* window) +{ + if (!(s_Video.features & PAL_VIDEO_FEATURE_WINDOW_SET_STATE)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - *outIcon = TO_PAL_HANDLE(PalIcon, icon); + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + // since we have no fixed way to restore the window + // we just restore from minimized and maximized state + xSendWMEvent( + xWin, + s_X11Atoms._NET_WM_STATE, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT, + s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ, + 1, + 0, + false); // _NET_WM_STATE_REMOVE + + s_X11.mapRaised(s_X11.display, xWin); + return PAL_RESULT_SUCCESS; } -void xDestroyIcon(PalIcon* icon) +PalResult xShowWindow(PalWindow* window) { - if (icon) { - palFree(s_Video.allocator, icon); + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; } + + s_X11.mapWindow(s_X11.display, xWin); + return PAL_RESULT_SUCCESS; } -PalResult xSetWindowIcon( - PalWindow* window, - PalIcon* icon) +PalResult xHideWindow(PalWindow* window) { - WindowData* winData = nullptr; Window xWin = FROM_PAL_HANDLE(Window, window); - s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&winData); - if (!winData) { + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } - unsigned long* iconData = FROM_PAL_HANDLE(unsigned long*, icon); - Uint64 totalPixels = 2 + iconData[0] * iconData[1]; - s_X11.changeProperty( - s_X11.display, - xWin, - s_X11Atoms._NET_WM_ICON, - XA_CARDINAL, - 32, - PropModeReplace, - (unsigned char*)iconData, - (int)totalPixels); - - s_X11.flush(s_X11.display); + s_X11.unmapWindow(s_X11.display, xWin); return PAL_RESULT_SUCCESS; } -static Backend s_XBackend = { - .shutdownVideo = xShutdownVideo, - .updateVideo = xUpdateVideo, - .enumerateMonitors = xEnumerateMonitors, - .getMonitorInfo = xGetMonitorInfo, - .getPrimaryMonitor = xGetPrimaryMonitor, - .enumerateMonitorModes = xEnumerateMonitorModes, - .getCurrentMonitorMode = xGetCurrentMonitorMode, - .setMonitorMode = xSetMonitorMode, - .validateMonitorMode = xValidateMonitorMode, - .setMonitorOrientation = xSetMonitorOrientation, - - .createWindow = xCreateWindow, +PalResult xFlashWindow( + PalWindow* window, + const PalFlashInfo* info) +{ + if (info->flags & PAL_FLASH_CAPTION) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + bool add = false; + if (info->flags & PAL_FLASH_TRAY) { + add = true; + } + + // check if modern flashing is supported + if (s_X11Atoms._NET_WM_STATE_DEMANDS_ATTENTIONS) { + xSendWMEvent( + xWin, + s_X11Atoms._NET_WM_STATE, + s_X11Atoms._NET_WM_STATE_DEMANDS_ATTENTIONS, + 0, + 0, + 0, + add); // _NET_WM_STATE_ADD + + } else { + // legacy mode + XWMHints* hints = s_X11.getWMHints(s_X11.display, xWin); + if (!hints) { + hints = s_X11.allocWMHints(); + if (!hints) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + if (add) { + hints->flags |= XUrgencyHint; + } else { + hints->flags &= ~XUrgencyHint; + } + s_X11.setWMHints(s_X11.display, xWin, hints); + s_X11.free(hints); + } + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xGetWindowStyle( + PalWindow* window, + PalWindowStyle* outStyle) +{ + // Window Manager quirks + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; +} + +PalResult xGetWindowMonitor( + PalWindow* window, + PalMonitor** outMonitor) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + XRRScreenResources* resources = nullptr; + resources = s_X11.getScreenResources( + s_X11.display, + s_X11.root); + + for (int i = 0; i < resources->noutput; ++i) { + RROutput output = resources->outputs[i]; + XRROutputInfo* info = s_X11.getOutputInfo( + s_X11.display, + resources, + output); + + if (info->connection == RR_Connected && + info->crtc != None) { + XRRCrtcInfo* crtc = s_X11.getCrtcInfo( + s_X11.display, + resources, + info->crtc); + + // check bounds to see if window is on the monitor + if (attr.x >= crtc->x && + attr.x < crtc->x + crtc->width && + attr.y >= crtc->y && + attr.y < crtc->y + crtc->height) { + // found monitor + *outMonitor = TO_PAL_HANDLE(PalMonitor, output); + break; + } + s_X11.freeCrtcInfo(crtc); + } + s_X11.freeOutputInfo(info); + } + s_X11.freeScreenResources(resources); + return PAL_RESULT_SUCCESS; +} + +PalResult xGetWindowTitle( + PalWindow* window, + Uint64 bufferSize, + Uint64* outSize, + char* outBuffer) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (!outBuffer || bufferSize <= 0) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + + if (s_X11Atoms.unicodeTitle) { + Atom type; + int format; + unsigned long count, bytesAfter; + unsigned char* prop = nullptr; + s_X11.getWindowProperty( + s_X11.display, + xWin, + s_X11Atoms._NET_WM_NAME, + 0, + (~0L), + False, + s_X11Atoms.UTF8_STRING, + &type, + &format, + &count, + &bytesAfter, + &prop); + + if (bufferSize >= count) { + strcpy(outBuffer, (const char*)prop); + } else { + // copy up to the limiit of the supplied buffer + strncpy(outBuffer, (const char*)prop, bufferSize); + } + s_X11.free(prop); + + } else { + XTextProperty text; + if (!s_X11.getWMName(s_X11.display, xWin, &text)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (bufferSize >= text.nitems) { + strcpy(outBuffer, (const char*)text.value); + } else { + // copy up to the limiit of the supplied buffer + strncpy(outBuffer, (const char*)text.value, bufferSize); + } + s_X11.free(text.value); + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xGetWindowPos( + PalWindow* window, + Int32* x, + Int32* y) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (x) { + *x = attr.x; + } + + if (y) { + *y = attr.y; + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xGetWindowSize( + PalWindow* window, + Uint32* width, + Uint32* height) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (width) { + *width = attr.width; + } + + if (height) { + *height = attr.height; + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xGetWindowState( + PalWindow* window, + PalWindowState* outState) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + Atom type; + int format; + unsigned long count, bytesAfter; + unsigned char* props = nullptr; + s_X11.getWindowProperty( + s_X11.display, + xWin, + s_X11Atoms._NET_WM_STATE, + 0, + (~0L), + False, + XA_ATOM, + &type, + &format, + &count, + &bytesAfter, + &props); + + PalWindowState state = PAL_WINDOW_STATE_RESTORED; + for (unsigned long i = 0; i < count; ++i) { + if (props[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_HORZ) { + state = PAL_WINDOW_STATE_MAXIMIZED; + } + + if (props[i] == s_X11Atoms._NET_WM_STATE_MAXIMIZED_VERT) { + state = PAL_WINDOW_STATE_MAXIMIZED; + } + + if (props[i] == s_X11Atoms._NET_WM_STATE_HIDDEN) { + state = PAL_WINDOW_STATE_MINIMIZED; + } + } + + s_X11.free(props); + *outState = state; + return PAL_RESULT_SUCCESS; +} + +bool xIsWindowVisible(PalWindow* window) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return false; + } + + return attr.map_state == IsViewable; +} + +PalWindow* xGetFocusWindow() +{ + Window window; + int tmp; + s_X11.getInputFocus(s_X11.display, &window, &tmp); + Window xWin = FROM_PAL_HANDLE(Window, window); + + if (xWin == s_X11.root) { + return nullptr; + } + return TO_PAL_HANDLE(PalWindow, window); +} + +PalWindowHandleInfo xGetWindowHandleInfo(PalWindow* window) +{ + PalWindowHandleInfo info; + info.nativeDisplay = (void*)s_X11.display; + info.nativeWindow = (void*)window; + return info; +} + +static PalResult xSetWindowOpacity( + PalWindow* window, + float opacity) +{ + XErrorHandler old = s_X11.setErrorHandler(xErrorHandler); + unsigned long value = (unsigned long)(opacity * 0xFFFFFFFFUL + 0.5f); + + s_X11.changeProperty( + s_X11.display, + FROM_PAL_HANDLE(Window, window), + s_X11Atoms._NET_WM_WINDOW_OPACITY, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)&value, + 1); + + s_X11.sync(s_X11.display, False); + s_X11.setErrorHandler(old); + if (s_X11.error) { + // technically, this is the only error that can occur + return PAL_RESULT_INVALID_WINDOW; + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xSetWindowStyle( + PalWindow* window, + PalWindowStyle style) +{ + // Window Manager quirks + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; +} + +PalResult xSetWindowTitle( + PalWindow* window, + const char* title) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (s_X11Atoms.unicodeTitle) { + s_X11.changeProperty( + s_X11.display, + xWin, + s_X11Atoms._NET_WM_NAME, + s_X11Atoms.UTF8_STRING, + 8, // unsigned char + PropModeReplace, + title, + strlen(title)); + + } else { + s_X11.storeName(s_X11.display, xWin, title); + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xSetWindowPos( + PalWindow* window, + Int32 x, + Int32 y) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + s_X11.moveWindow(s_X11.display, xWin, x, y); + return PAL_RESULT_SUCCESS; +} + +PalResult xSetWindowSize( + PalWindow* window, + Uint32 width, + Uint32 height) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + s_X11.resizeWindow(s_X11.display, xWin, width, height); + return PAL_RESULT_SUCCESS; +} + +PalResult xSetFocusWindow(PalWindow* window) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (s_X11Atoms._NET_ACTIVE_WINDOW) { + xSendWMEvent( + xWin, + s_X11Atoms._NET_ACTIVE_WINDOW, + CurrentTime, + 0, + 0, + 0, + true); // 1 + + } else { + s_X11.setInputFocus(s_X11.display, xWin, RevertToParent, CurrentTime); + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xCreateIcon( + const PalIconCreateInfo* info, + PalIcon** outIcon) +{ + Uint64 totalPixels = 2 + (Uint64)(info->width * info->height); + Uint64 totalBytes = sizeof(unsigned long) * totalPixels; + + unsigned long* icon = palAllocate(s_Video.allocator, totalBytes, 0); + if (!icon) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + // store width and height and populate data with icon pixels + // [width][height][pixels] + icon[0] = (unsigned long)info->width; + icon[1] = (unsigned long)info->height; + + // convert from RGBA8 to ARGB32 + for (int i = 0; i < info->width * info->height; i++) { + Uint8 r = info->pixels[i * 4 + 0]; // Red + Uint8 g = info->pixels[i * 4 + 1]; // Green + Uint8 b = info->pixels[i * 4 + 2]; // Blue + Uint8 a = info->pixels[i * 4 + 3]; // Alpha + + icon[2 + i] = ((unsigned long)a << 24) | + ((unsigned long)r << 16) | + ((unsigned long)g << 8) | + ((unsigned long)b); + } + + *outIcon = TO_PAL_HANDLE(PalIcon, icon); + return PAL_RESULT_SUCCESS; +} + +void xDestroyIcon(PalIcon* icon) +{ + if (icon) { + palFree(s_Video.allocator, icon); + } +} + +PalResult xSetWindowIcon( + PalWindow* window, + PalIcon* icon) +{ + WindowData* winData = nullptr; + Window xWin = FROM_PAL_HANDLE(Window, window); + s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&winData); + if (!winData) { + return PAL_RESULT_INVALID_WINDOW; + } + + unsigned long* iconData = FROM_PAL_HANDLE(unsigned long*, icon); + Uint64 totalPixels = 2 + iconData[0] * iconData[1]; + s_X11.changeProperty( + s_X11.display, + xWin, + s_X11Atoms._NET_WM_ICON, + XA_CARDINAL, + 32, + PropModeReplace, + (unsigned char*)iconData, + (int)totalPixels); + + s_X11.flush(s_X11.display); + return PAL_RESULT_SUCCESS; +} + +PalResult xCreateCursor( + const PalCursorCreateInfo* info, + PalCursor** outCursor) +{ + XcursorImage* image = s_X11.cursorImageCreate(info->width, info->height); + image->xhot = info->xHotspot; + image->yhot = info->yHotspot; + + // convert from RGBA8 to ARGB32 + for (int i = 0; i < info->width * info->height; i++) { + Uint8 r = info->pixels[i * 4 + 0]; // Red + Uint8 g = info->pixels[i * 4 + 1]; // Green + Uint8 b = info->pixels[i * 4 + 2]; // Blue + Uint8 a = info->pixels[i * 4 + 3]; // Alpha + + image->pixels[i] = ((unsigned long)a << 24) | + ((unsigned long)r << 16) | + ((unsigned long)g << 8) | + ((unsigned long)b); + } + + Cursor cursor = s_X11.cursorImageLoadCursor(s_X11.display, image); + if (!cursor) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + s_X11.cursorImageDestroy(image); + *outCursor = TO_PAL_HANDLE(PalCursor, cursor); + return PAL_RESULT_SUCCESS; +} + +PalResult xCreateCursorFrom( + PalCursorType type, + PalCursor** outCursor) +{ + int shape; + Cursor cursor; + switch (type) { + case PAL_CURSOR_ARROW: { + shape = XC_left_ptr; + break; + } + + case PAL_CURSOR_HAND: { + shape = XC_hand2; + break; + } + + case PAL_CURSOR_CROSS: { + shape = XC_cross; + break; + } + + case PAL_CURSOR_IBEAM: { + shape = XC_xterm; + break; + } + + case PAL_CURSOR_WAIT: { + shape = XC_watch; + break; + } + + default: { + return PAL_RESULT_INVALID_ARGUMENT; + } + } + + cursor = s_X11.createFontCursor(s_X11.display, shape); + *outCursor = TO_PAL_HANDLE(PalCursor, cursor); + return PAL_RESULT_SUCCESS; +} + +void xDestroyCursor(PalCursor* cursor) +{ + s_X11.freeCursor(s_X11.display, FROM_PAL_HANDLE(Cursor, cursor)); +} + +void xShowCursor(bool show) +{ + // X11 does not have a single function to show or hide cursor globally + // so we query on windows and set the cursor for each + // The limitation is any window not attached to PAL will not be affected + for (int i = 0; i < s_Video.maxWindowData; i++) { + WindowData* data = &s_Video.windowData[i]; + Window xWin = FROM_PAL_HANDLE(Window, data->window); + if (show) { + // we check if the window has a valid cursor + // if not we use the root windows cursor + Cursor cursor = FROM_PAL_HANDLE(Cursor, data->cursor); + if (cursor) { + s_X11.defineCursor(s_X11.display, xWin, cursor); + } else { + s_X11.undefineCursor(s_X11.display, xWin); + } + + } else { + s_X11.defineCursor(s_X11.display, xWin, s_X11.hiddenCursor); + } + s_X11.flush(s_X11.display); + } +} + +PalResult xClipCursor( + PalWindow* window, + bool clip) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + if (clip) { + s_X11.grabPointer( + s_X11.display, + xWin, + True, + 0, + GrabModeAsync, + GrabModeAsync, + xWin, + None, + CurrentTime); + + } else { + s_X11.ungrabPointer(s_X11.display, CurrentTime); + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xGetCursorPos( + PalWindow* window, + Int32* x, + Int32* y) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + Window root, rootChild; + int rootX, rootY, winX, winY; + unsigned int mask; + s_X11.queryPointer( + s_X11.display, + xWin, + &root, + &rootChild, + &rootX, + &rootY, + &winX, + &winY, + &mask); + + if (x) { + *x = winX; + } + + if (y) { + *y = winY; + } + + return PAL_RESULT_SUCCESS; +} + +PalResult xSetCursorPos( + PalWindow* window, + Int32 x, + Int32 y) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + s_X11.warpPointer( + s_X11.display, + None, + xWin, + 0, + 0, + 0, + 0, + x, + y); + + s_X11.flush(s_X11.display); + return PAL_RESULT_SUCCESS; +} + +PalResult xSetWindowCursor( + PalWindow* window, + PalCursor* cursor) +{ + Window xWin = FROM_PAL_HANDLE(Window, window); + XWindowAttributes attr; + if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { + return PAL_RESULT_INVALID_WINDOW; + } + + Window xCursor = FROM_PAL_HANDLE(Cursor, cursor); + if (xCursor) { + s_X11.defineCursor(s_X11.display, xWin, xCursor); + // cache the cursor. Show or hide cursor needs it + WindowData* data = nullptr; + s_X11.findContext(s_X11.display, xWin, s_X11.dataID, (XPointer*)&data); + data->cursor = cursor; + + } else { + s_X11.undefineCursor(s_X11.display, xWin); + } + + s_X11.flush(s_X11.display); + return PAL_RESULT_SUCCESS; +} + +static Backend s_XBackend = { + .shutdownVideo = xShutdownVideo, + .updateVideo = xUpdateVideo, + .enumerateMonitors = xEnumerateMonitors, + .getMonitorInfo = xGetMonitorInfo, + .getPrimaryMonitor = xGetPrimaryMonitor, + .enumerateMonitorModes = xEnumerateMonitorModes, + .getCurrentMonitorMode = xGetCurrentMonitorMode, + .setMonitorMode = xSetMonitorMode, + .validateMonitorMode = xValidateMonitorMode, + .setMonitorOrientation = xSetMonitorOrientation, + + .createWindow = xCreateWindow, .destroyWindow = xDestroyWindow, + .maximizeWindow = xMaximizeWindow, + .minimizeWindow = xMinimizeWindow, + .restoreWindow = xRestoreWindow, + .showWindow = xShowWindow, + .hideWindow = xHideWindow, + .xFlashWindow = xFlashWindow, + .getWindowStyle = xGetWindowStyle, + .getWindowMonitor = xGetWindowMonitor, + .getWindowTitle = xGetWindowTitle, + .getWindowPos = xGetWindowPos, + .getWindowSize = xGetWindowSize, + .getWindowState = xGetWindowState, + .isWindowVisible = xIsWindowVisible, + .getFocusWindow = xGetFocusWindow, + .getWindowHandleInfo = xGetWindowHandleInfo, .setWindowOpacity = xSetWindowOpacity, + .setWindowStyle = xSetWindowStyle, + .setWindowTitle = xSetWindowTitle, + .setWindowPos = xSetWindowPos, + .setWindowSize = xSetWindowSize, + .setFocusWindow = xSetFocusWindow, + + .createIcon = xCreateIcon, + .destroyIcon = xDestroyIcon, + .setWindowIcon = xSetWindowIcon, + + .createCursor = xCreateCursor, + .createCursorFrom = xCreateCursorFrom, + .destroyCursor = xDestroyCursor, + .showCursor = xShowCursor, + .clipCursor = xClipCursor, + .getCursorPos = xGetCursorPos, + .setCursorPos = xSetCursorPos, + .setWindowCursor = xSetWindowCursor +}; + +#pragma endregions + +// ================================================== +// Public API +// ================================================== + +PalResult PAL_CALL palInitVideo( + const PalAllocator* allocator, + PalEventDriver* eventDriver) +{ + if (s_Video.initialized) { + return PAL_RESULT_SUCCESS; + } + + if (allocator && (!allocator->allocate || !allocator->free)) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + + // get backend type + bool x11 = true; + const char* session = getenv("XDG_SESSION_TYPE"); + if (session) { + if (strcmp(session, "wayland") == 0) { + x11 = false; + } + } + + s_Video.maxMonitorData = 16; // initial size + s_Video.maxWindowData = 32;// initial size + + s_Video.windowData = palAllocate( + s_Video.allocator, + sizeof(WindowData) * s_Video.maxWindowData, + 0); + + s_Video.monitorData = palAllocate( + s_Video.allocator, + sizeof(MonitorData) * s_Video.maxMonitorData, + 0); + + if (!s_Video.monitorData || !s_Video.windowData) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + if (x11) { + PalResult ret = xInitVideo(); + if (ret != PAL_RESULT_SUCCESS) { + return ret; + } + s_Video.backend = &s_XBackend; + } + + s_Video.allocator = allocator; + s_Video.eventDriver = eventDriver; + s_Video.initialized = true; + return PAL_RESULT_SUCCESS; +} + +void PAL_CALL palShutdownVideo() +{ + if (s_Video.initialized) { + s_Video.backend->shutdownVideo(); + palFree(s_Video.allocator, s_Video.windowData); + palFree(s_Video.allocator, s_Video.monitorData); + } +} + +void PAL_CALL palUpdateVideo() +{ + if (s_Video.initialized) { + s_Video.backend->updateVideo(); + } +} + +PalVideoFeatures PAL_CALL palGetVideoFeatures() +{ + if (!s_Video.initialized) { + return 0; + } + + return s_Video.features; +} + +PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (pixelFormatIndex) { + s_Video.pixelFormat = pixelFormatIndex; + return PAL_RESULT_SUCCESS; + } + return PAL_RESULT_INVALID_GL_FBCONFIG; +} + +PalResult PAL_CALL palEnumerateMonitors( + Int32* count, + PalMonitor** outMonitors) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!count) { + return PAL_RESULT_NULL_POINTER; + } + + if (*count == 0 && outMonitors) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } - .createIcon = xCreateIcon, - .destroyIcon = xDestroyIcon, - .setWindowIcon = xSetWindowIcon -}; + return s_Video.backend->enumerateMonitors(count, outMonitors); +} -#pragma endregion +PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!outMonitor) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getPrimaryMonitor(outMonitor); +} + +PalResult PAL_CALL palGetMonitorInfo( + PalMonitor* monitor, + PalMonitorInfo* info) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!info) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getMonitorInfo(monitor, info); +} + +PalResult PAL_CALL palEnumerateMonitorModes( + PalMonitor* monitor, + Int32* count, + PalMonitorMode* modes) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !count) { + return PAL_RESULT_NULL_POINTER; + } + + if (*count == 0 && modes) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + + PalResult ret = s_Video.backend->enumerateMonitorModes( + monitor, + count, + modes + ); + + if (ret == PAL_RESULT_SUCCESS && modes) { + // sort the modes so that they are lowest to highest + qsort(modes, *count, sizeof(PalMonitorMode), compareModes); + } + + return ret; +} + +PalResult PAL_CALL palGetCurrentMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getCurrentMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palSetMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->setMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palValidateMonitorMode( + PalMonitor* monitor, + PalMonitorMode* mode) +{ + + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor || !mode) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->validateMonitorMode(monitor, mode); +} + +PalResult PAL_CALL palSetMonitorOrientation( + PalMonitor* monitor, + PalOrientation orientation) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!monitor) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->setMonitorOrientation(monitor, orientation); +} // ================================================== -// Public API +// Window // ================================================== -PalResult PAL_CALL palInitVideo( - const PalAllocator* allocator, - PalEventDriver* eventDriver) +PalResult PAL_CALL palCreateWindow( + const PalWindowCreateInfo* info, + PalWindow** outWindow) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!info || !outWindow) { + return PAL_RESULT_NULL_POINTER; + } + + if (info->style & PAL_WINDOW_STYLE_NO_MINIMIZEBOX) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + if (info->style & PAL_WINDOW_STYLE_NO_MAXIMIZEBOX) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + } + + return s_Video.backend->createWindow(info,outWindow); +} + +void PAL_CALL palDestroyWindow(PalWindow* window) +{ + if (s_Video.initialized && window) { + return s_Video.backend->destroyWindow(window); + } +} + +PalResult PAL_CALL palMinimizeWindow(PalWindow* window) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->maximizeWindow(window); +} + +PalResult PAL_CALL palMaximizeWindow(PalWindow* window) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->minimizeWindow(window); +} + +PalResult PAL_CALL palRestoreWindow(PalWindow* window) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->restoreWindow(window); +} + +PalResult PAL_CALL palShowWindow(PalWindow* window) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->showWindow(window); +} + +PalResult PAL_CALL palHideWindow(PalWindow* window) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->hideWindow(window); +} + +PalResult PAL_CALL palFlashWindow( + PalWindow* window, + const PalFlashInfo* info) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window || !info) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->xFlashWindow(window, info); +} + +PalResult PAL_CALL palGetWindowStyle( + PalWindow* window, + PalWindowStyle* outStyle) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window || !outStyle) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getWindowStyle(window, outStyle); +} + +PalResult PAL_CALL palGetWindowMonitor( + PalWindow* window, + PalMonitor** outMonitor) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window || !outMonitor) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getWindowMonitor(window, outMonitor); +} + +PalResult PAL_CALL palGetWindowTitle( + PalWindow* window, + Uint64 bufferSize, + Uint64* outSize, + char* outBuffer) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } + + if (!window || !outBuffer) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->getWindowTitle( + window, + bufferSize, + outSize, + outBuffer); +} + +PalResult PAL_CALL palGetWindowPos( + PalWindow* window, + Int32* x, + Int32* y) { - if (s_Video.initialized) { - return PAL_RESULT_SUCCESS; + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (allocator && (!allocator->allocate || !allocator->free)) { - return PAL_RESULT_INVALID_ALLOCATOR; + if (!window) { + return PAL_RESULT_NULL_POINTER; } - // get backend type - bool x11 = true; - const char* session = getenv("XDG_SESSION_TYPE"); - if (session) { - if (strcmp(session, "wayland") == 0) { - x11 = false; - } - } + return s_Video.backend->getWindowPos(window, x, y); +} - s_Video.maxMonitorData = 16; // initial size - s_Video.maxWindowData = 32;// initial size +PalResult PAL_CALL palGetWindowSize( + PalWindow* window, + Uint32* width, + Uint32* height) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; + } - s_Video.windowData = palAllocate( - s_Video.allocator, - sizeof(WindowData) * s_Video.maxWindowData, - 0); + if (!window) { + return PAL_RESULT_NULL_POINTER; + } - s_Video.monitorData = palAllocate( - s_Video.allocator, - sizeof(MonitorData) * s_Video.maxMonitorData, - 0); + return s_Video.backend->getWindowSize(window, width, height); +} - if (!s_Video.monitorData || !s_Video.windowData) { - return PAL_RESULT_OUT_OF_MEMORY; +PalResult PAL_CALL palGetWindowState( + PalWindow* window, + PalWindowState* outState) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (x11) { - PalResult ret = xInitVideo(); - if (ret != PAL_RESULT_SUCCESS) { - return ret; - } - s_Video.backend = &s_XBackend; + if (!window || !outState) { + return PAL_RESULT_NULL_POINTER; } - s_Video.allocator = allocator; - s_Video.eventDriver = eventDriver; - s_Video.initialized = true; - return PAL_RESULT_SUCCESS; + return s_Video.backend->getWindowState(window, outState); } -void PAL_CALL palShutdownVideo() +const bool* PAL_CALL palGetKeycodeState() { - if (s_Video.initialized) { - s_Video.backend->shutdownVideo(); - palFree(s_Video.allocator, s_Video.windowData); - palFree(s_Video.allocator, s_Video.monitorData); - } + // TODO: implement + return nullptr; } -void PAL_CALL palUpdateVideo() +const bool* PAL_CALL palGetScancodeState() { - if (s_Video.initialized) { - s_Video.backend->updateVideo(); - } + // TODO: implement + return nullptr; } -PalVideoFeatures PAL_CALL palGetVideoFeatures() +const bool* PAL_CALL palGetMouseState() +{ + // TODO: implement + return nullptr; +} + +void PAL_CALL palGetMouseDelta( + Int32* dx, + Int32* dy) +{ + // TODO: implement + return; +} + +void PAL_CALL palGetMouseWheelDelta( + Int32* dx, + Int32* dy) +{ + // TODO: implement + return; +} + +bool PAL_CALL palIsWindowVisible(PalWindow* window) { if (!s_Video.initialized) { - return 0; + return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - return s_Video.features; + if (!window) { + return PAL_RESULT_NULL_POINTER; + } + + return s_Video.backend->isWindowVisible(window); } -PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) +PalWindow* PAL_CALL palGetFocusWindow() { if (!s_Video.initialized) { - return PAL_RESULT_VIDEO_NOT_INITIALIZED; + return nullptr; } - if (pixelFormatIndex) { - s_Video.pixelFormat = pixelFormatIndex; - return PAL_RESULT_SUCCESS; + return s_Video.backend->getFocusWindow(); +} + +PalWindowHandleInfo PAL_CALL palGetWindowHandleInfo(PalWindow* window) +{ + if (s_Video.initialized) { + return s_Video.backend->getWindowHandleInfo(window); } - return PAL_RESULT_INVALID_GL_FBCONFIG; } -PalResult PAL_CALL palEnumerateMonitors( - Int32* count, - PalMonitor** outMonitors) +PalResult PAL_CALL palSetWindowOpacity( + PalWindow* window, + float opacity) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!count) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - if (*count == 0 && outMonitors) { - return PAL_RESULT_INSUFFICIENT_BUFFER; + if (!(s_Video.features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW)) { + return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - return s_Video.backend->enumerateMonitors(count, outMonitors); + if (opacity < 0.0f) { + opacity = 0.0f; + } + + if (opacity > 1.0f) { + opacity = 1.0f; + } + + return s_Video.backend->setWindowOpacity(window, opacity); } -PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) +PalResult PAL_CALL palSetWindowStyle( + PalWindow* window, + PalWindowStyle style) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!outMonitor) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->getPrimaryMonitor(outMonitor); + return s_Video.backend->setWindowStyle(window, style); } -PalResult PAL_CALL palGetMonitorInfo( - PalMonitor* monitor, - PalMonitorInfo* info) +PalResult PAL_CALL palSetWindowTitle( + PalWindow* window, + const char* title) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!info) { + if (!window || !title) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->getMonitorInfo(monitor, info); + return s_Video.backend->setWindowTitle(window, title); } -PalResult PAL_CALL palEnumerateMonitorModes( - PalMonitor* monitor, - Int32* count, - PalMonitorMode* modes) +PalResult PAL_CALL palSetWindowPos( + PalWindow* window, + Int32 x, + Int32 y) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!monitor || !count) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - if (*count == 0 && modes) { - return PAL_RESULT_INSUFFICIENT_BUFFER; - } - - PalResult ret = s_Video.backend->enumerateMonitorModes( - monitor, - count, - modes - ); - - if (ret == PAL_RESULT_SUCCESS && modes) { - // sort the modes so that they are lowest to highest - qsort(modes, *count, sizeof(PalMonitorMode), compareModes); - } - - return ret; + return s_Video.backend->setWindowPos(window, x, y); } -PalResult PAL_CALL palGetCurrentMonitorMode( - PalMonitor* monitor, - PalMonitorMode* mode) +PalResult PAL_CALL palSetWindowSize( + PalWindow* window, + Uint32 width, + Uint32 height) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!monitor || !mode) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->getCurrentMonitorMode(monitor, mode); + return s_Video.backend->setWindowSize(window, width, height); } -PalResult PAL_CALL palSetMonitorMode( - PalMonitor* monitor, - PalMonitorMode* mode) +PalResult PAL_CALL palSetFocusWindow(PalWindow* window) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!monitor || !mode) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->setMonitorMode(monitor, mode); + return s_Video.backend->setFocusWindow(window); } -PalResult PAL_CALL palValidateMonitorMode( - PalMonitor* monitor, - PalMonitorMode* mode) +// ================================================== +// Icon +// ================================================== + +PalResult PAL_CALL palCreateIcon( + const PalIconCreateInfo* info, + PalIcon** outIcon) { - if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!monitor || !mode) { + if (!info || !outIcon) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->validateMonitorMode(monitor, mode); + return s_Video.backend->createIcon(info, outIcon); } -PalResult PAL_CALL palSetMonitorOrientation( - PalMonitor* monitor, - PalOrientation orientation) +void PAL_CALL palDestroyIcon(PalIcon* icon) +{ + if (s_Video.initialized && icon) { + s_Video.backend->destroyIcon(icon); + } +} + +PalResult PAL_CALL palSetWindowIcon( + PalWindow* window, + PalIcon* icon) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!monitor) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->setMonitorOrientation(monitor, orientation); + return s_Video.backend->setWindowIcon(window, icon); } // ================================================== -// Window +// Cursor // ================================================== -PalResult PAL_CALL palCreateWindow( - const PalWindowCreateInfo* info, - PalWindow** outWindow) +PalResult PAL_CALL palCreateCursor( + const PalCursorCreateInfo* info, + PalCursor** outCursor) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!info || !outWindow) { + if (!info || !outCursor) { return PAL_RESULT_NULL_POINTER; } - if (info->style & PAL_WINDOW_STYLE_NO_MINIMIZEBOX) { - return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + return s_Video.backend->createCursor(info, outCursor); +} + +PalResult PAL_CALL palCreateCursorFrom( + PalCursorType type, + PalCursor** outCursor) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (info->style & PAL_WINDOW_STYLE_NO_MAXIMIZEBOX) { - return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; + if (!outCursor) { + return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->createWindow(info,outWindow); + return s_Video.backend->createCursorFrom(type, outCursor); } -void PAL_CALL palDestroyWindow(PalWindow* window) +void PAL_CALL palDestroyCursor(PalCursor* cursor) { - if (s_Video.initialized && window) { - return s_Video.backend->destroyWindow(window); + if (s_Video.initialized && cursor) { + s_Video.backend->destroyCursor(cursor); } } -PalResult PAL_CALL palSetWindowOpacity( +void PAL_CALL palShowCursor(bool show) +{ + if (s_Video.initialized) { + s_Video.backend->showCursor(show); + } +} + +PalResult PAL_CALL palClipCursor( PalWindow* window, - float opacity) + bool clip) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; @@ -2557,46 +4020,44 @@ PalResult PAL_CALL palSetWindowOpacity( return PAL_RESULT_NULL_POINTER; } - if (!(s_Video.features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW)) { - return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; - } + return s_Video.backend->clipCursor(window, clip); +} - if (opacity < 0.0f) { - opacity = 0.0f; +PalResult PAL_CALL palGetCursorPos( + PalWindow* window, + Int32* x, + Int32* y) +{ + if (!s_Video.initialized) { + return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (opacity > 1.0f) { - opacity = 1.0f; + if (!window) { + return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->setWindowOpacity(window, opacity); + return s_Video.backend->getCursorPos(window, x, y); } -PalResult PAL_CALL palCreateIcon( - const PalIconCreateInfo* info, - PalIcon** outIcon) +PalResult PAL_CALL palSetCursorPos( + PalWindow* window, + Int32 x, + Int32 y) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (!info || !outIcon) { + if (!window) { return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->createIcon(info, outIcon); -} - -void PAL_CALL palDestroyIcon(PalIcon* icon) -{ - if (s_Video.initialized && icon) { - s_Video.backend->destroyIcon(icon); - } + return s_Video.backend->setCursorPos(window, x, y); } -PalResult PAL_CALL palSetWindowIcon( +PalResult PAL_CALL palSetWindowCursor( PalWindow* window, - PalIcon* icon) + PalCursor* cursor) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; @@ -2606,5 +4067,5 @@ PalResult PAL_CALL palSetWindowIcon( return PAL_RESULT_NULL_POINTER; } - return s_Video.backend->setWindowIcon(window, icon); + return s_Video.backend->setWindowCursor(window, cursor); } \ No newline at end of file diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 4e41284..38bff62 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -2686,7 +2686,7 @@ PalResult PAL_CALL palCreateIcon( ICONINFO iconInfo = {0}; iconInfo.fIcon = TRUE; - iconInfo.hbmMask = mask; + iconInfo.hbmMask = mask; // TODO: set to nullptr to respect alpha iconInfo.hbmColor = bitmap; // create the icon with the icon info @@ -2787,7 +2787,7 @@ PalResult PAL_CALL palCreateCursor( ICONINFO iconInfo = {0}; iconInfo.fIcon = false; iconInfo.hbmColor = bitmap; - iconInfo.hbmMask = mask; + iconInfo.hbmMask = mask; // TODO: set to nullptr to respect alpha iconInfo.xHotspot = info->xHotspot; iconInfo.xHotspot = info->yHotspot; diff --git a/tests/cursor_test.c b/tests/cursor_test.c index dc36e0c..f660f5e 100644 --- a/tests/cursor_test.c +++ b/tests/cursor_test.c @@ -56,13 +56,13 @@ bool cursorTest() pixels[i + 0] = 255; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 0; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } else { pixels[i + 0] = 0; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 255; // Blue bit - pixels[i + 3] = 0; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } } } diff --git a/tests/tests.lua b/tests/tests.lua index f89f130..72dd1a2 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -37,9 +37,9 @@ project "tests" "monitor_mode_test.c", "window_test.c", "icon_test.c", - -- "cursor_test.c", + "cursor_test.c", -- "input_window_test.c", - -- "system_cursor_test.c" + "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index 2e21cb2..85127c8 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -29,11 +29,11 @@ int main(int argc, char** argv) // registerTest("Video Test", videoTest); // registerTest("Monitor Test", monitorTest); // registerTest("Monitor Mode Test", monitorModeTest); - registerTest("Window Test", windowTest); - registerTest("Icon Test", iconTest); + // registerTest("Window Test", windowTest); + // registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); // registerTest("Input Window Test", inputWindowTest); - // registerTest("System Cursor Test", systemCursorTest); + registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL From 2b31e273b89932a8ee4f8ab446325d24fcb1e21a Mon Sep 17 00:00:00 2001 From: nichcode Date: Mon, 13 Oct 2025 18:20:10 +0000 Subject: [PATCH 21/30] mouse window --- src/video/pal_video_linux.c | 171 +++++++++++++++++++++++++++++++++--- src/video/pal_video_win32.c | 5 +- tests/tests.lua | 2 +- tests/tests_main.c | 4 +- 4 files changed, 167 insertions(+), 15 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 6600e8a..c58cfc3 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -78,6 +78,23 @@ typedef struct { PalMonitor* monitor; } MonitorData; +typedef struct { + Int32 lastX; + Int32 lastY; + Int32 dx; + Int32 dy; + Int32 WheelX; + Int32 WheelY; + bool state[PAL_MOUSE_BUTTON_MAX]; +} Mouse; + +typedef struct { + bool scancodeState[PAL_SCANCODE_MAX]; + bool keycodeState[PAL_KEYCODE_MAX]; + PalScancode scancodes[512]; + PalKeycode keycodes[256]; +} Keyboard; + // ================================================== // X11 Typedefs, enums and structs // ================================================== @@ -631,6 +648,8 @@ typedef struct { } VideoLinux; static VideoLinux s_Video = {0}; +static Mouse s_Mouse = {0}; +static Keyboard s_Keyboard = {0}; // ================================================== // Internal API @@ -1382,6 +1401,7 @@ static void xShutdownVideo() s_X11.closeDisplay(s_X11.display); dlclose(s_X11.handle); dlclose(s_X11.xrandr); + dlclose(s_X11.libCursor); if (s_X11.opengl) { dlclose(s_X11.opengl); } @@ -1628,6 +1648,113 @@ static void xUpdateVideo() } } } + + case MotionNotify: { + // mouse moved + const int x = event.xmotion.x; + const int y = event.xmotion.y; + const int dx = x - s_Mouse.lastX; + const int dy = y - s_Mouse.lastY; + + if (s_Video.eventDriver) { + PalEventDriver* driver = s_Video.eventDriver; + PalEventType type = PAL_EVENT_MOUSE_MOVE; + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackInt32(x, y); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + + // push a mouse delta event + type = PAL_EVENT_MOUSE_DELTA; + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackInt32(dx, dy); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + + s_Mouse.lastX = x; + s_Mouse.lastY = y; + s_Mouse.dx = dx; + s_Mouse.dy = dy; + return; + } + + case ButtonPress: + case ButtonRelease: { + int xButton = event.xbutton.button; + bool pressed = (event.xbutton.type == ButtonPress); + PalMouseButton button = 0; + PalEventType type; + + if (xButton == 1) { + button = PAL_MOUSE_BUTTON_LEFT; + } else if (xButton == 3) { + button = PAL_MOUSE_BUTTON_RIGHT; + } else if (xButton == 2) { + button = PAL_MOUSE_BUTTON_MIDDLE; + } + + s_Mouse.state[button] = pressed; + if (s_Video.eventDriver && button != 0) { + PalEventDriver* driver = s_Video.eventDriver; + if (pressed) { + type = PAL_EVENT_MOUSE_BUTTONDOWN; + } else { + type = PAL_EVENT_MOUSE_BUTTONUP; + } + + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = button; + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + + int scrollX = 0; + int scrollY = 0; + if (xButton == 4) { + // scroll up + scrollY = 1; + } else if (xButton == 5) { + // scroll down + scrollY = -1; + } else if (xButton == 6) { + // scroll left + scrollX = -1; + } else if (xButton == 7) { + // scroll right + scrollX = 1; + } + + s_Mouse.WheelX = scrollX; + s_Mouse.WheelY = scrollY; + if (s_Video.eventDriver && (scrollX || scrollY)) { + PalEventDriver* driver = s_Video.eventDriver; + mode = palGetEventDispatchMode( + driver, + PAL_EVENT_MOUSE_WHEEL); + + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = PAL_EVENT_MOUSE_WHEEL; + event.data = palPackInt32(scrollX, scrollY); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + return; + } } } @@ -3756,36 +3883,60 @@ PalResult PAL_CALL palGetWindowState( const bool* PAL_CALL palGetKeycodeState() { - // TODO: implement - return nullptr; + if (!s_Video.initialized) { + return nullptr; + } + return s_Keyboard.keycodeState; } const bool* PAL_CALL palGetScancodeState() { - // TODO: implement - return nullptr; + if (!s_Video.initialized) { + return nullptr; + } + return s_Keyboard.scancodeState; } const bool* PAL_CALL palGetMouseState() { - // TODO: implement - return nullptr; + if (!s_Video.initialized) { + return nullptr; + } + return s_Mouse.state; } void PAL_CALL palGetMouseDelta( Int32* dx, Int32* dy) { - // TODO: implement - return; + if (!s_Video.initialized) { + return; + } + + if (dx) { + *dx = s_Mouse.dx; + } + + if (dy) { + *dy = s_Mouse.dy; + } } void PAL_CALL palGetMouseWheelDelta( Int32* dx, Int32* dy) { - // TODO: implement - return; + if (!s_Video.initialized) { + return; + } + + if (dx) { + *dx = s_Mouse.WheelX; + } + + if (dy) { + *dy = s_Mouse.WheelY; + } } bool PAL_CALL palIsWindowVisible(PalWindow* window) diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 38bff62..f7e149f 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -396,7 +396,7 @@ LRESULT CALLBACK videoProc( case WM_MOUSEHWHEEL: { Int32 delta = GET_WHEEL_DELTA_WPARAM(wParam); - s_Mouse.WheelX = delta; + s_Mouse.WheelX = delta; // normalize with delta if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; @@ -414,7 +414,7 @@ LRESULT CALLBACK videoProc( case WM_MOUSEWHEEL: { Int32 delta = GET_WHEEL_DELTA_WPARAM(wParam); - s_Mouse.WheelY = delta; + s_Mouse.WheelY = delta; // normalize with delta if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; @@ -537,6 +537,7 @@ LRESULT CALLBACK videoProc( ReleaseCapture(); } + // TODO: optimaize s_Mouse.state[button] = pressed; if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; diff --git a/tests/tests.lua b/tests/tests.lua index 72dd1a2..dc369d8 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -38,7 +38,7 @@ project "tests" "window_test.c", "icon_test.c", "cursor_test.c", - -- "input_window_test.c", + "input_window_test.c", "system_cursor_test.c" } end diff --git a/tests/tests_main.c b/tests/tests_main.c index 85127c8..428218b 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -32,8 +32,8 @@ int main(int argc, char** argv) // registerTest("Window Test", windowTest); // registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); - // registerTest("Input Window Test", inputWindowTest); - registerTest("System Cursor Test", systemCursorTest); + registerTest("Input Window Test", inputWindowTest); + // registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL From 034e69c1c322ccadf4cfbc8670492c44dd38580a Mon Sep 17 00:00:00 2001 From: nichcode Date: Tue, 14 Oct 2025 16:53:07 +0000 Subject: [PATCH 22/30] X11 video --- src/video/pal_video_linux.c | 334 +++++++++++++++++++++++++++++++++++- src/video/pal_video_win32.c | 4 +- 2 files changed, 332 insertions(+), 6 deletions(-) diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index c58cfc3..7a70df3 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -40,6 +40,7 @@ freely, subject to the following restrictions: #include #include #include +#include #include // Wayland headers @@ -91,8 +92,8 @@ typedef struct { typedef struct { bool scancodeState[PAL_SCANCODE_MAX]; bool keycodeState[PAL_KEYCODE_MAX]; - PalScancode scancodes[512]; - PalKeycode keycodes[256]; + int scancodes[512]; + int keycodes[256]; } Keyboard; // ================================================== @@ -234,6 +235,12 @@ typedef int (*XSetWMNormalHintsFn)( Window, XSizeHints*); +typedef int (*XGetWMNormalHintsFn)( + Display*, + Window, + XSizeHints*, + long*); + typedef int (*XSendEventFn)( Display*, Window, @@ -460,6 +467,15 @@ typedef XcursorImage* (*XcursorImageCreateFn)( typedef void (*XcursorImageDestroyFn)(XcursorImage*); +typedef KeySym (*XLookupKeysymFn)( + XKeyEvent*, + int); + +typedef int (*XkbSetDetectableAutoRepeatFn)( + Display*, + int, + int*); + typedef struct { bool unicodeTitle; @@ -524,6 +540,7 @@ typedef struct { XSetWMProtocolsFn setWMProtocols; XNextEventFn nextEvent; XSetWMNormalHintsFn setWMNormalHints; + XGetWMNormalHintsFn getWMNormalHints; XSendEventFn sendEvent; XMoveWindowFn moveWindow; XResizeWindowFn resizeWindow; @@ -576,6 +593,9 @@ typedef struct { XcursorImageLoadCursorFn cursorImageLoadCursor; XcursorImageCreateFn cursorImageCreate; XcursorImageDestroyFn cursorImageDestroy; + XLookupKeysymFn lookupKeysym; + + XkbSetDetectableAutoRepeatFn setDetectableAutoRepeat; } X11; static X11 s_X11 = {0}; @@ -1054,7 +1074,190 @@ static void xSendWMEvent( False, SubstructureNotifyMask | SubstructureRedirectMask, &e); +} +static void xCreateScancodeTable() +{ + // Letters + s_Keyboard.scancodes[30] = PAL_SCANCODE_A; + s_Keyboard.scancodes[48] = PAL_SCANCODE_B; + s_Keyboard.scancodes[46] = PAL_SCANCODE_C; + s_Keyboard.scancodes[32] = PAL_SCANCODE_D; + s_Keyboard.scancodes[18] = PAL_SCANCODE_E; + s_Keyboard.scancodes[33] = PAL_SCANCODE_F; + s_Keyboard.scancodes[34] = PAL_SCANCODE_G; + s_Keyboard.scancodes[35] = PAL_SCANCODE_H; + s_Keyboard.scancodes[23] = PAL_SCANCODE_I; + s_Keyboard.scancodes[36] = PAL_SCANCODE_J; + s_Keyboard.scancodes[37] = PAL_SCANCODE_K; + s_Keyboard.scancodes[38] = PAL_SCANCODE_L; + s_Keyboard.scancodes[50] = PAL_SCANCODE_M; + s_Keyboard.scancodes[49] = PAL_SCANCODE_N; + s_Keyboard.scancodes[24] = PAL_SCANCODE_O; + s_Keyboard.scancodes[25] = PAL_SCANCODE_P; + s_Keyboard.scancodes[16] = PAL_SCANCODE_Q; + s_Keyboard.scancodes[19] = PAL_SCANCODE_R; + s_Keyboard.scancodes[31] = PAL_SCANCODE_S; + s_Keyboard.scancodes[20] = PAL_SCANCODE_T; + s_Keyboard.scancodes[22] = PAL_SCANCODE_U; + s_Keyboard.scancodes[47] = PAL_SCANCODE_V; + s_Keyboard.scancodes[17] = PAL_SCANCODE_W; + s_Keyboard.scancodes[45] = PAL_SCANCODE_X; + s_Keyboard.scancodes[21] = PAL_SCANCODE_Y; + s_Keyboard.scancodes[44] = PAL_SCANCODE_Z; + + // Numbers (top row) + s_Keyboard.scancodes[11] = PAL_SCANCODE_0; + s_Keyboard.scancodes[2] = PAL_SCANCODE_1; + s_Keyboard.scancodes[3] = PAL_SCANCODE_2; + s_Keyboard.scancodes[4] = PAL_SCANCODE_3; + s_Keyboard.scancodes[5] = PAL_SCANCODE_4; + s_Keyboard.scancodes[6] = PAL_SCANCODE_5; + s_Keyboard.scancodes[7] = PAL_SCANCODE_6; + s_Keyboard.scancodes[8] = PAL_SCANCODE_7; + s_Keyboard.scancodes[9] = PAL_SCANCODE_8; + s_Keyboard.scancodes[10] = PAL_SCANCODE_9; + + // Function + s_Keyboard.scancodes[59] = PAL_SCANCODE_F1; + s_Keyboard.scancodes[60] = PAL_SCANCODE_F2; + s_Keyboard.scancodes[61] = PAL_SCANCODE_F3; + s_Keyboard.scancodes[62] = PAL_SCANCODE_F4; + s_Keyboard.scancodes[63] = PAL_SCANCODE_F5; + s_Keyboard.scancodes[64] = PAL_SCANCODE_F6; + s_Keyboard.scancodes[65] = PAL_SCANCODE_F7; + s_Keyboard.scancodes[66] = PAL_SCANCODE_F8; + s_Keyboard.scancodes[67] = PAL_SCANCODE_F9; + s_Keyboard.scancodes[68] = PAL_SCANCODE_F10; + s_Keyboard.scancodes[87] = PAL_SCANCODE_F11; + s_Keyboard.scancodes[88] = PAL_SCANCODE_F12; + + // Control + s_Keyboard.scancodes[1] = PAL_SCANCODE_ESCAPE; + s_Keyboard.scancodes[28] = PAL_SCANCODE_ENTER; + s_Keyboard.scancodes[15] = PAL_SCANCODE_TAB; + s_Keyboard.scancodes[14] = PAL_SCANCODE_BACKSPACE; + s_Keyboard.scancodes[57] = PAL_SCANCODE_SPACE; + s_Keyboard.scancodes[58] = PAL_SCANCODE_CAPSLOCK; + s_Keyboard.scancodes[69] = PAL_SCANCODE_NUMLOCK; + s_Keyboard.scancodes[70] = PAL_SCANCODE_SCROLLLOCK; + s_Keyboard.scancodes[42] = PAL_SCANCODE_LSHIFT; + s_Keyboard.scancodes[54] = PAL_SCANCODE_RSHIFT; + s_Keyboard.scancodes[29] = PAL_SCANCODE_LCTRL; + s_Keyboard.scancodes[97] = PAL_SCANCODE_RCTRL; + s_Keyboard.scancodes[56] = PAL_SCANCODE_LALT; + s_Keyboard.scancodes[100] = PAL_SCANCODE_RALT; + + // Arrows + s_Keyboard.scancodes[105] = PAL_SCANCODE_LEFT; + s_Keyboard.scancodes[106] = PAL_SCANCODE_RIGHT; + s_Keyboard.scancodes[103] = PAL_SCANCODE_UP; + s_Keyboard.scancodes[108] = PAL_SCANCODE_DOWN; + + // Navigation + s_Keyboard.scancodes[110] = PAL_SCANCODE_INSERT; + s_Keyboard.scancodes[111] = PAL_SCANCODE_DELETE; + s_Keyboard.scancodes[102] = PAL_SCANCODE_HOME; + s_Keyboard.scancodes[107] = PAL_SCANCODE_END; + s_Keyboard.scancodes[104] = PAL_SCANCODE_PAGEUP; + s_Keyboard.scancodes[109] = PAL_SCANCODE_PAGEDOWN; + + // Keypad + s_Keyboard.scancodes[82] = PAL_SCANCODE_KP_0; + s_Keyboard.scancodes[79] = PAL_SCANCODE_KP_1; + s_Keyboard.scancodes[80] = PAL_SCANCODE_KP_2; + s_Keyboard.scancodes[81] = PAL_SCANCODE_KP_3; + s_Keyboard.scancodes[75] = PAL_SCANCODE_KP_4; + s_Keyboard.scancodes[76] = PAL_SCANCODE_KP_5; + s_Keyboard.scancodes[77] = PAL_SCANCODE_KP_6; + s_Keyboard.scancodes[71] = PAL_SCANCODE_KP_7; + s_Keyboard.scancodes[72] = PAL_SCANCODE_KP_8; + s_Keyboard.scancodes[73] = PAL_SCANCODE_KP_9; + s_Keyboard.scancodes[96] = PAL_SCANCODE_KP_ENTER; + s_Keyboard.scancodes[78] = PAL_SCANCODE_KP_ADD; + s_Keyboard.scancodes[74] = PAL_SCANCODE_KP_SUBTRACT; + s_Keyboard.scancodes[55] = PAL_SCANCODE_KP_MULTIPLY; + s_Keyboard.scancodes[98] = PAL_SCANCODE_KP_DIVIDE; + s_Keyboard.scancodes[83] = PAL_SCANCODE_KP_DECIMAL; + + // Misc + s_Keyboard.scancodes[99] = PAL_SCANCODE_PRINTSCREEN; + s_Keyboard.scancodes[102] = PAL_SCANCODE_PAUSE; + s_Keyboard.scancodes[127] = PAL_SCANCODE_MENU; + s_Keyboard.scancodes[40] = PAL_SCANCODE_APOSTROPHE; + s_Keyboard.scancodes[43] = PAL_SCANCODE_BACKSLASH; + s_Keyboard.scancodes[51] = PAL_SCANCODE_COMMA; + s_Keyboard.scancodes[13] = PAL_SCANCODE_EQUAL; + s_Keyboard.scancodes[41] = PAL_SCANCODE_GRAVEACCENT; + s_Keyboard.scancodes[12] = PAL_SCANCODE_SUBTRACT; + s_Keyboard.scancodes[52] = PAL_SCANCODE_PERIOD; + s_Keyboard.scancodes[39] = PAL_SCANCODE_SEMICOLON; + s_Keyboard.scancodes[53] = PAL_SCANCODE_SLASH; + s_Keyboard.scancodes[26] = PAL_SCANCODE_LBRACKET; + s_Keyboard.scancodes[27] = PAL_SCANCODE_RBRACKET; + s_Keyboard.scancodes[125] = PAL_SCANCODE_LSUPER; + s_Keyboard.scancodes[126] = PAL_SCANCODE_RSUPER; +} + +static void xCreateKeycodeTable() +{ + // Tis is for only printable and text input keys + + // Letters + s_Keyboard.keycodes[XK_a] = PAL_KEYCODE_A; + s_Keyboard.keycodes[XK_b] = PAL_KEYCODE_B; + s_Keyboard.keycodes[XK_c] = PAL_KEYCODE_C; + s_Keyboard.keycodes[XK_d] = PAL_KEYCODE_D; + s_Keyboard.keycodes[XK_e] = PAL_KEYCODE_E; + s_Keyboard.keycodes[XK_f] = PAL_KEYCODE_F; + s_Keyboard.keycodes[XK_g] = PAL_KEYCODE_G; + s_Keyboard.keycodes[XK_h] = PAL_KEYCODE_H; + s_Keyboard.keycodes[XK_i] = PAL_KEYCODE_I; + s_Keyboard.keycodes[XK_j] = PAL_KEYCODE_J; + s_Keyboard.keycodes[XK_k] = PAL_KEYCODE_K; + s_Keyboard.keycodes[XK_l] = PAL_KEYCODE_L; + s_Keyboard.keycodes[XK_m] = PAL_KEYCODE_M; + s_Keyboard.keycodes[XK_n] = PAL_KEYCODE_N; + s_Keyboard.keycodes[XK_o] = PAL_KEYCODE_O; + s_Keyboard.keycodes[XK_p] = PAL_KEYCODE_P; + s_Keyboard.keycodes[XK_q] = PAL_KEYCODE_Q; + s_Keyboard.keycodes[XK_r] = PAL_KEYCODE_R; + s_Keyboard.keycodes[XK_s] = PAL_KEYCODE_S; + s_Keyboard.keycodes[XK_t] = PAL_KEYCODE_T; + s_Keyboard.keycodes[XK_u] = PAL_KEYCODE_U; + s_Keyboard.keycodes[XK_v] = PAL_KEYCODE_V; + s_Keyboard.keycodes[XK_w] = PAL_KEYCODE_W; + s_Keyboard.keycodes[XK_x] = PAL_KEYCODE_X; + s_Keyboard.keycodes[XK_y] = PAL_KEYCODE_Y; + s_Keyboard.keycodes[XK_z] = PAL_KEYCODE_Z; + + // Numbers (top row) + s_Keyboard.keycodes[XK_0] = PAL_KEYCODE_0; + s_Keyboard.keycodes[XK_1] = PAL_KEYCODE_1; + s_Keyboard.keycodes[XK_2] = PAL_KEYCODE_2; + s_Keyboard.keycodes[XK_3] = PAL_KEYCODE_3; + s_Keyboard.keycodes[XK_4] = PAL_KEYCODE_4; + s_Keyboard.keycodes[XK_5] = PAL_KEYCODE_5; + s_Keyboard.keycodes[XK_6] = PAL_KEYCODE_6; + s_Keyboard.keycodes[XK_7] = PAL_KEYCODE_7; + s_Keyboard.keycodes[XK_8] = PAL_KEYCODE_8; + s_Keyboard.keycodes[XK_9] = PAL_KEYCODE_9; + + // Control + s_Keyboard.keycodes[XK_space] = PAL_KEYCODE_SPACE; + + // Misc + s_Keyboard.keycodes[XK_apostrophe] = PAL_KEYCODE_APOSTROPHE; + s_Keyboard.keycodes[XK_backslash] = PAL_KEYCODE_BACKSLASH; + s_Keyboard.keycodes[XK_comma] = PAL_KEYCODE_COMMA; + s_Keyboard.keycodes[XK_equal] = PAL_KEYCODE_EQUAL; + s_Keyboard.keycodes[XK_grave] = PAL_KEYCODE_GRAVEACCENT; + s_Keyboard.keycodes[XK_minus] = PAL_KEYCODE_SUBTRACT; + s_Keyboard.keycodes[XK_period] = PAL_KEYCODE_PERIOD; + s_Keyboard.keycodes[XK_semicolon] = PAL_KEYCODE_SEMICOLON; + s_Keyboard.keycodes[XK_slash] = PAL_KEYCODE_SLASH; + s_Keyboard.keycodes[XK_bracketleft] = PAL_KEYCODE_LBRACKET; + s_Keyboard.keycodes[XK_bracketright] = PAL_KEYCODE_RBRACKET; } static PalResult xInitVideo() @@ -1071,6 +1274,7 @@ static PalResult xInitVideo() return PAL_RESULT_PLATFORM_FAILURE; } + // Xrandr is needed s_X11.xrandr = dlopen("libXrandr.so.2", RTLD_LAZY); if (!s_X11.xrandr) { s_X11.xrandr = dlopen("libXrandr.so", RTLD_LAZY); @@ -1161,6 +1365,10 @@ static PalResult xInitVideo() s_X11.handle, "XSetWMNormalHints"); + s_X11.getWMNormalHints = (XGetWMNormalHintsFn)dlsym( + s_X11.handle, + "XGetWMNormalHints"); + s_X11.sendEvent = (XSendEventFn)dlsym( s_X11.handle, "XSendEvent"); @@ -1331,6 +1539,14 @@ static PalResult xInitVideo() s_X11.libCursor, "XcursorImageDestroy"); + s_X11.lookupKeysym = (XLookupKeysymFn)dlsym( + s_X11.libCursor, + "XLookupKeysym"); + + s_X11.setDetectableAutoRepeat = (XkbSetDetectableAutoRepeatFn)dlsym( + s_X11.handle, + "XkbSetDetectableAutoRepeat"); + // X11 server s_X11.display = s_X11.openDisplay(nullptr); if (!s_X11.display) { @@ -1392,6 +1608,16 @@ static PalResult xInitVideo() 0); s_X11.freePixmap(s_X11.display, map); + xCreateScancodeTable(); + xCreateKeycodeTable(); + + // disable auto key repeats + int supported; + s_X11.setDetectableAutoRepeat(s_X11.display, True, &supported); + if (!supported) { + // TODO: FIXME + // fallback to manual key repeat detection + } return PAL_RESULT_SUCCESS; } @@ -1755,6 +1981,79 @@ static void xUpdateVideo() } return; } + + case KeyPress: + case KeyRelease: { + int xScancode = event.xkey.keycode; + bool pressed = (event.xbutton.type == KeyPress); + PalScancode scancode = PAL_SCANCODE_UNKNOWN; + PalKeycode keycode = PAL_KEYCODE_UNKNOWN; + PalEventType type; + KeySym keySym = s_X11.lookupKeysym(&event.xkey, 0); + + // special handling for Pause/break with Home + if (xScancode == 110) { + if (keySym == XK_Pause) { + scancode = PAL_SCANCODE_PAUSE; + } else { + scancode = PAL_SCANCODE_HOME; + } + + } else { + int index = xScancode - 8; + scancode = s_Keyboard.scancodes[index]; + } + + // printable and text input keys are from the range + // 39 (PAL_KEYCODE_APOSTROPHE) and 122 (PAL_KEYCODE_Z) + // The rest are almost the same as their scancode + // Maybe there will be a layout that makes this wrong + // but for now this works + if (keySym >= XK_apostrophe && keySym <= XK_z) { + // a printable or input key + keycode = s_Keyboard.keycodes[keySym]; + + } else { + // Since PalKeycode and PalScancode have the same integers + // we can make a direct cast without a table + // Examle: PAL_KEYCODE_A(int 0) == PAL_SCANCODE_A(int 0) + keycode = (PalKeycode)(Uint32)scancode; + } + + // If we got a keySym but its not mapped into our keycode array + // we do a direct cast as well + if (keycode == PAL_KEYCODE_UNKNOWN) { + keycode = (PalKeycode)(Uint32)scancode; + } + + // update our keyboard and mouse state to handle key repeat + bool repeat = s_Keyboard.keycodeState[keycode]; + s_Keyboard.scancodeState[scancode] = pressed; + s_Keyboard.keycodeState[keycode] = pressed; + + if (pressed) { + if (repeat) { + type = PAL_EVENT_KEYREPEAT; + } else { + type = PAL_EVENT_KEYDOWN; + } + } else { + type = PAL_EVENT_KEYUP; + } + + if (s_Video.eventDriver) { + PalEventDriver* driver = s_Video.eventDriver; + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackUint32(keycode, scancode); + event.data2 = palPackPointer(window); + palPushEvent(driver, &event); + } + } + return; + } } } @@ -2496,7 +2795,8 @@ static PalResult xCreateWindow( // resizable if (!(info->style & PAL_WINDOW_STYLE_RESIZABLE)) { - wmHints.flags = PMinSize | PMaxSize; + wmHints.flags |= PMinSize; + wmHints.flags |= PMaxSize; wmHints.min_width = wmHints.max_width = info->width; wmHints.min_height = wmHints.max_height = info->height; } @@ -3038,6 +3338,7 @@ PalResult xSetWindowTitle( s_X11.storeName(s_X11.display, xWin, title); } + s_X11.flush(s_X11.display); return PAL_RESULT_SUCCESS; } @@ -3053,6 +3354,7 @@ PalResult xSetWindowPos( } s_X11.moveWindow(s_X11.display, xWin, x, y); + s_X11.flush(s_X11.display); return PAL_RESULT_SUCCESS; } @@ -3067,7 +3369,31 @@ PalResult xSetWindowSize( return PAL_RESULT_INVALID_WINDOW; } - s_X11.resizeWindow(s_X11.display, xWin, width, height); + // X11 does not allow users resize programaticaly + // if the window is not resizable. + // so we hack it by making the window resizable and resizing + // then revert back. + XSizeHints hints; + long tmp; + s_X11.getWMNormalHints(s_X11.display, xWin, &hints, &tmp); + if ((hints.flags & PMinSize) && (hints.flags & PMaxSize)) { + hints.flags &= ~PMinSize; + hints.flags &= ~PMaxSize; + s_X11.resizeWindow(s_X11.display, xWin, width, height); + s_X11.flush(s_X11.display); + + // revert + hints.flags |= PMinSize; + hints.flags |= PMaxSize; + hints.min_width = hints.max_width = width; + hints.min_height = hints.max_height = height; + + } else { + // window is already resizable + s_X11.resizeWindow(s_X11.display, xWin, width, height); + } + + s_X11.flush(s_X11.display); return PAL_RESULT_SUCCESS; } diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index f7e149f..e197d13 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -140,8 +140,8 @@ typedef struct { typedef struct { bool scancodeState[PAL_SCANCODE_MAX]; bool keycodeState[PAL_KEYCODE_MAX]; - PalScancode scancodes[512]; - PalKeycode keycodes[256]; + int scancodes[512]; + int keycodes[256]; } Keyboard; typedef struct { From 87e5a38babc3851d43aaafaa69f093a9afa4f6a7 Mon Sep 17 00:00:00 2001 From: nichcode Date: Tue, 14 Oct 2025 18:01:32 +0000 Subject: [PATCH 23/30] add opengl system X11 --- include/pal/pal_config.h | 2 +- pal.lua | 26 +++ pal_config.lua | 2 +- src/opengl/pal_opengl_linux.c | 392 ++++++++++++++++++++++++++++++++++ src/opengl/pal_opengl_win32.c | 48 +++-- src/video/pal_video_linux.c | 1 + tests/tests_main.c | 6 +- 7 files changed, 459 insertions(+), 18 deletions(-) create mode 100644 src/opengl/pal_opengl_linux.c diff --git a/include/pal/pal_config.h b/include/pal/pal_config.h index ebe01c8..65d5ee9 100644 --- a/include/pal/pal_config.h +++ b/include/pal/pal_config.h @@ -5,4 +5,4 @@ #define PAL_HAS_SYSTEM 1 #define PAL_HAS_THREAD 1 #define PAL_HAS_VIDEO 1 -#define PAL_HAS_OPENGL 0 +#define PAL_HAS_OPENGL 1 diff --git a/pal.lua b/pal.lua index bf2b63d..1e96872 100644 --- a/pal.lua +++ b/pal.lua @@ -113,6 +113,32 @@ project "PAL" if (PAL_BUILD_OPENGL) then filter {"system:windows", "configurations:*"} files { "src/opengl/pal_opengl_win32.c" } + + filter {"system:linux", "configurations:*"} + files { "src/opengl/pal_opengl_linux.c" } + + -- check for wayland support. This is cross compiler + local paths = { + "/usr/include/wayland-client.h", + "/usr/include/x86_64-linux-gnu/wayland-client.h" + } + + local found = false + for _, path in ipairs(paths) do + local file = io.open(path, "r") + if file then + file:close() + found = true + break + end + end + + if found then + defines { "PAL_HAS_WAYLAND=1" } + else + defines { "PAL_HAS_WAYLAND=0" } + end + filter {} end diff --git a/pal_config.lua b/pal_config.lua index c50620d..a912de3 100644 --- a/pal_config.lua +++ b/pal_config.lua @@ -15,4 +15,4 @@ PAL_BUILD_THREAD = true PAL_BUILD_VIDEO = true -- build opengl module -PAL_BUILD_OPENGL = false \ No newline at end of file +PAL_BUILD_OPENGL = true \ No newline at end of file diff --git a/src/opengl/pal_opengl_linux.c b/src/opengl/pal_opengl_linux.c new file mode 100644 index 0000000..b472bb7 --- /dev/null +++ b/src/opengl/pal_opengl_linux.c @@ -0,0 +1,392 @@ + +/** + +Copyright (C) 2025 Nicholas Agbo + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + */ + +// ================================================== +// Includes +// ================================================== + +#include "pal/pal_opengl.h" + +#include +#include +#include + +// X11 headers +#include + +// ================================================== +// Typedefs, enums and structs +// ================================================== + +typedef struct { + void (*shutdownGL)(); + PalResult (*enumerateGLFBConfigs)(PalGLWindow*, Int32*, PalGLFBConfig*); + PalResult (*createGLContext)(const PalGLContextCreateInfo*, PalGLContext**); + void (*destroyGLContext)(PalGLContext*); + PalResult (*makeContextCurrent)(PalGLWindow*, PalGLContext*); + void* (*getProcAddress)(const char*); + PalResult (*swapBuffers)(PalGLWindow*, PalGLContext*); + PalResult (*setSwapInterval)(Int32); +} backend; + +typedef struct { + bool initialized; + const PalAllocator* allocator; + const backend* backend; + PalGLInfo info; +} GLLinux; + +static GLLinux s_GL = {0}; + +// ================================================== +// X11 Typedefs, enums and structs +// ================================================== + +typedef struct { + int screen; + Display* display; + Window window; + // dummy context + PalGLInfo info; +} Glx; + +// ================================================== +// Internal API +// ================================================== + +// ================================================== +// X11 API +// ================================================== + +PalResult xInitGL() +{ + +} + +void xShutdownGL() +{ + +} + +PalResult xEnumerateGLFBConfigs( + PalGLWindow* glWindow, + Int32* count, + PalGLFBConfig* configs) +{ + +} + +PalResult xCreateGLContext( + const PalGLContextCreateInfo* info, + PalGLContext** outContext) +{ + +} + +void xDestroyGLContext(PalGLContext* context) +{ + +} + +PalResult xMakeContextCurrent( + PalGLWindow* glWindow, + PalGLContext* context) +{ + +} + +void* xGLGetProcAddress(const char* name) +{ + +} + +PalResult xSwapBuffers( + PalGLWindow* glWindow, + PalGLContext* context) +{ + +} + +PalResult xSetSwapInterval(Int32 interval) +{ + +} + +static backend s_Xbackend = { + .shutdownGL = xShutdownGL, + .enumerateGLFBConfigs = xEnumerateGLFBConfigs, + .createGLContext = xCreateGLContext, + .destroyGLContext = xDestroyGLContext, + .makeContextCurrent = xMakeContextCurrent, + .getProcAddress = xGLGetProcAddress, + .swapBuffers = xSwapBuffers, + .setSwapInterval = xSetSwapInterval +}; + +// ================================================== +// Public API +// ================================================== + +PalResult PAL_CALL palInitGL(const PalAllocator* allocator) +{ + if (s_GL.initialized) { + return PAL_RESULT_SUCCESS; + } + + if (allocator && (!allocator->allocate || !allocator->free)) { + return PAL_RESULT_INVALID_ALLOCATOR; + } + + // get backend type + bool x11 = true; + const char* session = getenv("XDG_SESSION_TYPE"); + if (session) { + if (strcmp(session, "wayland") == 0) { + x11 = false; + } + } + + if (x11) { + PalResult ret = xInitGL(); + if (ret != PAL_RESULT_SUCCESS) { + return ret; + } + s_GL.backend = &s_Xbackend; + } + + s_GL.allocator = allocator; + s_GL.initialized = true; + return PAL_RESULT_SUCCESS; +} + +void PAL_CALL palShutdownGL() +{ + if (s_GL.initialized) { + s_GL.backend->shutdownGL(); + s_GL.initialized = false; + } +} + +const PalGLInfo* PAL_CALL palGetGLInfo() +{ + if (!s_GL.initialized) { + return nullptr; + } + return &s_GL.info; +} + +PalResult PAL_CALL palEnumerateGLFBConfigs( + PalGLWindow* glWindow, + Int32* count, + PalGLFBConfig* configs) +{ + if (!s_GL.initialized) { + return PAL_RESULT_GL_NOT_INITIALIZED; + } + + if (!count) { + return PAL_RESULT_NULL_POINTER; + } + + if (count == 0 && configs) { + return PAL_RESULT_INSUFFICIENT_BUFFER; + } + + return s_GL.backend->enumerateGLFBConfigs(glWindow, count, configs); +} + +const PalGLFBConfig* PAL_CALL palGetClosestGLFBConfig( + PalGLFBConfig* configs, + Int32 count, + const PalGLFBConfig* desired) +{ + if (!s_GL.initialized) { + return nullptr; + } + + if (!configs || !desired) { + return nullptr; + } + + if (count == 0) { + return nullptr; + } + + Int32 score = 0; + Int32 bestScore = 0x7FFFFFFF; + PalGLFBConfig* best = nullptr; + for (Int32 i = 0; i < count; i++) { + PalGLFBConfig* tmp = &configs[i]; + + // filter out hard constraints + if (desired->doubleBuffer && !tmp->doubleBuffer) { + continue; + } + + if (desired->stereo && !tmp->stereo) { + continue; + } + + score = 0; + + // score color bits + score += abs(tmp->redBits - desired->redBits); + score += abs(tmp->greenBits - desired->greenBits); + score += abs(tmp->blueBits - desired->blueBits); + score += abs(tmp->alphaBits - desired->alphaBits); + score += abs(tmp->depthBits - desired->depthBits); + score += abs(tmp->stencilBits - desired->stencilBits); + + // score soft constraints + if (desired->samples != tmp->samples) { + score += 1000; + } + + if (desired->sRGB != tmp->sRGB) { + score += 500; + } + + if (score < bestScore) { + bestScore = score; + best = &configs[i]; + } + } + + return best; +} + +// ================================================== +// Context +// ================================================== + +PalResult PAL_CALL palCreateGLContext( + const PalGLContextCreateInfo* info, + PalGLContext** outContext) +{ + if (!s_GL.initialized) { + return PAL_RESULT_GL_NOT_INITIALIZED; + } + + if (!info || !outContext || (info && (!info->window || !info->fbConfig))) { + return PAL_RESULT_NULL_POINTER; + } + + // check support for requested features + if (info->profile != PAL_GL_PROFILE_NONE) { + if (!(s_GL.info.extensions & PAL_GL_EXTENSION_CONTEXT_PROFILE)) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + } + + if (info->forward) { + if (!(s_GL.info.extensions & PAL_GL_EXTENSION_CREATE_CONTEXT)) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + } + + if (info->reset != PAL_GL_CONTEXT_RESET_NONE) { + if (!(s_GL.info.extensions & PAL_GL_EXTENSION_ROBUSTNESS)) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + } + + if (info->noError) { + if (!(s_GL.info.extensions & PAL_GL_EXTENSION_NO_ERROR)) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + } + + if (info->release != PAL_GL_RELEASE_BEHAVIOR_NONE) { + if (!(s_GL.info.extensions & PAL_GL_EXTENSION_FLUSH_CONTROL)) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + } + + // clang-format off + + // check version + bool valid = info->major < s_GL.info.major || + (info->major == s_GL.info.major && info->minor <= s_GL.info.minor); + // clang-format on + + if (!valid) { + return PAL_RESULT_INVALID_GL_VERSION; + } + + return s_GL.backend->createGLContext(info, outContext); +} + +void PAL_CALL palDestroyGLContext(PalGLContext* context) +{ + if (s_GL.initialized && context) { + s_GL.backend->destroyGLContext(context); + } +} + +PalResult PAL_CALL palMakeContextCurrent( + PalGLWindow* glWindow, + PalGLContext* context) +{ + if (!s_GL.initialized) { + return PAL_RESULT_GL_NOT_INITIALIZED; + } + + if ((!glWindow && context) || (glWindow && !context)) { + return PAL_RESULT_NULL_POINTER; + } + + return s_GL.backend->makeContextCurrent(glWindow, context); +} + +void* PAL_CALL palGLGetProcAddress(const char* name) +{ + if (!s_GL.initialized) { + return nullptr; + } + + return s_GL.backend->getProcAddress(name); +} + +PalResult PAL_CALL palSwapBuffers( + PalGLWindow* glWindow, + PalGLContext* context) +{ + if (!s_GL.initialized) { + return PAL_RESULT_GL_NOT_INITIALIZED; + } + + if (!context || !glWindow) { + return PAL_RESULT_NULL_POINTER; + } + + return s_GL.backend->swapBuffers(glWindow, context); +} + +PalResult PAL_CALL palSetSwapInterval(Int32 interval) +{ + if (!s_GL.initialized) { + return PAL_RESULT_GL_NOT_INITIALIZED; + } + + return s_GL.backend->setSwapInterval(interval); +} \ No newline at end of file diff --git a/src/opengl/pal_opengl_win32.c b/src/opengl/pal_opengl_win32.c index 4c8ac10..6399603 100644 --- a/src/opengl/pal_opengl_win32.c +++ b/src/opengl/pal_opengl_win32.c @@ -1,4 +1,26 @@ +/** + +Copyright (C) 2025 Nicholas Agbo + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + + */ + // ================================================== // Includes // ================================================== @@ -970,6 +992,19 @@ PalResult PAL_CALL palMakeContextCurrent( return PAL_RESULT_SUCCESS; } +void* PAL_CALL palGLGetProcAddress(const char* name) +{ + if (!s_Wgl.initialized) { + return nullptr; + } + + void* proc = s_Wgl.wglGetProcAddress(name); + if (!proc) { + proc = (void*)GetProcAddress(s_Wgl.opengl, name); + } + return proc; +} + PalResult PAL_CALL palSwapBuffers( PalGLWindow* glWindow, PalGLContext* context) @@ -1002,19 +1037,6 @@ PalResult PAL_CALL palSwapBuffers( return PAL_RESULT_SUCCESS; } -void* PAL_CALL palGLGetProcAddress(const char* name) -{ - if (!s_Wgl.initialized) { - return nullptr; - } - - void* proc = s_Wgl.wglGetProcAddress(name); - if (!proc) { - proc = (void*)GetProcAddress(s_Wgl.opengl, name); - } - return proc; -} - PalResult PAL_CALL palSetSwapInterval(Int32 interval) { if (!s_Wgl.initialized) { diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 7a70df3..8e31c9a 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -3824,6 +3824,7 @@ void PAL_CALL palShutdownVideo() s_Video.backend->shutdownVideo(); palFree(s_Video.allocator, s_Video.windowData); palFree(s_Video.allocator, s_Video.monitorData); + s_Video.initialized = false; } } diff --git a/tests/tests_main.c b/tests/tests_main.c index 428218b..00d717b 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -32,7 +32,7 @@ int main(int argc, char** argv) // registerTest("Window Test", windowTest); // registerTest("Icon Test", iconTest); // registerTest("Cursor Test", cursorTest); - registerTest("Input Window Test", inputWindowTest); + // registerTest("Input Window Test", inputWindowTest); // registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO @@ -44,8 +44,8 @@ int main(int argc, char** argv) // window #if PAL_HAS_OPENGL && PAL_HAS_VIDEO registerTest("Opengl FBConfig Test", openglFBConfigTest); - registerTest("Opengl Context Test", openglContextTest); - registerTest("Opengl Multi Context Test", openglMultiContextTest); + // registerTest("Opengl Context Test", openglContextTest); + // registerTest("Opengl Multi Context Test", openglMultiContextTest); #endif // PAL_HAS_OPENGL runTests(); From 3ec590ca85319bea3cf93d2216bf24577489c8dc Mon Sep 17 00:00:00 2001 From: nichcode Date: Thu, 16 Oct 2025 18:30:34 +0000 Subject: [PATCH 24/30] opengl window x11 --- CHANGELOG.md | 11 +- include/pal/pal_core.h | 3 +- include/pal/pal_opengl.h | 2 +- include/pal/pal_system.h | 6 +- include/pal/pal_video.h | 48 +- pal.lua | 23 - src/opengl/pal_opengl_linux.c | 929 ++++++++++++++++++++++++++---- src/opengl/pal_opengl_win32.c | 36 +- src/pal_core.c | 3 + src/video/pal_video_linux.c | 312 ++++++++-- src/video/pal_video_win32.c | 14 +- tests/opengl_context_test.c | 17 +- tests/opengl_fbconfig_test.c | 34 +- tests/opengl_multi_context_test.c | 17 +- tests/tests.lua | 4 +- tests/tests_main.c | 6 +- 16 files changed, 1202 insertions(+), 263 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52386c8..314bf1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,14 @@ - **System:** Added Linux backend support. - **Video:** Added **palCreateCursorFrom()** to create system cursors. -palSetPixelFormat() +PAL_RESULT_FBCONFIG_BACKEND +PAL_VIDEO_FEATURE_SET_ICON + +PAL_PLATFORM_API_COCOA, +PAL_PLATFORM_API_ANDRIOD, +PAL_PLATFORM_API_UIKIT, +PAL_PLATFORM_API_HEADLESS +palSetFBConfig() ### Changed - **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. @@ -38,4 +45,4 @@ palSetPixelFormat() ### Notes - No API or ABI changes - existing Windows code remains compatible. - Linux video support currently targets **X11** only: **Wayland** is planned for future releases. -- Safe upgrade from **v1.0.1** - just rebuild your project after updating. \ No newline at end of file +- Safe upgrade from **v1.0.1** - just rebuild your project after updating. diff --git a/include/pal/pal_core.h b/include/pal/pal_core.h index 24a2c5e..6ccb5ad 100644 --- a/include/pal/pal_core.h +++ b/include/pal/pal_core.h @@ -236,7 +236,8 @@ typedef enum { PAL_RESULT_INVALID_GL_FBCONFIG, PAL_RESULT_INVALID_GL_VERSION, PAL_RESULT_INVALID_GL_PROFILE, - PAL_RESULT_INVALID_GL_CONTEXT + PAL_RESULT_INVALID_GL_CONTEXT, + PAL_RESULT_INVALID_BACKEND } PalResult; /** diff --git a/include/pal/pal_opengl.h b/include/pal/pal_opengl.h index 818f039..ff7b098 100644 --- a/include/pal/pal_opengl.h +++ b/include/pal/pal_opengl.h @@ -261,7 +261,7 @@ PAL_API const PalGLInfo* PAL_CALL palGetGLInfo(); * If the count is 0 and the PalGLFBConfigs array is nullptr, the function fails * and returns `PAL_RESULT_INSUFFICIENT_BUFFER`. * - * @param[in] glWindow Pointer to the opengl window. Set to nullptr to get driver supported formats. + * @param[in] glWindow Set to nullptr. * @param[in] count Capacity of the PalGLFBConfig array. * @param[out] configs User allocated array of PalGLFBConfig. * diff --git a/include/pal/pal_system.h b/include/pal/pal_system.h index 972524f..c8d71bf 100644 --- a/include/pal/pal_system.h +++ b/include/pal/pal_system.h @@ -119,7 +119,11 @@ typedef enum { typedef enum { PAL_PLATFORM_API_WIN32, PAL_PLATFORM_API_WAYLAND, - PAL_PLATFORM_API_X11 + PAL_PLATFORM_API_X11, + PAL_PLATFORM_API_COCOA, + PAL_PLATFORM_API_ANDRIOD, + PAL_PLATFORM_API_UIKIT, + PAL_PLATFORM_API_HEADLESS } PalPlatformApiType; /** diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index dcaa6e9..b2a3eb4 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -187,6 +187,23 @@ typedef enum { PAL_FLASH_TRAY = PAL_BIT(1) /**< Flash the icon of the window.*/ } PalFlashFlag; +/** + * @enum PalFBConfigBackend + * @brief Represents the backend of a FBConfig. + * + * All FBConfig backends follow the format `PAL_CONFIG_BACKEND**` for consistency and + * API use. + * + * @since 1.1 + * @ingroup pal_video + */ +typedef enum { + PAL_CONFIG_BACKEND_EGL, + PAL_CONFIG_BACKEND_GLX, + PAL_CONFIG_BACKEND_WGL, + PAL_CONFIG_BACKEND_PAL_OPENGL /**< Use PAL opengl module backend.*/ +} PalFBConfigBackend; + /** * @enum PalScancode * @brief scancodes (layout independent keys) of a keyboard. @@ -673,24 +690,27 @@ PAL_API void PAL_CALL palUpdateVideo(); PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); /** - * @brief Set the pixel format or FBConfig for the video system. + * @brief Set the FBConfig for the video system. * * The video system must be initialized before this call. - * The pixel format set will be used for all created windows after this call. - * The `pixelFormatIndex` is the loop index from the drivers - * supported pixel formats or FBConfig. + * The provided FBConfig will be used for all created windows after this call. + * The `index` is the loop index from the drivers + * supported FBConfigs. * - * Example: + * The `backend` is used to tell the video system, the source of the index. + * Examples: PAL_CONFIG_BACKEND_EGL tells the video system, we got this loop index + * from EGL. This will enable the video system to find your FBConfig. * - * @code - * for (int i = 0; i < count; i++) { pixelFormatIndex = i;} - * @endcode + * Example Flow: + * Enumerate and select your FBConfig using any backend(EGL, GLX, WGL, etc) + * and just let the video system know which one you used. * - * An opengl supported pixel format or FBConfig must be used - * the window will be used to create an opengl context otherwise - * this can be ignored safely. + * If the backend passed is not the same as the one used, + * the video system might still get a FBConfig but it will not be the + * one requested. * - * @param[in] pixelFormatIndex The pixel format driver index. + * @param[in] index The FBConfig driver index. + * @param[in] backend The FBConfig backend or source. * * @return `PAL_RESULT_SUCCESS` on success or a result code on * failure. Call palFormatResult() for more information. @@ -700,7 +720,9 @@ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); * @since 1.1 * @ingroup pal_video */ -PAL_API PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex); +PAL_API PalResult PAL_CALL palSetFBConfig( + const int index, + PalFBConfigBackend backend); /** * @brief Return a list of all connected monitors. diff --git a/pal.lua b/pal.lua index 1e96872..ce17da0 100644 --- a/pal.lua +++ b/pal.lua @@ -116,29 +116,6 @@ project "PAL" filter {"system:linux", "configurations:*"} files { "src/opengl/pal_opengl_linux.c" } - - -- check for wayland support. This is cross compiler - local paths = { - "/usr/include/wayland-client.h", - "/usr/include/x86_64-linux-gnu/wayland-client.h" - } - - local found = false - for _, path in ipairs(paths) do - local file = io.open(path, "r") - if file then - file:close() - found = true - break - end - end - - if found then - defines { "PAL_HAS_WAYLAND=1" } - else - defines { "PAL_HAS_WAYLAND=0" } - end - filter {} end diff --git a/src/opengl/pal_opengl_linux.c b/src/opengl/pal_opengl_linux.c index b472bb7..61e88ce 100644 --- a/src/opengl/pal_opengl_linux.c +++ b/src/opengl/pal_opengl_linux.c @@ -30,161 +30,530 @@ freely, subject to the following restrictions: #include #include #include +#include -// X11 headers -#include +#include +#include +#include // ================================================== // Typedefs, enums and structs // ================================================== +#ifndef GL_VENDOR +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#endif // GL_VENDOR + +// TODO: +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) + +typedef unsigned int GLenum; +typedef unsigned char GLubyte; +typedef int32_t EGLint; +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; + +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLNativeDisplayType; + +typedef void* (*eglGetProcAddressFn)(const char*); + +typedef EGLContext (*eglCreateContextFn)( + EGLDisplay, + EGLConfig, + EGLContext, + const EGLint*); + +typedef EGLBoolean (*eglDestroyContextFn)( + EGLDisplay, + EGLContext); + +typedef EGLBoolean (*eglMakeCurrentFn)( + EGLDisplay, + EGLSurface, + EGLSurface, + EGLContext); + +typedef EGLBoolean (*eglSwapBuffersFn)( + EGLDisplay, + EGLSurface); + +typedef EGLBoolean (*eglSwapIntervalFn)( + EGLDisplay, + EGLint); + +typedef EGLBoolean (*eglInitializeFn)( + EGLDisplay, + EGLint*, + EGLint*); + +typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); + +typedef EGLDisplay (*eglGetDisplayFn)(EGLNativeDisplayType); + +typedef EGLBoolean (*eglDestroySurfaceFn)( + EGLDisplay, + EGLSurface); + +typedef EGLSurface (*eglCreatePbufferSurfaceFn)( + EGLDisplay, + EGLConfig, + const EGLint*); + +typedef EGLBoolean (*eglChooseConfigFn)( + EGLDisplay, + const EGLint*, + EGLConfig*, + EGLint, + EGLint*); + +typedef EGLBoolean (*eglGetConfigAttribFn)( + EGLDisplay, + EGLConfig, + EGLint, + EGLint*); + +typedef EGLint (*eglGetErrorFn)(void); + +typedef EGLBoolean (*eglBindAPIFn)(EGLenum); + +typedef const char *(*eglQueryStringFn)( + EGLDisplay, + EGLint); + +typedef EGLBoolean (*eglGetConfigsFn)( + EGLDisplay, + EGLConfig*, + EGLint, + EGLint*); + +typedef EGLSurface (*eglCreateWindowSurfaceFn) ( + EGLDisplay, + EGLConfig, + EGLNativeWindowType, + const EGLint*); + +typedef const GLubyte*(*glGetStringFn)(GLenum); + typedef struct { - void (*shutdownGL)(); - PalResult (*enumerateGLFBConfigs)(PalGLWindow*, Int32*, PalGLFBConfig*); - PalResult (*createGLContext)(const PalGLContextCreateInfo*, PalGLContext**); - void (*destroyGLContext)(PalGLContext*); - PalResult (*makeContextCurrent)(PalGLWindow*, PalGLContext*); - void* (*getProcAddress)(const char*); - PalResult (*swapBuffers)(PalGLWindow*, PalGLContext*); - PalResult (*setSwapInterval)(Int32); -} backend; + bool used; + EGLSurface surface; + PalGLContext* context; +} ContextData; typedef struct { bool initialized; + Int32 maxContextData; const PalAllocator* allocator; - const backend* backend; + + eglGetProcAddressFn eglGetProcAddress; + eglCreateContextFn eglCreateContext; + eglDestroyContextFn eglDestroyContext; + eglMakeCurrentFn eglMakeCurrent; + eglSwapBuffersFn eglSwapBuffers; + eglSwapIntervalFn eglSwapInterval; + eglInitializeFn eglInitialize; + eglTerminateFn eglTerminate; + eglGetDisplayFn eglGetDisplay; + eglDestroySurfaceFn eglDestroySurface; + eglCreatePbufferSurfaceFn eglCreatePbufferSurface; + eglChooseConfigFn eglChooseConfig; + eglGetConfigAttribFn eglGetConfigAttrib; + eglGetErrorFn eglGetError; + eglBindAPIFn eglBindAPI; + eglQueryStringFn eglQueryString; + eglGetConfigsFn eglGetConfigs; + eglCreateWindowSurfaceFn eglCreateWindowSurface; + + glGetStringFn glGetString; + + void* handle; + ContextData* contextData; + EGLDisplay display; PalGLInfo info; } GLLinux; static GLLinux s_GL = {0}; // ================================================== -// X11 Typedefs, enums and structs +// Internal API // ================================================== -typedef struct { - int screen; - Display* display; - Window window; - // dummy context - PalGLInfo info; -} Glx; +static inline bool checkExtension( + const char* extension, + const char* extensions) +{ + const char* start = extensions; + size_t extensionLen = strlen(extension); -// ================================================== -// Internal API -// ================================================== + for (;;) { + const char* where = nullptr; + const char* terminator = nullptr; -// ================================================== -// X11 API -// ================================================== + where = strstr(start, extension); + if (!where) { + return false; + } -PalResult xInitGL() -{ + // the extension was found, we find the terminator by adding the sizeof + // the extension + terminator = where + extensionLen; + if (where == start || *(where - 1) == ' ') { + if (*terminator == ' ' || *terminator == '\0') { + return true; + } + } + start = terminator; + } } -void xShutdownGL() +static ContextData* getFreeContextData() { + for (int i = 0; i < s_GL.maxContextData; ++i) { + if (!s_GL.contextData[i].used) { + s_GL.contextData[i].used = true; + return &s_GL.contextData[i]; + } + } + // resize the data array + // this will almost not reach here since most setups are 1-4 monitors + ContextData* data = nullptr; + int count = s_GL.maxContextData * 2; // double the size + int freeIndex = s_GL.maxContextData + 1; + data = palAllocate(s_GL.allocator, sizeof(ContextData) * count, 0); + if (data) { + memcpy( + data, + s_GL.contextData, + s_GL.maxContextData * sizeof(ContextData)); + + palFree(s_GL.allocator, s_GL.contextData); + s_GL.contextData = data; + s_GL.maxContextData = count; + + s_GL.contextData[freeIndex].used = true; + return &s_GL.contextData[freeIndex]; + } + return nullptr; } -PalResult xEnumerateGLFBConfigs( - PalGLWindow* glWindow, - Int32* count, - PalGLFBConfig* configs) +static ContextData* findContextData(PalGLContext* context) { - + for (int i = 0; i < s_GL.maxContextData; ++i) { + if (s_GL.contextData[i].used && + s_GL.contextData[i].context == context) { + return &s_GL.contextData[i]; + } + } } -PalResult xCreateGLContext( - const PalGLContextCreateInfo* info, - PalGLContext** outContext) +static void freeContextData(PalGLContext* context) { - + for (int i = 0; i < s_GL.maxContextData; ++i) { + if (s_GL.contextData[i].used && + s_GL.contextData[i].context == context) { + s_GL.contextData[i].used = false; + } + } } -void xDestroyGLContext(PalGLContext* context) +// ================================================== +// Public API +// ================================================== + +PalResult PAL_CALL palInitGL(const PalAllocator* allocator) { + if (s_GL.initialized) { + return PAL_RESULT_SUCCESS; + } -} + if (allocator && (!allocator->allocate || !allocator->free)) { + return PAL_RESULT_INVALID_ALLOCATOR; + } -PalResult xMakeContextCurrent( - PalGLWindow* glWindow, - PalGLContext* context) -{ + s_GL.maxContextData = 16; // initial size + s_GL.contextData = palAllocate( + s_GL.allocator, + sizeof(ContextData) * s_GL.maxContextData, + 0); -} + if (!s_GL.maxContextData) { + return PAL_RESULT_OUT_OF_MEMORY; + } -void* xGLGetProcAddress(const char* name) -{ + s_GL.handle = dlopen("libEGL.so", RTLD_LAZY); + if (!s_GL.handle) { + return PAL_RESULT_PLATFORM_FAILURE; + } -} + s_GL.eglGetProcAddress = (eglGetProcAddressFn)dlsym( + s_GL.handle, + "eglGetProcAddress"); -PalResult xSwapBuffers( - PalGLWindow* glWindow, - PalGLContext* context) -{ + s_GL.eglCreateContext = (eglCreateContextFn)s_GL.eglGetProcAddress( + "eglCreateContext"); -} + s_GL.eglDestroyContext = (eglDestroyContextFn)s_GL.eglGetProcAddress( + "eglDestroyContext"); -PalResult xSetSwapInterval(Int32 interval) -{ + s_GL.eglDestroySurface = (eglDestroySurfaceFn)s_GL.eglGetProcAddress( + "eglDestroySurface"); -} + s_GL.eglMakeCurrent = (eglMakeCurrentFn)s_GL.eglGetProcAddress( + "eglMakeCurrent"); -static backend s_Xbackend = { - .shutdownGL = xShutdownGL, - .enumerateGLFBConfigs = xEnumerateGLFBConfigs, - .createGLContext = xCreateGLContext, - .destroyGLContext = xDestroyGLContext, - .makeContextCurrent = xMakeContextCurrent, - .getProcAddress = xGLGetProcAddress, - .swapBuffers = xSwapBuffers, - .setSwapInterval = xSetSwapInterval -}; + s_GL.eglSwapBuffers = (eglSwapBuffersFn)s_GL.eglGetProcAddress( + "eglSwapBuffers"); -// ================================================== -// Public API -// ================================================== + s_GL.eglSwapInterval = (eglSwapIntervalFn)s_GL.eglGetProcAddress( + "eglSwapInterval"); -PalResult PAL_CALL palInitGL(const PalAllocator* allocator) -{ - if (s_GL.initialized) { - return PAL_RESULT_SUCCESS; + s_GL.eglInitialize = (eglInitializeFn)s_GL.eglGetProcAddress( + "eglInitialize"); + + s_GL.eglTerminate = (eglTerminateFn)s_GL.eglGetProcAddress( + "eglTerminate"); + + s_GL.eglGetDisplay = (eglGetDisplayFn)s_GL.eglGetProcAddress( + "eglGetDisplay"); + + // clang-format off + s_GL.eglCreatePbufferSurface = (eglCreatePbufferSurfaceFn)s_GL.eglGetProcAddress( + "eglCreatePbufferSurface"); + // clang-format on + + s_GL.eglChooseConfig = (eglChooseConfigFn)s_GL.eglGetProcAddress( + "eglChooseConfig"); + + s_GL.eglGetConfigAttrib = (eglGetConfigAttribFn)s_GL.eglGetProcAddress( + "eglGetConfigAttrib"); + + s_GL.eglGetError = (eglGetErrorFn)s_GL.eglGetProcAddress( + "eglGetError"); + + s_GL.eglBindAPI = (eglBindAPIFn)s_GL.eglGetProcAddress( + "eglBindAPI"); + + s_GL.eglQueryString = (eglQueryStringFn)s_GL.eglGetProcAddress( + "eglQueryString"); + + s_GL.eglGetConfigs = (eglGetConfigsFn)s_GL.eglGetProcAddress( + "eglGetConfigs"); + + s_GL.eglCreateWindowSurface = (eglCreateWindowSurfaceFn)s_GL.eglGetProcAddress( + "eglCreateWindowSurface"); + + if (!s_GL.eglBindAPI || + !s_GL.eglChooseConfig || + !s_GL.eglCreateContext || + !s_GL.eglCreatePbufferSurface || + !s_GL.eglDestroyContext || + !s_GL.eglDestroySurface || + !s_GL.eglGetConfigAttrib || + !s_GL.eglGetDisplay || + !s_GL.eglGetError || + !s_GL.eglGetProcAddress || + !s_GL.eglInitialize || + !s_GL.eglMakeCurrent || + !s_GL.eglSwapBuffers || + !s_GL.eglSwapInterval || + !s_GL.eglTerminate || + !s_GL.eglQueryString || + !s_GL.eglGetConfigs || + !s_GL.eglCreateWindowSurface + ) { + return PAL_RESULT_PLATFORM_FAILURE; } - if (allocator && (!allocator->allocate || !allocator->free)) { - return PAL_RESULT_INVALID_ALLOCATOR; + // create a dummy context + if (!s_GL.eglBindAPI(EGL_OPENGL_API)) { + return PAL_RESULT_PLATFORM_FAILURE; } - // get backend type - bool x11 = true; - const char* session = getenv("XDG_SESSION_TYPE"); - if (session) { - if (strcmp(session, "wayland") == 0) { - x11 = false; - } + EGLDisplay display = s_GL.eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (display == EGL_NO_DISPLAY) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + if (!s_GL.eglInitialize(display, nullptr, nullptr)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + // use a simple FBConfig + EGLConfig config; + int numConfigs; + EGLint attribs[] = { + EGL_RENDERABLE_TYPE, + EGL_OPENGL_BIT, + EGL_SURFACE_TYPE, + EGL_PBUFFER_BIT, + EGL_NONE}; + + EGLint type; + s_GL.eglChooseConfig(display, attribs, &config, 1, &numConfigs); + s_GL.eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &type); + if (!(type & EGL_OPENGL_BIT)) { + // we must support opengl API (desktop) + return PAL_RESULT_PLATFORM_FAILURE; } - if (x11) { - PalResult ret = xInitGL(); - if (ret != PAL_RESULT_SUCCESS) { - return ret; + // Since we don't want to create dummy window to get the driver info + // we use EGL_OPENGL_ES2_BIT to create without a window + if (!(type & EGL_OPENGL_ES2_BIT)) { + // TODO: create a dummy window if EGL_OPENGL_ES2_BIT + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLint pBufferAttribs[] = { + EGL_WIDTH, + 1, + EGL_HEIGHT, + 1, + EGL_NONE}; + + EGLSurface surface = s_GL.eglCreatePbufferSurface( + display, + config, + pBufferAttribs); + + if (surface == EGL_NO_SURFACE) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLint contextAttrib[] = { + EGL_CONTEXT_MAJOR_VERSION, + 2, + EGL_CONTEXT_MINOR_VERSION, + 1, + EGL_NONE}; + + // create a dummy context + EGLContext context = s_GL.eglCreateContext( + display, + config, + EGL_NO_CONTEXT, + contextAttrib); + + if (!s_GL.eglMakeCurrent(display, surface, surface, context)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + s_GL.glGetString = (glGetStringFn)s_GL.eglGetProcAddress( + "glGetString"); + + const char* version = (const char*)s_GL.glGetString(GL_VERSION); + if (version) { +#ifdef _MSC_VER + sscanf_s(version, "%d.%d", &s_GL.info.major, &s_GL.info.minor); +#else + sscanf(version, "%d.%d", &s_GL.info.major, &s_GL.info.minor); +#endif + } + + const char* renderer = (const char*)s_GL.glGetString(GL_RENDERER); + const char* vendor = (const char*)s_GL.glGetString(GL_VENDOR); + strcpy(s_GL.info.vendor, vendor); + strcpy(s_GL.info.version, version); + strcpy(s_GL.info.graphicsCard, renderer); + + // EGL extensions can be queried without a bound context + // we just do that over here after making the context current + const char* extensions = s_GL.eglQueryString(display, EGL_EXTENSIONS); + if (extensions) { + // color space + if (checkExtension("EGL_KHR_gl_colorspace", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_COLORSPACE_SRGB; + } + + // create context + if (checkExtension("EGL_KHR_create_context", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_CREATE_CONTEXT; + s_GL.info.extensions |= PAL_GL_EXTENSION_CONTEXT_PROFILE; + } + + // robustness + if (checkExtension("EGL_EXT_create_context_robustness", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_ROBUSTNESS; + } + + // no error + if (checkExtension("EGL_KHR_create_context_no_error", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_NO_ERROR; + } + + // flush control + if (checkExtension("EGL_KHR_context_flush_control", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_FLUSH_CONTROL; + } + + // swap control + if (checkExtension("EGL_EXT_swap_control", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_FLUSH_CONTROL; } - s_GL.backend = &s_Xbackend; + + if (checkExtension("EGL_EXT_swap_control_tear", extensions)) { + s_GL.info.extensions |= PAL_GL_EXTENSION_FLUSH_CONTROL; + } + } + + // part of the core API + s_GL.info.extensions |= PAL_GL_EXTENSION_MULTISAMPLE; + + if (type & EGL_OPENGL_ES_BIT || + type & EGL_OPENGL_ES2_BIT || + type & EGL_OPENGL_ES3_BIT) { + s_GL.info.extensions |= PAL_GL_EXTENSION_CONTEXT_PROFILE_ES2; + } + + // check if we support the core swap interval + if (s_GL.eglSwapInterval) { + s_GL.info.extensions |= PAL_GL_EXTENSION_SWAP_CONTROL; } + s_GL.eglMakeCurrent( + display, + EGL_NO_SURFACE, + EGL_NO_SURFACE, + EGL_NO_CONTEXT); + + s_GL.eglDestroyContext(display, context); + s_GL.eglDestroySurface(display, surface); + s_GL.allocator = allocator; s_GL.initialized = true; + s_GL.display = display; return PAL_RESULT_SUCCESS; } void PAL_CALL palShutdownGL() { - if (s_GL.initialized) { - s_GL.backend->shutdownGL(); - s_GL.initialized = false; + if (!s_GL.initialized) { + return; } + + palFree(s_GL.allocator, s_GL.contextData); + s_GL.eglTerminate(s_GL.display); + dlclose(s_GL.handle); + s_GL.initialized = false; } const PalGLInfo* PAL_CALL palGetGLInfo() @@ -212,7 +581,153 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( return PAL_RESULT_INSUFFICIENT_BUFFER; } - return s_GL.backend->enumerateGLFBConfigs(glWindow, count, configs); + Int32 configCount = 0; + Int32 maxConfigCount = 0; + + if (configs) { + maxConfigCount = *count; + } + + // get the number of configs and filter the ones for opengl desktop + EGLint numConfigs = 0; + if (!s_GL.eglGetConfigs(s_GL.display, nullptr, 0, &numConfigs)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLConfig* eglConfigs = palAllocate( + s_GL.allocator, + sizeof(EGLConfig) * numConfigs, + 0); + + if (!eglConfigs) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + s_GL.eglGetConfigs(s_GL.display, eglConfigs, numConfigs, &numConfigs); + for (int i = 0; i < numConfigs; i++) { + // attributes we care about + EGLint surfaceType = 0, renderable = 0; + EGLint colorType = 0; + + EGLConfig config = eglConfigs[i]; + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_SURFACE_TYPE, + &surfaceType); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_RENDERABLE_TYPE, + &renderable); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_COLOR_BUFFER_TYPE, + &colorType); + + // we need only opengl API configs + if (colorType != EGL_RGB_BUFFER) { + continue; + } + + if (!(renderable & EGL_OPENGL_BIT)) { + continue; + } + + if (!(surfaceType & EGL_WINDOW_BIT)) { + continue; + } + + if (configs && configCount < maxConfigCount) { + // get this only if user supplied an output buffer (PalGLFBConfig*) + PalGLFBConfig* fbConfig = &configs[configCount]; + fbConfig->index = i; + + EGLint redBits, greenBits, blueBits, alphaBits; + EGLint depthBits, stencilBits, samples; + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_RED_SIZE, + &redBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_GREEN_SIZE, + &greenBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_BLUE_SIZE, + &blueBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_ALPHA_SIZE, + &alphaBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_DEPTH_SIZE, + &depthBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_STENCIL_SIZE, + &stencilBits); + + s_GL.eglGetConfigAttrib( + s_GL.display, + config, + EGL_SAMPLES, + &samples); + + if (samples == 0) { + samples = 1; + } + + fbConfig->redBits = redBits; + fbConfig->greenBits = greenBits; + fbConfig->blueBits = blueBits; + fbConfig->alphaBits = alphaBits; + fbConfig->depthBits = depthBits; + fbConfig->stencilBits = stencilBits; + fbConfig->samples = samples; + + // True for EGL_WINDOW_BIT + fbConfig->doubleBuffer = true; + fbConfig->stereo = false; + + if (s_GL.info.extensions & PAL_GL_EXTENSION_COLORSPACE_SRGB) { + // since EGL does not have a bit to check SRGB support + // we check if all the color bits are greater than or equal to 8 + if (fbConfig->redBits >= 8 && + fbConfig->greenBits >= 8 && + fbConfig->blueBits >= 8) { + fbConfig->sRGB = true; + } + } else { + fbConfig->sRGB = false; + } + } + configCount++; + } + + palFree(s_GL.allocator, eglConfigs); + if (!configs) { + *count = configCount; + } + + return PAL_RESULT_SUCCESS; } const PalGLFBConfig* PAL_CALL palGetClosestGLFBConfig( @@ -287,7 +802,11 @@ PalResult PAL_CALL palCreateGLContext( return PAL_RESULT_GL_NOT_INITIALIZED; } - if (!info || !outContext || (info && (!info->window || !info->fbConfig))) { + if (!info || !outContext) { + return PAL_RESULT_NULL_POINTER; + } + + if (!info->window || !info->fbConfig) { return PAL_RESULT_NULL_POINTER; } @@ -333,13 +852,169 @@ PalResult PAL_CALL palCreateGLContext( return PAL_RESULT_INVALID_GL_VERSION; } - return s_GL.backend->createGLContext(info, outContext); + ContextData* data = getFreeContextData(); + if (!data) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + // we need to get the EGL config from the user supplied index + EGLint numConfigs = 0; + if (!s_GL.eglGetConfigs(s_GL.display, nullptr, 0, &numConfigs)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLConfig* eglConfigs = palAllocate( + s_GL.allocator, + sizeof(EGLConfig) * numConfigs, + 0); + + if (!eglConfigs) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + s_GL.eglGetConfigs(s_GL.display, eglConfigs, numConfigs, &numConfigs); + EGLConfig config = eglConfigs[info->fbConfig->index]; + + EGLContext* share = nullptr; + if (info->shareContext) { + share = (EGLContext)info->shareContext; + } + + Int32 attribs[40]; + Int32 index = 0; + Int32 profile = 0; + Int32 flags = 0; + + // set context attributes + // the first element is the key and the second is the value + // set version + attribs[index++] = EGL_CONTEXT_MAJOR_VERSION_KHR; // key + attribs[index++] = info->major; // value + + attribs[index++] = EGL_CONTEXT_MINOR_VERSION_KHR; + attribs[index++] = info->minor; + + // set profile mask + if (info->profile != PAL_GL_PROFILE_NONE) { + attribs[index++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; + + if (info->profile == PAL_GL_PROFILE_COMPATIBILITY) { + profile = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; + } else if (info->profile == PAL_GL_PROFILE_CORE) { + profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + } + + attribs[index++] = info->profile; + } + + // set forward flag + if (info->forward) { + flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; + } + + // set debug flag + if (info->debug) { + flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; + } + + // set robustness + if (info->reset != PAL_GL_CONTEXT_RESET_NONE) { + flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; + attribs[index++] = EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR; + + if (info->reset == PAL_GL_CONTEXT_RESET_LOSE_CONTEXT) { + attribs[index++] = EGL_LOSE_CONTEXT_ON_RESET_KHR; + + } else if (info->reset == PAL_GL_CONTEXT_RESET_NO_NOTIFICATION) { + attribs[index++] = EGL_NO_RESET_NOTIFICATION_KHR; + } + } + + // set no error + if (info->noError) { + attribs[index++] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; + attribs[index++] = true; + } + + // release + if (info->release != PAL_GL_RELEASE_BEHAVIOR_NONE) { + attribs[index++] = EGL_CONTEXT_RELEASE_BEHAVIOR_KHR; + attribs[index++] = EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR; + } + + if (flags) { + attribs[index++] = EGL_CONTEXT_FLAGS_KHR; + attribs[index++] = flags; + } + attribs[index++] = EGL_NONE; + + // create context + EGLContext context = s_GL.eglCreateContext( + s_GL.display, + config, + EGL_NO_CONTEXT, + attribs); + + if (context == EGL_NO_CONTEXT) { + EGLint error = s_GL.eglGetError(); + if (error == EGL_BAD_CONFIG) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + + } else if (error == EGL_BAD_ATTRIBUTE) { + // we just return invalid version + // it could be invalid profile + return PAL_RESULT_INVALID_GL_VERSION; + + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } + } + + // create a window surface + // The only attrib we want is colorspace + EGLint surfaceAttribs[3]; + surfaceAttribs[0] = EGL_GL_COLORSPACE; + if (info->fbConfig->sRGB) { + surfaceAttribs[1] = EGL_GL_COLORSPACE_SRGB_KHR; + } else { + surfaceAttribs[1] = EGL_GL_COLORSPACE_LINEAR_KHR; + } + surfaceAttribs[2] = EGL_NONE; + + EGLSurface surface = s_GL.eglCreateWindowSurface( + s_GL.display, + config, + (EGLNativeWindowType)info->window->window, + surfaceAttribs); + + if (surface == EGL_NO_SURFACE) { + EGLint error = s_GL.eglGetError(); + if (error == EGL_BAD_CONFIG) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } + } + + palFree(s_GL.allocator, eglConfigs); + + data->context = (PalGLContext*)context; + data->surface = surface; + + *outContext = (PalGLContext*)context; + return PAL_RESULT_SUCCESS; } void PAL_CALL palDestroyGLContext(PalGLContext* context) { if (s_GL.initialized && context) { - s_GL.backend->destroyGLContext(context); + ContextData* data = findContextData(context); + if (data) { + s_GL.eglDestroyContext(s_GL.display, (EGLContext)context); + s_GL.eglDestroySurface(s_GL.display, data->surface); + data->used = false; + } } } @@ -355,7 +1030,41 @@ PalResult PAL_CALL palMakeContextCurrent( return PAL_RESULT_NULL_POINTER; } - return s_GL.backend->makeContextCurrent(glWindow, context); + if (context && glWindow) { + ContextData* data = findContextData(context); + if (!data) { + return PAL_RESULT_INVALID_GL_CONTEXT; + } + + EGLint ret = s_GL.eglMakeCurrent( + s_GL.display, + data->surface, + data->surface, + (EGLConfig)context); + + if (!ret) { + EGLint error = s_GL.eglGetError(); + if (error == EGL_BAD_CONTEXT) { + return PAL_RESULT_INVALID_GL_CONTEXT; + + } else if (error == EGL_BAD_SURFACE) { + // since we always create a window surface + return PAL_RESULT_INVALID_GL_WINDOW; + + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } + } + + } else if (!context && !glWindow) { + s_GL.eglMakeCurrent( + s_GL.display, + EGL_NO_SURFACE, + EGL_NO_SURFACE, + EGL_NO_CONTEXT); + } + + return PAL_RESULT_SUCCESS; } void* PAL_CALL palGLGetProcAddress(const char* name) @@ -364,7 +1073,7 @@ void* PAL_CALL palGLGetProcAddress(const char* name) return nullptr; } - return s_GL.backend->getProcAddress(name); + return s_GL.eglGetProcAddress(name); } PalResult PAL_CALL palSwapBuffers( @@ -379,7 +1088,26 @@ PalResult PAL_CALL palSwapBuffers( return PAL_RESULT_NULL_POINTER; } - return s_GL.backend->swapBuffers(glWindow, context); + ContextData* data = findContextData(context); + if (!data) { + return PAL_RESULT_INVALID_GL_CONTEXT; + } + + if (!s_GL.eglSwapBuffers(s_GL.display, data->surface)) { + EGLint error = s_GL.eglGetError(); + if (error == EGL_BAD_CONTEXT) { + return PAL_RESULT_INVALID_GL_CONTEXT; + + } else if (error == EGL_BAD_SURFACE) { + // since we always create a window surface + return PAL_RESULT_INVALID_GL_WINDOW; + + } else { + return PAL_RESULT_PLATFORM_FAILURE; + } + } + + return PAL_RESULT_SUCCESS; } PalResult PAL_CALL palSetSwapInterval(Int32 interval) @@ -388,5 +1116,10 @@ PalResult PAL_CALL palSetSwapInterval(Int32 interval) return PAL_RESULT_GL_NOT_INITIALIZED; } - return s_GL.backend->setSwapInterval(interval); + if (!s_GL.eglSwapInterval) { + return PAL_RESULT_GL_EXTENSION_NOT_SUPPORTED; + } + + s_GL.eglSwapInterval(s_GL.display, interval); + return PAL_RESULT_SUCCESS; } \ No newline at end of file diff --git a/src/opengl/pal_opengl_win32.c b/src/opengl/pal_opengl_win32.c index 6399603..0d21d20 100644 --- a/src/opengl/pal_opengl_win32.c +++ b/src/opengl/pal_opengl_win32.c @@ -48,6 +48,8 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== +// TODO: use platform header file + #define PAL_GL_CLASS L"PALGLClass" // check to see if this is not defined yet @@ -55,6 +57,7 @@ freely, subject to the following restrictions: #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 #define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 #endif // GL_VENDOR #ifndef WGL_NUMBER_PIXEL_FORMATS_ARB @@ -417,6 +420,7 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) strcpy(s_Wgl.info.graphicsCard, renderer); // check available extensions + // TODO: use normal path const char* extensions = nullptr; if (s_Wgl.wglGetExtensionsStringARB) { extensions = s_Wgl.wglGetExtensionsStringARB(s_Wgl.hdc); @@ -542,19 +546,6 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( return PAL_RESULT_INSUFFICIENT_BUFFER; } - HDC windowDC = nullptr; - bool free = true; - if (glWindow) { - windowDC = GetDC((HWND)glWindow->window); - if (!windowDC) { - return PAL_RESULT_INVALID_GL_WINDOW; - } - - } else { - windowDC = s_Wgl.hdc; - free = false; - } - Int32 configCount = 0; Int32 maxConfigCount = 0; Int32 nativeCount = 0; @@ -568,7 +559,7 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( if (s_Wgl.wglGetPixelFormatAttribivARB) { // get framebuffer config with extensions if (!s_Wgl.wglGetPixelFormatAttribivARB( - windowDC, + s_Wgl.hdc, 0, 0, 1, @@ -597,7 +588,7 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( Int32 values[sizeof(attributes) / sizeof(attributes[0])]; for (Int32 i = 1; i <= nativeCount; i++) { if (!s_Wgl.wglGetPixelFormatAttribivARB( - windowDC, + s_Wgl.hdc, i, 0, sizeof(attributes) / sizeof(attributes[0]), @@ -653,12 +644,12 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( } else { // get pixel format with legacy pixel descriptor - nativeCount = s_Gdi.describePixelFormat(windowDC, 1, 0, nullptr); + nativeCount = s_Gdi.describePixelFormat(s_Wgl.hdc, 1, 0, nullptr); for (Int32 i = 1; i <= nativeCount; i++) { PIXELFORMATDESCRIPTOR pfd; if (!s_Gdi.describePixelFormat( - windowDC, + s_Wgl.hdc, i, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) { @@ -704,7 +695,7 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( } if (free) { - ReleaseDC((HWND)glWindow->window, windowDC); + ReleaseDC((HWND)glWindow->window, s_Wgl.hdc); } if (!configs) { @@ -902,11 +893,9 @@ PalResult PAL_CALL palCreateGLContext( } // release - if (s_Wgl.info.extensions & PAL_GL_EXTENSION_FLUSH_CONTROL) { - if (info->release != PAL_GL_RELEASE_BEHAVIOR_NONE) { - attribs[index++] = WGL_CONTEXT_RELEASE_BEHAVIOR_ARB; - attribs[index++] = WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB; - } + if (info->release != PAL_GL_RELEASE_BEHAVIOR_NONE) { + attribs[index++] = WGL_CONTEXT_RELEASE_BEHAVIOR_ARB; + attribs[index++] = WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB; } if (flags) { @@ -915,6 +904,7 @@ PalResult PAL_CALL palCreateGLContext( } attribs[index++] = 0; + // TODO: put share context over here context = s_Wgl.wglCreateContextAttribsARB(hdc, nullptr, attribs); if (!context) { DWORD error = GetLastError(); diff --git a/src/pal_core.c b/src/pal_core.c index 3b468f5..02b634d 100644 --- a/src/pal_core.c +++ b/src/pal_core.c @@ -335,6 +335,9 @@ const char* PAL_CALL palFormatResult(PalResult result) case PAL_RESULT_INVALID_GL_CONTEXT: return "Invalid opengl context"; + + case PAL_RESULT_INVALID_BACKEND: + return "Invalid backend"; } return "Unknown"; } diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 8e31c9a..201a472 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -55,6 +55,64 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLNativeDisplayType; + +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_NATIVE_VISUAL_ID 0x302E + +typedef int32_t EGLint; +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; + +typedef void* (*eglGetProcAddressFn)(const char*); + +typedef EGLBoolean (*eglInitializeFn)( + EGLDisplay, + EGLint*, + EGLint*); + +typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); + +typedef EGLDisplay (*eglGetDisplayFn)(void*); + +typedef EGLBoolean (*eglChooseConfigFn)( + EGLDisplay, + const EGLint*, + EGLConfig*, + EGLint, + EGLint*); + +typedef EGLBoolean (*eglGetConfigAttribFn)( + EGLDisplay, + EGLConfig, + EGLint, + EGLint*); + +typedef EGLint (*eglGetErrorFn)(void); + +typedef EGLBoolean (*eglBindAPIFn)(EGLenum); + +typedef EGLBoolean (*eglGetConfigsFn)( + EGLDisplay, + EGLConfig*, + EGLint, + EGLint*); + typedef struct { bool skipConfigure; bool skipState; @@ -96,6 +154,18 @@ typedef struct { int keycodes[256]; } Keyboard; +typedef struct { + void* handle; + eglInitializeFn eglInitialize; + eglTerminateFn eglTerminate; + eglGetDisplayFn eglGetDisplay; + eglChooseConfigFn eglChooseConfig; + eglGetConfigAttribFn eglGetConfigAttrib; + eglGetErrorFn eglGetError; + eglBindAPIFn eglBindAPI; + eglGetConfigsFn eglGetConfigs; +} EGL; + // ================================================== // X11 Typedefs, enums and structs // ================================================== @@ -457,6 +527,12 @@ typedef Pixmap (*XCreatePixmapFn)( unsigned int, unsigned int); +typedef XVisualInfo *(*XGetVisualInfoFn)( + Display*, + long, + XVisualInfo*, + int*); + typedef Cursor (*XcursorImageLoadCursorFn)( Display*, const XcursorImage*); @@ -508,10 +584,11 @@ typedef struct { bool skipNotifyEvent; int bpp; int screen; + int depth; int rrEventBase; void* handle; void* xrandr; - void* opengl; + void* glxHandle; void* libCursor; Display* display; Window root; @@ -519,6 +596,9 @@ typedef struct { Cursor hiddenCursor; const char* className; + Visual* visual; + Colormap colormap; + XOpenDisplayFn openDisplay; XCloseDisplayFn closeDisplay; XGetWindowAttributesFn getWindowAttributes; @@ -566,6 +646,7 @@ typedef struct { XAllocClassHintFn allocClassHint; XSetClassHintFn setClassHint; XFreeFn free; + XGetVisualInfoFn getVisualInfo; // opengl GLXGetFBConfigsFn glxGetFBConfigs; @@ -670,6 +751,7 @@ typedef struct { static VideoLinux s_Video = {0}; static Mouse s_Mouse = {0}; static Keyboard s_Keyboard = {0}; +static EGL s_Egl; // ================================================== // Internal API @@ -789,6 +871,127 @@ static void freeMonitorData(PalMonitor* monitor) } } +static PalResult glxBackend() +{ + // user choose GLX FBConfig backend + if (!s_X11.glxHandle) { + // Rare + return PAL_RESULT_PLATFORM_FAILURE; + } + + int count = 0; + GLXFBConfig* configs = s_X11.glxGetFBConfigs( + s_X11.display, + s_X11.screen, + &count); + + GLXFBConfig fbConfig = configs[s_Video.pixelFormat]; + if (!fbConfig) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + // get a matching visual + XVisualInfo* visualInfo = s_X11.glxGetVisualFromFBConfig( + s_X11.display, + fbConfig); + + if (!visualInfo) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + s_X11.visual = visualInfo->visual; + s_X11.depth = visualInfo->depth; + s_X11.colormap = s_X11.createColormap( + s_X11.display, + s_X11.root, + visualInfo->visual, + AllocNone); + + if (!s_X11.colormap) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + return PAL_RESULT_SUCCESS; +} + +static PalResult eglXBackend(int index) +{ + // user choose EGL FBConfig backend + if (!s_Egl.handle) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + if (!s_Egl.eglBindAPI(EGL_OPENGL_API)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLDisplay display = EGL_NO_DISPLAY; + display = s_Egl.eglGetDisplay((EGLNativeDisplayType)s_X11.display); + + if (display == EGL_NO_DISPLAY) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + if (!s_Egl.eglInitialize(display, nullptr, nullptr)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLint numConfigs = 0; + if (!s_Egl.eglGetConfigs(display, nullptr, 0, &numConfigs)) { + return PAL_RESULT_PLATFORM_FAILURE; + } + + EGLConfig* eglConfigs = palAllocate( + s_Video.allocator, + sizeof(EGLConfig) * numConfigs, + 0); + + if (!eglConfigs) { + return PAL_RESULT_OUT_OF_MEMORY; + } + + s_Egl.eglGetConfigs(display, eglConfigs, numConfigs, &numConfigs); + EGLConfig config = eglConfigs[index]; + + // we create a visual from the config + EGLint visualID; + s_Egl.eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &visualID); + if (visualID == 0) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + int numVisuals = 0; + XVisualInfo tmp; + tmp.visualid = visualID; + + // get a matching visual info + XVisualInfo* visualInfo = s_X11.getVisualInfo( + s_X11.display, + VisualIDMask, + &tmp, + &numVisuals); + + if (!visualInfo) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + s_X11.visual = visualInfo->visual; + s_X11.depth = visualInfo->depth; + s_X11.colormap = s_X11.createColormap( + s_X11.display, + s_X11.root, + visualInfo->visual, + AllocNone); + + if (!s_X11.colormap) { + return PAL_RESULT_INVALID_GL_FBCONFIG; + } + + s_Egl.eglTerminate(display); + palFree(s_Video.allocator, eglConfigs); + return PAL_RESULT_SUCCESS; +} + // ================================================== // X11 API // ================================================== @@ -1454,6 +1657,10 @@ static PalResult xInitVideo() s_X11.handle, "XFree"); + s_X11.getVisualInfo = (XGetVisualInfoFn)dlsym( + s_X11.handle, + "XGetVisualInfo"); + s_X11.createFontCursor = (XCreateFontCursorFn)dlsym( s_X11.handle, "XCreateFontCursor"); @@ -1575,13 +1782,16 @@ static PalResult xInitVideo() resetMonitorData(); xCacheMonitors(true); - // load opengl functions - s_X11.opengl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); - if (s_X11.opengl) { + // since X11 supports both EGL and GLX + // we try to load them and resolve the needed functions + + // we load GLX + s_X11.glxHandle = dlopen("libGL.so.1", RTLD_LAZY); + if (s_X11.glxHandle) { GLXGetProcAddressFn load = nullptr; load = (GLXGetProcAddressFn)dlsym( - s_X11.opengl, + s_X11.glxHandle, "glXGetProcAddress"); s_X11.glxGetFBConfigs = (GLXGetFBConfigsFn)load( @@ -1628,8 +1838,9 @@ static void xShutdownVideo() dlclose(s_X11.handle); dlclose(s_X11.xrandr); dlclose(s_X11.libCursor); - if (s_X11.opengl) { - dlclose(s_X11.opengl); + + if (s_X11.glxHandle) { + dlclose(s_X11.glxHandle); } } @@ -2564,42 +2775,12 @@ static PalResult xCreateWindow( unsigned long bgPixel = 0; unsigned long borderPixel = 0; - // check to see if the user has set a pixel format - // with palSetPixelFormat() - if (s_Video.pixelFormat) { - // this is the pixel format driver index - // we query info about it and create the visual with it - if (s_X11.opengl) { - int count = 0; - GLXFBConfig* configs = s_X11.glxGetFBConfigs( - s_X11.display, - s_X11.screen, - &count); - - GLXFBConfig fbConfig = configs[s_Video.pixelFormat]; - if (!fbConfig) { - return PAL_RESULT_INVALID_GL_FBCONFIG; - } - - // get a matching visual and use that to create the window - XVisualInfo* visualInfo = s_X11.glxGetVisualFromFBConfig( - s_X11.display, - fbConfig); - - if (!visualInfo) { - return PAL_RESULT_INVALID_GL_FBCONFIG; - } - - visual = visualInfo->visual; - depth = visualInfo->depth; - bgPixel = 0; - borderPixel = 0; - colormap = s_X11.createColormap( - s_X11.display, - s_X11.root, - visual, - AllocNone); - } + if (s_X11.colormap) { + visual = s_X11.visual; + depth = s_X11.depth; + colormap = s_X11.colormap; + bgPixel = 0; + borderPixel = 0; } else { // use a default visual @@ -3812,6 +3993,24 @@ PalResult PAL_CALL palInitVideo( s_Video.backend = &s_XBackend; } + // we load EGL as well + s_Egl.handle = dlopen("libEGL.so", RTLD_LAZY); + if (s_Egl.handle) { + eglGetProcAddressFn load = nullptr; + load = (eglGetProcAddressFn)dlsym( + s_Egl.handle, + "eglGetProcAddress"); + + s_Egl.eglInitialize = (eglInitializeFn)load("eglInitialize"); + s_Egl.eglTerminate = (eglTerminateFn)load("eglTerminate"); + s_Egl.eglGetDisplay = (eglGetDisplayFn)load("eglGetDisplay"); + s_Egl.eglChooseConfig = (eglChooseConfigFn)load("eglChooseConfig"); + s_Egl.eglGetConfigAttrib = (eglGetConfigAttribFn)load("eglGetConfigAttrib"); + s_Egl.eglGetError = (eglGetErrorFn)load("eglGetError"); + s_Egl.eglBindAPI = (eglBindAPIFn)load("eglBindAPI"); + s_Egl.eglGetConfigs = (eglGetConfigsFn)load("eglGetConfigs"); + } + s_Video.allocator = allocator; s_Video.eventDriver = eventDriver; s_Video.initialized = true; @@ -3824,6 +4023,10 @@ void PAL_CALL palShutdownVideo() s_Video.backend->shutdownVideo(); palFree(s_Video.allocator, s_Video.windowData); palFree(s_Video.allocator, s_Video.monitorData); + + if (s_Egl.handle) { + dlclose(s_Egl.handle); + } s_Video.initialized = false; } } @@ -3844,17 +4047,30 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() return s_Video.features; } -PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) +PalResult PAL_CALL palSetFBConfig( + const int index, + PalFBConfigBackend backend) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (pixelFormatIndex) { - s_Video.pixelFormat = pixelFormatIndex; - return PAL_RESULT_SUCCESS; + // X11 can used GLX and EGL + if (backend == PAL_CONFIG_BACKEND_WGL) { + return PAL_RESULT_INVALID_BACKEND; + } + + // we try to create a colormap to see if the index is valid + if (backend == PAL_CONFIG_BACKEND_GLX) { + return glxBackend(); + + } else if (backend == PAL_CONFIG_BACKEND_EGL || + backend == PAL_CONFIG_BACKEND_PAL_OPENGL) { + if (s_X11.display) { + // we are on X11 + return eglXBackend(index); + } } - return PAL_RESULT_INVALID_GL_FBCONFIG; } PalResult PAL_CALL palEnumerateMonitors( diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index e197d13..678751f 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1403,14 +1403,22 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() return s_Video.features; } -PalResult PAL_CALL palSetPixelFormat(const int pixelFormatIndex) +PalResult PAL_CALL palSetFBConfig( + const int index, + PalFBConfigBackend backend) { + // Win32 uses only WGL and WGL index starts from 1 if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (pixelFormatIndex) { - s_Video.pixelFormat = pixelFormatIndex; + if (backend != PAL_CONFIG_BACKEND_WGL || + backend != PAL_CONFIG_BACKEND_PAL_OPENGL) { + return PAL_RESULT_INVALID_BACKEND; + } + + if (index >= 1) { + s_Video.pixelFormat = index; return PAL_RESULT_SUCCESS; } return PAL_RESULT_INVALID_GL_FBCONFIG; diff --git a/tests/opengl_context_test.c b/tests/opengl_context_test.c index 5af0550..620dfd9 100644 --- a/tests/opengl_context_test.c +++ b/tests/opengl_context_test.c @@ -57,7 +57,7 @@ bool openglContextTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr + // glWindow must be nullptr result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); @@ -79,7 +79,7 @@ bool openglContextTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr + // glWindow must be nullptr result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); @@ -133,10 +133,15 @@ bool openglContextTest() return false; } - // set the pixel format to use to create all windows with pal_video - // this must be set before creating a window - // for this example, we set the closest we desired - palSetPixelFormat(closest->index); + // set the FBConfig that will be used by PAL video system + // to create windows. this must be set before creating a window + // for this example, we set the closest we desired. + // If pal_opengl and pal_video will be used together, + // then its recommended to use PAL_CONFIG_BACKEND_PAL_OPENGL + + // NOTE: If PAL video system will not be used, + // users need to call the direct OS call to achieve this. + result = palSetFBConfig(closest->index, PAL_CONFIG_BACKEND_PAL_OPENGL); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set GL pixel format: %s", error); diff --git a/tests/opengl_fbconfig_test.c b/tests/opengl_fbconfig_test.c index 8bcc6d5..407daee 100644 --- a/tests/opengl_fbconfig_test.c +++ b/tests/opengl_fbconfig_test.c @@ -22,7 +22,7 @@ bool openglFBConfigTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr + // glWindow must be nullptr for default Int32 fbCount = 0; result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { @@ -45,7 +45,6 @@ bool openglFBConfigTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); @@ -54,31 +53,6 @@ bool openglFBConfigTest() return false; } - PalWindow* window = nullptr; - PalWindowCreateInfo createInfo = {0}; - - // initialize the video system. - result = palInitVideo(nullptr, nullptr); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to initialize video: %s", error); - return false; - } - - createInfo.monitor = nullptr; // use primary monitor - createInfo.height = 480; - createInfo.width = 640; - createInfo.show = true; - createInfo.style = PAL_WINDOW_STYLE_RESIZABLE; - - // create the window with the create info struct - result = palCreateWindow(&createInfo, &window); - if (result != PAL_RESULT_SUCCESS) { - const char* error = palFormatResult(result); - palLog(nullptr, "Failed to create window: %s", error); - return false; - } - // log configs palLog(nullptr, ""); for (Int32 i = 0; i < fbCount; i++) { @@ -150,12 +124,6 @@ bool openglFBConfigTest() palLog(nullptr, " sRGB: %s", g_BoolsToSting[closest->sRGB]); palLog(nullptr, ""); - // destroy the window - palDestroyWindow(window); - - // shutdown the video system - palShutdownVideo(); - // shutdown the opengl system palShutdownGL(); diff --git a/tests/opengl_multi_context_test.c b/tests/opengl_multi_context_test.c index 25cda34..872473b 100644 --- a/tests/opengl_multi_context_test.c +++ b/tests/opengl_multi_context_test.c @@ -57,7 +57,7 @@ bool openglMultiContextTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr + // glWindow must be nullptr result = palEnumerateGLFBConfigs(nullptr, &fbCount, nullptr); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); @@ -79,7 +79,7 @@ bool openglMultiContextTest() } // enumerate supported opengl framebuffer configs - // glWindow can be nullptr + // glWindow must be nullptr result = palEnumerateGLFBConfigs(nullptr, &fbCount, fbConfigs); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); @@ -133,10 +133,15 @@ bool openglMultiContextTest() return false; } - // set the pixel format to use to create all windows with pal_video - // this must be set before creating a window - // for this example, we set the closest we desired - palSetPixelFormat(closest->index); + // set the FBConfig that will be used by PAL video system + // to create windows. this must be set before creating a window + // for this example, we set the closest we desired. + // If pal_opengl and pal_video will be used together, + // then its recommended to use PAL_CONFIG_BACKEND_PAL_OPENGL + + // NOTE: If PAL video system will not be used, + // users need to call the direct OS call to achieve this. + result = palSetFBConfig(closest->index, PAL_CONFIG_BACKEND_PAL_OPENGL); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set GL pixel format: %s", error); diff --git a/tests/tests.lua b/tests/tests.lua index dc369d8..5af61d0 100644 --- a/tests/tests.lua +++ b/tests/tests.lua @@ -45,13 +45,13 @@ project "tests" if (PAL_BUILD_OPENGL) then files { - "opengl_test.c" + "opengl_test.c", + "opengl_fbconfig_test.c" } end if (PAL_BUILD_OPENGL and PAL_BUILD_VIDEO) then files { - "opengl_fbconfig_test.c", "opengl_context_test.c", "opengl_multi_context_test.c" } diff --git a/tests/tests_main.c b/tests/tests_main.c index 00d717b..cec4435 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -37,15 +37,15 @@ int main(int argc, char** argv) #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL - registerTest("Opengl Test", openglTest); + // registerTest("Opengl Test", openglTest); + // registerTest("Opengl FBConfig Test", openglFBConfigTest); #endif // PAL_HAS_OPENGL // This test can run without video system so long as your have a valid // window #if PAL_HAS_OPENGL && PAL_HAS_VIDEO - registerTest("Opengl FBConfig Test", openglFBConfigTest); // registerTest("Opengl Context Test", openglContextTest); - // registerTest("Opengl Multi Context Test", openglMultiContextTest); + registerTest("Opengl Multi Context Test", openglMultiContextTest); #endif // PAL_HAS_OPENGL runTests(); From 0880a5ccda9b1cb38cb1c8a6a5cc713639b267f3 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 12:44:10 +0000 Subject: [PATCH 25/30] Linux backend cleanup --- CHANGELOG.md | 2 +- include/pal/pal_core.h | 2 +- src/opengl/pal_opengl_linux.c | 93 ++++++++++++++++++++++++++++------- src/pal_core.c | 4 +- src/video/pal_video_linux.c | 9 ++-- src/video/pal_video_win32.c | 2 +- tests/tests_main.c | 40 +++++++-------- 7 files changed, 106 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 314bf1a..ccc8a7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ - **System:** Added Linux backend support. - **Video:** Added **palCreateCursorFrom()** to create system cursors. -PAL_RESULT_FBCONFIG_BACKEND +PAL_RESULT_INVALID_FBCONFIG_BACKEND PAL_VIDEO_FEATURE_SET_ICON PAL_PLATFORM_API_COCOA, diff --git a/include/pal/pal_core.h b/include/pal/pal_core.h index 6ccb5ad..ce82697 100644 --- a/include/pal/pal_core.h +++ b/include/pal/pal_core.h @@ -237,7 +237,7 @@ typedef enum { PAL_RESULT_INVALID_GL_VERSION, PAL_RESULT_INVALID_GL_PROFILE, PAL_RESULT_INVALID_GL_CONTEXT, - PAL_RESULT_INVALID_BACKEND + PAL_RESULT_INVALID_FBCONFIG_BACKEND } PalResult; /** diff --git a/src/opengl/pal_opengl_linux.c b/src/opengl/pal_opengl_linux.c index 61e88ce..a057bd3 100644 --- a/src/opengl/pal_opengl_linux.c +++ b/src/opengl/pal_opengl_linux.c @@ -32,10 +32,6 @@ freely, subject to the following restrictions: #include #include -#include -#include -#include - // ================================================== // Typedefs, enums and structs // ================================================== @@ -47,7 +43,23 @@ freely, subject to the following restrictions: #define GL_EXTENSIONS 0x1F03 #endif // GL_VENDOR -// TODO: +typedef unsigned int GLenum; +typedef unsigned char GLubyte; +typedef int32_t EGLint; +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; + +typedef unsigned long int khronos_uintptr_t; +typedef khronos_uintptr_t EGLNativeWindowType; + +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLNativeDisplayType; + +#ifndef EGL_OPENGL_API +// EGL header is not included /* C++ / C typecast macros for special EGL handle values */ #if defined(__cplusplus) #define EGL_CAST(type, value) (static_cast(value)) @@ -60,18 +72,63 @@ freely, subject to the following restrictions: #define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) #define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) #define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) - -typedef unsigned int GLenum; -typedef unsigned char GLubyte; -typedef int32_t EGLint; -typedef unsigned int EGLBoolean; -typedef unsigned int EGLenum; - -typedef void *EGLConfig; -typedef void *EGLSurface; -typedef void *EGLContext; -typedef void *EGLDisplay; -typedef void *EGLNativeDisplayType; +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_GL_COLORSPACE 0x309D +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RGB_BUFFER 0x308E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_SURFACE 0x300D +#define EGL_EXTENSIONS 0x3055 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NONE 0x3038 +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 + +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_RED_SIZE 0x3024 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_SAMPLES 0x3031 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_WINDOW_BIT 0x0004 +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB + +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 +#define EGL_GL_COLORSPACE_KHR 0x309D +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A + +#endif // EGL header typedef void* (*eglGetProcAddressFn)(const char*); @@ -419,7 +476,7 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) // Since we don't want to create dummy window to get the driver info // we use EGL_OPENGL_ES2_BIT to create without a window if (!(type & EGL_OPENGL_ES2_BIT)) { - // TODO: create a dummy window if EGL_OPENGL_ES2_BIT + // FIXME: create a dummy window if EGL_OPENGL_ES2_BIT return PAL_RESULT_PLATFORM_FAILURE; } diff --git a/src/pal_core.c b/src/pal_core.c index 02b634d..fa1e49b 100644 --- a/src/pal_core.c +++ b/src/pal_core.c @@ -336,8 +336,8 @@ const char* PAL_CALL palFormatResult(PalResult result) case PAL_RESULT_INVALID_GL_CONTEXT: return "Invalid opengl context"; - case PAL_RESULT_INVALID_BACKEND: - return "Invalid backend"; + case PAL_RESULT_INVALID_FBCONFIG_BACKEND: + return "Invalid FBConfg backend"; } return "Unknown"; } diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index 201a472..c459077 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -1825,8 +1825,7 @@ static PalResult xInitVideo() int supported; s_X11.setDetectableAutoRepeat(s_X11.display, True, &supported); if (!supported) { - // TODO: FIXME - // fallback to manual key repeat detection + // FIXME: fallback to manual key repeat detection } return PAL_RESULT_SUCCESS; @@ -1834,6 +1833,10 @@ static PalResult xInitVideo() static void xShutdownVideo() { + if (s_X11.colormap) { + s_X11.freeColormap(s_X11.display, s_X11.colormap); + } + s_X11.closeDisplay(s_X11.display); dlclose(s_X11.handle); dlclose(s_X11.xrandr); @@ -4057,7 +4060,7 @@ PalResult PAL_CALL palSetFBConfig( // X11 can used GLX and EGL if (backend == PAL_CONFIG_BACKEND_WGL) { - return PAL_RESULT_INVALID_BACKEND; + return PAL_RESULT_INVALID_FBCONFIG_BACKEND; } // we try to create a colormap to see if the index is valid diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 678751f..2702a80 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -1414,7 +1414,7 @@ PalResult PAL_CALL palSetFBConfig( if (backend != PAL_CONFIG_BACKEND_WGL || backend != PAL_CONFIG_BACKEND_PAL_OPENGL) { - return PAL_RESULT_INVALID_BACKEND; + return PAL_RESULT_INVALID_FBCONFIG_BACKEND; } if (index >= 1) { diff --git a/tests/tests_main.c b/tests/tests_main.c index cec4435..a972fa1 100644 --- a/tests/tests_main.c +++ b/tests/tests_main.c @@ -9,42 +9,42 @@ int main(int argc, char** argv) palLog(nullptr, "%s: %s", "PAL Version", palGetVersionString()); // core - // registerTest("Logger Test", loggerTest); - // registerTest("Time Test", timeTest); - // registerTest("User Event Test", userEventTest); - // registerTest("Event Test", eventTest); + registerTest("Logger Test", loggerTest); + registerTest("Time Test", timeTest); + registerTest("User Event Test", userEventTest); + registerTest("Event Test", eventTest); #if PAL_HAS_SYSTEM - // registerTest("System Test", systemTest); + registerTest("System Test", systemTest); #endif // PAL_HAS_SYSTEM #if PAL_HAS_THREAD - // registerTest("Thread Test", threadTest); - // registerTest("TLS Test", tlsTest); - // registerTest("Mutex Test", mutexTest); - // registerTest("Condvar Test", condvarTest); + registerTest("Thread Test", threadTest); + registerTest("TLS Test", tlsTest); + registerTest("Mutex Test", mutexTest); + registerTest("Condvar Test", condvarTest); #endif // PAL_HAS_THREAD #if PAL_HAS_VIDEO - // registerTest("Video Test", videoTest); - // registerTest("Monitor Test", monitorTest); - // registerTest("Monitor Mode Test", monitorModeTest); - // registerTest("Window Test", windowTest); - // registerTest("Icon Test", iconTest); - // registerTest("Cursor Test", cursorTest); - // registerTest("Input Window Test", inputWindowTest); - // registerTest("System Cursor Test", systemCursorTest); + registerTest("Video Test", videoTest); + registerTest("Monitor Test", monitorTest); + registerTest("Monitor Mode Test", monitorModeTest); + registerTest("Window Test", windowTest); + registerTest("Icon Test", iconTest); + registerTest("Cursor Test", cursorTest); + registerTest("Input Window Test", inputWindowTest); + registerTest("System Cursor Test", systemCursorTest); #endif // PAL_HAS_VIDEO #if PAL_HAS_OPENGL - // registerTest("Opengl Test", openglTest); - // registerTest("Opengl FBConfig Test", openglFBConfigTest); + registerTest("Opengl Test", openglTest); + registerTest("Opengl FBConfig Test", openglFBConfigTest); #endif // PAL_HAS_OPENGL // This test can run without video system so long as your have a valid // window #if PAL_HAS_OPENGL && PAL_HAS_VIDEO - // registerTest("Opengl Context Test", openglContextTest); + registerTest("Opengl Context Test", openglContextTest); registerTest("Opengl Multi Context Test", openglMultiContextTest); #endif // PAL_HAS_OPENGL From 2d42955c54edabe6af7d3eabc30d52483980a462 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 14:38:33 +0000 Subject: [PATCH 26/30] transparent icons and cursors --- include/pal/pal_opengl.h | 8 +- include/pal/pal_video.h | 24 +++--- src/opengl/pal_opengl_win32.c | 29 +++---- src/pal_core.c | 14 ++-- src/video/pal_video_win32.c | 152 +++++++++++++++------------------- 5 files changed, 105 insertions(+), 122 deletions(-) diff --git a/include/pal/pal_opengl.h b/include/pal/pal_opengl.h index ff7b098..e31ca92 100644 --- a/include/pal/pal_opengl.h +++ b/include/pal/pal_opengl.h @@ -312,10 +312,10 @@ PAL_API const PalGLFBConfig* PAL_CALL palGetClosestGLFBConfig( * * The opengl system must be initialized before this call. The created context * will not be made current. - * - * The provided PalGLFBConfig must be the same as the one used to create the window. - * Once set, it cannot be changed. To change it, you must destroy the window - * and recreate it. + * + * The provided PalGLFBConfig must be the same as the one used to create the + * window. Once set, it cannot be changed. To change it, you must destroy the + * window and recreate it. * * @param[in] info Pointer to a PalGLContextCreateInfo struct that specifies * paramters. Must not be nullptr. diff --git a/include/pal/pal_video.h b/include/pal/pal_video.h index b2a3eb4..98d6f69 100644 --- a/include/pal/pal_video.h +++ b/include/pal/pal_video.h @@ -191,8 +191,8 @@ typedef enum { * @enum PalFBConfigBackend * @brief Represents the backend of a FBConfig. * - * All FBConfig backends follow the format `PAL_CONFIG_BACKEND**` for consistency and - * API use. + * All FBConfig backends follow the format `PAL_CONFIG_BACKEND**` for + * consistency and API use. * * @since 1.1 * @ingroup pal_video @@ -694,19 +694,19 @@ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); * * The video system must be initialized before this call. * The provided FBConfig will be used for all created windows after this call. - * The `index` is the loop index from the drivers - * supported FBConfigs. - * + * The `index` is the loop index from the drivers + * supported FBConfigs. + * * The `backend` is used to tell the video system, the source of the index. - * Examples: PAL_CONFIG_BACKEND_EGL tells the video system, we got this loop index - * from EGL. This will enable the video system to find your FBConfig. - * + * Examples: PAL_CONFIG_BACKEND_EGL tells the video system, we got this loop + * index from EGL. This will enable the video system to find your FBConfig. + * * Example Flow: * Enumerate and select your FBConfig using any backend(EGL, GLX, WGL, etc) * and just let the video system know which one you used. - * - * If the backend passed is not the same as the one used, - * the video system might still get a FBConfig but it will not be the + * + * If the backend passed is not the same as the one used, + * the video system might still get a FBConfig but it will not be the * one requested. * * @param[in] index The FBConfig driver index. @@ -721,7 +721,7 @@ PAL_API PalVideoFeatures PAL_CALL palGetVideoFeatures(); * @ingroup pal_video */ PAL_API PalResult PAL_CALL palSetFBConfig( - const int index, + const int index, PalFBConfigBackend backend); /** diff --git a/src/opengl/pal_opengl_win32.c b/src/opengl/pal_opengl_win32.c index 0d21d20..91e9626 100644 --- a/src/opengl/pal_opengl_win32.c +++ b/src/opengl/pal_opengl_win32.c @@ -48,8 +48,6 @@ freely, subject to the following restrictions: // Typedefs, enums and structs // ================================================== -// TODO: use platform header file - #define PAL_GL_CLASS L"PALGLClass" // check to see if this is not defined yet @@ -420,7 +418,6 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) strcpy(s_Wgl.info.graphicsCard, renderer); // check available extensions - // TODO: use normal path const char* extensions = nullptr; if (s_Wgl.wglGetExtensionsStringARB) { extensions = s_Wgl.wglGetExtensionsStringARB(s_Wgl.hdc); @@ -694,10 +691,6 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( } } - if (free) { - ReleaseDC((HWND)glWindow->window, s_Wgl.hdc); - } - if (!configs) { *count = configCount; } @@ -832,6 +825,11 @@ PalResult PAL_CALL palCreateGLContext( return PAL_RESULT_INVALID_GL_FBCONFIG; } + HGLRC share = nullptr; + if (info->shareContext) { + share = (HGLRC)info->shareContext; + } + HGLRC context = nullptr; if (s_Wgl.wglCreateContextAttribsARB) { // create context with modern wgl functions @@ -904,8 +902,7 @@ PalResult PAL_CALL palCreateGLContext( } attribs[index++] = 0; - // TODO: put share context over here - context = s_Wgl.wglCreateContextAttribsARB(hdc, nullptr, attribs); + context = s_Wgl.wglCreateContextAttribsARB(hdc, share, attribs); if (!context) { DWORD error = GetLastError(); if (error == ERROR_INVALID_PROFILE_ARB) { @@ -921,14 +918,14 @@ PalResult PAL_CALL palCreateGLContext( if (!context) { return PAL_RESULT_PLATFORM_FAILURE; } - } - // share context - if (info->shareContext) { - if (!s_Wgl.wglShareLists((HGLRC)info->shareContext, context)) { - s_Wgl.wglDeleteContext(context); - ReleaseDC((HWND)info->window->window, hdc); - return PAL_RESULT_PLATFORM_FAILURE; + // share context + if (share) { + if (!s_Wgl.wglShareLists(share, context)) { + s_Wgl.wglDeleteContext(context); + ReleaseDC((HWND)info->window->window, hdc); + return PAL_RESULT_PLATFORM_FAILURE; + } } } diff --git a/src/pal_core.c b/src/pal_core.c index fa1e49b..48a3519 100644 --- a/src/pal_core.c +++ b/src/pal_core.c @@ -27,11 +27,11 @@ freely, subject to the following restrictions: #ifdef __linux__ #define _POSIX_C_SOURCE 200112L -#include -#include #include -#include #include +#include +#include +#include #endif // __linux__ #include "pal/pal_core.h" @@ -169,8 +169,8 @@ static inline LogTLSData* getLogTlsData() } FlsSetValue(s_TlsID, data); #elif defined(__linux__) - pthread_once(&s_TLSCreation, createTLSID); - pthread_setspecific(s_TLSID, data); + pthread_once(&s_TLSCreation, createTLSID); + pthread_setspecific(s_TLSID, data); #endif // _WIN32 } return data; @@ -227,7 +227,7 @@ static inline void writeToConsole(LogTLSData* data) } else { OutputDebugStringW(data->wideBuffer); } -#elif defined (__linux__) +#elif defined(__linux__) fprintf(stdout, "%s", data->buffer); fflush(stdout); #endif // _WIN32 @@ -336,7 +336,7 @@ const char* PAL_CALL palFormatResult(PalResult result) case PAL_RESULT_INVALID_GL_CONTEXT: return "Invalid opengl context"; - case PAL_RESULT_INVALID_FBCONFIG_BACKEND: + case PAL_RESULT_INVALID_FBCONFIG_BACKEND: return "Invalid FBConfg backend"; } return "Unknown"; diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 2702a80..2b430c0 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -396,7 +396,7 @@ LRESULT CALLBACK videoProc( case WM_MOUSEHWHEEL: { Int32 delta = GET_WHEEL_DELTA_WPARAM(wParam); - s_Mouse.WheelX = delta; // normalize with delta + s_Mouse.WheelX = delta / WHEEL_DELTA; if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; @@ -414,7 +414,7 @@ LRESULT CALLBACK videoProc( case WM_MOUSEWHEEL: { Int32 delta = GET_WHEEL_DELTA_WPARAM(wParam); - s_Mouse.WheelY = delta; // normalize with delta + s_Mouse.WheelY = delta / WHEEL_DELTA; if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; @@ -492,6 +492,7 @@ LRESULT CALLBACK videoProc( case WM_MBUTTONUP: case WM_XBUTTONUP: { PalMouseButton button = PAL_MOUSE_BUTTON_UNKNOWN; + PalEventType type; bool pressed = false; if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) { @@ -522,9 +523,11 @@ LRESULT CALLBACK videoProc( msg == WM_MBUTTONDOWN || msg == WM_XBUTTONDOWN) { pressed = true; + type = PAL_EVENT_MOUSE_BUTTONDOWN; } else { pressed = false; + type = PAL_EVENT_MOUSE_BUTTONUP; } // clang-format on @@ -537,31 +540,16 @@ LRESULT CALLBACK videoProc( ReleaseCapture(); } - // TODO: optimaize s_Mouse.state[button] = pressed; if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; - if (pressed) { - PalEventType type = PAL_EVENT_MOUSE_BUTTONDOWN; - mode = palGetEventDispatchMode(driver, type); - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = button; - event.data2 = palPackPointer((PalWindow*)hwnd); - palPushEvent(driver, &event); - } - - } else { - PalEventType type = PAL_EVENT_MOUSE_BUTTONUP; - mode = palGetEventDispatchMode(driver, type); - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = button; - event.data2 = palPackPointer((PalWindow*)hwnd); - palPushEvent(driver, &event); - } + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = button; + event.data2 = palPackPointer((PalWindow*)hwnd); + palPushEvent(driver, &event); } } return 0; @@ -573,6 +561,7 @@ LRESULT CALLBACK videoProc( case WM_SYSKEYUP: { PalKeycode keycode = PAL_KEYCODE_UNKNOWN; PalScancode scancode = PAL_SCANCODE_UNKNOWN; + PalEventType type; Int32 win32Keycode; Int32 win32Scancode; bool pressed = false; @@ -684,49 +673,28 @@ LRESULT CALLBACK videoProc( s_Keyboard.keycodeState[keycode] = true; s_Keyboard.scancodeState[scancode] = true; + type = PAL_EVENT_KEYDOWN; + if (repeat) { + type = PAL_EVENT_KEYREPEAT; + } + } else { s_Keyboard.keycodeState[keycode] = false; s_Keyboard.scancodeState[scancode] = false; + type = PAL_EVENT_KEYUP; } if (s_Video.eventDriver) { PalEventDriver* driver = s_Video.eventDriver; - if (pressed) { - if (repeat) { - PalEventType type = PAL_EVENT_KEYREPEAT; - mode = palGetEventDispatchMode(driver, type); - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = palPackUint32(keycode, scancode); - event.data2 = palPackPointer((PalWindow*)hwnd); - palPushEvent(driver, &event); - } - - } else { - PalEventType type = PAL_EVENT_KEYDOWN; - mode = palGetEventDispatchMode(driver, type); - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = palPackUint32(keycode, scancode); - event.data2 = palPackPointer((PalWindow*)hwnd); - palPushEvent(driver, &event); - } - } - } else { - PalEventType type = PAL_EVENT_KEYUP; - mode = palGetEventDispatchMode(driver, type); - if (mode != PAL_DISPATCH_NONE) { - PalEvent event = {0}; - event.type = type; - event.data = palPackUint32(keycode, scancode); - event.data2 = palPackPointer((PalWindow*)hwnd); - palPushEvent(driver, &event); - } + mode = palGetEventDispatchMode(driver, type); + if (mode != PAL_DISPATCH_NONE) { + PalEvent event = {0}; + event.type = type; + event.data = palPackUint32(keycode, scancode); + event.data2 = palPackPointer((PalWindow*)hwnd); + palPushEvent(driver, &event); } } - return 0; } @@ -1412,8 +1380,8 @@ PalResult PAL_CALL palSetFBConfig( return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (backend != PAL_CONFIG_BACKEND_WGL || - backend != PAL_CONFIG_BACKEND_PAL_OPENGL) { + if (backend == PAL_CONFIG_BACKEND_EGL || + backend == PAL_CONFIG_BACKEND_GLX) { return PAL_RESULT_INVALID_FBCONFIG_BACKEND; } @@ -2675,38 +2643,39 @@ PalResult PAL_CALL palCreateIcon( // convert RGBA to BGRA Uint8* pixels = (Uint8*)dibPixels; - for (Uint32 y = 0; y < info->height; ++y) { - for (Uint32 x = 0; x < info->width; ++x) { - int i = (y * info->width + x) * 4; - pixels[i + 0] = info->pixels[i + 2]; // Red - pixels[i + 1] = info->pixels[i + 1]; // Green - pixels[i + 2] = info->pixels[i + 0]; // Nlue - pixels[i + 3] = info->pixels[i + 3]; // Alpha + for (int i = 0; i < info->width * info->height; i++) { + Uint8 r = info->pixels[i * 4 + 0]; // Red + Uint8 g = info->pixels[i * 4 + 1]; // Green + Uint8 b = info->pixels[i * 4 + 2]; // Blue + Uint8 a = info->pixels[i * 4 + 3]; // Alpha + + // premultiply only if alpha is not 0 + if (a == 0) { + r = g = b = 0; + } else { + r = (Uint8)((r * a) / 255); + g = (Uint8)((g * a) / 255); + b = (Uint8)((b * a) / 255); } - } - // create mask - HBITMAP mask = nullptr; - mask = s_Video.createBitmap(info->width, info->height, 1, 1, nullptr); - if (!mask) { - s_Video.deleteObject(bitmap); - return PAL_RESULT_PLATFORM_FAILURE; + pixels[i * 4 + 0] = b; + pixels[i * 4 + 1] = g; + pixels[i * 4 + 2] = r; + pixels[i * 4 + 3] = a; } ICONINFO iconInfo = {0}; iconInfo.fIcon = TRUE; - iconInfo.hbmMask = mask; // TODO: set to nullptr to respect alpha + iconInfo.hbmMask = bitmap; iconInfo.hbmColor = bitmap; // create the icon with the icon info HICON icon = CreateIconIndirect(&iconInfo); if (!icon) { - s_Video.deleteObject(mask); s_Video.deleteObject(bitmap); return PAL_RESULT_PLATFORM_FAILURE; } - s_Video.deleteObject(mask); s_Video.deleteObject(bitmap); *outIcon = (PalIcon*)icon; return PAL_RESULT_SUCCESS; @@ -2789,26 +2758,43 @@ PalResult PAL_CALL palCreateCursor( } ReleaseDC(nullptr, hdc); - // copy pixels and create mask - memcpy(dibPixels, info->pixels, info->width * info->height * 4); - HBITMAP mask = s_Video.createBitmap(info->width, info->height, 1, 1, NULL); + // convert RGBA to BGRA + Uint8* pixels = (Uint8*)dibPixels; + for (int i = 0; i < info->width * info->height; i++) { + Uint8 r = info->pixels[i * 4 + 0]; // Red + Uint8 g = info->pixels[i * 4 + 1]; // Green + Uint8 b = info->pixels[i * 4 + 2]; // Blue + Uint8 a = info->pixels[i * 4 + 3]; // Alpha + + // premultiply only if alpha is not 0 + if (a == 0) { + r = g = b = 0; + } else { + r = (Uint8)((r * a) / 255); + g = (Uint8)((g * a) / 255); + b = (Uint8)((b * a) / 255); + } + + pixels[i * 4 + 0] = b; + pixels[i * 4 + 1] = g; + pixels[i * 4 + 2] = r; + pixels[i * 4 + 3] = a; + } ICONINFO iconInfo = {0}; iconInfo.fIcon = false; iconInfo.hbmColor = bitmap; - iconInfo.hbmMask = mask; // TODO: set to nullptr to respect alpha + iconInfo.hbmMask = bitmap; iconInfo.xHotspot = info->xHotspot; iconInfo.xHotspot = info->yHotspot; // create the cursor with the iconinfo HCURSOR cursor = CreateIconIndirect(&iconInfo); if (!cursor) { - s_Video.deleteObject(mask); s_Video.deleteObject(bitmap); return PAL_RESULT_PLATFORM_FAILURE; } - s_Video.deleteObject(mask); s_Video.deleteObject(bitmap); *outCursor = (PalCursor*)cursor; return PAL_RESULT_SUCCESS; From ab2cf0ced9bfad931c759d24235624fd8f6d6eb5 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 16:18:01 +0000 Subject: [PATCH 27/30] source format --- src/opengl/pal_opengl_linux.c | 387 ++++++++++++----------- src/system/pal_system_linux.c | 12 +- src/thread/pal_thread_linux.c | 9 +- src/video/pal_video_linux.c | 558 ++++++++++++++++------------------ src/video/pal_video_win32.c | 28 +- 5 files changed, 480 insertions(+), 514 deletions(-) diff --git a/src/opengl/pal_opengl_linux.c b/src/opengl/pal_opengl_linux.c index a057bd3..1998f46 100644 --- a/src/opengl/pal_opengl_linux.c +++ b/src/opengl/pal_opengl_linux.c @@ -27,10 +27,10 @@ freely, subject to the following restrictions: #include "pal/pal_opengl.h" +#include #include #include -#include -#include +#include // ================================================== // Typedefs, enums and structs @@ -49,14 +49,14 @@ typedef int32_t EGLint; typedef unsigned int EGLBoolean; typedef unsigned int EGLenum; -typedef unsigned long int khronos_uintptr_t; +typedef unsigned long int khronos_uintptr_t; typedef khronos_uintptr_t EGLNativeWindowType; -typedef void *EGLConfig; -typedef void *EGLSurface; -typedef void *EGLContext; -typedef void *EGLDisplay; -typedef void *EGLNativeDisplayType; +typedef void* EGLConfig; +typedef void* EGLSurface; +typedef void* EGLContext; +typedef void* EGLDisplay; +typedef void* EGLNativeDisplayType; #ifndef EGL_OPENGL_API // EGL header is not included @@ -64,101 +64,101 @@ typedef void *EGLNativeDisplayType; #if defined(__cplusplus) #define EGL_CAST(type, value) (static_cast(value)) #else -#define EGL_CAST(type, value) ((type) (value)) +#define EGL_CAST(type, value) ((type)(value)) #endif -#define EGL_OPENGL_API 0x30A2 -#define EGL_OPENGL_BIT 0x0008 -#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) -#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) -#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) -#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) -#define EGL_GL_COLORSPACE 0x309D -#define EGL_COLORSPACE_sRGB 0x3089 -#define EGL_COLORSPACE_LINEAR 0x308A -#define EGL_COLOR_BUFFER_TYPE 0x303F -#define EGL_OPENGL_ES_BIT 0x0001 -#define EGL_OPENGL_ES_API 0x30A0 -#define EGL_RENDERABLE_TYPE 0x3040 -#define EGL_RGB_BUFFER 0x308E -#define EGL_ALPHA_SIZE 0x3021 -#define EGL_BAD_ATTRIBUTE 0x3004 -#define EGL_BAD_CONFIG 0x3005 -#define EGL_BAD_CONTEXT 0x3006 -#define EGL_BAD_SURFACE 0x300D -#define EGL_EXTENSIONS 0x3055 -#define EGL_GREEN_SIZE 0x3023 -#define EGL_MAX_PBUFFER_WIDTH 0x302C -#define EGL_NATIVE_VISUAL_ID 0x302E -#define EGL_NONE 0x3038 -#define EGL_HEIGHT 0x3056 -#define EGL_WIDTH 0x3057 -#define EGL_OPENGL_ES_BIT 0x0001 -#define EGL_OPENGL_ES2_BIT 0x0004 -#define EGL_OPENGL_ES3_BIT 0x00000040 - -#define EGL_PBUFFER_BIT 0x0001 -#define EGL_RED_SIZE 0x3024 -#define EGL_BLUE_SIZE 0x3022 -#define EGL_DEPTH_SIZE 0x3025 -#define EGL_SAMPLES 0x3031 -#define EGL_STENCIL_SIZE 0x3026 -#define EGL_SURFACE_TYPE 0x3033 -#define EGL_WINDOW_BIT 0x0004 -#define EGL_CONTEXT_MAJOR_VERSION 0x3098 -#define EGL_CONTEXT_MINOR_VERSION 0x30FB - -#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 -#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB -#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext, 0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay, 0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface, 0) +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType, 0) +#define EGL_GL_COLORSPACE 0x309D +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RGB_BUFFER 0x308E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_SURFACE 0x300D +#define EGL_EXTENSIONS 0x3055 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NONE 0x3038 +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 + +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_RED_SIZE 0x3024 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_SAMPLES 0x3031 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_WINDOW_BIT 0x0004 +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB + +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC #define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD #define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD -#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE -#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF -#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 #define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 #define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 #define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 #define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 -#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 -#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 -#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 #define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 -#define EGL_GL_COLORSPACE_KHR 0x309D -#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 -#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#define EGL_GL_COLORSPACE_KHR 0x309D +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A #endif // EGL header typedef void* (*eglGetProcAddressFn)(const char*); typedef EGLContext (*eglCreateContextFn)( - EGLDisplay, - EGLConfig, - EGLContext, + EGLDisplay, + EGLConfig, + EGLContext, const EGLint*); typedef EGLBoolean (*eglDestroyContextFn)( - EGLDisplay, + EGLDisplay, EGLContext); typedef EGLBoolean (*eglMakeCurrentFn)( - EGLDisplay, - EGLSurface, - EGLSurface, + EGLDisplay, + EGLSurface, + EGLSurface, EGLContext); typedef EGLBoolean (*eglSwapBuffersFn)( - EGLDisplay, + EGLDisplay, EGLSurface); typedef EGLBoolean (*eglSwapIntervalFn)( - EGLDisplay, + EGLDisplay, EGLint); typedef EGLBoolean (*eglInitializeFn)( - EGLDisplay, - EGLint*, + EGLDisplay, + EGLint*, EGLint*); typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); @@ -166,48 +166,48 @@ typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); typedef EGLDisplay (*eglGetDisplayFn)(EGLNativeDisplayType); typedef EGLBoolean (*eglDestroySurfaceFn)( - EGLDisplay, + EGLDisplay, EGLSurface); typedef EGLSurface (*eglCreatePbufferSurfaceFn)( - EGLDisplay, - EGLConfig, + EGLDisplay, + EGLConfig, const EGLint*); typedef EGLBoolean (*eglChooseConfigFn)( - EGLDisplay, - const EGLint*, - EGLConfig*, - EGLint, + EGLDisplay, + const EGLint*, + EGLConfig*, + EGLint, EGLint*); typedef EGLBoolean (*eglGetConfigAttribFn)( - EGLDisplay, - EGLConfig, - EGLint, + EGLDisplay, + EGLConfig, + EGLint, EGLint*); typedef EGLint (*eglGetErrorFn)(void); typedef EGLBoolean (*eglBindAPIFn)(EGLenum); -typedef const char *(*eglQueryStringFn)( - EGLDisplay, +typedef const char* (*eglQueryStringFn)( + EGLDisplay, EGLint); typedef EGLBoolean (*eglGetConfigsFn)( - EGLDisplay, - EGLConfig*, - EGLint, + EGLDisplay, + EGLConfig*, + EGLint, EGLint*); -typedef EGLSurface (*eglCreateWindowSurfaceFn) ( - EGLDisplay, - EGLConfig, - EGLNativeWindowType, +typedef EGLSurface (*eglCreateWindowSurfaceFn)( + EGLDisplay, + EGLConfig, + EGLNativeWindowType, const EGLint*); -typedef const GLubyte*(*glGetStringFn)(GLenum); +typedef const GLubyte* (*glGetStringFn)(GLenum); typedef struct { bool used; @@ -238,7 +238,7 @@ typedef struct { eglQueryStringFn eglQueryString; eglGetConfigsFn eglGetConfigs; eglCreateWindowSurfaceFn eglCreateWindowSurface; - + glGetStringFn glGetString; void* handle; @@ -282,7 +282,7 @@ static inline bool checkExtension( } } -static ContextData* getFreeContextData() +static ContextData* getFreeContextData() { for (int i = 0; i < s_GL.maxContextData; ++i) { if (!s_GL.contextData[i].used) { @@ -299,8 +299,8 @@ static ContextData* getFreeContextData() data = palAllocate(s_GL.allocator, sizeof(ContextData) * count, 0); if (data) { memcpy( - data, - s_GL.contextData, + data, + s_GL.contextData, s_GL.maxContextData * sizeof(ContextData)); palFree(s_GL.allocator, s_GL.contextData); @@ -313,20 +313,20 @@ static ContextData* getFreeContextData() return nullptr; } -static ContextData* findContextData(PalGLContext* context) +static ContextData* findContextData(PalGLContext* context) { for (int i = 0; i < s_GL.maxContextData; ++i) { - if (s_GL.contextData[i].used && + if (s_GL.contextData[i].used && s_GL.contextData[i].context == context) { return &s_GL.contextData[i]; } } } -static void freeContextData(PalGLContext* context) +static void freeContextData(PalGLContext* context) { for (int i = 0; i < s_GL.maxContextData; ++i) { - if (s_GL.contextData[i].used && + if (s_GL.contextData[i].used && s_GL.contextData[i].context == context) { s_GL.contextData[i].used = false; } @@ -362,8 +362,10 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) return PAL_RESULT_PLATFORM_FAILURE; } + // clang-format off + s_GL.eglGetProcAddress = (eglGetProcAddressFn)dlsym( - s_GL.handle, + s_GL.handle, "eglGetProcAddress"); s_GL.eglCreateContext = (eglCreateContextFn)s_GL.eglGetProcAddress( @@ -387,16 +389,13 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) s_GL.eglInitialize = (eglInitializeFn)s_GL.eglGetProcAddress( "eglInitialize"); - s_GL.eglTerminate = (eglTerminateFn)s_GL.eglGetProcAddress( - "eglTerminate"); + s_GL.eglTerminate = (eglTerminateFn)s_GL.eglGetProcAddress("eglTerminate"); s_GL.eglGetDisplay = (eglGetDisplayFn)s_GL.eglGetProcAddress( "eglGetDisplay"); - // clang-format off s_GL.eglCreatePbufferSurface = (eglCreatePbufferSurfaceFn)s_GL.eglGetProcAddress( "eglCreatePbufferSurface"); - // clang-format on s_GL.eglChooseConfig = (eglChooseConfigFn)s_GL.eglGetProcAddress( "eglChooseConfig"); @@ -404,11 +403,8 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) s_GL.eglGetConfigAttrib = (eglGetConfigAttribFn)s_GL.eglGetProcAddress( "eglGetConfigAttrib"); - s_GL.eglGetError = (eglGetErrorFn)s_GL.eglGetProcAddress( - "eglGetError"); - - s_GL.eglBindAPI = (eglBindAPIFn)s_GL.eglGetProcAddress( - "eglBindAPI"); + s_GL.eglGetError = (eglGetErrorFn)s_GL.eglGetProcAddress("eglGetError"); + s_GL.eglBindAPI = (eglBindAPIFn)s_GL.eglGetProcAddress("eglBindAPI"); s_GL.eglQueryString = (eglQueryStringFn)s_GL.eglGetProcAddress( "eglQueryString"); @@ -417,27 +413,26 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) "eglGetConfigs"); s_GL.eglCreateWindowSurface = (eglCreateWindowSurfaceFn)s_GL.eglGetProcAddress( - "eglCreateWindowSurface"); + "eglCreateWindowSurface"); if (!s_GL.eglBindAPI || !s_GL.eglChooseConfig || - !s_GL.eglCreateContext || - !s_GL.eglCreatePbufferSurface || + !s_GL.eglCreateContext || + !s_GL.eglCreatePbufferSurface || !s_GL.eglDestroyContext || - !s_GL.eglDestroySurface || + !s_GL.eglDestroySurface || !s_GL.eglGetConfigAttrib || - !s_GL.eglGetDisplay || - !s_GL.eglGetError || + !s_GL.eglGetDisplay || + !s_GL.eglGetError || !s_GL.eglGetProcAddress || - !s_GL.eglInitialize || - !s_GL.eglMakeCurrent || + !s_GL.eglInitialize || + !s_GL.eglMakeCurrent || !s_GL.eglSwapBuffers || - !s_GL.eglSwapInterval || - !s_GL.eglTerminate || + !s_GL.eglSwapInterval || + !s_GL.eglTerminate || !s_GL.eglQueryString || - !s_GL.eglGetConfigs || - !s_GL.eglCreateWindowSurface - ) { + !s_GL.eglGetConfigs || + !s_GL.eglCreateWindowSurface) { return PAL_RESULT_PLATFORM_FAILURE; } @@ -480,16 +475,15 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) return PAL_RESULT_PLATFORM_FAILURE; } + EGLSurface surface = EGL_NO_SURFACE; EGLint pBufferAttribs[] = { - EGL_WIDTH, - 1, - EGL_HEIGHT, - 1, + EGL_WIDTH, 1, E + GL_HEIGHT, 1, EGL_NONE}; - EGLSurface surface = s_GL.eglCreatePbufferSurface( - display, - config, + surface = s_GL.eglCreatePbufferSurface( + display, + config, pBufferAttribs); if (surface == EGL_NO_SURFACE) { @@ -497,26 +491,23 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) } EGLint contextAttrib[] = { - EGL_CONTEXT_MAJOR_VERSION, - 2, - EGL_CONTEXT_MINOR_VERSION, - 1, + EGL_CONTEXT_MAJOR_VERSION, 2, + EGL_CONTEXT_MINOR_VERSION, 1, EGL_NONE}; // create a dummy context - EGLContext context = s_GL.eglCreateContext( - display, + EGLContext context = EGL_NO_CONTEXT; + context = s_GL.eglCreateContext( + display, config, - EGL_NO_CONTEXT, + EGL_NO_CONTEXT, contextAttrib); if (!s_GL.eglMakeCurrent(display, surface, surface, context)) { return PAL_RESULT_PLATFORM_FAILURE; } - s_GL.glGetString = (glGetStringFn)s_GL.eglGetProcAddress( - "glGetString"); - + s_GL.glGetString = (glGetStringFn)s_GL.eglGetProcAddress("glGetString"); const char* version = (const char*)s_GL.glGetString(GL_VERSION); if (version) { #ifdef _MSC_VER @@ -575,7 +566,7 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) // part of the core API s_GL.info.extensions |= PAL_GL_EXTENSION_MULTISAMPLE; - if (type & EGL_OPENGL_ES_BIT || + if (type & EGL_OPENGL_ES_BIT || type & EGL_OPENGL_ES2_BIT || type & EGL_OPENGL_ES3_BIT) { s_GL.info.extensions |= PAL_GL_EXTENSION_CONTEXT_PROFILE_ES2; @@ -587,11 +578,13 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) } s_GL.eglMakeCurrent( - display, - EGL_NO_SURFACE, - EGL_NO_SURFACE, + display, + EGL_NO_SURFACE, + EGL_NO_SURFACE, EGL_NO_CONTEXT); + // clang-format on + s_GL.eglDestroyContext(display, context); s_GL.eglDestroySurface(display, surface); @@ -651,11 +644,8 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( return PAL_RESULT_PLATFORM_FAILURE; } - EGLConfig* eglConfigs = palAllocate( - s_GL.allocator, - sizeof(EGLConfig) * numConfigs, - 0); - + EGLint configSize = sizeof(EGLConfig) * numConfigs; + EGLConfig* eglConfigs = palAllocate(s_GL.allocator, configSize, 0); if (!eglConfigs) { return PAL_RESULT_OUT_OF_MEMORY; } @@ -668,21 +658,21 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( EGLConfig config = eglConfigs[i]; s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_SURFACE_TYPE, + s_GL.display, + config, + EGL_SURFACE_TYPE, &surfaceType); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_RENDERABLE_TYPE, + s_GL.display, + config, + EGL_RENDERABLE_TYPE, &renderable); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_COLOR_BUFFER_TYPE, + s_GL.display, + config, + EGL_COLOR_BUFFER_TYPE, &colorType); // we need only opengl API configs @@ -707,45 +697,45 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( EGLint depthBits, stencilBits, samples; s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_RED_SIZE, + s_GL.display, + config, + EGL_RED_SIZE, &redBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_GREEN_SIZE, + s_GL.display, + config, + EGL_GREEN_SIZE, &greenBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_BLUE_SIZE, + s_GL.display, + config, + EGL_BLUE_SIZE, &blueBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_ALPHA_SIZE, + s_GL.display, + config, + EGL_ALPHA_SIZE, &alphaBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_DEPTH_SIZE, + s_GL.display, + config, + EGL_DEPTH_SIZE, &depthBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_STENCIL_SIZE, + s_GL.display, + config, + EGL_STENCIL_SIZE, &stencilBits); s_GL.eglGetConfigAttrib( - s_GL.display, - config, - EGL_SAMPLES, + s_GL.display, + config, + EGL_SAMPLES, &samples); if (samples == 0) { @@ -767,8 +757,7 @@ PalResult PAL_CALL palEnumerateGLFBConfigs( if (s_GL.info.extensions & PAL_GL_EXTENSION_COLORSPACE_SRGB) { // since EGL does not have a bit to check SRGB support // we check if all the color bits are greater than or equal to 8 - if (fbConfig->redBits >= 8 && - fbConfig->greenBits >= 8 && + if (fbConfig->redBits >= 8 && fbConfig->greenBits >= 8 && fbConfig->blueBits >= 8) { fbConfig->sRGB = true; } @@ -920,11 +909,8 @@ PalResult PAL_CALL palCreateGLContext( return PAL_RESULT_PLATFORM_FAILURE; } - EGLConfig* eglConfigs = palAllocate( - s_GL.allocator, - sizeof(EGLConfig) * numConfigs, - 0); - + EGLint configSize = sizeof(EGLConfig) * numConfigs; + EGLConfig* eglConfigs = palAllocate(s_GL.allocator, configSize, 0); if (!eglConfigs) { return PAL_RESULT_OUT_OF_MEMORY; } @@ -960,7 +946,7 @@ PalResult PAL_CALL palCreateGLContext( } else if (info->profile == PAL_GL_PROFILE_CORE) { profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; } - + attribs[index++] = info->profile; } @@ -1005,12 +991,14 @@ PalResult PAL_CALL palCreateGLContext( } attribs[index++] = EGL_NONE; + // clang-format off // create context EGLContext context = s_GL.eglCreateContext( s_GL.display, - config, - EGL_NO_CONTEXT, + config, + EGL_NO_CONTEXT, attribs); + // clang-format on if (context == EGL_NO_CONTEXT) { EGLint error = s_GL.eglGetError(); @@ -1021,7 +1009,7 @@ PalResult PAL_CALL palCreateGLContext( // we just return invalid version // it could be invalid profile return PAL_RESULT_INVALID_GL_VERSION; - + } else { return PAL_RESULT_PLATFORM_FAILURE; } @@ -1039,8 +1027,8 @@ PalResult PAL_CALL palCreateGLContext( surfaceAttribs[2] = EGL_NONE; EGLSurface surface = s_GL.eglCreateWindowSurface( - s_GL.display, - config, + s_GL.display, + config, (EGLNativeWindowType)info->window->window, surfaceAttribs); @@ -1055,7 +1043,6 @@ PalResult PAL_CALL palCreateGLContext( } palFree(s_GL.allocator, eglConfigs); - data->context = (PalGLContext*)context; data->surface = surface; @@ -1094,9 +1081,9 @@ PalResult PAL_CALL palMakeContextCurrent( } EGLint ret = s_GL.eglMakeCurrent( - s_GL.display, - data->surface, - data->surface, + s_GL.display, + data->surface, + data->surface, (EGLConfig)context); if (!ret) { @@ -1107,7 +1094,7 @@ PalResult PAL_CALL palMakeContextCurrent( } else if (error == EGL_BAD_SURFACE) { // since we always create a window surface return PAL_RESULT_INVALID_GL_WINDOW; - + } else { return PAL_RESULT_PLATFORM_FAILURE; } @@ -1130,7 +1117,7 @@ void* PAL_CALL palGLGetProcAddress(const char* name) return nullptr; } - return s_GL.eglGetProcAddress(name); + return s_GL.eglGetProcAddress(name); } PalResult PAL_CALL palSwapBuffers( @@ -1158,7 +1145,7 @@ PalResult PAL_CALL palSwapBuffers( } else if (error == EGL_BAD_SURFACE) { // since we always create a window surface return PAL_RESULT_INVALID_GL_WINDOW; - + } else { return PAL_RESULT_PLATFORM_FAILURE; } diff --git a/src/system/pal_system_linux.c b/src/system/pal_system_linux.c index 907fcd6..6d9e731 100644 --- a/src/system/pal_system_linux.c +++ b/src/system/pal_system_linux.c @@ -27,13 +27,13 @@ freely, subject to the following restrictions: #include "pal/pal_system.h" -#include +#include +#include +#include #include +#include #include #include -#include -#include -#include // ================================================== // Typedefs, enums and structs @@ -43,7 +43,7 @@ freely, subject to the following restrictions: // Internal API // ================================================== -static Uint32 parseCache(const char* path) +static Uint32 parseCache(const char* path) { long cacheSize = 0; FILE* file = fopen(path, "r"); @@ -189,7 +189,7 @@ PalResult PAL_CALL palGetCPUInfo( } else if (strcmp(token, "avx512f") == 0) { info->features |= PAL_CPU_FEATURE_AVX512F; - + } else if (strcmp(token, "fma") == 0) { info->features |= PAL_CPU_FEATURE_FMA3; diff --git a/src/thread/pal_thread_linux.c b/src/thread/pal_thread_linux.c index 50dd7ae..b20a669 100644 --- a/src/thread/pal_thread_linux.c +++ b/src/thread/pal_thread_linux.c @@ -27,12 +27,12 @@ freely, subject to the following restrictions: #define _GNU_SOURCE #define _POSIX_C_SOURCE 200112L -#include #include +#include #include -#include #include #include +#include #include "pal/pal_thread.h" @@ -57,7 +57,6 @@ struct PalCondVar { // Internal API // ================================================== - // ================================================== // Public API // ================================================== @@ -244,7 +243,7 @@ PalResult PAL_CALL palSetThreadPriority( setpriority(PRIO_PROCESS, 0, 0); break; } - + case PAL_THREAD_PRIORITY_HIGH: { struct sched_param param; param.sched_priority = 10; @@ -279,7 +278,7 @@ PalResult PAL_CALL palSetThreadAffinity( pthread_t _thread = FROM_PAL_HANDLE(pthread_t, thread); int ret = pthread_setaffinity_np(_thread, sizeof(cpuset), &cpuset); if (ret == 0) { - return PAL_RESULT_SUCCESS; + return PAL_RESULT_SUCCESS; } else { return PAL_RESULT_INVALID_THREAD; } diff --git a/src/video/pal_video_linux.c b/src/video/pal_video_linux.c index c459077..234795d 100644 --- a/src/video/pal_video_linux.c +++ b/src/video/pal_video_linux.c @@ -27,20 +27,20 @@ freely, subject to the following restrictions: #include "pal/pal_video.h" -#include -#include -#include #include +#include +#include +#include #include // X11 headers -#include +#include #include +#include +#include #include #include #include -#include -#include #include // Wayland headers @@ -55,25 +55,25 @@ freely, subject to the following restrictions: #define TO_PAL_HANDLE(type, val) ((type*)(UintPtr)(val)) #define FROM_PAL_HANDLE(type, handle) ((type)(UintPtr)(handle)) -typedef void *EGLConfig; -typedef void *EGLSurface; -typedef void *EGLContext; -typedef void *EGLDisplay; -typedef void *EGLNativeDisplayType; +typedef void* EGLConfig; +typedef void* EGLSurface; +typedef void* EGLContext; +typedef void* EGLDisplay; +typedef void* EGLNativeDisplayType; /* C++ / C typecast macros for special EGL handle values */ #if defined(__cplusplus) #define EGL_CAST(type, value) (static_cast(value)) #else -#define EGL_CAST(type, value) ((type) (value)) +#define EGL_CAST(type, value) ((type)(value)) #endif -#define EGL_OPENGL_API 0x30A2 -#define EGL_OPENGL_BIT 0x0008 -#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) -#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) -#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) -#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext, 0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay, 0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface, 0) +#define EGL_NATIVE_VISUAL_ID 0x302E typedef int32_t EGLint; typedef unsigned int EGLBoolean; @@ -82,8 +82,8 @@ typedef unsigned int EGLenum; typedef void* (*eglGetProcAddressFn)(const char*); typedef EGLBoolean (*eglInitializeFn)( - EGLDisplay, - EGLint*, + EGLDisplay, + EGLint*, EGLint*); typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); @@ -91,16 +91,16 @@ typedef EGLBoolean (*eglTerminateFn)(EGLDisplay); typedef EGLDisplay (*eglGetDisplayFn)(void*); typedef EGLBoolean (*eglChooseConfigFn)( - EGLDisplay, - const EGLint*, - EGLConfig*, - EGLint, + EGLDisplay, + const EGLint*, + EGLConfig*, + EGLint, EGLint*); typedef EGLBoolean (*eglGetConfigAttribFn)( - EGLDisplay, - EGLConfig, - EGLint, + EGLDisplay, + EGLConfig, + EGLint, EGLint*); typedef EGLint (*eglGetErrorFn)(void); @@ -108,9 +108,9 @@ typedef EGLint (*eglGetErrorFn)(void); typedef EGLBoolean (*eglBindAPIFn)(EGLenum); typedef EGLBoolean (*eglGetConfigsFn)( - EGLDisplay, - EGLConfig*, - EGLint, + EGLDisplay, + EGLConfig*, + EGLint, EGLint*); typedef struct { @@ -178,7 +178,7 @@ typedef struct { // optionally, needed to create visual from FBConfig #define GLX_FBCONFIG_ID 0x8012 -typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef struct __GLXFBConfigRec* GLXFBConfig; typedef GLXFBConfig* (*GLXGetFBConfigsFn)( Display*, @@ -209,18 +209,18 @@ typedef int (*XGetWindowPropertyFn)( Display*, Window, Atom, - long, - long, - Bool, - Atom, - Atom*, - int*, - unsigned long*, - unsigned long*, + long, + long, + Bool, + Atom, + Atom*, + int*, + unsigned long*, + unsigned long*, unsigned char**); typedef Atom (*XInternAtomFn)( - Display*, + Display*, _Xconst char*, Bool); @@ -360,7 +360,7 @@ typedef int (*XRRSetCrtcConfigFn)( XRRScreenResources*, RRCrtc, Time, - int, + int, int, RRMode, Rotation, @@ -368,43 +368,40 @@ typedef int (*XRRSetCrtcConfigFn)( int); typedef XRRScreenResources* (*XRRGetScreenResourcesFn)( - Display*, + Display*, Window); typedef RROutput (*XRRGetOutputPrimaryFn)( - Display*, + Display*, Window); typedef XRROutputInfo* (*XRRGetOutputInfoFn)( - Display*, + Display*, XRRScreenResources*, RROutput); typedef XRRCrtcInfo* (*XRRGetCrtcInfoFn)( - Display*, + Display*, XRRScreenResources*, RRCrtc); -typedef void (*XRRFreeScreenResourcesFn)( - XRRScreenResources*); +typedef void (*XRRFreeScreenResourcesFn)(XRRScreenResources*); -typedef void (*XRRFreeOutputInfoFn)( - XRROutputInfo*); +typedef void (*XRRFreeOutputInfoFn)(XRROutputInfo*); -typedef void (*XRRFreeCrtcInfoFn)( - XRRCrtcInfo*); +typedef void (*XRRFreeCrtcInfoFn)(XRRCrtcInfo*); typedef void (*XRRSelectInputFn)( - Display*, - Window, + Display*, + Window, int); typedef int (*XRRQueryExtensionFn)( Display*, - int*, - int*); + int*, + int*); -typedef XClassHint *(*XAllocClassHintFn)(void); +typedef XClassHint* (*XAllocClassHintFn)(void); typedef int (*XSetClassHintFn)( Display*, @@ -477,7 +474,7 @@ typedef int (*XUngrabPointerFn)( Display*, Time); -typedef XWMHints *(*XAllocWMHintsFn) (void); +typedef XWMHints* (*XAllocWMHintsFn)(void); typedef int (*XMapRaisedFn)( Display*, @@ -496,7 +493,7 @@ typedef int (*XFreeCursorFn)( Display*, Cursor); -typedef XWMHints *(*XGetWMHintsFn)( +typedef XWMHints* (*XGetWMHintsFn)( Display*, Window); @@ -527,18 +524,18 @@ typedef Pixmap (*XCreatePixmapFn)( unsigned int, unsigned int); -typedef XVisualInfo *(*XGetVisualInfoFn)( +typedef XVisualInfo* (*XGetVisualInfoFn)( Display*, long, XVisualInfo*, int*); typedef Cursor (*XcursorImageLoadCursorFn)( - Display*, + Display*, const XcursorImage*); typedef XcursorImage* (*XcursorImageCreateFn)( - int, + int, int); typedef void (*XcursorImageDestroyFn)(XcursorImage*); @@ -547,13 +544,12 @@ typedef KeySym (*XLookupKeysymFn)( XKeyEvent*, int); -typedef int (*XkbSetDetectableAutoRepeatFn)( - Display*, - int, - int*); +typedef int (*XkbSetDetectableAutoRepeatFn)( + Display*, + int, + int*); -typedef struct -{ +typedef struct { bool unicodeTitle; Atom WM_DELETE_WINDOW; @@ -685,6 +681,7 @@ static X11Atoms s_X11Atoms = {0}; #pragma endregion typedef struct { + // clang-format off void (*shutdownVideo)(); void (*updateVideo)(); PalResult (*enumerateMonitors)(Int32*, PalMonitor**); @@ -704,7 +701,6 @@ typedef struct { PalResult (*showWindow)(PalWindow*); PalResult (*hideWindow)(PalWindow*); PalResult (*xFlashWindow)(PalWindow*, const PalFlashInfo*); - PalResult (*getWindowStyle)(PalWindow*, PalWindowStyle*); PalResult (*getWindowMonitor)(PalWindow*, PalMonitor**); PalResult (*getWindowTitle)(PalWindow*, Uint64, Uint64*, char*); @@ -733,6 +729,7 @@ typedef struct { PalResult (*getCursorPos)(PalWindow*, Int32*, Int32*); PalResult (*setCursorPos)(PalWindow*, Int32, Int32); PalResult (*setWindowCursor)(PalWindow*, PalCursor*); + // clang-format off } Backend; typedef struct { @@ -757,7 +754,9 @@ static EGL s_Egl; // Internal API // ================================================== -static int compareModes(const void* a, const void* b) +static int compareModes( + const void* a, + const void* b) { const PalMonitorMode* mode1 = (const PalMonitorMode*)a; const PalMonitorMode* mode2 = (const PalMonitorMode*)b; @@ -780,7 +779,7 @@ static int compareModes(const void* a, const void* b) } } -static WindowData* getFreeWindowData() +static WindowData* getFreeWindowData() { for (int i = 0; i < s_Video.maxWindowData; ++i) { if (!s_Video.windowData[i].used) { @@ -798,8 +797,8 @@ static WindowData* getFreeWindowData() data = palAllocate(s_Video.allocator, sizeof(WindowData) * count, 0); if (data) { memcpy( - data, - s_Video.windowData, + data, + s_Video.windowData, s_Video.maxWindowData * sizeof(WindowData)); palFree(s_Video.allocator, s_Video.windowData); @@ -812,15 +811,15 @@ static WindowData* getFreeWindowData() return nullptr; } -static void resetMonitorData() +static void resetMonitorData() { memset( - s_Video.monitorData, - 0, + s_Video.monitorData, + 0, s_Video.maxMonitorData * sizeof(MonitorData)); } -static MonitorData* getFreeMonitorData() +static MonitorData* getFreeMonitorData() { for (int i = 0; i < s_Video.maxMonitorData; ++i) { if (!s_Video.monitorData[i].used) { @@ -837,8 +836,8 @@ static MonitorData* getFreeMonitorData() data = palAllocate(s_Video.allocator, sizeof(MonitorData) * count, 0); if (data) { memcpy( - data, - s_Video.monitorData, + data, + s_Video.monitorData, s_Video.maxMonitorData * sizeof(MonitorData)); palFree(s_Video.allocator, s_Video.monitorData); @@ -851,27 +850,27 @@ static MonitorData* getFreeMonitorData() return nullptr; } -static MonitorData* findMonitorData(PalMonitor* monitor) +static MonitorData* findMonitorData(PalMonitor* monitor) { for (int i = 0; i < s_Video.maxMonitorData; ++i) { - if (s_Video.monitorData[i].used && + if (s_Video.monitorData[i].used && s_Video.monitorData[i].monitor == monitor) { return &s_Video.monitorData[i]; } } } -static void freeMonitorData(PalMonitor* monitor) +static void freeMonitorData(PalMonitor* monitor) { for (int i = 0; i < s_Video.maxMonitorData; ++i) { - if (s_Video.monitorData[i].used && + if (s_Video.monitorData[i].used && s_Video.monitorData[i].monitor == monitor) { s_Video.monitorData[i].used = false; } } } -static PalResult glxBackend() +static PalResult glxBackend() { // user choose GLX FBConfig backend if (!s_X11.glxHandle) { @@ -879,10 +878,12 @@ static PalResult glxBackend() return PAL_RESULT_PLATFORM_FAILURE; } + // clang-format off + int count = 0; GLXFBConfig* configs = s_X11.glxGetFBConfigs( - s_X11.display, - s_X11.screen, + s_X11.display, + s_X11.screen, &count); GLXFBConfig fbConfig = configs[s_Video.pixelFormat]; @@ -892,19 +893,21 @@ static PalResult glxBackend() // get a matching visual XVisualInfo* visualInfo = s_X11.glxGetVisualFromFBConfig( - s_X11.display, + s_X11.display, fbConfig); - + if (!visualInfo) { return PAL_RESULT_INVALID_GL_FBCONFIG; } + // clang-format on + s_X11.visual = visualInfo->visual; s_X11.depth = visualInfo->depth; s_X11.colormap = s_X11.createColormap( - s_X11.display, - s_X11.root, - visualInfo->visual, + s_X11.display, + s_X11.root, + visualInfo->visual, AllocNone); if (!s_X11.colormap) { @@ -914,7 +917,7 @@ static PalResult glxBackend() return PAL_RESULT_SUCCESS; } -static PalResult eglXBackend(int index) +static PalResult eglXBackend(int index) { // user choose EGL FBConfig backend if (!s_Egl.handle) { @@ -941,11 +944,8 @@ static PalResult eglXBackend(int index) return PAL_RESULT_PLATFORM_FAILURE; } - EGLConfig* eglConfigs = palAllocate( - s_Video.allocator, - sizeof(EGLConfig) * numConfigs, - 0); - + EGLint configSize = sizeof(EGLConfig) * numConfigs; + EGLConfig* eglConfigs = palAllocate(s_Video.allocator, configSize, 0); if (!eglConfigs) { return PAL_RESULT_OUT_OF_MEMORY; } @@ -964,12 +964,14 @@ static PalResult eglXBackend(int index) XVisualInfo tmp; tmp.visualid = visualID; + // clang-format off // get a matching visual info XVisualInfo* visualInfo = s_X11.getVisualInfo( s_X11.display, VisualIDMask, &tmp, &numVisuals); + // clang-format on if (!visualInfo) { return PAL_RESULT_INVALID_GL_FBCONFIG; @@ -978,9 +980,9 @@ static PalResult eglXBackend(int index) s_X11.visual = visualInfo->visual; s_X11.depth = visualInfo->depth; s_X11.colormap = s_X11.createColormap( - s_X11.display, - s_X11.root, - visualInfo->visual, + s_X11.display, + s_X11.root, + visualInfo->visual, AllocNone); if (!s_X11.colormap) { @@ -999,7 +1001,7 @@ static PalResult eglXBackend(int index) #pragma region X11 API static RRMode xFindMode( - XRRScreenResources* resources, + XRRScreenResources* resources, const PalMonitorMode* mode) { for (int i = 0; i < resources->nmode; ++i) { @@ -1009,8 +1011,7 @@ static RRMode xFindMode( double rate = (double)info->dotClock / tmp; // compare with width, height and refresh rate - if (info->width == mode->width && - info->height == mode->height && + if (info->width == mode->width && info->height == mode->height && (Uint32)(rate + 0.5) == mode->refreshRate) { return info->id; } @@ -1121,14 +1122,16 @@ static void xCheckFeatures() s_X11.free(supportedAtoms); } -static int xErrorHandler(Display*, XErrorEvent* e) +static int xErrorHandler( + Display*, + XErrorEvent* e) { // this is use for simple success and failure s_X11.error = true; return 0; } -static PalWindowState xQueryWindowState(Window xWin) +static PalWindowState xQueryWindowState(Window xWin) { Atom type; int format; @@ -1171,19 +1174,15 @@ static PalWindowState xQueryWindowState(Window xWin) static void xCacheMonitors(bool enumerate) { XRRScreenResources* resources = nullptr; - resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); + resources = s_X11.getScreenResources(s_X11.display, s_X11.root); for (int i = 0; i < resources->noutput; ++i) { RROutput output = resources->outputs[i]; - XRROutputInfo* info = s_X11.getOutputInfo( - s_X11.display, - resources, - output); + // clang-format off + XRROutputInfo* info = s_X11.getOutputInfo(s_X11.display, resources, output); + // clang-format on - if (info->connection == RR_Connected && - info->crtc != None) { + if (info->connection == RR_Connected && info->crtc != None) { // get monitor data and update info PalMonitor* monitor = TO_PAL_HANDLE(PalMonitor, output); MonitorData* data = nullptr; @@ -1200,10 +1199,9 @@ static void xCacheMonitors(bool enumerate) data = findMonitorData(monitor); } - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - info->crtc); + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, info->crtc); + // clang-format on double dpi = (double)(crtc->width * 25.4) / (double)info->mm_width; data->dpi = (int)dpi; @@ -1222,7 +1220,7 @@ static void xCacheMonitors(bool enumerate) } static int xGetWindowMonitorDPI( - WindowData* data, + WindowData* data, bool enumerate) { int winX = data->x + data->w / 2; @@ -1235,9 +1233,7 @@ static int xGetWindowMonitorDPI( // we found a monitor, check the monitor bounds with the window MonitorData* info = &s_Video.monitorData[i]; - if (winX >= info->x && - winX < info->x + info->w && - winY >= info->y && + if (winX >= info->x && winX < info->x + info->w && winY >= info->y && winY < info->y + info->h) { // found monitor return info->dpi; @@ -1246,7 +1242,7 @@ static int xGetWindowMonitorDPI( } static void xSendWMEvent( - Window window, + Window window, Atom type, long a, long b, @@ -1390,7 +1386,7 @@ static void xCreateScancodeTable() s_Keyboard.scancodes[40] = PAL_SCANCODE_APOSTROPHE; s_Keyboard.scancodes[43] = PAL_SCANCODE_BACKSLASH; s_Keyboard.scancodes[51] = PAL_SCANCODE_COMMA; - s_Keyboard.scancodes[13] = PAL_SCANCODE_EQUAL; + s_Keyboard.scancodes[13] = PAL_SCANCODE_EQUAL; s_Keyboard.scancodes[41] = PAL_SCANCODE_GRAVEACCENT; s_Keyboard.scancodes[12] = PAL_SCANCODE_SUBTRACT; s_Keyboard.scancodes[52] = PAL_SCANCODE_PERIOD; @@ -1463,7 +1459,7 @@ static void xCreateKeycodeTable() s_Keyboard.keycodes[XK_bracketright] = PAL_KEYCODE_RBRACKET; } -static PalResult xInitVideo() +static PalResult xInitVideo() { // load X11 library s_X11.handle = dlopen("libX11.so", RTLD_LAZY); @@ -1483,6 +1479,8 @@ static PalResult xInitVideo() s_X11.xrandr = dlopen("libXrandr.so", RTLD_LAZY); } + // clang-format off + // load procs s_X11.openDisplay = (XOpenDisplayFn)dlsym( s_X11.handle, @@ -1828,10 +1826,11 @@ static PalResult xInitVideo() // FIXME: fallback to manual key repeat detection } + // clang-format on return PAL_RESULT_SUCCESS; } -static void xShutdownVideo() +static void xShutdownVideo() { if (s_X11.colormap) { s_X11.freeColormap(s_X11.display, s_X11.colormap); @@ -1901,7 +1900,7 @@ static void xUpdateVideo() // real configure event if (s_Video.eventDriver) { // check if its a resize event - if (data->w != event.xconfigure.width || + if (data->w != event.xconfigure.width || data->h != event.xconfigure.height) { data->w = event.xconfigure.width; data->h = event.xconfigure.height; @@ -1921,7 +1920,7 @@ static void xUpdateVideo() } // check if its a move event - if (data->x != event.xconfigure.x || + if (data->x != event.xconfigure.x || data->y != event.xconfigure.y) { data->x = event.xconfigure.x; data->y = event.xconfigure.y; @@ -1939,9 +1938,9 @@ static void xUpdateVideo() palPushEvent(driver, &event); } - /** a window has to be moved + /** a window has to be moved before its can change monitors - we get the monitor the moved + we get the monitor the moved window is on and check if the dpi is different from the one it was created on */ int monitorDPI = xGetWindowMonitorDPI(data, false); @@ -2044,7 +2043,7 @@ static void xUpdateVideo() } case RANDR_SCREEN_CHANGE_EVENT: { - // skip the first event + // skip the first event if (s_X11.skipScreenEvent) { s_X11.skipScreenEvent = false; return; @@ -2057,7 +2056,7 @@ static void xUpdateVideo() } case RANDR_NOTIFY_EVENT: { - // skip the first event + // skip the first event if (s_X11.skipNotifyEvent) { s_X11.skipNotifyEvent = false; return; @@ -2079,7 +2078,7 @@ static void xUpdateVideo() } } - /** enumerate monitors and cache them + /** enumerate monitors and cache them these will be used to detect DPI changed since X11 does not have a DPI changed function */ resetMonitorData(); @@ -2150,7 +2149,7 @@ static void xUpdateVideo() } else { type = PAL_EVENT_MOUSE_BUTTONUP; } - + mode = palGetEventDispatchMode(driver, type); if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; @@ -2181,9 +2180,9 @@ static void xUpdateVideo() s_Mouse.WheelY = scrollY; if (s_Video.eventDriver && (scrollX || scrollY)) { PalEventDriver* driver = s_Video.eventDriver; - mode = palGetEventDispatchMode( - driver, - PAL_EVENT_MOUSE_WHEEL); + // clang-format off + mode = palGetEventDispatchMode(driver, PAL_EVENT_MOUSE_WHEEL); + // clang-format on if (mode != PAL_DISPATCH_NONE) { PalEvent event = {0}; @@ -2280,18 +2279,17 @@ static PalResult xEnumerateMonitors( { int _count = 0; int maxCount = outMonitors ? *count : 0; - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + for (int i = 0; i < resources->noutput; ++i) { RROutput output = resources->outputs[i]; - XRROutputInfo* outputInfo = s_X11.getOutputInfo( - s_X11.display, - resources, - output); - - if (outputInfo->connection == RR_Connected && + // clang-format off + XRROutputInfo* outputInfo = s_X11.getOutputInfo(s_X11.display, resources, output); + // clang-format on + + if (outputInfo->connection == RR_Connected && outputInfo->crtc != None) { // a monitor if (outMonitors) { @@ -2311,24 +2309,21 @@ static PalResult xEnumerateMonitors( static PalResult xGetPrimaryMonitor(PalMonitor** outMonitor) { - RROutput primary = s_X11.getOutputPrimary( - s_X11.display, - s_X11.root); + RROutput primary = s_X11.getOutputPrimary(s_X11.display, s_X11.root); if (!primary) { // primary monitor is not set, set the first one - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on for (int i = 0; i < resources->noutput; ++i) { RROutput output = resources->outputs[i]; - XRROutputInfo* outputInfo = s_X11.getOutputInfo( - s_X11.display, - resources, - output); + // clang-format off + XRROutputInfo* outputInfo = s_X11.getOutputInfo(s_X11.display, resources, output); + // clang-format on - if (outputInfo->connection == RR_Connected && + if (outputInfo->connection == RR_Connected && outputInfo->crtc != None) { primary = resources->outputs[i]; break; @@ -2350,9 +2345,9 @@ static PalResult xGetMonitorInfo( PalMonitor* monitor, PalMonitorInfo* info) { - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2370,24 +2365,21 @@ static PalResult xGetMonitorInfo( s_X11.freeScreenResources(resources); return PAL_RESULT_INVALID_MONITOR; } - + strcpy(info->name, outputInfo->name); - + // check if its primary monitor - RROutput primary = s_X11.getOutputPrimary( - s_X11.display, - s_X11.root); + RROutput primary = s_X11.getOutputPrimary(s_X11.display, s_X11.root); if (monitor == TO_PAL_HANDLE(PalMonitor, primary)) { info->primary = true; } // get monitor pos and size - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - outputInfo->crtc); - + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, outputInfo->crtc); + // clang-format on + info->x = crtc->x; info->y = crtc->y; info->width = crtc->width; @@ -2431,7 +2423,7 @@ static PalResult xGetMonitorInfo( default: { info->orientation = PAL_ORIENTATION_LANDSCAPE; } - } + } // get dpi double tmp = (double)(crtc->width * 25.4) / (double)outputInfo->mm_width; @@ -2448,14 +2440,14 @@ static PalResult xEnumerateMonitorModes( PalMonitor* monitor, Int32* count, PalMonitorMode* modes) -{ +{ Int32 modeCount = 0; int maxModeCount = modes ? *count : 0; - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + // get the monitor info XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2488,7 +2480,10 @@ static PalResult xEnumerateMonitorModes( mode->height = info->height; mode->bpp = s_X11.bpp; + // clang-format off double tmp = (double)info->hTotal * (double)info->vTotal; + // clang-format on + double rate = (double)info->dotClock / tmp; mode->refreshRate = rate + 0.5; } @@ -2504,7 +2499,7 @@ static PalResult xEnumerateMonitorModes( s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); - + return PAL_RESULT_SUCCESS; } @@ -2512,10 +2507,10 @@ static PalResult xGetCurrentMonitorMode( PalMonitor* monitor, PalMonitorMode* mode) { - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + // get the monitor info XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2535,11 +2530,10 @@ static PalResult xGetCurrentMonitorMode( } // get the current display mode - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - outputInfo->crtc); - + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, outputInfo->crtc); + // clang-format on + // find the display mode XRRModeInfo* info = nullptr; for (int i = 0; i < resources->nmode; ++i) { @@ -2559,11 +2553,11 @@ static PalResult xGetCurrentMonitorMode( double rate = (double)info->dotClock / tmp; mode->refreshRate = rate + 0.5; } - + s_X11.freeCrtcInfo(crtc); s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); - + return PAL_RESULT_SUCCESS; } @@ -2571,10 +2565,10 @@ static PalResult xSetMonitorMode( PalMonitor* monitor, PalMonitorMode* mode) { - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + // get the monitor info XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2602,10 +2596,9 @@ static PalResult xSetMonitorMode( } // apply the display mode - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - outputInfo->crtc); + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, outputInfo->crtc); + // clang-format on RROutput output = FROM_PAL_HANDLE(RROutput, monitor); int ret = s_X11.setCrtcConfig( @@ -2619,7 +2612,7 @@ static PalResult xSetMonitorMode( crtc->rotation, &output, 1); - + s_X11.freeCrtcInfo(crtc); s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); @@ -2627,7 +2620,7 @@ static PalResult xSetMonitorMode( if (ret != Success) { return PAL_RESULT_PLATFORM_FAILURE; } - + return PAL_RESULT_SUCCESS; } @@ -2635,10 +2628,10 @@ static PalResult xValidateMonitorMode( PalMonitor* monitor, PalMonitorMode* mode) { - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + // get the monitor info XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2675,10 +2668,10 @@ static PalResult xSetMonitorOrientation( PalMonitor* monitor, PalOrientation orientation) { - XRRScreenResources* resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); - + // clang-format off + XRRScreenResources* resources = s_X11.getScreenResources(s_X11.display, s_X11.root); + // clang-format on + // get the monitor info XRROutputInfo* outputInfo = s_X11.getOutputInfo( s_X11.display, @@ -2698,10 +2691,9 @@ static PalResult xSetMonitorOrientation( } // get the current display mode - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - outputInfo->crtc); + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, outputInfo->crtc); + // clang-format on // check if the new orientation is supported Rotation rotation = 0; @@ -2747,7 +2739,7 @@ static PalResult xSetMonitorOrientation( rotation, &output, 1); - + s_X11.freeCrtcInfo(crtc); s_X11.freeOutputInfo(outputInfo); s_X11.freeScreenResources(resources); @@ -2755,7 +2747,7 @@ static PalResult xSetMonitorOrientation( if (ret != Success) { return PAL_RESULT_PLATFORM_FAILURE; } - + return PAL_RESULT_SUCCESS; } @@ -2900,7 +2892,7 @@ static PalResult xCreateWindow( s_X11.setClassHint(s_X11.display, window, hints); s_X11.free(hints); } - + if (s_X11Atoms.unicodeTitle) { s_X11.changeProperty( s_X11.display, @@ -2932,7 +2924,6 @@ static PalResult xCreateWindow( PropModeReplace, (unsigned char*)&s_X11Atoms._NET_WM_WINDOW_TYPE_SPLASH, 1); - } // tool window @@ -2951,7 +2942,6 @@ static PalResult xCreateWindow( PropModeReplace, (unsigned char*)&s_X11Atoms._NET_WM_WINDOW_TYPE_UTILITY, 1); - } // topmost @@ -3051,9 +3041,9 @@ static PalResult xCreateWindow( } s_X11.setWMProtocols( - s_X11.display, - window, - &s_X11Atoms.WM_DELETE_WINDOW, + s_X11.display, + window, + &s_X11Atoms.WM_DELETE_WINDOW, True); s_X11.flush(s_X11.display); @@ -3179,13 +3169,13 @@ PalResult xFlashWindow( return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } - bool add = false; + bool add = false; if (info->flags & PAL_FLASH_TRAY) { add = true; } @@ -3235,36 +3225,29 @@ PalResult xGetWindowMonitor( PalWindow* window, PalMonitor** outMonitor) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } XRRScreenResources* resources = nullptr; - resources = s_X11.getScreenResources( - s_X11.display, - s_X11.root); + resources = s_X11.getScreenResources(s_X11.display, s_X11.root); for (int i = 0; i < resources->noutput; ++i) { RROutput output = resources->outputs[i]; - XRROutputInfo* info = s_X11.getOutputInfo( - s_X11.display, - resources, - output); + // clang-format off + XRROutputInfo* info = s_X11.getOutputInfo(s_X11.display, resources, output); + // clang-format on - if (info->connection == RR_Connected && - info->crtc != None) { - XRRCrtcInfo* crtc = s_X11.getCrtcInfo( - s_X11.display, - resources, - info->crtc); + if (info->connection == RR_Connected && info->crtc != None) { + // clang-format off + XRRCrtcInfo* crtc = s_X11.getCrtcInfo(s_X11.display, resources, info->crtc); + // clang-format on // check bounds to see if window is on the monitor - if (attr.x >= crtc->x && - attr.x < crtc->x + crtc->width && - attr.y >= crtc->y && - attr.y < crtc->y + crtc->height) { + if (attr.x >= crtc->x && attr.x < crtc->x + crtc->width && + attr.y >= crtc->y && attr.y < crtc->y + crtc->height) { // found monitor *outMonitor = TO_PAL_HANDLE(PalMonitor, output); break; @@ -3283,7 +3266,7 @@ PalResult xGetWindowTitle( Uint64* outSize, char* outBuffer) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3334,7 +3317,7 @@ PalResult xGetWindowTitle( } s_X11.free(text.value); } - + return PAL_RESULT_SUCCESS; } @@ -3343,7 +3326,7 @@ PalResult xGetWindowPos( Int32* x, Int32* y) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3365,7 +3348,7 @@ PalResult xGetWindowSize( Uint32* width, Uint32* height) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3386,7 +3369,7 @@ PalResult xGetWindowState( PalWindow* window, PalWindowState* outState) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3432,7 +3415,7 @@ PalResult xGetWindowState( bool xIsWindowVisible(PalWindow* window) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return false; @@ -3478,7 +3461,7 @@ static PalResult xSetWindowOpacity( PropModeReplace, (unsigned char*)&value, 1); - + s_X11.sync(s_X11.display, False); s_X11.setErrorHandler(old); if (s_X11.error) { @@ -3501,7 +3484,7 @@ PalResult xSetWindowTitle( PalWindow* window, const char* title) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3531,7 +3514,7 @@ PalResult xSetWindowPos( Int32 x, Int32 y) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3547,7 +3530,7 @@ PalResult xSetWindowSize( Uint32 width, Uint32 height) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3556,7 +3539,7 @@ PalResult xSetWindowSize( // X11 does not allow users resize programaticaly // if the window is not resizable. // so we hack it by making the window resizable and resizing - // then revert back. + // then revert back. XSizeHints hints; long tmp; s_X11.getWMNormalHints(s_X11.display, xWin, &hints, &tmp); @@ -3583,7 +3566,7 @@ PalResult xSetWindowSize( PalResult xSetFocusWindow(PalWindow* window) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3630,10 +3613,12 @@ PalResult xCreateIcon( Uint8 b = info->pixels[i * 4 + 2]; // Blue Uint8 a = info->pixels[i * 4 + 3]; // Alpha + // clang-format off icon[2 + i] = ((unsigned long)a << 24) | ((unsigned long)r << 16) | ((unsigned long)g << 8) | ((unsigned long)b); + // clang-format on } *outIcon = TO_PAL_HANDLE(PalIcon, icon); @@ -3659,7 +3644,7 @@ PalResult xSetWindowIcon( } unsigned long* iconData = FROM_PAL_HANDLE(unsigned long*, icon); - Uint64 totalPixels = 2 + iconData[0] * iconData[1]; + Uint64 totalPixels = 2 + iconData[0] * iconData[1]; s_X11.changeProperty( s_X11.display, xWin, @@ -3689,10 +3674,12 @@ PalResult xCreateCursor( Uint8 b = info->pixels[i * 4 + 2]; // Blue Uint8 a = info->pixels[i * 4 + 3]; // Alpha + // clang-format off image->pixels[i] = ((unsigned long)a << 24) | ((unsigned long)r << 16) | ((unsigned long)g << 8) | ((unsigned long)b); + // clang-format on } Cursor cursor = s_X11.cursorImageLoadCursor(s_X11.display, image); @@ -3781,7 +3768,7 @@ PalResult xClipCursor( PalWindow* window, bool clip) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3811,7 +3798,7 @@ PalResult xGetCursorPos( Int32* x, Int32* y) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; @@ -3847,23 +3834,14 @@ PalResult xSetCursorPos( Int32 x, Int32 y) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } - s_X11.warpPointer( - s_X11.display, - None, - xWin, - 0, - 0, - 0, - 0, - x, - y); - + s_X11.warpPointer(s_X11.display, None, xWin, 0, 0, 0, 0, x, y); + s_X11.flush(s_X11.display); return PAL_RESULT_SUCCESS; } @@ -3872,13 +3850,13 @@ PalResult xSetWindowCursor( PalWindow* window, PalCursor* cursor) { - Window xWin = FROM_PAL_HANDLE(Window, window); + Window xWin = FROM_PAL_HANDLE(Window, window); XWindowAttributes attr; if (!s_X11.getWindowAttributes(s_X11.display, xWin, &attr)) { return PAL_RESULT_INVALID_WINDOW; } - Window xCursor = FROM_PAL_HANDLE(Cursor, cursor); + Window xCursor = FROM_PAL_HANDLE(Cursor, cursor); if (xCursor) { s_X11.defineCursor(s_X11.display, xWin, xCursor); // cache the cursor. Show or hide cursor needs it @@ -3941,8 +3919,7 @@ static Backend s_XBackend = { .clipCursor = xClipCursor, .getCursorPos = xGetCursorPos, .setCursorPos = xSetCursorPos, - .setWindowCursor = xSetWindowCursor -}; + .setWindowCursor = xSetWindowCursor}; #pragma endregions @@ -3952,7 +3929,7 @@ static Backend s_XBackend = { PalResult PAL_CALL palInitVideo( const PalAllocator* allocator, - PalEventDriver* eventDriver) + PalEventDriver* eventDriver) { if (s_Video.initialized) { return PAL_RESULT_SUCCESS; @@ -3972,7 +3949,7 @@ PalResult PAL_CALL palInitVideo( } s_Video.maxMonitorData = 16; // initial size - s_Video.maxWindowData = 32;// initial size + s_Video.maxWindowData = 32; // initial size s_Video.windowData = palAllocate( s_Video.allocator, @@ -4000,18 +3977,19 @@ PalResult PAL_CALL palInitVideo( s_Egl.handle = dlopen("libEGL.so", RTLD_LAZY); if (s_Egl.handle) { eglGetProcAddressFn load = nullptr; - load = (eglGetProcAddressFn)dlsym( - s_Egl.handle, - "eglGetProcAddress"); + load = (eglGetProcAddressFn)dlsym(s_Egl.handle, "eglGetProcAddress"); s_Egl.eglInitialize = (eglInitializeFn)load("eglInitialize"); s_Egl.eglTerminate = (eglTerminateFn)load("eglTerminate"); s_Egl.eglGetDisplay = (eglGetDisplayFn)load("eglGetDisplay"); s_Egl.eglChooseConfig = (eglChooseConfigFn)load("eglChooseConfig"); - s_Egl.eglGetConfigAttrib = (eglGetConfigAttribFn)load("eglGetConfigAttrib"); s_Egl.eglGetError = (eglGetErrorFn)load("eglGetError"); s_Egl.eglBindAPI = (eglBindAPIFn)load("eglBindAPI"); s_Egl.eglGetConfigs = (eglGetConfigsFn)load("eglGetConfigs"); + + // clang-format off + s_Egl.eglGetConfigAttrib = (eglGetConfigAttribFn)load("eglGetConfigAttrib"); + // clang-format on } s_Video.allocator = allocator; @@ -4034,14 +4012,14 @@ void PAL_CALL palShutdownVideo() } } -void PAL_CALL palUpdateVideo() +void PAL_CALL palUpdateVideo() { if (s_Video.initialized) { s_Video.backend->updateVideo(); } } -PalVideoFeatures PAL_CALL palGetVideoFeatures() +PalVideoFeatures PAL_CALL palGetVideoFeatures() { if (!s_Video.initialized) { return 0; @@ -4051,7 +4029,7 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() } PalResult PAL_CALL palSetFBConfig( - const int index, + const int index, PalFBConfigBackend backend) { if (!s_Video.initialized) { @@ -4067,7 +4045,8 @@ PalResult PAL_CALL palSetFBConfig( if (backend == PAL_CONFIG_BACKEND_GLX) { return glxBackend(); - } else if (backend == PAL_CONFIG_BACKEND_EGL || + } else if ( + backend == PAL_CONFIG_BACKEND_EGL || backend == PAL_CONFIG_BACKEND_PAL_OPENGL) { if (s_X11.display) { // we are on X11 @@ -4095,7 +4074,7 @@ PalResult PAL_CALL palEnumerateMonitors( return s_Video.backend->enumerateMonitors(count, outMonitors); } -PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) +PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; @@ -4110,7 +4089,7 @@ PalResult PAL_CALL palGetPrimaryMonitor(PalMonitor** outMonitor) PalResult PAL_CALL palGetMonitorInfo( PalMonitor* monitor, - PalMonitorInfo* info) + PalMonitorInfo* info) { if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; @@ -4140,11 +4119,10 @@ PalResult PAL_CALL palEnumerateMonitorModes( return PAL_RESULT_INSUFFICIENT_BUFFER; } - PalResult ret = s_Video.backend->enumerateMonitorModes( - monitor, - count, - modes - ); + // clang-format off + + PalResult ret = s_Video.backend->enumerateMonitorModes(monitor, count, modes); + // clang-format on if (ret == PAL_RESULT_SUCCESS && modes) { // sort the modes so that they are lowest to highest @@ -4186,9 +4164,9 @@ PalResult PAL_CALL palSetMonitorMode( PalResult PAL_CALL palValidateMonitorMode( PalMonitor* monitor, - PalMonitorMode* mode) + PalMonitorMode* mode) { - + if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } @@ -4239,7 +4217,7 @@ PalResult PAL_CALL palCreateWindow( return PAL_RESULT_VIDEO_FEATURE_NOT_SUPPORTED; } - return s_Video.backend->createWindow(info,outWindow); + return s_Video.backend->createWindow(info, outWindow); } void PAL_CALL palDestroyWindow(PalWindow* window) @@ -4373,11 +4351,13 @@ PalResult PAL_CALL palGetWindowTitle( return PAL_RESULT_NULL_POINTER; } + // clang-format off return s_Video.backend->getWindowTitle( window, bufferSize, outSize, outBuffer); + // clang-format on } PalResult PAL_CALL palGetWindowPos( diff --git a/src/video/pal_video_win32.c b/src/video/pal_video_win32.c index 2b430c0..2fe23e0 100644 --- a/src/video/pal_video_win32.c +++ b/src/video/pal_video_win32.c @@ -674,7 +674,7 @@ LRESULT CALLBACK videoProc( s_Keyboard.scancodeState[scancode] = true; type = PAL_EVENT_KEYDOWN; - if (repeat) { + if (repeat) { type = PAL_EVENT_KEYREPEAT; } @@ -1105,7 +1105,7 @@ static void createScancodeTable() s_Keyboard.scancodes[0x15C] = PAL_SCANCODE_RSUPER; } -static WindowData* getFreeWindowData() +static WindowData* getFreeWindowData() { for (int i = 0; i < s_Video.maxWindowData; ++i) { if (!s_Video.windowData[i].used) { @@ -1123,8 +1123,8 @@ static WindowData* getFreeWindowData() data = palAllocate(s_Video.allocator, sizeof(WindowData) * count, 0); if (data) { memcpy( - data, - s_Video.windowData, + data, + s_Video.windowData, s_Video.maxWindowData * sizeof(WindowData)); palFree(s_Video.allocator, s_Video.windowData); @@ -1155,8 +1155,8 @@ PalResult PAL_CALL palInitVideo( s_Video.maxWindowData = 32; s_Video.windowData = palAllocate( - s_Video.allocator, - sizeof(WindowData) * s_Video.maxWindowData, + s_Video.allocator, + sizeof(WindowData) * s_Video.maxWindowData, 0); // get the instance @@ -1372,7 +1372,7 @@ PalVideoFeatures PAL_CALL palGetVideoFeatures() } PalResult PAL_CALL palSetFBConfig( - const int index, + const int index, PalFBConfigBackend backend) { // Win32 uses only WGL and WGL index starts from 1 @@ -1380,7 +1380,7 @@ PalResult PAL_CALL palSetFBConfig( return PAL_RESULT_VIDEO_NOT_INITIALIZED; } - if (backend == PAL_CONFIG_BACKEND_EGL || + if (backend == PAL_CONFIG_BACKEND_EGL || backend == PAL_CONFIG_BACKEND_GLX) { return PAL_RESULT_INVALID_FBCONFIG_BACKEND; } @@ -1856,7 +1856,7 @@ PalResult PAL_CALL palCreateWindow( &pfd)) { return PAL_RESULT_INVALID_GL_FBCONFIG; } - + s_Video.setPixelFormat(hdc, s_Video.pixelFormat, &pfd); ReleaseDC(handle, hdc); } @@ -2802,8 +2802,9 @@ PalResult PAL_CALL palCreateCursor( PalResult PAL_CALL palCreateCursorFrom( PalCursorType type, - PalCursor** outCursor) { - + PalCursor** outCursor) +{ + if (!s_Video.initialized) { return PAL_RESULT_VIDEO_NOT_INITIALIZED; } @@ -2959,9 +2960,8 @@ PalResult PAL_CALL palSetWindowCursor( { if (window) { SetLastError(0); - WindowData* data = (WindowData*)GetWindowLongPtrW( - (HWND)window, - GWLP_USERDATA); + WindowData* data = + (WindowData*)GetWindowLongPtrW((HWND)window, GWLP_USERDATA); data->cursor = (HCURSOR)cursor; DWORD error = GetLastError(); From b885eb24d5b0d2fa5b986b9707ee369aaadfcffe Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 16:21:21 +0000 Subject: [PATCH 28/30] tests format --- tests/cursor_test.c | 4 ++-- tests/icon_test.c | 4 ++-- tests/monitor_mode_test.c | 2 +- tests/monitor_test.c | 2 +- tests/opengl_context_test.c | 4 ++-- tests/opengl_multi_context_test.c | 6 +++--- tests/time_test.c | 8 ++++---- tests/video_test.c | 2 +- tests/window_test.c | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/cursor_test.c b/tests/cursor_test.c index f660f5e..710ce75 100644 --- a/tests/cursor_test.c +++ b/tests/cursor_test.c @@ -56,13 +56,13 @@ bool cursorTest() pixels[i + 0] = 255; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 255; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } else { pixels[i + 0] = 0; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 255; // Blue bit - pixels[i + 3] = 255; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } } } diff --git a/tests/icon_test.c b/tests/icon_test.c index ddfe08c..b92dc2a 100644 --- a/tests/icon_test.c +++ b/tests/icon_test.c @@ -56,13 +56,13 @@ bool iconTest() pixels[i + 0] = 255; // Red bit pixels[i + 1] = 0; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 255; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } else { pixels[i + 0] = 0; // Red bit pixels[i + 1] = 255; // Green bit pixels[i + 2] = 0; // Blue bit - pixels[i + 3] = 255; // Alpha bit + pixels[i + 3] = 255; // Alpha bit } } } diff --git a/tests/monitor_mode_test.c b/tests/monitor_mode_test.c index dc672da..61a1bdb 100644 --- a/tests/monitor_mode_test.c +++ b/tests/monitor_mode_test.c @@ -128,6 +128,6 @@ bool monitorModeTest() // free monitors array palFree(nullptr, monitors); - + return true; } \ No newline at end of file diff --git a/tests/monitor_test.c b/tests/monitor_test.c index 20bd113..6d65e60 100644 --- a/tests/monitor_test.c +++ b/tests/monitor_test.c @@ -106,6 +106,6 @@ bool monitorTest() // free monitors array palFree(nullptr, monitors); - + return true; } \ No newline at end of file diff --git a/tests/opengl_context_test.c b/tests/opengl_context_test.c index 620dfd9..c5fbed0 100644 --- a/tests/opengl_context_test.c +++ b/tests/opengl_context_test.c @@ -133,13 +133,13 @@ bool openglContextTest() return false; } - // set the FBConfig that will be used by PAL video system + // set the FBConfig that will be used by PAL video system // to create windows. this must be set before creating a window // for this example, we set the closest we desired. // If pal_opengl and pal_video will be used together, // then its recommended to use PAL_CONFIG_BACKEND_PAL_OPENGL - // NOTE: If PAL video system will not be used, + // NOTE: If PAL video system will not be used, // users need to call the direct OS call to achieve this. result = palSetFBConfig(closest->index, PAL_CONFIG_BACKEND_PAL_OPENGL); if (result != PAL_RESULT_SUCCESS) { diff --git a/tests/opengl_multi_context_test.c b/tests/opengl_multi_context_test.c index 872473b..f69d31c 100644 --- a/tests/opengl_multi_context_test.c +++ b/tests/opengl_multi_context_test.c @@ -107,7 +107,7 @@ bool openglMultiContextTest() const PalGLFBConfig* closest = nullptr; closest = palGetClosestGLFBConfig(fbConfigs, fbCount, &desired); - // log the closest GL FBConfig + // log the closest GL FBConfig palLog(nullptr, "Closest GL FBConfig:"); palLog(nullptr, " Index: %d", closest->index); palLog(nullptr, " Red Bits: %d", closest->redBits); @@ -133,13 +133,13 @@ bool openglMultiContextTest() return false; } - // set the FBConfig that will be used by PAL video system + // set the FBConfig that will be used by PAL video system // to create windows. this must be set before creating a window // for this example, we set the closest we desired. // If pal_opengl and pal_video will be used together, // then its recommended to use PAL_CONFIG_BACKEND_PAL_OPENGL - // NOTE: If PAL video system will not be used, + // NOTE: If PAL video system will not be used, // users need to call the direct OS call to achieve this. result = palSetFBConfig(closest->index, PAL_CONFIG_BACKEND_PAL_OPENGL); if (result != PAL_RESULT_SUCCESS) { diff --git a/tests/time_test.c b/tests/time_test.c index f4898b9..02042bd 100644 --- a/tests/time_test.c +++ b/tests/time_test.c @@ -39,10 +39,10 @@ bool timeTest() totalTime = now - lastTime; palLog( - nullptr, - "Frame %d, Total Time %f seconds", - frameCount, - totalTime); + nullptr, + "Frame %d, Total Time %f seconds", + frameCount, + totalTime); frameCount++; } diff --git a/tests/video_test.c b/tests/video_test.c index 5b03281..32e8861 100644 --- a/tests/video_test.c +++ b/tests/video_test.c @@ -150,6 +150,6 @@ bool videoTest() // shutdown the video system palShutdownVideo(); - + return true; } \ No newline at end of file diff --git a/tests/window_test.c b/tests/window_test.c index eb48f70..f5f89c7 100644 --- a/tests/window_test.c +++ b/tests/window_test.c @@ -245,7 +245,7 @@ bool windowTest() #if MAKE_TRANSPARENT if (features & PAL_VIDEO_FEATURE_TRANSPARENT_WINDOW) { - //result = palSetWindowOpacity(window, OPACITY); + result = palSetWindowOpacity(window, OPACITY); if (result != PAL_RESULT_SUCCESS) { const char* error = palFormatResult(result); palLog(nullptr, "Failed to set window opacity: %s", error); From b12f9c55de461e9e2771f69c286f384fc7fdef86 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 16:58:46 +0000 Subject: [PATCH 29/30] updated readme --- CHANGELOG.md | 22 +++++++++++----------- README.md | 9 ++++++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccc8a7f..55821a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,31 +16,31 @@ - No API or ABI changes - Safe upgrade from **v1.0** - just rebuild your project after updating. -## [1.1.0] - 2025-10-01 +## [1.1.0] - 2025-10-17 ### Features - **Build:** Added Linux platform support across all modules. +- **Core:** Added Linux backend support. - **Video:** Added X11-based backend support. - **Thread:** Added Linux backend support. - **Opengl:** Added Linux backend support. - **System:** Added Linux backend support. - **Video:** Added **palCreateCursorFrom()** to create system cursors. - -PAL_RESULT_INVALID_FBCONFIG_BACKEND -PAL_VIDEO_FEATURE_SET_ICON - -PAL_PLATFORM_API_COCOA, -PAL_PLATFORM_API_ANDRIOD, -PAL_PLATFORM_API_UIKIT, -PAL_PLATFORM_API_HEADLESS -palSetFBConfig() +- **Video:** Added **palSetFBConfig()** to select window FBConfig. +- **Video:** Added **PAL_VIDEO_FEATURE_WINDOW_SET_ICON** to `PalVideoFeatures` enum. +- **System:** Added **PAL_PLATFORM_API_COCOA** to `PalPlatformApiType` enum. +- **System:** Added **PAL_PLATFORM_API_ANDRIOD** to `PalPlatformApiType` enum. +- **System:** Added **PAL_PLATFORM_API_UIKIT** to `PalPlatformApiType` enum. +- **System:** Added **PAL_PLATFORM_API_HEADLESS** to `PalPlatformApiType` enum. +- **Core:** Added **PAL_RESULT_INVALID_FBCONFIG_BACKEND** to `PalResult` enum. ### Changed - **System:** `PalCPUInfo.architecture` is now determined at runtime instead of build time. +- **Opengl:** **palEnumerateGLFBConfigs()** now does not use the `glWindow` paramter. Set to `nullptr` ### Fixed - Fixed a bug where **enter modal mode and exit modal mode** operations triggered only one event. -- Fixed repeated window state event +- Fixed repeated window state event (**minimized**, **maximized**, **restore**). ### Notes - No API or ABI changes - existing Windows code remains compatible. diff --git a/README.md b/README.md index a3f95f0..fb189e2 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,7 @@ For more detailed examples, see the [tests folder](./tests) tests folder, which PAL is written in **C99** and uses **Premake** as its build system. Configure modules via [pal_config.lua](./pal_config.lua). See [pal_config.h](./include/pal/pal_config.h) to see the reflection of modules that will be built. +**Windows** ```bash premake\premake5.exe gmake2 # generate Makefiles (default: GCC) premake\premake5.exe gmake2 --compiler=clang @@ -120,6 +121,12 @@ premake\premake5.exe vs2022 # generate Visual Studio project (default: MS premake\premake5.exe vs2022 --compiler=clang ``` +**Linux** +```bash +premake\premake5.exe gmake2 # generate Makefiles (default: GCC) +premake\premake5.exe gmake2 --compiler=clang +``` + Enable tests in `pal_config.lua` by setting `PAL_BUILD_TESTS = true`. --- @@ -147,7 +154,7 @@ PAL uses [Doxygen](https://www.doxygen.nl/) for generating API documentation. ```bash cd docs -make doxygen +doxygen doxyfile ``` The generated HTML docs will be available in `docs/html/`. From 1ce0cd575cc50a15fdd7a2105f6af6ae6cf38ca9 Mon Sep 17 00:00:00 2001 From: nichcode Date: Fri, 17 Oct 2025 17:15:25 +0000 Subject: [PATCH 30/30] premake linux --- README.md | 8 +++++--- src/opengl/pal_opengl_linux.c | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fb189e2..24677d8 100644 --- a/README.md +++ b/README.md @@ -88,9 +88,10 @@ For more detailed examples, see the [tests folder](./tests) tests folder, which ## Supported Platforms - Windows (Vista+) +- Linux (X11) ## Planned Platforms -- Linux (X11/Wayland) +- Linux (Wayland) - macOS (Cocoa) - Android - iOS @@ -99,6 +100,8 @@ For more detailed examples, see the [tests folder](./tests) tests folder, which - Standard C library - Platform SDKs (Win32, X11, Cocoa, etc.) - [Make for Windows](https://www.gnu.org/software/make/) (if not using Visual Studio) +- XRandR (1.2+) for X11 +- libXcursor for X11 ## Compilers - GCC @@ -123,8 +126,7 @@ premake\premake5.exe vs2022 --compiler=clang **Linux** ```bash -premake\premake5.exe gmake2 # generate Makefiles (default: GCC) -premake\premake5.exe gmake2 --compiler=clang +./premake/premake5 gmake # generate Makefiles (default: GCC) ``` Enable tests in `pal_config.lua` by setting `PAL_BUILD_TESTS = true`. diff --git a/src/opengl/pal_opengl_linux.c b/src/opengl/pal_opengl_linux.c index 1998f46..dc38610 100644 --- a/src/opengl/pal_opengl_linux.c +++ b/src/opengl/pal_opengl_linux.c @@ -477,8 +477,8 @@ PalResult PAL_CALL palInitGL(const PalAllocator* allocator) EGLSurface surface = EGL_NO_SURFACE; EGLint pBufferAttribs[] = { - EGL_WIDTH, 1, E - GL_HEIGHT, 1, + EGL_WIDTH, 1, + EGL_HEIGHT, 1, EGL_NONE}; surface = s_GL.eglCreatePbufferSurface(