From dbf94f5d599baf2857603f9e60256caaf3a2354f Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Mon, 30 Nov 2015 10:41:28 +0100 Subject: [PATCH] Added GLFW 3.1.2 --- bin/msvc14/x64/glfw3.dll | Bin 0 -> 56832 bytes bin/msvc14/x64/glfw3d.dll | Bin 0 -> 146944 bytes include/GLFW/glfw3.h | 3358 ++++++++++++++++++++++++++++++++++++ include/GLFW/glfw3native.h | 356 ++++ lib/msvc14/x64/glfw3.lib | Bin 0 -> 19602 bytes lib/msvc14/x64/glfw3d.lib | Bin 0 -> 19602 bytes 6 files changed, 3714 insertions(+) create mode 100644 bin/msvc14/x64/glfw3.dll create mode 100644 bin/msvc14/x64/glfw3d.dll create mode 100644 include/GLFW/glfw3.h create mode 100644 include/GLFW/glfw3native.h create mode 100644 lib/msvc14/x64/glfw3.lib create mode 100644 lib/msvc14/x64/glfw3d.lib diff --git a/bin/msvc14/x64/glfw3.dll b/bin/msvc14/x64/glfw3.dll new file mode 100644 index 0000000000000000000000000000000000000000..570e011dc604a4749cea15cb8b71f36e8e51b6c6 GIT binary patch literal 56832 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 OlS|d#l>BM6!2bcUm*XP< literal 0 HcmV?d00001 diff --git a/bin/msvc14/x64/glfw3d.dll b/bin/msvc14/x64/glfw3d.dll new file mode 100644 index 0000000000000000000000000000000000000000..e0ff3cdfdfedd928a229e327cb1cb6e6fe2d5c2d GIT binary patch literal 146944 zcmeFa33wD$);C_AbW4DQ4w#0hD6KRSWU&R*fZ%jAIu#8X6)`9}5fFp8L`*a)U}AzM zcA_|<;?B5?`{=k}z-1C)2q@0rHsdxU?iCvy+(uN!{(ir6tE#K3J1q0Q{{PSSJ;{@< zy7!!W&pr3tbGLJsnsVwAEmPApFMjd3rnTYCzlc0{@bG9_zagvoX;1ZjW#2YW=_~tA zt(<#NuxkDVXU{+Lyx^=e&p-cy>fp??g7a(656(S5SbY3R!SgPdeb$(qoIW9w^iONw zfBaAP|M4U1*Y~h9K6)PhQ-6N^L-l^*!{@~R)Q5kR_tPIfjrYv*%RX9x_n+>6{G*Y0 zPx<-j51*9xA3uCS-p75U-cO4E#JRI7nT9(@Wk+e+?5nc0!}DiMvv6Cq{epcn`e|An zGWZt-JvxAQuDA(R?hH-aO+bmawj4kT6Mvan1%j$b)+^PoAa$EO+S}Qh)^tjS*22hj z8QLV$3FGZ2!2Da1q1A%wrWZY0p#@9x4zBiSOP%nt46Uh`6Oim4Q+-x#H9(;&OqQ8T zGapvSpr%!fnLqo?>N7QM`ssi!L6|e}Zp7R17lHbWQNgqe#{sbg_#oaNri5!BQ>6kL z{eeebwE=i%;O+Q}kltJsZsK4dkQZ$qyz|n83x{XTIa|~AVp3JWGsxI9;pSg7e-=<8 zW5`+xa(udQXPtWi0{(%OWC`$;$;6a!M*#YN<=+PWbzOCvrgeFK#$(&=cpTankFlfi zm;yO=Rh|V`=AL+r$%l9PL3k{!hxd3i7+s&w!{fW5ctmF7@i61=kIK{4aVH+zR^ZX= z5Ipu9g=lx&2v;Ek9~pvopDB2(9|3RiVQ~HGk8nM7C|rTv@mM|%kCF7Qm;=PC^tR}5 zoub3_+Yxvy9EnFk5U_?^xc)+K$wTmd{1qMt=HPJvNd;EIwfs1^o+W{4KMB;|kH-cE zx%yzZj`$RhDU4gloF921Tt6R=NADUuz6}8OoAcp%Cl9UwS&J}(eJQY`8RVR&mg->DnFy#cPtPvY^`7XWauDD<90GM{BAs?d|w#_mvJnxLnq+z2O=hn#lyQ0k2nz%rM|INXqA9HJP58s zK8Nd%#6HKzGZg23d^}HY6FQ2nOmg}H^KlES=~7mM$EM)Xhst#pRUktCqPyeqx83k4 zqJnIrT6{(YzI!AddsB4zBsGqd|3dv+e;FQ)4E)y%;5y(zJiepe=Q7B{x4^Xr;qmWd;O$_L z!Q}aBmgN%^-FZjiQO+RWFpYk*@K|4ta7$Sp*WHfCOZ&rnBWub=GCuMMJgy=yA5hru zF{@WI`!7;=Tba;Say5>scgEg$^u8C5MpnAxDTvF?#N!jTlNHn88p#+pvE~)At=r6+ za{pksGTy}Fl@IXHf3IoM?)E%-B+w&)9treF;QuoT=*^{}tW)%c&0#&dZDlsb>}^c@ zn}_viX(*yci}7eK4h8)yd=Gx>(H6JY^c(luN{{BzjL}=;@mL>*3mSj@HXhd-)`Wkv z+QoTMR|-VL>RU)i97G|63IZV>pdPSml3#B}cTE++C#5-y$`l zgAHx#5Hi!>(n3h<)X?~qdtYhd;!Cyw*I67Y08WebLHL4rI}$B`Yy1Sf7oHNG8Y)$y)u!Van;xH_~Q0zlb$GQl~E3$9^I-(Hz4}^ zmw}T(6k@a!MO2YS=j`$cx^$RnP$O>mO1QQad63D7v5hG~>cmK){09jk%fd+5cvfkk zTP^hFsi9mu(FhaGg*Y6Q61gi5m8)X6G8>Es8V<=2nHNwz1zL?4NmY=^GUL==c~CN? zD1pp%dbER4QQN6DEWYY~bQkzvh{PMV25a`BFARl&r#jp6ARieq<&%_SjZ#VwS|nL$ z#UP%aoC&0r+Oj~Qvf}u|JJ)>Y^Q~K&*69t2!evFhA?TYo1h&d1ctie%Qm>`~sLyMM zc%V3mTm{K)q@i|{wkU_rAe~_RIe{~9Fj`VLK`*S%h&_OWKuGB<;$&-!0%n|St%hpu z6*c#oG;1f)QbcW=CUoFit5 zHyZIK#XZp*E%A02JIfV2D;mj4j-3@P$x4Y0=JOKF*Jit@WJe>}$yBnVCD|60JTnJ* zD(khmuGqQJNN#fM+-ON|cd_$avGbylyyVz<(UQFGV&}VJ=SL&?$+7dJCHdXO9_)%e zI2sw89D8uIWN>$}gRa=YXe5{%8yX+%E_TQjI~0wCl4FOWC86$Ohh4G5(MUKsb~suR z?k@Itt=g(@+g8GgkZ6rt zLYv?<`hNi`pcm9zb6$T1eade)lPsDWy}6#CLev}I0RE&_rYJr;~=J6#Om9~g9qk) z|KcjRgn4sFvEV{AoY*IMI05S88#Z~+JF7xoTlWS@C~yYA(kBJi)}epbJh4%fD+FL{ zgPedJ%q&v!{uPlN2N4PFO#TXlL`Ff=L);LssFTI%ibcOGGSEdtPgLjqTC!N`7lf)$1gOR$ z{~nXh1^GRQI+G}iFi{?&W`gw3FN5^^C_}JzqTaeRv=qWgq5hnJ(h)__ z>5|76_RuJpZahYzhwBTei`BzSPX;~I;IB|^R%Sv`jf;>EXz=I^Rq|#G|Kd?#NMfN& z^emWSII`6o0YMUqBz7( zw^Bvi&x(i|mA$yV+6wQ@l<+s%;R{vxuTe0uixoqKlyJ>lGX)6lP%ANQfh{6WS`lT` zjJ3lq8ZJ(^h+glsMD%6>x8+l>;vR0M zmY;~5PyMvx=2IUf?&VBZwB;xjHv?+gkTQ+4^)c-z*ZBTZt7l+4B%?8mq$V_hF>Qh9 zgbP?BYHIFKX^eLu8rH{BI*k22kr9H>_zET}dLnNIMRsTn>q z$Av31%n4y(e2MgRpcdieB%(T$uhDC$4&~#|ME5s<7>I^RROXps84!f^SpXv9nsTjr zrt(Bf*OVI#SeqipO=N;$O2LVEqEpwDi>%{;=MKo=)EA=x3&#PmJr9Z`xThA!GGbQ~ z!p>AW^wMZcs2v`XZX>WYa1Qtu;>J&(u)&py=vj7V21#aOEFo)}S$RH6?r{WWqXvQ^ z;&B^{Lr|D#cOG&3C?9gOf#?C4aEu-C8 zm4?v&pwD5uT*w3qj~drb(?%uvs4#r*$KyZ+*)bI&qQ)NAYJ&ef7ftYJaE}(aVNKc2 zH@Dr{uW$bc&3=|~@tC5vtUj7H?lp{*fBY0lJ&d(jM5|GgFQ*#J+^?^aj>LcEn`j0qT37g=tdSuf$<~?B=$r!@Sw!Vxs_?fke1%*y9RFlb^4l2 zmr;Vy4k5#UvyW1 z4Qq03Zlr#2QNmF@+UkNZIt+lo^pTsGOc2FyCWGO{5@3GoBeIpt8FwJ-2o)iqQ-#*>2YLi) z3lC9RJhwg0;U7X)0jy*C$2ZAblz~;AYzh!#DgxIQd&3~kK^}q^0uswJvteLEh7ciC zk1iFgiHiqvksoEq|NR_j%W*=pB~;6>7+(FIx>moY4qjWF8z@S)FYe-j#s(?;W*C~i zq0wC6g0o>#DC?3+eHMzRHRpr%Xg(V2Td;FN&+LeALPNUZd5;#ublCSM9Y@2lnU2YD z^nC%2@o?-%$4EFv(6JvJIvsn!aRD8Fk9)@wkpAz$_jlO;MOd$Lp?!|(TV~w#4%HSVv@U~fT&3y;t)`Qm zQU&dDn0&}8)Vg?J)IJ#+YIYcHP*_{o2SLZj@fXWNurLtg@g9#7k0exdyO~H@9&+~! zp&zXixwarDT?im`A{EdyqYKv7UIZ^V`5s2RPvLUPAgeb$528s9Z^j8$D~&ln%BG? zk9XaMvOu8nZnz#y{)OwqVlyHA3d$mAoQ~aFu~`s)g;q`B)54?0vgm?CLqJ$481M~@ zHDVJJ0mF7cnU5kMgw2451rV@5@_oQ_R=z{vue%~l%KDDW>nNBoF{QLu6W6~b<@Fmd zrfUoOAd~tGaE7I-)%yl0g<{X_hOL=30~4^d0BO=X$NUMXgiJ0o zrvmOG|BGSAb@Ja^aW+Ho-;1wa!hD|1{HK4HEV`JVk;?px^vuslVm@^|u%n#~93JSJ zGDPeCQ`*1w_eTZi60?GpnK0C*`(Kyb**hRcg7w&`QZwpn%QGXHT1}xzZg)aeS$yr! zEz%uS1yv@+L{u43u{^dL08TX{8T&wTNjX!cg1}Ql`FNH(mWg+)S6{rA%=v|X1LxC( zbA5vEdyKHKBzkmGPWBTYI7B{>UIdvz^%Or@j+Dg)!h?1WPp-mB?YQoB7uTuvKP|Hm z?lFo*TlN3)rsze*Dz?IC2yh-F@V9)m$gSEXj7CR;bGLL5z>>^F zSZmJ!G3X`6!t|X2F3}45RJ5e_${HWIxkS7On7r>*k)ypEV}vl-g$;}v>Sn}KfoAj9 zbY;*rnXXK_#?j@aYXn_Bx`xoT8(pl;d!c5kX7tTBgu9cS8UM#1SH{Q7Fw)NWFnANW zJ?1rMZs)?+O>XV=t%l7zZk8X!auj4}H_M~JXBYMgOKk~in2Ri-C+b_yaT(j`n5@DV zu*amARii+wmi_}kl!T78_?m1?T;M4%ZhX^!lQ3g3H zjbd)}W*u#Tvn!Meyi4gL)$uA-yH>QR!W7FlYC&BE*Dyr5teq4P7;X|M0N_IE0UxQn zkfB}W=ia}F6l{J9T>Mm~L*ugUzBrIn9Be-Zh-fptx%e9B$? zl&9rKpuY$|#V&r<{UupGwQ2bg=uYut^>1h@lD1@`;oxqzKfjbLjuMspD74&RZ2`w` zVZV&uS{}E$tNm3Fwb^mt2I>D37A)I-k!~L-6J?88*olsVtNFg8TbAc*M$ zWUZ@?`ka>}bB-yWL)wn<#g3CIQAycd%PSBY@+$i!gT_-TC+>8*vyX1;6u#}jN*#z{ zAP>{iGpaP)giNk6vc*23bjk{0+^>k*!Waosu@V^)hv)dmV1#nn-Zgt6nK}Lg;khK& zLLKPyp6t;s=5+bVN1-UPmbQ*^c%3KC2mL`Tw@Cs0YsHGd0d${1Rf zbE4?Kt`)wuU`7MBk}I#6Bg*1vnauo9w!SVLOcb=IW)By-VXLRc$LJmvUB+%@Gy^Q= zCK#I*=a!i;2iO4r3K-^_rg~=kS0FY5bI#3SfJXJg9^N*NQLw22zAEY(hwYUdwpT#6 z6oV2nzC;Ey-C0Pwk&nB1qps2hQy84zpRYw1XG27V%fSNdktZ@GEHSrnT%c9&K{g_6 zP9&Nj<4cG`R7@4s<_H9r{8Z<;LlWFw`vd(-oxi2!*5ZkMjaEGvdV<*uo>=&BvL#(n zH;o;1dROJ68u`Lri!x$oA-7nomm){s5Gk^XT&0g9pJ5ic0iu;NHa_*FKkTA?cHq;gDPy$LKUZN=U~*$-)_xCc^%tf$^G^2JxTe(gV?9iH))XPv)b zqaE^KgtR^DC0!n2IQKZLd`w*}eQ;G88*)T>UdtBY}>&(HjF@W zE@vW9uX~U2f4!b1+g)^(S93W_KxKCJ-^PlAb83J3bC{2&tV133!glBPzaW1TT>L%% zEchE^uCK`ofHFbga2bjTqXewj3Ajuw6F4nKu*(8(>qmHprjM1+B&)|{qz`)pGy-EA z*#+RDO@-J#eJI8(7uC;J2~})<_ce7u1vo%v3b4TVE+Ift12m$bt_jGi zuSm|{>53EVO2^R7SdEi~&<-9W&6jwlQ1h+THk`0ak?xN2ud=`_BK_&E^#8F^Br$}6 zg4juhvpX36l9x_!mVhQn;2Y;kD7LwCmW4s?0~oX0J2$Y+UBJHIJOz20+uQ*G4{ts# zGO*1=)4@Ym2`cC}{#@+%W}q?Zec8S>LtxqQAE>++4M>DI(DzU=tUH{r+;_WW-SLxB z9Bjbu5yUHLV;$!r*kPpkTWws+JA=cXwbo=6H^?d{Eh!ql@{kIg9UR2rUV`S zf^~qXFvcG;8DqLn;mds=AL*cA2ZKGz_aiVD_veIUOHvr!KT6TkXF=9;nu|*#T_<9T zijLU|ln`6IC_Kv}#u&>(LkISN(K5o^=&egtV9ci|abxKUmK&!j_Z@+0%A?}N{&y1O z{&$Fo``_WUrUyHyKS}zt2TIe~eBbem=npEk(jQC%*BO%mbO20+s(Q)^bt=>@)h8&> z(kF!p+a#Ee^kRwy?u*3!3zHkz4a~&9d6J3S2GkZx#mPca|113qs(#XDq^R#?Y`Q@; zDnP4o1e|O&!q}pAINZj5B-rdb0Pb|U7xm=>!}+tnwGjn}Fd@8@e)6a_{NT9&Awmn! zq(v_znn9M4vAh?N=3ky;!<49<1$j0~BghJ63s)cG4k@B)LDb%V9%q)q;O)~F&QJ+v0u90Q! zLcNn0L_u(?vA6PNkb>bvVyw!*t$1v?Ag=6=c;Ip1x`uX_OpNxXXyGu!}Pzb`^LXBE0UUc=ZUcIonoAiGte6=P8OL+g>m9;(&6;N0GDluM=6Y6Lk&iNSz zrP9#&Om*OXJQF~8oJE&oSXOv-79HUyrVo$P=Skt!>2rkdlP0`LH2HXbrF}e~EFuW3 z=TY<2Jv|YYbLCMumk(&s$c_HTUdrr10uTO2V>=+biNQDyvJYV%EXLJAc7&@};YPtk zPc$0dczmRuC)W&&0;CWk9Y3F^ti>hwA4m%@e;*rm2wVcIVT>?hjJilR2}LM#(hcEV zfcGf8!+4L!yRd80&nRp7xCNoiZs^TcE?Iwq)SoProZWXzC9*8>#^Kn{4JwXR64&_! zYdI~KgdCPG2sMaG9SqiR9U_>IB*0Pd7VNmuwC{hQ&$?o5%Zd$^J$-#9<3bEg83pG*paZ(L}2``5b&AJG*3<-x&{V=;_+^uSW{4p-DG+G{}Uh#xd z#NAFh^VH++kwA|GdL)oe0^QjoH{Y9V=%{)C=85~z0u{A!*RGr$jQjy@&{w$Hq0@Ig zoE|L`uBf;OTMQTf*81iUw$@jnUZ<+pRP{QJuTI|prNh66#c7vlCxfOKeB#527YL%E6}_L zX^rvZW@uL&Zn^x8G#~*V9PQEM0FR6wck^F;21lSW*KEz%c!L}WyB)Xu%7HM69kl7d z3zcXo=NXLws#u6OKtD5^e(o&5qdASy$92Kw(UKDUfPJjHqsqJ zZ;9>AqnG!?Bj1(k3{Hq;D`#+IMvrKrX5W^F5pFALdon3p*bXPNc-g1axXcA<2MSw!|*!>zv=irh+i9i7lT$k-k%`; zxA>8ECVm6(E5z>%{LaD8+0G{Bn^wy+?G(L!b0sp(*5_1YIdKw~lNOknj5{zaRA%Qg zK+q(eahEhn_A!zV@22Up>kTvtI7rKA+M+&iHPLkiZ|s?Um1S67p~61E1_Xv!n*FYR zfa6Y#B)?i2L48eVd>a@Z-X-wT zB)rk|FEjm{O#gDz{{a2qpKx4Nw6-zy791YD-!|Xx@~yY3Ejz|d$dh?Z8N~1knt@dY z9_EB^)5pjjQr(I;lpl-6l9uQV0&{OxF1GW9R~(27S#1`7}$p`n14l!WVMOYPZf-ycaT_<-rEU! zPe9n*nh5m|0b!L+fjT4Q+#+Q>c_*hKjUf%$DQyMIrFQ8qRX5cjXUvXq<#IXqvoH4v z3EXL zR3!4VQi~)?FunvmYl4&TT@F_35XaUZe`6iuGSh5{_12}KJZBdEhOm$rVb;c}c1wiZ zz(+SDrbS}NpoEQekus-8*KHX+iv(ih{VSC6ViRNm-Be(>vEXRRdJ-}~JF@Bh9ZSt5 zZqM@ip>r~RFVc~lfY=;xC1ex|4l5y*@c!nEq$`x|`72Z`)hxovW<+cuXjFRNmORdB z1qWUCfK8gS<$M+wn;0di`?4VWqPAK9XrWnW{AfUbN+@<3S8IBWTW|byD|5im6MS!C z_=p?4I(_Tl;2)>YL1W8p2-50%3_x;$x*`wSVkVfUv;b2$bxI3fVx6b7e%OTAX-qTH z?CwhbZ4?|8q!gJ|uY`vpdm zwUqq=hf}+|=Wi$NeF^rU*kM<~PeJQqW2IPOy9sO6+*g0m6;=m%BhkBa!*N+cY?;*5 zG;IBX^1AfqWO@AuC6_9%LCexJW|r!IBQMRBa3d3zOZkFIUg#20B~TI3b=hv1Ne8=x z=D8(>w_i|RB{wC@>lLJ)Dz888NdM8iq+t@>KzHUp)EF3Yd3HkG5mTPnG*e-MDiR<} zVx+26CO}mtsLI}2v*^a;tYk1Na%`YVT5H}EQCW&Ys9?=5XPX!{7AZ|gHvR2N`{zou z74)prGuPjoQj$u+c7gtbOOrD-+ChKR{{sCI7yVa2Q|&!5)i%S*&8yv|woCg@-o7C@ zKc{z_UinSkNN<8J)$X5kT%Me+ecHwT$*0n=Cl<|;hRjo;ZPG`>N>Sjk ztQ6w%H{#Pxoc0x1){X*HhXPnT26B7?s{`)t&-w65v33+M0*Ke&Ncaq8rI7HnQgCEo zhJQkZudu?a5ySpBVo>s$J%Gpte_g9>?>~ME?^EJceRh@{t(WEsJ$Ub~We!~5F0PlW zrmSuaIE^hdJ?rSHGCdpUnPqx5(xdJ@h}OMFPl;gsE93^^*kP9MP2xtIvEHHwgBCWL z{4k*=7oUu{)S9IZMW%2UnRG9hr=Ge{)8^uLHGZ}D-H2ZS#BdMZFW~nwesAIT34UMW zrvcXwzrFBF>dfKU)$xP(`edbUT8c`fZc}Cf;BYurAsqeSuGD|b{+#=5MuW6df0O81 z`Pfzdi(QGVgRKjR*yp)9ZncM+C=$t1lR&AEL}BF4ha-~~GyjD=pSmtN(}ga6VAV^* zk3fGBenKvO9zcz8$|pZ9KLY(l_*r^wvV8Jg{GfeEBOihOBK&w={4`ykET4k3{0Q_H z;itMaSw35rB=Zwa%a1^R5q>^yN#>{0#ZO^cegwKx{B*beaIQ+%o;Yo}4(*c9*!x=P zSrZ#Nx{E)`75{O@?~lz)V=-#v3cb%5;HJfD-yOa8q9O;Ip9+iKhZsdEdVgxRV zURNBDObn;3JT-Z4BHu+puk;6Ui9<38-T5!* zv!U+pz^^po|3mt$INi~gO68`XG~U~;XxK)iIS(pLhnuR1ULJOTzg^mFpS9{-str^F zMG;>jO?E2XouIcil5Os+YG}((B}`CCF(w%9arH=`M*=+(=#fB=1bQTpA^{oSM%>2D zhRL^Ko~U*#4$@moL!o%!8ksp(^FSB(Wn!6gtJ-=vVgMGU`Zr*(n`Y~w-M^=#!67Av ziUk-cV9Z*qHmMfL&T?8d%W!*Z*ME3v6vsaf3m_{jx`lJ+-rKbN!Wuf`EOK(~pQyOL&oG&UsNTm*ecNUluog4* zEK;2TII{5!0>%T=RpciaxixT-LftN?!xic-h0+zOUQk07szsqDE7Tl8WhvC9L^VvF zju$W6Y?yqCxbomSSzLYKI*Bg%uv;IHP`u7SDS+39pdHBJo`A;#kMKhBX5VN8N33BI z{}8a7rxFeT5D#3Z0_8GLYoNbE{df&g)e7|=ctCTY&@5N5uLx_HEW53$Ni$bPd|M(O zrUJbo5d%32^@5;+3e^Em$~T$Pmsi8&BN14u#`1j5M4|B<&cGq@sW$jn0pF*Ut|~-EU*P!(pYq06qoaDz-Rtn)5ssA_Iuq zh&afF$OPg_BF4H9_=s4}Tq4G~5I!Kvh~S%fu^af&cBM@vtooVy|;&mb>xDfjQv5JTy7lON(en-R+F2oohnus{kg$M$10TJBr z=1hD55Yvb_%7xe$h{;48?Ly#A{+tjIzjh&p0@0TU-GxA(n)7u75G5`IzZ38_5y!X? z!+>Zf;#e1Ae<1EBqSS>L3&gcVOmQI&0-}b9<6H>r6U&)F#PKc!zBQ0@BoSpU1in3x za{v)1xDZ%T&*@LZi7vztAhuo!#7Qnh9uV&nG1Y~@vFMz&M4aqG90>c}^|iidLA2;VuNe)Q~fXh#4-#I3Rwm z2V#^9kpsjhL`-%eMgXyahzb{CPavKo;xrc`8;Dzp80|vfLlQalM2vAE_5z}kh|^t& z;XoWu#9=PP!9W~B#DOlvG$8gS;%*nB9}r$5GSP-6ggCeTB=~_du+eUn&xJc);WiML zlZ2axll{m)5gr!;I|6fVB|=L=%x(X*qPB>*Y!~iCg_}v7*M&P>;f^Mb_E0DHxD}4v zA3$7R7mil|0N0PWK1sNF?MDIe-4#F#b|EGJ@g5ODmjL}htR^DE6=Nb04-t`{gqYiY z6#T$lOWdAGxOwgP%t%fR5qr20hXFBzi2YoMNkAM)#84LkA1cW?fQXO_aX1kDi5TWW z{0fMzi-6eQg@^$0J`uxRh$0}?5>enn90A0mM2v7Djs#*U5eK*s#Xww6#7GwcgS?!X zM2vDF@cF`=5+X*s5VL^@6EVhxI17kDL>%Zs%mL!(g+PQ|h_iwCgouM&h)N(f5HZ$; zm_9BDi5Op{w)S=K)bq#KA7axjg5U~Y7oa{mz0K{uVOie<}Z9ffu;8qZKiVH_ZfxDHs zy<9l*3fv;%PIck-R=AnOO;5tjYsauMr-X>|B*fhI87k6f;>c7YTXWmX6s|vUSuWhM z3isXR!1Z$BrYPLo#O>z7=?eEealMmp^V;#n-kf`hh`12=vQSQxh$0uF42bze9N|Ko z0K{}6j&vc81tLO3u?tZO#Bd_m# zgosiX;us)?6T#ABjGna!_Z+#$-y?w@3Hf9eyzqyJn80?gsd)QZC zsDmsxN3?t{Y!>PqQH2CtDhFD4d*E<1(zZqZ*q@z3zBn_?jB3^id z!VHn>7Jzc|7680+f#%p&#f{{_%V8jn1`+C?&qGdh<Xd>=W}LYE~2bhH$e*cOn85b$lAI~LCWL!9`n|pAgmz7V1AFe zf=S^N#_!JusD2F#!8QTf_G7GrcXR#%dk2{U7?C~ck@Q^4F^hQM_D4~M5M4yEg)AoD zNnxf3Rp>=IY+LyrNIO+Qz`h&LwpF1L5Lm4v5RTa4X{%5YB!V8IIrCRnNR-JHPh~}I zIt;v4x&O36LRAqa)??ht4wWezw>}>5fMr;PeO=GPeua{G3LG_T@&J?(dkmyG;a8-m z3hAi{(l{Umg2o-B-Y9N60p&#+xDmNDR2>i8`iPm#2}nk7Z3%@?-p1LY(~Y4B^9^O; zTdU!Qf8O)0O8nk=*l|*)_MuQYs?nw24s1NI=mCfcI;SJns@)Kib%maIU?@<)R1ibO zN?>{egJ8rIM?1Jnr$v%AhRtRDY77+ulL-FW{VY)x1mF9EN}4hn2C7-=h>(i2wyqYU z!(IrJ1hre(<%+>ch-hPctaCi+^fAOIsy;pmy_IN)z7TJ5*lQON0?-Cn3n#6`p=x{G z;;$5kmAbDG%OY+b|*SGKkxvg8~QB^VTC9I1$5jCf&SDtdAAM zPKxn#B-J(ZKiE~Afrm5+q=xHK)cro-$y^0%fJ}|Pm3E`RYQ;w3`g2sH0I%IBIJyF7 z`@Nl`HoC5glqu`=9a6l}jq$))O6mKcEZK^xW6?o4uoMH3yLH%*dcLQAGv}jhDQG}+ zv=k8m`{vC;QK(LXDL9+^u;G2uZtkHc6pzG$Viw8mNxZQp zX2FR}Er2+I;LJ(GcOihF6Sbla0E&78YHZ#25b*2?X+XXQu~OBqVJ5aOUpZ&H z48fS!IUwuE>*E6UT`|+nYaJjEs#Py&1$QVr_-kVTLLDN(w{zh)zWk#tmB!E;fG|Ij z1O&r#hzte&Lze)du>MQ)cs(dW3Byt=!jJ|lm>-{)xD(MQ!OgB2PKp@L8E{g1aGuL! zos|?e%o6x^CB(zH#=NuT*0czcQw^+D;}DhnM|p2tWZ?)^1I=5|3iZr&dbERtaIj>Z zar12H?|B2>^UR1NqOVKi5(R+F9s03ayigwtEs(1#L&K~(;H4r0$^Of~mp<6n^)xQT zvFYO^?S!nF$(FwXx9Md=HsfF2gzS!&!~f&!K#iP_SNFG}oyG7Z9ysDb)piIIido*R z)gp}Zh9@fvakeXVrX{b8pvB;RvmyUCHnK4pQA80x^4jY6&a(BUH-z zHOt^lIe(eh@VTR^rd8PL7X+o`s&>m`wo`=J8N{VtvMdd@#BHlm#bnA zQgI{Hgo_Fte~NIu+)7O?>Pgl?0e$)Rg~uTynrqg_iyudZCn}QyC1=0gVy?P!kc*CJ`%3K?^*ziAK0)o`>ugo^$(T* zLQ}W#G&F4uDTf|}KX+SZU_PwrBYnRHiDZV}1SwwUJ&eRt8ZXEa>~-^fI^#?b1+y4| z@+$F>#2%7VUeC?m%I~y)SeuMW#Ir=I@;9s4d`4ZR|wNcM}Rgb=;kL*D9 z9;St%A!W-;T6v=}J{Q3;a>OnG5&g-xQaF%ztWPW}9{6+)CXDU&Fzom*A+WnnW#91s z_hpA^_wU35i*JE-z&CE5M{Afo3eR{AztP-@br{tfAB56IUz5Go*9TY+hpFkL)y;l4 z$m@-BL|)m^oWH;o4{XB_Dvh`k_n`-=sF3JLMt7Bp2nu7xVu0s2dlIz6yymM z1tI0MRa7uM9hKr}^{t60Y!xG)!pNWW1$^2z7f2pmRv_GleFO0a`Ukust9lcRV4h2^rt_rv$Dc*lt(A?C* zaXV6`cT{uJ5_1?YOeQk17$piFAH_Ik`3jSNj)BS3r=>Ev6ZTr`D|Ec|5BDoo59Gal z^8LAdy5!??d&Y3HHHX!=2Qc-TI!xxIixKxyt1PRtj({iu3rsN8sy5{68I zEQ}yO6wn%Y>~Kr(UPacrKA^56%Fkv=Q!M2poBx??N$%#8 z*)n%sj}*;hJ8+uPDe1l9ffopB4SdE}y*2ddXG*Nt8Q32>UelT0`ZODJ7clX_g(TK6`E9^8X+GL*X8I_yy|8%mETg3=OyWK{=ghGiOCqlgDQB6X zg24Pq{vyUZ!|i+XTaam@VfTUUUZD+q%Y$l0Ez6Lt-E-;m)QrV;@ca{yC86RS$*5__ zU#`e=hc`5Z(=WMlXNZdS>!}ujhJmyou?1yNUz^z@x+{oXzRH zIvF-*9w0R?=uj4PRXZUya;h6=kyA%~;}XJW6D_Sd^CYM&s{B;mO~p)Ft!QyV&rhJ@ zx=V0p+iP@L1t=Z%b))!B(_r61Jww^p_t1dv0@_ujv6g9V1wf-Lb87$3&<0Lt2|5~T z_xalT&2>x-vJT>Hj~$ey6KYwCZ4Wxl!^NRm%>0)j5S%muELYCb1hgyxok}YVyFO!H zKZ#Lg1KvSp2b)#JQ8`?U9uMM=2X26Q6qygB-Q?R6Mi5>svy_HPdH0acRWfB?wM*bf zseUvm6n={ID$A6{)zWVFEtDJfggVejRttL&lcszsC=HqjZE1j8h@uEvLrhVW*~J5d z*`L0&L={i1dD~Adm=3deo(nO3(;iMI5aX>v8cd#_I$rTyMxG<&xnWI3dWLtg{7hL% zjghP9q)fgafR3sH{RQmFRC$`0i;KU>2cic?5zIz}0=&scP?_n{ z6v|mBO*Q$s=o4h{_2arLhcxmJrmOjEwj!*5FxEn@hBif{_Lk|E_+S(XuBnG3V*%SnW8Lg#qksuMwJC$-amYdZQDGby7 zae&GWT-_I;R3))toBBY4EmCou%8#fwT}$10PHt<&xoYIK@cXwIZygiEmZRt7N==2D zq);1e)LU?2n1Wcd!Bb=;F41RPf>qp25?~J$Fqub~Vk-5Xd96`AvGQ~h` ze1fW3zlP#VtB~7ougx`8HriG-Ig(OpNSQZU6>pHRndww?_=1nh~$zF z<;;OIb^}IxtFga8^EWQU6GT_Q$EE5zFl1b+nuaF0S1!jR9vBq$Xv;db`mt*QfjCNA z`8z@Ue2o*qwi_)0@mfuh8bQr%=N4Ml*g8P%D?Emxt}}r|BQ0BPt#C%~W8-m3?-xTW`1tnzj!g|vK3u}x8AxmbT8i~lSc8cr6DCuE?u<{6Y4qXs~HSp zjOW5}23Q?-;^ceSjY8YHycHI@jTSj$Kcu6Yw(~bZ?#JoUl)>p}%F@oqvF;AR8_OBr zrJoW$weI*fU_+_&rM7}eEwNg?9MDT!Ws2EfNvG}{sqSc}*9vUkm7xeWsIbhid8QC= z{;?>Uq#Uu?3fiQ@UDUP!7}Zf#7zf@U9eM>}R%mS7;$Xmxi_b`X{}uq1qGR~vU+CPn zAVSl1K59}GcAap;4mAw=OQ$F$K4%Cgl?pC8ml6*j4IHS3O!h_R}PAYV#WfcSN8eP4H!ji!NhGQPeqip zl2?mkg-AD{4X3zaqO&#|OE6J1h)3Y9}Tufyr=U z`bzgtPMbYlhhhca{?rl#y%kwAMq&DktkTUt@QcAK$1B^EZ<+F8=8Ft+;008c>A{C; z8bi7CnAGBdUtfiCVeKZgxd^L?B3GURqcai@d?8LW5)6S4uBlVe<}A?KVpH``u=YSP zE3MpqEUJw$$Qaf`*S!J>^Fro zTKM)JZO#17K1wXP_Jq|n;@p}3id5B?XVGx*YgqR)Wmm&uX2{tJbZZ|f#^im1@62O8 zT6IQj9!sbUEw31>GGeFctzv;W6uY=@`n7Yj3IEt1uDIh?9P*SKat77}*+0s|Qy7+Rm#P4zZp26=0 z{H*dzJKnK6ZqcWBpaNN3HVmp&Cv_EEH>~qC|NWJK8eW+rkufHfTF02k>cTews+%Mc0|1$~1Uq ze)KeWXMPHZcjPCZ{{J#R&i-QiwmfsV-`~IZPGptimSuc1pB^lDSNCa~j?TG@6aRSN zWUvGdtF4l@N42OZ7%`0j8c|NbdPqb=tm=K}^3s(@mxr!Cbot=Iq5!%XeE`=USZC}c z`@>s}EsEtez1q+Q;Op&eCnJ1pxXoRMk*g1j$1$^crhQl(IBe-_&AGW4t8stw7TF8N zN56%tb^at&t!U@=?R{o@P`|mInTHyL@pc%5HVW8xGDc740Q+%)nBO#M;Fn}Kl06kr z4;yQcY!e61Xw_kIcVNPY$K#v?aTH9fY@oH{Wuqm4c*B$*VOvl&IUm@B4C)XW-`ZEG{0CdU2z|MhuZq5m*glSQdxOPcAd3CRoYd_JXV(@K zwo3Iz%wGWYnyHFlI<~S=fQXndW@M-erB0zVc?0(&vk)d+>WNo$glc_O=yF6;g82wM#m=!vjjAcK!dh7XHHfiHg?<{LtpHY9 z3GB_J#g9cN@shw_0({q2RAi(1d&!P0A+d3c2i~vsus*Vd@Q8(ows#yOf?sL|vvTLb zh`$~HGoY6Nhd2VRVra$be1^Rv5w@3`sC-XZg*_T!W72YqGB`V=23&88Ph!}ttje@g z$YreYtjcL(Wz_8HjKxWkO6#5R=G|Cbc@PBDEr;^B^xqi{mV4Rily>^p~=iy~Hgfal&fN6#evWtP>3acUH){GixBipnIz9O8ds7C$w zkrexwI+_q6rwXoq(0FKqX>|m6h6z?SM6&hoLy(g_WOEEQz#M=eVqPTbU7%ESKoh%F z!X$6*R$-brGtmU7`o z$5S)T%n~u^)ev1Q1y=ubIGPHFC|*4X<%M=b30_gFF1Dy~UDj+BGit^-2%Ca;ZYy~6 zJLKQ&_$~+4RK>%9lwGnk&-EXuA*yr<*dj><`Qg8c_25{MdjPdb<#vMavI*UZuIgXu z7+dCM>rYO$npFZ%QN@JM_ApukYMivDUAGB>a-QJRnDPa7)~#_ko4x769g0%+MalOg z?1IhXton@$JtoBxP>f+)kSaUOocC64d*=M09dsWA?fMq&v{g>MYWzk$I99x|%kO%V zXsc~OC0T|_qGl)NIkXl5VgFK<9N=tYC7OjZL3pp?_*QIxkHXl?D%MUw>r%DciQ*)+ zc;IG4Ma^goJpwNrYB|)d`|pDzSWlk4|X+7}aOBm`N^G zxo!5oWCe%^?zjkJNz4!8B-qYGmI~`iH)^08yO7a^gDGe$f25}4oAaPL#>nnk;+(QQ0%T884$}Trh?efHOYMH^iQC&fA*y z&L&O!7{8fsY1-xR&&KB!|ABWV-uvTs>PHCOyLWF7e%4=x<@lxEnZFd_ouljZ?bh4t z>(#q=)|@5tV85LSW7K>Y5}$+3{cHT@e1KjGzdPU-`FJw2)PE*k-YomiXS>{v-Q0j* z*x$>tQ90kT|3lW(9P`nJ%@v%C=A+mhv)d|IYtJiyPO0rp<>-zJ5W?Pqg%+z8qYKVW z>i~um13F%Uu&hgsx0SCCd;pg@w{*aGy82u>16{yImIDhad=trdK$rVf$6L@P0#!D` z(=mcI?i)$9#>kGg-Giv(>215rcX#_;!l*&ab18`1d2Uh1ccZ?Ghnv}MROf7wMV%2E zFdnHs*|q(}#6|Udqnym3ximnPjj%)_;wZ623LLHKy+8xInHf`Sxv^s*-P!Qhp*?BD zn@+veTp)&Mu?MNeTqRayi?Il4B@xY~^djKU7%XQt?Ub{OM@NArq=LFG-3H(4;?lX8 z>Z@Ja_duW+&HM}k?3>DXPX?l}m9YsQ`56k;x{Sh1>@mQs05p`8(<8CqDdYO3&eZ6L z&;jfkynrl(lTv^)3@398CzW9~-a&xa)Inv~+6n8efv*107_|BQp*e|EWvPZ>eGaE|#{vYBCUq zD9mx5nRSct_bRzdxiM5O!I#Q{ttC9;r2_l*Vb@aQVjUyu?hRK4Tectg=WRGW17$|5>D;m;o+hNvv{(2kCYDxf)&@#r6~g2qT=aRaVSkT8BrU1(CN11K;@jd+Rx!Cp-!}H4$_-dw6!N4oQK^ z0szO8$`iXx1w8-O!EoI7Lx2~|2^3Zi|p-+>@r1m63Kf1d$L}O zEDb*3cDW*pwMeY@dm%zoWIHEHTL|3vDnj5Q1js(1$QG0Av|T1kCa6WW0sXXy1y20a$)*IEr*kQsSWc&twH2yE=k0K2E9Y`Jvy}5*II#nT0Um&pe^@eQ zO4ue zQp^Wh0&|FSt=H3y9Al%?2e%8wYNkxF&oKAVRU$dNCU~AfO*kmet_kaiL``^Rpwxto z@Fr@4)wG9&!nTzgkgtU5M+E8{1lz0hGL5({!mZj26A!#M#O`s*DHn;Us>XB}Bh7B^ z=TlfquvTDPL1wU&r^2mAcNjQ`;hKy4L|pOrkod)(h@HbjnZx6Ew{u9Qn8P;%l0)Xj z%Avhx z%s2k&yh{n*(hvg7C?)C)_-FY1KzCyc{T~fPdLsWnA%V2#^^7X$Hul)Cqv(yc5M#yh zKeLwgD`OS${b?{>4U?b2OD&ch0<2mrY3eVFC9ku2Y7HC>IIj4(4guqVx8+Em?;1vK z4IHUZ)q;9Kp)OIVh(b*l)IAC{TcIW^)Zv0^Qm7LYYOF#H71VhO#c*JBAYNKEZfu#H zCoX=ZZ-BV?k-l7U@gsfx=#nc%zWa}rp=WZ%>fhaYrL^(`soVBqlKlSNZ{dmuo;wZ) zAYX@YTy-(c(fSI+WFt|YXe2l?tP-%VZ(n4IBW|@ugYM#EgyWz4)M70oG}H#Q>b=;i zi#HlU`%|}^-8cvo3Q2T0@;0|YAHg!V(rd0?W_I}!rlE~qRpvi#vqZGiFJ(Rzo9npL zNq)GevQDTf#*Jb>2LtVAIo&v=yv;qEQ2n1dN||(>DL2&SY5qoZX3k7+GBYjJ+)h5vlZ)i>kyRyz z&f>=Kv@2yiMXAVegbpYE%rt8tRB}**d!^D#$wxh(CZHGB4@!zS$ zZ&8U4K$92`cqMVGuo`N;o|*v(UlzpmA+qHxyX&`?651KIOVJW=YhHO_F4=aYY zDuyl;hAu+Git|?vP5tdoC787{2|l6{yaXvh{97c!3`r0pacYWIeV#MvrQ1mwS!Il! zN%nD-EYm}>bJ4NI1JNnWCz55IcO|?3_1$X{l4XpYN%l#VEYm}>A4;-$lB_e2NWELN zWkaz&yro%BtCaqwQmVwR{&?UawDjZJOIu}OA0IAY5VO`{q2JjJ#g}YE9dz_j(w|vj z8`|hqeblG_MjzEnL)W_{OPYL65W6^Sb&-w-zTxyb(e0%r$&<_@!K@;Ahmgd*KPVJ( ztKp-%78B7WiU5o(z{CSjgZkoj8Cnb=fh_VgLlGEaC2RcP<&?tgG4Dn<)JC%Qv?Kfo zrX6qXW=}iHDI!ce&gd=EjtY3KX@@;F-O>IEO52oJVpj!uj|aN2-^bcjAtDuCR0J6Y zRI5$DdUS~@9Vt0;6!Gn^6Okn_Bd6Jtkuv`2<|?+eFk1>Yy6SQLi*GgA(akOw8#;Xcmb~h@r2fMX}KXl~_V zGVqNv@OI*6Dk^c3rcgK<=srXlw`VUJX7Ta1@R11rp7JLsBK&wBLo)e(NAYdvQk51e}Jn z>a2L+8jK%e?<)eT9g7E!D*|T?>9!78W&$@m+?{0Xk%4TGIH?5*YF2Dq4+PlE6S!hC z%i2UIFevC-s)YQECb0OD#{qJ&u>*PB>`@#PkOC%DZS5eTRgV>KdrT{Mk6YmC%9XEduL=z~Rbkwez4IUqVcG#P&=grVe1IRjBRfM>vZIdi6tbh+Gxh zy~s^4hJlTI=OE{=Ih?}nk*?5e`p9LHT}KoT-RR3Ps^xv4pdiilA|!mTQxGitr;f-g;g*|Gtgxf$S@2{0Qtfb$4GHUZwGz{3b0p8!)y z5qf`u_fCM>8UZ|<;N22nwz;lOr5MGSpR`rEj0KYiEj0~p6h#Fp2Um4aCOGbd%AuOO z8q85R>qhhcF>;3#Pe+RJfFC0$j4?4Z8BaASpsPw0MjhP4Sukiyr4X~nDj*zR!g4@| zg7ayN(HfWndaCpP4Kx^|crOsx2EA2nSHAOJWbogTL0;5dmeQT4`ySD9$;Y;poJQMu zY!O>HR_NaS5gAeTf+Z4AS;_4@SMP%lTm(()F$W(UA{qR+401X?He7bGlC-^FlmX0K z#sk%p%CeXp6wtd~`GZN@fQ5$-Q$TLT#9#KGxP(IfH`wlZhIpyy&HI zWmypI>A{~_V`l$Ps+SAK1Npcz2w$X}#YVT#9D(3-RwxH!{~r-bnsCs-?cJm?f;8k- z>X(T{lA!Sh?vw_NAuRKD#3Z;NS~7|E%u0YK5x{XveeqqOKIsR>?_?{qgmEx8dy#C_ zuUQUnYGaNus6Bpg5BNlA>`@}p(O^INEtt$g3GDsodxKl&e)Q#N3SFZ)dm7l|=#fB= z1bQUUBZ2>CB@iE0J{Hr|Ve{oVTb|S8smpV$JVWvvD9S#HO`hfQJXM}EdUL(&1@;qOj74ke$p2hM!M4kom+*6*}^88Yswembio-^cmoIE#*98Q(z z40)a*&kA|Yl&6yC9C265^Bj4eE6?-gStU;;|7vmf6Z*B{zD%AoFcORp>nG1#c@B_g zo;<%CLu@L1pkVXmd7_j>u{;lvC(FxHYi!lTM<>_oi`Q2lpf7%{de{_H&=)B==T#QE-EdB6UU6d*P|zA9WyI?>=E?~CMc!{ z95btUESWx{eo`S5Qd}1v6P-FX%V_@sT(2!@SetuTjkchpGzv009(pM<5Y(fq75j_d ztv+uFE;RJUJ9UiPzS9AiQGXc8)$CP&d7d~1)L))2j^6c`52k~rVVrj@<}mVgqt_OW zD38ppUyv`HC1bn(MeJ$b_+LT0=3WS_;5Vo3s>GOR_kZ|))F%@)%_a)}yGj0r&4qQ7 z%e4T*M2B>I&88w11P*gMTU_%carOP z5WkY~Q{tpMuPq9Iku%DJw@FS_Uv4QhW}w`}0!=}sCM`U;)+0cwoP+SHD7MjV#l!){ ziwPEoARSR^-!Yo>vz)H8AKFE9~1LDU&|Vc5?M`DH6b_5L=b-M~$&0M5gwXqTx9mbp&H zDS1$kczD19sE@ONNRWo{q12#;HRat%!!DLxbU50B!*Zq@xDo-Y#2p>EbH4A0$G@)0 z_m9$qzz`_^n0{GwDzz6B#E@t0rpTi9UUm>obMhW<4(vR;6@zv}b zh2SD}xWfQ-`gQ|^EOq)cxTvw6zCNa_Eel>)vOq8=gE2e3yl_iPz@s@6G5rLW-k=4< z!c@*^3y6p(V0G7c7otklewXle!b{P@011kN5v7vzQ20Fl>N`lG%mU(LR4$VjK}Lp+s?-h)fY=u^{WWt%ekCt#?r zxIr2_eOq%*!7SSN;PZ5R?nG84h}37=gUyVYdhokL?2JXsjFCrUG7x1_WqXR17ei!$F%yd~FVj?!NoP8V7vqUeQV%uL@WiYtR(7f*KsRN>?MdW z?>gk_&aVF*+XPa3oXV%K%f$KX_5q@kHull%3K_fqTYvM!Bv0I0vwg=!bu!+7cA zpJDxMkNJ&%nl5|KW}0zE8dVlh;{IQ>f;xsB=NLj312{PqgtUwcKl_f$?_)RofmjVpYZ!K%!1A$IJNrCwP=8Ksf<7643e) zLj(rSVJ*ms&jyLwgQTg-i2a}T-UTqOqI&$F&7)193D81|2p33c6k0-BF!TXQleAk% z%aW#TzFJ5&$);IIvdcdDP=r7Wv@XGl{QOnrs{slGD75lLDGwz@q~#qzprUBxi@J#V z3y4tBFZqAY+_{_0CWTU7U;pk+&Ym-8&di)S^SE>8&de>0PfzHQ!D7LViBC0Xu^sh@ zor&14Y%dAR4MtQm<~f-tWg7Nq?t8K!t08^~_Axb2ciWsHHd{SD=J zV=Q}|Xs~-@b~ZTvG?tX|SvPkn&J3q$Zbtq1Pkt-qGfTp9#e=%4NG%%wGP9}ANR29q z9|UceTG9@-b;Au;hbTLwzDv_DG&hDCS7anLye1<$U+h>XEnJ&19z{YrJbYPVko{^O z%B6_h$$WmY$PrVk18S1e(|ASbPh*k|a7?bG-?@g775G0q^JL5yD{ z5)$QEexdWgIjpwo^GH_oF#OEu7g7|L_b~&CXS{Y;ivL>T7k~Xhq(U6}RUo~~$5e#| zmD!N;V%RtLtt(K1Gqk1HUSs5({d*YFVl2tB6~CNHB$@C~fZT$pGX1j5VSj4Kkn{>9 zq7ou1mWT@Dk8#{CF}>&WN#gysjMT7wu`8M#|3|N_R8m|4c~Q9UxWo_-4jfId?Lv$- zbRKo`!q#$eGhp1L-*?-0EqRA!&3LA~W8Ua{HXPDg(m%0*jW@5+)yR!{KOQ6o#h+o~ zCqE~MVFvE^#qwNNGBmZn9r=M$<9zz1%SxB=iR50&l7f7KW7^y^^y>L;II)x86o$+W zyuOY$zn)icifMxAVdO9?_Izc>xUa`Y zqxMIJkLKB5gzsJ#=Vo_p{vHX6OtHJ;ix!X24{JF-LTC77+`O>w$i7$mt;jEUV1)6t zVlTw6eo0Dq5s6pluUWY6RX$k2GiGJ%r}1}WEN+6wpO6O`C$8i7#($jbj=jJ$so1m* z6`s|}U~^P`N@#{!YwWv%qXRV{ez>G-A}rm38C2}~g|R2&>-7_p$wAEIkRhO0Ro;6& zN^Ru5mzcfu+;h+Qcy0!RTC(j}_fFR8g~j)6eJ_d)&Q@rznH$ zFkOFn>@oN8&&S8VNS$8yaOQ@i+#MJ55y?NhqCGNaStpZ!+{lUk%#N%`*~3}WRq4Z7 zBPh~`tkT-jb4$-DU2%X-fH|DpALa3+xc-^wTkhj`^7J^UR+cPTx;$Y4KFi71VdZ}H zycC4)<~G5pnDOU@4e^TD-xkIGULJdy49Cy@1$kj&lyNN!N}r0qv`6}vzH;VG3rg2L z(!VISs}h>N-o5dz{4OH7=T+9H@*VZVsbCGe-Ix4b2AbiM=+$%pcL$qfNAv6u+a+P> zJ4}FQCQFUHOMA*F+TC&T-Rp@?I{$bFN3Ap3Jet1q!FFklPsS$PQW@J7dm{df_R77C z?>O`Lv)#4mvbUn6nCHx0FU#oHcSpwePyEXySu&A(*(p*1QJ@Z$xN#L^Y4=(G(0WKi zDxvSvJRTS0IEM3ZmnbSt#xQHg$r0i;kzGJ!Zd#cHq)Wc6+nrnf>-ZljNGCtF2+I_BVP)(wot4-N zPDV=mpI^th!!BM5*u^XDSL%wi-*Laxowrmbr~1~O^AS%he~?E00c7?2ilnaiSL{R_ z)D`y&BlZj356cjmHzm32yCCA~XzbOSx-LYm!Cmg;=I$`NgKfeC=DAL%k z{+Du<@+zhVmF}Rz(GSPp(2JJ_I$^hN;n(K75t1VqK_5d0EcRxWv_)PLMe-*}FI>1V z_KStGqETKH#eem@bS%}<(>_(nK#%e6!|vE~63%kRa^l}VM)I;EzeE}fuYKr|q&xNG zx_8oj4!fo|xjN|aw0;SoU;HqL<}Um9c(+bf#-y~%X4Ww3cE}qQ>Fd_gM2Ne1xOXLV zp1Bb4|v7J9%x4S-# ze8fi{UsgzLGqQb>%y3U0iANW@T$Yy+w4D0$Y~rRiX#R!Ll#ZE>H&3WMcS8wFJS!nG zB~4SNbjw2J=%{k`Q<6eiVYX3gR^QVF=#i-MK$A4rXmw^}5p&5eQe zqu#h~MkyFfYGa=}_Xh_F-;#V=D#F@(abWaH$0n|@j>bLFoBN$ph41y#jhYed%kE?{GDgs?SGFb zboe)(VkYWo1cxd$@IEuqQV3EUuOdlIdOX%~yP~>&*4Xxc}%j7Q9 z%&xq4>Lp)LGn9*oKLntwi`Sa{{qd{Gg((!%Dd`HYyQf0CLQ};VIA(XqD1@;E{(E^U)JLiR zbxT5|Btf|ol!st#CK&!n!E`NZuKmDkC6e2XLp%LXjig&AnGtoD-EU_MbqK#ZH_c_u-rQK^Of`l zQ=j4|*_D&&MVX5#B*u)_#?rfVjQbBhzv#YV_~!rk23`$1aj?erWMm0CPU0vQtFmt+M^6wFdg6~ymV~0*bmUbJ#<5-- zB~!%~=1{uKUptA<$znvxecZVcQ%7o$0y{{76Qp22`bVdn9qi~^jJ|o2il5ABeRN0M zALUyl^e6FSNc^?WzQ#!s=8jB(GnhlS7rE8PU!R25`*Y_@N>8HQz#I)DzQ|}N>v|H{ zlGa2*+ze7D-D%lwv6G$Y9YxpwX4*!p}q z#!KG*-y@Gu@r>PQ-LYP;I--A_(S1)3&rE;4)!o5E6_W@36CcQt`m;WN5@RK4Bc7D^ zzW-PJ;k%{nxKm$g2gQq--hp{mla`dSywXm2?^|k8)5iyLGKEeR{j^)JwcxWjdQxM3 zemfbkb(X2azuwBBCBmAhR0-sINCdU+PHdZS_fNciq)W*>fV@^MalIz5Rb|eQUtXY< ziZ$9L92(XoOoO9Y-b;Uju+k>#`X^om30r?7kfTi`f>L_7(Y9f4c^Jd;O&N;dV|W5h z6!owK=kr|hr%uTOcBiRIu{PtBV%5$0E6lP}4_oXtTw`+YW>J?Eh}{t}p~a_CalY3c zj^u=sp9O_4?Lmxn0?CLOEqi<$mC=PBI*_(CXh_fA84)v&I!W8#?Dmp0lrI;_0-ks# z4UFFPFr#4I4k_~StL0{Tq_e_y0wF^S7b%!+Wa+^mHo}h_A6)Wk~P-R;yS|d zJ4RgSj#2PaCEu2pUEk+R$K2fCr?U`!nPezU-2(GfcVV-M>p!LHf$&j*qw5=4+0k7oh zbWd_Tl6CqC9XUFYnofzAc&ye%UZ%NalX&b(zN(CqInK}7ost+YaWhG&>mP+v_dhZ% zO$m7(kfimjya$fX{ShIZ`y6tAm?+A)9$gn`znTHRf5^q7+Z~zdTBc8`%KGox zGKXlHt@&#lnbBG%j!cBc{#g8i2j%uzo^O`#ifX#Q>zEk702OxaBw&00vxw)>)Hv^j zOrR#~{88sghIEBFNW?!c(NNcU?2rzdC<bbcomXjSMB`k!~lo`~&3>c~eHKx(Ao@D)!ZTgb?=Vm;eCt71^czqAaosx^p|6!Pb!NX5$n0q+9h?o;-~t? zE7k84zwsVm-9Suz2HVf zWDZ)Yk4y>c#|wD&Y`K1=6JLofsg1J4rD>2VQ~Nm6TA)YQ!GX?}WtDivMj4P4p3((=|KoPnYS;P(;`3s(WqzX35+o z4@s^+(xQ@;3C#5Il)H2Z?@5=tJ6iIe#=LvTXvGXF^MCYLY?K#aP30SBEsDMB?pXR% zMaKf}G_&4CBl@E8s3p?82|DLX=lrxhR&lXAwunsMuRpKoj(v5to7WGE=)kcipB=1t zVTa65(y~=?^JA=>?ubk*g#cQ2e!diu|hee{STMV zek1e}Ke_AIiN-LB=WczF!OpRjr_TMh5N+{C_sVQUb_|#FUFSTUy%Ey&8i#&luM%d* z#Hno{`E=NE|09I7NICgtcf8}r(#KWYZC)r8(;w;gYw&no%8p|C?buVg$fc*#O9r3I zkT|}2w>w4(lcc9yAhFN|K0CMc8%3_%%Qh!V)acGMACbzAMGwq)hRV0KRboJ1y5sY0 z;RkedH6;??+sw|`ulYI_ZPRL$#~v=tz598gtwhMlc1R??`hRuk%{>@NBKVO^?{qAM zOCsw@pyu%y4*iWU9DBKIQ ztCzyfUH?;&lMKfWbH~1@Rln{&UDl}HXzoLp=w?b@TUG8vwzVRwj*ou7boR{rP-|>y zp!6r?f!8!o&VG8;LA)=F?ZoS$(1`w>vmXt;K@!_KO8cq34`uQB*M3#Hv4V6l*XCZW z!DI2ylPqnhmeOAtTY58zXxqt8flgUUs3N!G-TsN4f0xpD$Ykd`xDr;rAGKyI{ebuE_rh-HK-CSZPgt!J;I>=;sEah z|E|GGmhi;rp({G}hgehwi`?*JaD;(nX~Rr|i#5)!K#FF~%HJ!ww>*dyC zm2RYd)nt`!bmx?A^o-T3w`4O)tUSvi+B}EB7c{f1lNb2fqW5qEW53EHnX$^T)+Mj| z+k6Yh>~xqJHnT0_YZ=4Q;?dEl!xRPcf;mD#=$V6@4O#hvV=j$Gnw>~Y%)YjWe@M&? zrHjfFF^^5e%-zjDHY!G&h$0 zIh~wqW3~k$(<5@+#Zg*L<@V*yRk?NQLgZYIT6^zfDYac1-Iv~6U zfaHki{9V}#iIf2ZqwWPdot%x?rzNE$87f@YYZ2e%UD-$A!`u_XhihSLWA;H1(t|Um zmVxpSJLoCbJ>>bb`eEsXzzc#;8(~I@5NB>so-)jBa zv{%A*>)$HNdGqK-(~vOt$%0f-xKujk@`1J|7Pgl zEjosM>9b7x*680a>faUm_gwv3r+@8u8a3Udf7iSrxj0Y%uF$`W^>2y(Ez-aF`u9-% zo1=fAVrhhNgzir6d_TTPGDoj}K=azS4$ug<# z)cMX2Q#aFL(-ufuAZ>xP1=1EsTOe(Lv<1=@NLwInfwToaZ3_&%f9dc2v~@|RpSD2S z0%;4REs(ZA+5%|{q%DxPK-vOn3#2WOwm{kfpR@%^ma-zi;smYSA1$)tk6it3|0b3Y zSc%ha68`b*|AU{Fx?zaafYw^Rkoepi7Ztl>6@ZGVjTL+&tD-oz$o~EodrT~jA?mzc zPO7V@i!Ehs+9FT<=aK@c7ba34h}WSK`nY4R8IN32EQgrci*l2-cBJL}Fq6LzEWdFP zJ6$ROt$%*3B7ZK6P`aa|c2!tr)kTG+S6x)FDJaQg1Bs`pv<1=@NLwInfwTqE7D!tl zZGp4}(iTWtAZ>xP1=1Gyx3Pds5~Q!R1=1EsTOe(Lv<1=@NLwInfse)l4S{GI2T&z0 z*?E99>GWH6Fd`k3zGkkrtsmVv}UDaZz zUt`(n?=j)^ITrAG_A@>^mIMEl!!hLQ-Ouz^`x_(8$T$1^E1R*R)1Ee8YunFhPn(Qe zNB%MXIQn-UaC-UiG1Cv4=cu^K+Y*)9AM&;ag;zrY7I@8n+W9MimUAD1#x2f|^K$an zZqjQFH2TVt`eZqmK>D}5?|r!XYaL+t!FlgJeXzT4u)8-6c;zJ*Z7OR;_mx|^;6f| z_6hqU5r3N=vT3_WdlCC>GX9$R0e)zn`sy^{rGFEKQ$CxZCH}p}U&bR+K79w69zj3Q z<&=-Q!Op*BmP!he;s~LO1w^b+f(@ao8JD) z{qvUBpIKDz8GQd$y=8;L_ocX%THP>MLh7>{2;TJJ?9*<-2LoZ{fTZNuqvu1$-)q7< z@%{Wm##eZ=onI%uJs&c@b`xL7*Px$0ochsc_}-AuEA|ju=K(#2FT4+OiM|p(et_W} zy$ZYR{5M5gT9&7b`CG#)mGIr>89?-N`pIq+&dI0T>18~&+3?GayWO~Peyo=>M&y>M zuew|8d^!B}a7Di>jXsUWU1H>9JRtVm@d@cmQXlAYp2M8{mE3CQuikG*^AJe#XBqw$ zSS&MRn2#<_o}ZFc^g`$rdv=K#GXe`}y6Ka-3b@?*WE zeoK4Vdw}UV?XlhDE45sc@2`@P#I23C=fsxmWE$*fMUB`8Y4pO>}AWOONgkw3#)Ts1)7yfd;Z8XRJ;ZsVWqw?DKKf6oDi-=8!@rYAR}UD68X*?3>!+V8RR zx#?aT$M3Uo-u*WA7`(w?M}NV|uq5JbIN$Pyc(v7NMVfuqDsRXyuL`WGI_as_YH!$T z2!ujW=EobSJNi_oh)%WqVXNN96txu%`x>p){z!8m8Zj(?n?K_Bw)nrC6oV7f@Ys%@ zcY;=+$*Nf5(Q32>B33XI2>L=TYpt+%73p{zLV)&NHr>xz4c?ZP>6TU9j6(cJ z!%-M(kqG(1(UyqBCnBP0Qm95>Lkn|3w>x&6g13wbv^7EI^=5XDT^RFyQB_10id0 zV6WBamzT{18YYtIqsI-O+^2MFONBZbg4d)*JC!k+nge)huP?)rR+4En*OI zDc%@jVH4$wA*38dU7Zzg%L&%nK-3CTNG*+)tOC)c9}YxA4cg{X7j%+RlG@K36x&lf zB0j6$ACWLbPv2zu*6`N0#W%~cMvoiS(CiIa4c1(%z;7LA6|R{-|8uiPk1K2TwyhMK z>v(zDfG&<+YcXs~izTJ&#c&N|lf*Be-29QXk`r;-r6(~2f=u>GRiaup`VP>Zj3q&^ z9Gs=ddR4t@(XtWzEY(O@?lNNecj*kQiEg;$xadahrj9R8v}W0X#7vEzlkrd1CZY`)ju z5~Y-moziGcv!)EBV3$jxf3w`_4s&#=t|PkpX^Xbj)9j@|I*rGPbe81=FnIJ5 zT1XOibZKKFDurj!B1PmQ(my3trKW`W3j$wmTTu*yyQ!8j!t+b?5c=lL9%Uz;8s$9)eC*dxn?Ut)b z{^VLl+peM?SWF9Dh-8J4DMzZ2mT8tr4J434dFd(qwAWTz>om1mr#_ATMtT_^9Qj=d zH%y-tqCc5Nj3@CcAe!te4KF^c$c4l{Llq5?tn#fqE9h%G)3>%_&2n_YeRk9rTDwfv z57{iODf}{u%ZH$LFHvWy`Q&xEDka|)SZ6u9uGW^4bQa@kL}#&@pL|Gv83vlre+AZ( zoJ7&91)D~oq_+&`j#j|;X`i5$FH5mks?(!WXe6cvLX{I+Vriuo9VjU~WNKMD z@$HN6DW4~H!YqEq0lt$(esBu3$4M)e316OJ>wuDS;5kpESKFnXHfcTN+n{Lk%m+ef80m+H1!2 zU}L?`R6f4~a>-n5`bt}1e=YFJ!Ad`8JM#Z(Zb$DlPFo;tf%mt-Z}SGX_kT6_`{yt% z@$YN_*O3`&bk&HUYhs2PQIru(xR1zCql&U^_nr8QToL%#43!%i6Lb}1s0mehL05jJ z8s|D(jR-P7?8ulnCs$;uBU}^IMEs(MFh`$aXjg_yWk|Sb8ESIX#GuAkgB@K2SD{m$ zOXZ22!=98a6*pKCBEi?&?v&$z@sUGp=cBLhz6}sjnU$JQDgjc}k97%H7GkqsPA7QpctK zIq|$7PEE&=ckJ{*v6I(SEa`-j>V;E394!7)ZzO%Ox52~NGnwbgb}4Cvy1q(zN;qjZ zg0BXr>f!VSxh|FKgexLkiky?i2HQcG~IW zl1z1&>p0z?h@VBc$#b%(mouoBV|2O80N;-PxJ3L~PN(^Jg6Cl!zAZPHr}J24@(Olz zPR0qlNdA)Bv$(OB$foAqvAx6BGLtgZDA&PuKkC>@>R^bzS^9zyeSz3q^pQFfGHpWK zPQPo))UlDS(}bTqhwyLY2E|S?`8)Xw#CvC+c6&rW!i&F_FG61T_lG9>`!11j;@%(Z z*sRFdPO#435rgw*Y-Xo7J&|6W)PdCcnw;l@O}yaA=sx<+5d(P<{X)h+8B0IR{Y2Yb z%E>9O&t<5C-xw3L>)ND5UE7|V=b}vdlOyR*q@K`!-8n(0S0lF6wmL4MyVS2iwyGMw z-Vk)3SK?mh*oQuI)ScOhJWf6}Qyt_As?q49%QO=`H1Ep^-frQ|%v57tO}hQ+HUdxX z7Y7%OC*;88)I$f`ZR>{o_-o{aycLDsLC-Yw!t%P?W(C6@payXvEIVe1GscE^g zTq=uu=F$9QMervdO~8sh19?g1=`c)tCGa6Gb;$L&C%M$5d0^6Uu_z=*=!0D9AV*f* zqg-l~xCOtQg7KG2$9u3+2aR{B@s}z!{#=)ibLR=@HO-~EziR8IW%<}VV@%IMk{^#%I?jq%kbFkr`u%hXoRfDER{2J zwyG;~sh5F0zZfW!RGw=>j+)RoT1}`Pr6$aTu9DF$dCSXGdG*|dOuZW=<$e8towl9i zQoDd4c@(U}7@MZbeij{020D=yoGd%}yfNy$#^+pzxSn^7?Hk>j(=(zwE12n#`Y!E# z(|9eeT;oT`y}vJ~cSKKCx8$0-H*tiT7#XX^HI7l)Ge@hEQ(WqN;PDp+@|(&VRF5b# z$305wRdW8yDARJ6>Op70a=A?YbUl->PF;2ISeF_*5B}&(HTuC3!R$I6Ot}tosl)2w ziw(tpf3fH!@=~8AyyJGT#B=FB;?weSKc1lPS6Y9O7rvAJSm|4TqWf0uFY${1=qxpw z{)#b{&Vkck)m6IGSApVR4cIr8x393>gnJ2yB!x}oCGzLZVeQytp4UF3^7_X2j4d2v zm-iuzjb1rSXu;ZYM0vK#FvwyavqwbdABa5+#Eg`6S-7gYWT^Y5nEMiTS>k1 zWQawmV-oMo#j1C)OZm=nsS{o@c^7`8NAotqFHh!IpQVI%JFvpx6W4G&iE~hR_2zGRR||h~o>H^8Z(q$z+Q+~p2Pt(XyzfC@226nd!bINJ zLhr)w4&ZO_uBU!Cf-eQ8Kr3Xn6UTGN(e0^cfnVV_75OmuzrfqTe@32!4QPb-0KADn1lR+_;h#j9N1&_0laVb z>jVD|yal+5a8Kgr2A>c70vLfioA5`0Z$vhS@N1z@#P1E@Lc+ZRKNJ28_!E%z;GPEV zf_EnPSloSL=T}_naNu}g9#9Q50bd2K0d58E1D*l?8+a4Q`JGE01Nrzwxb9cLLqOFM&S+*>UO#FdbL~d=WSwxDfa{a1*c-cmeot;9X$yt1fj4umGq7 zz6yK`=mH)Do&){@{0}hhk1lm2Z~`zJI0KL#GDBr5M%!$2AIV;#QLH^1qZo0h@hX?S zJqM|S)gi1cn5Yg_hw=V)vN~LSMjfF(tBzDhDT@*PF{}&AXFb?)YAS1YKc_ygj#nqJ zeq_2jQ5CZCqKFkDGu6qg;rN0oR;Q|2YPOoA=Bm@w>Ga*DY94D`%313%UoBvN??QEk zI+N8ei&*P%7VBcpW*vyUb)GT3v86>*W$Xox_{yT8Fy~x}m(5^lPg|om)HuXrxxcM3 zuv$x&`d)j=2dB4z9$ ztPha#64rvZtxT}(qcq9_Eaqf`ohT~8T5S*8?hIo-N9pj=TvnpWS}=#bz}wpDt&&rA zjNHPuU^K$=xrD?Sfwkd?zv28+IgZK*IlOt%NJRD$q_Fj}JHwL|H-=mkU};kzl@ zyytT+lCFu=Kz+oE9k7aqz`EI_be2$wSvy?Ds@QrK zrE4j}qa4CR_`|dg5g%y230H-z(jF3iP=iUxqH3ySIm@0?d3ptIDl?_YrF!e8=VWVe zJ0$tR?GOeHDK!RD=0n+uc9H6}g!S<)Evei@V;~v31oUFLR59CYexM;b#3r_vsVu{X zbLwIujbTh{M^okFc#v@O@X;*MOVqV~j_vGFiK?AQKsdukQtgkl*v&s7oZ1dZXSE%% zoy=-)aGvfx?JB$k_d=;h?7-0i)xJ=xzl|G)b}je%BS{tBj!13yFr52FIvkNNOc{HtTk%f-$;jT>aAM6%Su0(iCJC$rmU~>Tbc|tx$cfM8Zwy|%c z)+&2+VlhyZQJ;NHX`HVAjZ-ZSB;=a(-Ys?nyjKJZ+vvCaY?*2Cb62)XJqzua9KO-d zNqdTa`V_r`HpQPEKusvlI!>dkVXy;>-4%g0Hd-}ukZBuPV^@ro66=iVMHXXe%Ud5< zWp;3+#9y%_ku6&V$KT0Y$k*cYhS`9Wavm+)kXAENp4Jd(4YH2D-mmu#v8CYsbt+8O zX-Im3`e-=P#?A?=)gB`=R+Ia{O6~-haAgZ_GjbG*u52koL3w;g@Ulfx z+}on}%!LBy``Xlk%G%PZd9{tQ%(a${bBxJ#0U7?FY>9{AhZ5>(Y0a;wsjeN4f2O;t z)|j!jsU;e2)-Hwz5_FjQ$is#GU}9>bB{gC{Z!!sW%*%6K$0iCe`1^jvXuLl?O2f4uj-qjqGg{p~3!V zv1gJUZ}vtKLWq9)=(I2ohDohgZ*6SzuA&=}-J1KBb6Pa2N0a1BEsi;ikbdj5aM0J_ zZ}K--KG{`f1sZhz8nwD9@rt|`;|z{VBrB?_&Z?SaEnR%(;(pf3f0_?@2R_dr6{%SpPwZbxkAXf^X zjc9g1HJ@|ItZ+lf=aX%+GA|-KQrn~{)%(alJK=^4Z*OytGKk*CW$!F%WuMXDJwptz zXB5q{2D&5JMj$D-w(9vD%AXFn+_$RC8w|5i$ac#kiG3y96|y3Nc}dEX0Q$j5-0u;8 zVym&l6=h$LkDWECdzE<1@Pq;l+&9WS3ro2*nH=hUu;!_E5x(A)KDIQ{I~YA0*^|_& z?EO#4IWAw_x-eYE%`FgSgK40x!kp&{f4=nPqO)9j3x%b%x0s)>micA>bD33MS!oM= z$loD$3Hu_}Dw!*>EBO$A?l^Qo5$7JlfM;p-{AtCG8s*H($u6}@=Ij0gW~$r7r=ONB zIUHJ7MXQyYvQ(_1lTWc@N)6}4|9*IgzV@D6wm4T;F5xcF=(FpG6VDKNCx5H$h7yqn zO&QinE>Ajzna4`zAD2@<3Uw4i!|O>$(`LATr^q|*TI^KDyyaq}$dGtKzLgxWuD6Fu z>*H484O2m#@cT~Rl+Ql&ACeADTsDBG_CG`AhAnq2VqZh#6Lw$O5~ycr#D4KcEGc(L zIZI8?gA#N|xBvt7B#95~@04F65h=WZq4$vZ9C;2h6f4LO-6`%wr8ar|B++U;;7rUV zhwVEoLqVg&@cs-r2mH_}8CnCcM0m3KGfFvTe|*mDzEB zSRWIhQ*`)E1GCh%;i?6WI!gRyAp2haGGMl=qcg6hemDbWT}>T+ZQ{AbiFa_gT3@(m zKt>eYM?6Eu)lPh2riYTp(@uDOeoL)AZWDz@x&dg&_OtJLcKxoZd^;hT^O>ARLa7BKltzB?x#a5N|AX3%VJrCMJgV|K$u8(5KEn(d z8aVGKY#-$HRJxf%m+(uN4EM=5Gi02RlD|RvBo9bZHL1O{aLzv)AiYI-|6<7?yrWc z1L^+x(;RPp(*5)Pj!RPH?9b?MY#OKJ@!+S=MlWOo#XPSQA-=CW2=w_Sa0;PiZ^m7RozYO3+i=U)R z`04B8vq0bBtY!WTYoecYDGxXX?11hBzYcUmvshKF0CqzM!Tq0QO*C}gk*t{p_CU9T zXCB3xY3LI0yT`KjS!D8Alg$yUebAlYV?WPX^3a9gZ9vvjtlk{1qlSH$!)V-KVnW4%!1gZ5C^(g$Dl<*bbdHTd8}19njt2 zZ*r<(H*_a>;auz{^5DHd4>Z$E>i57N=sxfZr(-v0`MTkf67mUM2mTGvCozYgR;cY=>9<68pIh2U+#BE%jU&>rwpKml|wcwq%L5hDwc=iI;lZ!m~2A~FdJNQpP9khI0=u)5=dK36R7jnL@$bc80!Jb^` zI`Dl!J9H0t^_iUI4BZZH;ML70=pgt$V6(`8r!2z$(1qX!crnl=eDD{~!v4^8;6DI6 zpu3kUb>uSE^ouv}g+MX%Ch$?U*bur9T<^s+&_Qq);DO!_KDQnl3LpGB zPzNoOlJ!8d@WC$wLFhi=HDW{IgP#Z5p?ksi`>-K&5BO_M*but=Jf*JXi^p4`w}WL* z?_JOqczuL0(3`+tjZ&3_2EPpKf$jslS5YUSJ>c7bICMAo%+=IM=sNJrz+RCDe`O7I z@)_a*AGVe{32lLI1M;A|!IyoRIw>;X-vSnNAGq`@)JbR$cpFeC^5CN`#GcTF;7frL z=uP1Ei_lMK@E-vWbRT%$#n=?2*ffrv!orJCf{}9*#-3^|2Iemi2 zfTO@}=yvd9Ko4{;_}DA3KXf7ZLZBCV`&I1u_&PRxmi7*Q7?=dz1HN?=HiX^|_Iv{y zLf3(R3>1nC_?JL2bRT%c)z}a^4}AAGu_1If*t&-B(1qZfPHYHWw}pKtKn`>eJnANF z2%QIB1zZT-4nFc$>JxM!_!?j{bSL?J; z2h=O*cJR-Ete;~O@XR}DgV5W5$lU3V$Ro4|{0*QGx)XfJ-Q*G40k3JGd{1 zJor+e8hR7>XTS>R9`M^hBXr3<>>s+9x*;?;3|t7^4nF8U@(68#e*|0!-3>0fpFE2^ zc=eBIZz2zF_z8P>po8Eg56}jo>%d!pyP&s&r*zW>p$ozH0uMoVgYVm^)Z@@S;Fbrm z4|F@Y?5Ffy&>ryBz?;yW;Qx7uz6(0W)}e;1epy&Zh?!;~>}A^3ct0J29{4O^19Tnukf&%<&=&Yxz-H)9@asS)wCbS^0$tGC!Jl~=U7-uX{|R&pAAH6$ z=mhNn$AKQ`KJd0@X-ClA;ER7wJA&Q>zU?{Wgb(h1p85ve1I~B>U7tr!@Rh%#zCm|_ zzw&!*2)zmXr&qBXwE83c2`~pb2>uyR4qf;*brrY}x&-`9U_EpvICn4cLR;X!yhA;K zR{x;y{2%%Xq2E>NMc^UmUhw(-=nviQa;dvA*xLl%4SpMVQ{*$*do{+T{s~{3gC7Lhr6U|+xN@4p;qWRJh#7;qtU@|gv4p20!KxYTCC3O*Xx zF7be!vkH>W7f3#TK+Y!E4df7~;3ohJT5vBg6I$?+W6>YF8{7|UhR(}p?;5ZPx&-`X zpbL5vc*7KQgzg2qjzb@j2Uh^EK-Ym!n##U$=pc9<@DTJS@bLwdlgNPEKIc;RLwAGE z{ygU^K(~X7j(4eFK?lJ*fj;P7@X8a&H+%0lfq%*Q1AE~YPIsw0fPDBp;3ErNsu{W+ z+ym4>_kj;TiL!t$1UCWKKyLy+4OFtfy$^hPkxQ+CPTtcm`~4rEL0v*#a2&`(rh6uP z-A-n|H2mZ}@v>k3DWDe_!LI@8m&km1t3HV}Q zj>ycVJ^($0?F9D%d!X}9W4|DN`L;bPu?wggiofz(HU$bUXMzflbic!M(tC z=ss|EDf&a_f!lx$(3`+N0Xm_3z`p~!L>_$VJZuZ?0WT`URw57nOga1fpi963pbokn z`~VPy?g3X-xYQBC2loK^(0$-z=eyJd=tA(k1?UI8349X}hu#kU8PEsa1D@!n+@b5h zuP<~d>sQccxYQ2-1>Fn2{7mu$y&e28FbTQ`JdgeIg(44j_T3A<9&p1Kd^=DFoxGP` z_St7F;#?8*^}S8oIVhJ1V093Auss1z$A(1Kd|o#YzQ4Z zhdrgh*k6+e@Na+#LbtMC6tJM>jE@(ABdDwT43CSj6||hiQ3G5FEoWA20)o_AIg_Fr zxE5N@dKh;x^@Z|EUug^ct6SjF#tfZ>OAWrt;O`lHm%%R@{6~Y|HF$#04u71%s|^2> zvdfw}JN?TIzQ*7!29G|^_J7xJ<2MX`+29_7?=`s7;6@WZV%+rxFE+Ty;3EwlZSbF( z?R0t!zTe>M4Zh0YFPiu(4L;4_B7+Y#_@A|Qe4PgW-rydCyA8g>;IA1yjxhQDq{?A` z(+Qe-Qg5)w;L{A=-*`T#Tup;*$7X{sGWaTkzhm&N2JbNVQGGU*l>e1yTH4W4E6 z=r;9hkHK#mJl1RLcbvg<3|?$-y}_#tzTDu=26q|!PovL|jC;4iFB<$8gO!oXGx$h@ zKWO=WTJl$!dV9UWTMd5F;68(Mnryok7+h}fxdv}Ga-UQ_zP!@b=UWDM8T_chzc)C; z^jC))Tww5N2D=SzG4hSZ9WnSVlfOS1{EERZ8r*I0O$J|U@CJkHOuUN?KF#1Fg9{8k z(%=aOk2W~N;A*4KKTW(>8~jPx`~A|{Q)8Eh$lXa>?3Tl&zBIr)k9Hfc;!MUQxtUUD zklXOZ0l7=z1(B;cXMnegyp}A@PVu(&GZ#HtBJ}zG}!v%TJFB?E01- z7nnXNJuc7%+h6xL}KGK6_0o?M>TiOGfIZirX?P*$`^{m-Fr{bCK*onzuIM zs}3w@@0J`jq+ZH)$m&4CUlnHQPs(|GA-zwft$|G(e14N1+$Rn3L5mBbzP5(7>eB4$ zmazU>BX2l_Mx|wXKka4WVne9yS|=`1UbTwW9BsshE8Tjx8+uxq3-tasJEG%_i?0Xr zuDZy$mh#OkaZfdF9ho|_qH1wPrL#Nb3z~adw}F7q&G8ma8es-ho=~53>P$ zEm}ob$QagN&U;%`uwgyL2c6y;j;}+!k?g}}TR$6Km#dP@>JSGw>C?LG1D_TMr!CBm zbD!Dt%3EM1DS0Ce&4xuv!3>Yjcm9Ao;t~tl+hpynxseR^@H#9)tj?5^cbrJCQyj#` zmOVKMi!Cc;jR` z`vj(et&WdpkVZm4J`1YU=fxf=yx%B&vQ~o2J2MHXPi>OdTZAa(%gC#oqqdd`hqI+P z){br0hid=u+O~!SOFg7h_68$-F_pKCSWut2QRZ-dX~&Nd^=G5)e5q3;rt&g%iz5$x z#DJZuIZguWPZcS2<%onTHW+b2U}@udZ05Bi5teL(ep+jgIG{^CHQ-h!>lg<7&cJg1 zV42wl&n{UVd3Au3uh@*vNt78jRUNQ>co&&zr#3$nXw@g7slQA7TA$q#yX{>WXj|!t zgqEub1Gz}>resL}VyC)XP1PGjYz7Pc~EYa!tHv z)t{$zImJnH;k+d<^e0I3kYO{wzuxB=*x9Mxk@%AtYGS5r3U!XjT2Q{wWF%jehrITO zIpu@Bl>3wcj%{*fY0i8O+K}DrM`>4SLxV3Eksx8U#9dM8bZ7GvZIORjBF51eVIMY} zBUD3>^)m&kwl+c?<&=%k+S*pHzpd8awu)m_YT2HO;hZHT@B8s;w$IK-c>CZuLGiuMMl6XzFXOZPF(u)XKS?7uaF# zkIUD#c{##lb*-;$l|K|{lXF=3>ggZ}zU;onAF0*5LRoc^QS00aYK@QcMP>CnRqI>h zYhZV(<7EeWP_gMaQcLGaL~5tws=Xk}nVAHEskXqisWY-Ai}pEj-^D_$oR`Q=ubIrK zyK!?D_D2k(!Pr;)qNGvJK}U_c7Tl3l72yy+-6NNoO_M(qUS%L~el$2g+NK+>K4ggX zGvc$%ABu4D!_v0Z+zweAlfAUfuGEbcYow9U&Z(&~s8LnfwCjC(=gKIBj!w>Yl$$Dd zV-?JygR4{X4*f;{A`5Y3!-NQL4@;vLuaYLmU|xl!m3*=^;XO=0fL#%DyGCeb!A7^)oFW@nRH?@sp9zGT~J6 zxo3SM4Xb=I5e(Ynt~r{v$5pq8oXMC-a29g5F|Hmaezec~>Dba1NL%33x4>6Zz8CrO zgu&mB{PZgC~igEj)KB zqxxClhGt)@H$1J?&+*6MKvP7{g`DLLw@zPm(p0O}%L&(v;+NS6ZQ7|3m1WI|gm@N} z@qvl$nD>co#xXh^A;Sz6L;lEG$)v|+uqxnw{~sav9;j# z4YzN;J?D;sJDTq(-sav`v#ojCnr*6+HMxXe(;4q9xUTuSHP^+j%ej8i^&775x;}n= z&JB}p*l}+pul-Hnp8^nxI!+XF+Fir@OPJv$=E64U@JMZgFp^+0wgZ z@0Oe!C*8Q?#=SRo-LwN;n$cs&&3kU1gbwXpon2jMvZJdTZMwE?-?n30x5U|P+iJ}X zn{L>AL+{OfH><9^E~~4stE9`*Ro4|H + * + * 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. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @defgroup context Context handling + * + * This is the reference documentation for context related functions. For more + * information, see the @ref context. + */ +/*! @defgroup init Initialization, version and errors + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more information, + * see the @ref intro. + */ +/*! @defgroup input Input handling + * + * This is the reference documentation for input related functions and types. + * For more information, see the @ref input. + */ +/*! @defgroup monitor Monitor handling + * + * This is the reference documentation for monitor related functions and types. + * For more information, see the @ref monitor. + */ +/*! @defgroup window Window handling + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more information, see + * the @ref window. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#ifndef APIENTRY + #ifdef _WIN32 + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Most Windows GLU headers need wchar_t. + * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + */ +#if !defined(GLFW_INCLUDE_NONE) + #include +#endif + +/* Include the chosen client API headers. + */ +#if defined(__APPLE_CC__) + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif !defined(GLFW_INCLUDE_NONE) + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES2) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES3) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES31) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif !defined(GLFW_INCLUDE_NONE) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#endif + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You may not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a shared / dynamic library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + /* We are building or calling GLFW as a static library */ + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW library. + * + * This is incremented when the API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW library. + * + * This is incremented when features are added to the API but it remains + * backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 1 +/*! @brief The revision number of the GLFW library. + * + * This is incremented when a bug fix release is made that does not contain any + * API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 2 +/*! @} */ + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup keys Keyboard keys + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup errors Error codes + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that may not be called unless the + * library is [initialized](@ref intro_init). + * + * @par Analysis + * Application programmer error. Initialize GLFW before calling any function + * that requires initialization. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @par Analysis + * Application programmer error. Ensure a context is current before calling + * functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref + * glfwGetWindowAttrib. + * + * @par Analysis + * Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @par Analysis + * Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @par Analysis + * A bug in GLFW or the underlying operating system. Report the bug to our + * [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested client API on the + * system. + * + * GLFW could not find support for the requested client API on the system. If + * emitted by functions other than @ref glfwCreateWindow, no supported client + * API was found. + * + * @par Analysis + * The installed graphics driver does not support the requested client API, or + * does not support it via the chosen context creation backend. Below are + * a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. + * + * @par Analysis + * The machine does not support your requirements. If your application is + * sufficiently flexible, downgrade your requirements and try again. + * Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @par Analysis + * A bug or configuration error in GLFW, the underlying operating system or + * its drivers, or a lack of required resources. Report the issue to our + * [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @par Analysis + * If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @} */ + +#define GLFW_FOCUSED 0x00020001 +#define GLFW_ICONIFIED 0x00020002 +#define GLFW_RESIZABLE 0x00020003 +#define GLFW_VISIBLE 0x00020004 +#define GLFW_DECORATED 0x00020005 +#define GLFW_AUTO_ICONIFY 0x00020006 +#define GLFW_FLOATING 0x00020007 + +#define GLFW_RED_BITS 0x00021001 +#define GLFW_GREEN_BITS 0x00021002 +#define GLFW_BLUE_BITS 0x00021003 +#define GLFW_ALPHA_BITS 0x00021004 +#define GLFW_DEPTH_BITS 0x00021005 +#define GLFW_STENCIL_BITS 0x00021006 +#define GLFW_ACCUM_RED_BITS 0x00021007 +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +#define GLFW_AUX_BUFFERS 0x0002100B +#define GLFW_STEREO 0x0002100C +#define GLFW_SAMPLES 0x0002100D +#define GLFW_SRGB_CAPABLE 0x0002100E +#define GLFW_REFRESH_RATE 0x0002100F +#define GLFW_DOUBLEBUFFER 0x00021010 + +#define GLFW_CLIENT_API 0x00022001 +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +#define GLFW_CONTEXT_REVISION 0x00022004 +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +#define GLFW_OPENGL_PROFILE 0x00022008 +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 + +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +/*! @defgroup shapes Standard cursor shapes + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @ingroup cursor + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function signature for error callbacks. + * + * This is the function signature for error callback functions. + * + * @param[in] error An [error code](@ref errors). + * @param[in] description A UTF-8 encoded string describing the error. + * + * @sa glfwSetErrorCallback + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int,const char*); + +/*! @brief The function signature for window position callbacks. + * + * This is the function signature for window position callback functions. + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * + * @sa glfwSetWindowPosCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window resize callbacks. + * + * This is the function signature for window size callback functions. + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa glfwSetWindowSizeCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window close callbacks. + * + * This is the function signature for window close callback functions. + * + * @param[in] window The window that the user attempted to close. + * + * @sa glfwSetWindowCloseCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/*! @brief The function signature for window content refresh callbacks. + * + * This is the function signature for window refresh callback functions. + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa glfwSetWindowRefreshCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/*! @brief The function signature for window focus/defocus callbacks. + * + * This is the function signature for window focus callback functions. + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GL_TRUE` if the window was given input focus, or + * `GL_FALSE` if it lost it. + * + * @sa glfwSetWindowFocusCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/*! @brief The function signature for window iconify/restore callbacks. + * + * This is the function signature for window iconify/restore callback + * functions. + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GL_TRUE` if the window was iconified, or `GL_FALSE` + * if it was restored. + * + * @sa glfwSetWindowIconifyCallback + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/*! @brief The function signature for framebuffer resize callbacks. + * + * This is the function signature for framebuffer resize callback + * functions. + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa glfwSetFramebufferSizeCallback + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for mouse button callbacks. + * + * This is the function signature for mouse button callback functions. + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetMouseButtonCallback + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); + +/*! @brief The function signature for cursor position callbacks. + * + * This is the function signature for cursor position callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor. + * + * @sa glfwSetCursorPosCallback + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for cursor enter/leave callbacks. + * + * This is the function signature for cursor enter/leave callback functions. + * + * @param[in] window The window that received the event. + * @param[in] entered `GL_TRUE` if the cursor entered the window's client + * area, or `GL_FALSE` if it left it. + * + * @sa glfwSetCursorEnterCallback + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); + +/*! @brief The function signature for scroll callbacks. + * + * This is the function signature for scroll callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa glfwSetScrollCallback + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for keyboard key callbacks. + * + * This is the function signature for keyboard key callback functions. + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetKeyCallback + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); + +/*! @brief The function signature for Unicode character callbacks. + * + * This is the function signature for Unicode character callback functions. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa glfwSetCharCallback + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); + +/*! @brief The function signature for Unicode character with modifiers + * callbacks. + * + * This is the function signature for Unicode character with modifiers callback + * functions. It is called for each input character, regardless of what + * modifier keys are held down. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa glfwSetCharModsCallback + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); + +/*! @brief The function signature for file drop callbacks. + * + * This is the function signature for file drop callbacks. + * + * @param[in] window The window that received the event. + * @param[in] count The number of dropped files. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @sa glfwSetDropCallback + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); + +/*! @brief The function signature for monitor configuration callbacks. + * + * This is the function signature for monitor configuration callback functions. + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa glfwSetMonitorCallback + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @ingroup monitor + */ +typedef struct GLFWvidmode +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa glfwGetGammaRamp glfwSetGammaRamp + * + * @ingroup monitor + */ +typedef struct GLFWgammaramp +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GL_TRUE` immediately. + * + * @return `GL_TRUE` if successful, or `GL_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @remarks __OS X:__ This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref intro_init + * @sa glfwTerminate + * + * @since Added in GLFW 1.0. + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. + * + * @remarks This function may be called before @ref glfwInit. + * + * @warning No window's context may be current on another thread when this + * function is called. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref intro_init + * @sa glfwInit + * + * @since Added in GLFW 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. This function always + * succeeds. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @remarks This function may be called before @ref glfwInit. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref intro_version + * @sa glfwGetVersionString + * + * @since Added in GLFW 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns the compile-time generated + * [version string](@ref intro_version_string) of the GLFW library binary. It + * describes the version, platform, compiler and any platform-specific + * compile-time options. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function already provides the version of the running + * library binary. + * + * This function always succeeds. + * + * @return The GLFW version string. + * + * @remarks This function may be called before @ref glfwInit. + * + * @par Pointer Lifetime + * The returned string is static and compile-time generated. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref intro_version + * @sa glfwGetVersion + * + * @since Added in GLFW 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @remarks This function may be called before @ref glfwInit. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref error_handling + * + * @since Added in GLFW 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @param[out] count Where to store the number of monitors in the returned + * array. This is set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is guaranteed to be valid only until the monitor configuration + * changes or the library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa glfwGetPrimaryMonitor + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @remarks The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa glfwGetMonitors + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @remarks __Windows:__ The OS calculates the returned physical size from the + * current resolution and system DPI instead of querying the monitor EDID data. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified monitor is disconnected or the + * library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @bug __X11:__ This callback is not yet called on monitor configuration + * changes. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths) and then by resolution area (the + * product of width and height). + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified monitor is disconnected, this + * function is called again for that monitor or the library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoMode + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Changed to return an array of modes for a specific monitor. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified monitor is disconnected or the + * library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoModes + * + * @since Added in GLFW 3.0. Replaces `glfwGetDesktopMode`. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates a 256-element gamma ramp from the specified exponent + * and then calls @ref glfwSetGammaRamp with it. The value must be a finite + * number greater than zero. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + * This function returns the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned structure and its arrays are allocated and freed by GLFW. You + * should not free them yourself. They are valid until the specified monitor + * is disconnected, this function is called again for that monitor or the + * library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @remarks Gamma ramp sizes other than 256 are not supported by all platforms + * or graphics hardware. + * + * @remarks __Windows:__ The gamma ramp size must be 256. + * + * @par Pointer Lifetime + * The specified gamma ramp is copied before this function returns. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in GLFW 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_hints + * @sa glfwWindowHint + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to @ref + * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is + * terminated. + * + * @param[in] target The [window hint](@ref window_hints) to set. + * @param[in] hint The new value of the window hint. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_hints + * @sa glfwDefaultWindowHints + * + * @since Added in GLFW 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int target, int hint); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. + * + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, windowed mode will be used. Unless + * you have a way for the user to choose a specific monitor, it is recommended + * that you pick the primary monitor. For more information on how to query + * connected monitors, see @ref monitor_monitors. + * + * For full screen windows, the specified size becomes the resolution of the + * window's _desired video mode_. As long as a full screen window has input + * focus, the supported video mode most closely matching the desired video mode + * is set for the specified monitor. For more information about full screen + * windows, including the creation of so called _windowed full screen_ or + * _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * If a full screen window has input focus, the screensaver is prohibited from + * starting. + * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` to use + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @remarks __Windows:__ Window creation will fail if the Microsoft GDI + * software OpenGL implementation is the only one available. + * + * @remarks __Windows:__ If the executable has an icon resource named + * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is + * present, the `IDI_WINLOGO` icon will be used instead. + * + * @remarks __Windows:__ The context to share resources with may not be current + * on any other thread. + * + * @remarks __OS X:__ The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remarks __OS X:__ The first time a window is created the menu bar is + * populated with common commands like Hide, Quit and About. The About entry + * opens a minimal about dialog with information from the application's bundle. + * The menu bar can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @remarks __OS X:__ On OS X 10.10 and later the window frame will not be + * rendered at full resolution on Retina displays unless the + * `NSHighResolutionCapable` key is enabled in the application bundle's + * `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remarks __X11:__ There is no mechanism for setting the window icon yet. + * + * @remarks __X11:__ Some window managers will not respect the placement of + * initially hidden windows. + * + * @remarks __X11:__ Due to the asynchronous nature of X11, it may take + * a moment for a window to reach its requested state. This means you may not + * be able to query the final size, position or other attributes directly after + * window creation. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_creation + * @sa glfwDestroyWindow + * + * @since Added in GLFW 3.0. Replaces `glfwOpenWindow`. + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * If the context of the specified window is current on the main thread, it is + * detached before being destroyed. + * + * @param[in] window The window to destroy. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_creation + * @sa glfwCreateWindow + * + * @since Added in GLFW 3.0. Replaces `glfwCloseWindow`. + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_close + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_close + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @remarks __OS X:__ The window title will not be updated until the next time + * you process events. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Retrieves the position of the client area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the client area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the client area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the client area, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_pos + * @sa glfwSetWindowPos + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the client area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the client area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the client area. + * @param[in] ypos The y-coordinate of the upper-left corner of the client area. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_pos + * @sa glfwGetWindowPos + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the client area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the client area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * client area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * client area, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * @sa glfwSetWindowSize + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size of the client area of the specified window. + * + * This function sets the size, in screen coordinates, of the client area of + * the specified window. + * + * For full screen windows, this function selects and switches to the resolution + * closest to the specified size, without affecting the window's context. As + * the context is unaffected, the bit depths of the framebuffer remain + * unchanged. + * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * + * @param[in] window The window to resize. + * @param[in] width The desired width of the specified window. + * @param[in] height The desired height of the specified window. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * @sa glfwGetWindowSize + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa glfwSetFramebufferSizeCallback + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in GLFW 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, the original monitor + * resolution is restored until the window is restored. + * + * @param[in] window The window to iconify. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwRestoreWindow + * + * @since Added in GLFW 2.1. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window if it was previously iconified + * (minimized). If the window is already restored, this function does nothing. + * + * If the specified window is a full screen window, the resolution chosen for + * the window is restored on the selected monitor. + * + * @param[in] window The window to restore. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwIconifyWindow + * + * @since Added in GLFW 2.1. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * @param[in] window The window to make visible. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_hide + * @sa glfwHideWindow + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_hide + * @sa glfwShowWindow + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an error + * occurred. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_monitor + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @remarks Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remarks Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_attribs + * + * @since Added in GLFW 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_userptr + * @sa glfwGetWindowUserPointer + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref window_userptr + * @sa glfwSetWindowUserPointer + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the screen + * position of the upper-left corner of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @remarks __OS X:__ Selecting Quit from the application menu will + * trigger the close callback for all windows. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in GLFW 2.5. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the client area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz or Aqua, where the window + * contents are saved off-screen, this callback may be called only very + * infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in GLFW 2.5. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in GLFW 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain events are sent directly to the application + * without going through the event queue, causing callbacks to be called + * outside of a call to one of the event processing functions. + * + * Event processing is not required for joystick input to work. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref events + * @sa glfwWaitEvents + * + * @since Added in GLFW 1.0. + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref events + * @sa glfwPollEvents + * + * @since Added in GLFW 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents to return. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref events + * @sa glfwWaitEvents + * + * @since Added in GLFW 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa glfwSetInputMode + * + * @since Added in GLFW 3.0. + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + * area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to + * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GL_TRUE` to enable sticky mouse buttons, or `GL_FALSE` to disable it. If + * sticky mouse buttons are enabled, a mouse button press will ensure that @ref + * glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even if + * the mouse button had been released before the call. This is useful when you + * are only interested in whether mouse buttons have been pressed but not when + * or in which order. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * @param[in] value The new value of the specified input mode. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa glfwGetInputMode + * + * @since Added in GLFW 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to + * the key callback. + * + * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is + * not a valid key for this function. + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. + * + * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function + * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, + * even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the client area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the client area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the client area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the client area, or `NULL`. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa glfwSetCursorPos + * + * @since Added in GLFW 3.0. Replaces `glfwGetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the client area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the client area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * client area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * client area. + * + * @remarks __X11:__ Due to the asynchronous nature of X11, it may take + * a moment for the window focus event to arrive. This means you may not be + * able to set the cursor position directly after window creation. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa glfwGetCursorPos + * + * @since Added in GLFW 3.0. Replaces `glfwSetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel. They are arranged canonically as packed sequential rows, + * starting from the top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The specified image data is copied before this function returns. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwDestroyCursor + * @sa glfwCreateStandardCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * @param[in] cursor The cursor object to destroy. + * + * @par Reentrancy + * This function may not be called from a callback. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * @sa glfwCreateCursor + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * client area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specified window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on OS X or Alt key + * on Windows. There is a + * [character with modifiers callback](@ref glfwSetCharModsCallback) that + * receives these events. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in GLFW 2.4. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. Updated callback signature. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in GLFW 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); + +/*! @brief Sets the cursor enter/exit callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the client area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in GLFW 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in GLFW 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); + +/*! @brief Sets the file drop callback. + * + * This function sets the file drop callback of the specified window, which is + * called when one or more dragged files are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in GLFW 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in GLFW 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int joy); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if an error occurred. + * @return An array of axis values, or `NULL` if the joystick is not present. + * + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in GLFW 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if an error occurred. + * @return An array of button states, or `NULL` if the joystick is not present. + * + * @par Pointer Lifetime + * The returned array is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in GLFW 2.2. + * + * @par + * __GLFW 3:__ Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present. + * + * @par Pointer Lifetime + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the specified joystick is disconnected, this + * function is called again for that joystick or the library is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in GLFW 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window The window that will own the clipboard contents. + * @param[in] string A UTF-8 encoded string. + * + * @par Pointer Lifetime + * The specified string is copied before this function returns. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetClipboardString + * + * @since Added in GLFW 3.0. + * + * @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window The window that will request the clipboard contents. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @par Pointer Lifetime + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetClipboardString + * + * @since Added in GLFW 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the value of the GLFW timer. + * + * This function returns the value of the GLFW timer. Unless the timer has + * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW + * was initialized. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current value, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @sa @ref time + * + * @since Added in GLFW 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW timer. + * + * This function sets the value of the GLFW timer. It then continues to count + * up from that value. The value must be a positive finite number less than + * or equal to 18446744073.0, which is approximately 584.5 years. + * + * @param[in] time The new value, in seconds. + * + * @remarks The upper limit of the timer is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref time + * + * @since Added in GLFW 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. A context can only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref context_current + * @sa glfwGetCurrentContext + * + * @since Added in GLFW 3.0. + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref context_current + * @sa glfwMakeContextCurrent + * + * @since Added in GLFW 3.0. + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window. If + * the swap interval is greater than zero, the GPU driver waits the specified + * number of screen updates before swapping the buffers. + * + * @param[in] window The window whose buffers to swap. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa glfwSwapInterval + * + * @since Added in GLFW 1.0. + * + * @par + * __GLFW 3:__ Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current context, i.e. the + * number of screen updates to wait from the time @ref glfwSwapBuffers was + * called before swapping the buffers and returning. This is sometimes called + * _vertical synchronization_, _vertical retrace synchronization_ or just + * _vsync_. + * + * Contexts that support either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, + * which allow the driver to swap even if a frame arrives a little bit late. + * You can check for the presence of these extensions using @ref + * glfwExtensionSupported. For more information about swap tearing, see the + * extension specifications. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @remarks This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @remarks Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa glfwSwapBuffers + * + * @since Added in GLFW 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [client API extension](@ref context_glext) is supported by the current + * OpenGL or OpenGL ES context. It searches both for OpenGL and OpenGL ES + * extension and platform-specific context creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref context_glext + * @sa glfwGetProcAddress + * + * @since Added in GLFW 1.0. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified + * [core or extension function](@ref context_glext), if it is supported + * by the current context. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an [error](@ref + * error_handling) occurred. + * + * @remarks The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remarks This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. + * + * @par Pointer Lifetime + * The returned function pointer is valid until the context is destroyed or the + * library is terminated. + * + * @par Thread Safety + * This function may be called from any thread. + * + * @sa @ref context_glext + * @sa glfwExtensionSupported + * + * @since Added in GLFW 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/include/GLFW/glfw3native.h b/include/GLFW/glfw3native.h new file mode 100644 index 0000000..b3ce748 --- /dev/null +++ b/include/GLFW/glfw3native.h @@ -0,0 +1,356 @@ +/************************************************************************* + * GLFW 3.1 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund + * + * 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. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @defgroup native Native access + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you must define exactly one + * window system API macro and exactly one context creation API macro. Failure + * to do this will cause a compile-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #undef APIENTRY + #include +#elif defined(GLFW_EXPOSE_NATIVE_COCOA) + #include + #if defined(__OBJC__) + #import + #else + typedef void* id; + #endif +#elif defined(GLFW_EXPOSE_NATIVE_X11) + #include + #include +#else + #error "No window API selected" +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ +#elif defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ +#elif defined(GLFW_EXPOSE_NATIVE_GLX) + #include +#elif defined(GLFW_EXPOSE_NATIVE_EGL) + #include +#else + #error "No context API selected" +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @par Thread Safety + * This function may be called from any thread. Access is not synchronized. + * + * @par History + * Added in GLFW 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/lib/msvc14/x64/glfw3.lib b/lib/msvc14/x64/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..2b94f5bbd05c4a027d853eff3737d61f14258e51 GIT binary patch literal 19602 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 OBBiY%rY$7@boF0BxUX*j literal 0 HcmV?d00001 diff --git a/lib/msvc14/x64/glfw3d.lib b/lib/msvc14/x64/glfw3d.lib new file mode 100644 index 0000000000000000000000000000000000000000..e2a9c8c02047f454a8b42d3a783ef45295e32f09 GIT binary patch literal 19602 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 PK%}%a#I%LvpRWE3j7hP1 literal 0 HcmV?d00001