From 599c41ef1b373753a9fe5e2839b31be2b1358df9 Mon Sep 17 00:00:00 2001 From: Julia <145168563+julia-aph@users.noreply.github.com> Date: Mon, 22 Apr 2024 00:19:54 -0500 Subject: [PATCH] the hub the hub --- source/io/input.c | 12 ++++++++---- source/io/platforms/platform.c | 0 source/io/platforms/win.c | 2 +- source/main.c | 12 +++++++++++- test.exe | Bin 82233 -> 82089 bytes 5 files changed, 20 insertions(+), 6 deletions(-) delete mode 100644 source/io/platforms/platform.c diff --git a/source/io/input.c b/source/io/input.c index 73cc854..7332cd3 100644 --- a/source/io/input.c +++ b/source/io/input.c @@ -29,26 +29,30 @@ void InputBufferAdd(struct InputBuffer *buf, struct InputRecord *rec) *buf_get(buf, buf->len++) = *rec; } -void *input_thread_loop(struct InputThreadHandle *hand) +void *input_thread_loop(void *arg) { + struct InputThreadHandle *hand = arg; struct InputBuffer tmp_buf = { .len = 0, .start = 0 }; while (!hand->is_terminating) { + printf("\tinput cycle"); if (!PlatformReadInput(&tmp_buf)) { hand->err = true; - return; + return nullptr; } hand->err = pthread_mutex_lock(&hand->mutex); if (hand->err) - return; + return nullptr; InputBufferTransfer(&tmp_buf, hand->buf); hand->err = pthread_mutex_unlock(&hand->mutex); if (hand->err) - return; + return nullptr; } + + return nullptr; } bool BeginInputThread(struct InputThreadHandle *hand, struct InputBuffer *buf) diff --git a/source/io/platforms/platform.c b/source/io/platforms/platform.c deleted file mode 100644 index e69de29..0000000 diff --git a/source/io/platforms/win.c b/source/io/platforms/win.c index e683185..7b2825f 100644 --- a/source/io/platforms/win.c +++ b/source/io/platforms/win.c @@ -88,7 +88,7 @@ bool copy_mouse_event(struct InputRecord *rec, MOUSE_EVENT_RECORD *win_mouse) return true; } - if (win_mouse->dwEventFlags & (MOUSE_WHEELED | MOUSE_HWHEELED) != 0) { + if ((win_mouse->dwEventFlags & (MOUSE_WHEELED | MOUSE_HWHEELED)) != 0) { rec->type = AXIS; rec->bind = win_mouse->dwEventFlags == MOUSE_WHEELED; rec->axis.value = win_mouse->dwButtonState; diff --git a/source/main.c b/source/main.c index ed8ea7a..d2314cc 100644 --- a/source/main.c +++ b/source/main.c @@ -33,7 +33,17 @@ int main() if (!BeginInputThread(&input, &ctrl.buf)) ErrorExit("Input handle failed to initialize"); - printf("woah"); + CtrlMap(&ctrl, 0, BUTTON, 'A'); + + while (true) { + bool poll = CtrlPoll(&ctrl); + printf("poll: %u\n", poll); + + struct InputAxis *a = CtrlGet(&ctrl, 0, BUTTON); + printf("get: %llu\n", a); + + printf("val: %u\n", a->but.value); + } return 0; } \ No newline at end of file diff --git a/test.exe b/test.exe index 78e8ad2f1138a1bebece1cb134dee3b2c0d134dd..0f79fc9247e3c18aae0a3f73d470ac84372fc348 100644 GIT binary patch delta 11069 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 FEMhN{S0dPAL*H zWe+K*phV~!;xgiH{UjU%ZiRQt#p`s3P?wEs3N6&_Evu%%Gfnm*dF|ARxnWqJ$kI7e z7EOL)=Hh~iFjr?jKt~MlmWPr8@q)fx5n)<(%fTy*k;bX9!S5OjP%FWbZmWfXE7hjdRr$pg!8>sx&+=g;YFu;@2-JT z>!ECf!aBCJ*#%{~hjIW)rCXUgujt9i#RXHx;I*mQ^GVp8^iVD(L0X4*qGqE8D0|$B zE8PZ4dB>_Tx5}ggN$={!ylB1(l)J~5(^2nMY3f_q^`eAIomj{1I+tqjAUC>Zh%b~7 z0|gPZcv^cv@xfbIb6EYMbagAE3Kl+8P&`M-aVy-<5ZDC9xOxpOE-2te@3<9iGnza4 z#zUF_<&M_XjdvM6zeFh3xfItN;PHD8I}uJCs~Mr5OL{+7-Lbm(rLanepI}nkg|< zEJ~o@qjA(=l{Iy(3?|Z~-Ks(EH66XNJ4d6%u5`rh@K8wY_ULf7o<5+O{cTT`rl^(4 z0_wR}Czd$|soWn=mOcKIygyQ7Yi0NfUEQ05Z`;!cqSouZr4Ny0E|SzG>JnWE^5pH% zjZVc&aHS0YFYUX7zfEqe{zDUtL$zg;+i6dYPBbT~dGZjn`{Olvt&H~5%>6Bl&TA@L z8JwiIktMvi_9^J?1G88jO*uGQ!!PTWW1gj74(i0pF3vIiY1`fq3f|&Jlit^9a$6aH zPj9@h8pCze^rGT|CvehLc5$WcO0trg-nVKjtvdfg=RVN!-@}5B4yE*i{xsrHq^6;j zQ4pC9@hkP+Lpj6rNe;(6T)eU2Pz>tUQW*^8dkL-t=LWrmU6cNi^>xov1e;%I;+QC__`%%HT259ajx3 zC%eWF4a3M3xpw_B`K_HeE4L$mjTf2Cf>&416Bg_6wOpzBABTpc&|YR>ogZ-n*ou z1!v=-_|b*0^GP~4j7_J*U+QoOoc?+?T{>3?w&ijkDmyPz+wTo@54aY%^n%Pv)c*Dh z@i?STe?5y9emRWoQhVEI{m=Mw;Xh~78oPmR{!?bPs+XdRGL5?CM>{U3&`;n?uN$cF zE17QoXrLdyl9^q#nsG^H`{6r>s(&h^X5^mSs}zwJJ8#6)?`)re9~%h93%P?_C4+zAjVmKMhoMUB(|7d8f`d;zcv>G>hK3 zA>;ooaAt}(3EuJP9}B4p9g=>M*-L24p?B{2(YR|#^3V|6me7DxDEKiO_^O#0}y}3H;E&F4Zq6xn>r7m^ACP-cuv{M zU>k5tRv$tf?OQQOladi7uyz+|39HBgYTNbM%93pWzKzP)T{;LoSacpShi^>C9 z4%VQuyN$9kS7I8PeX|=a{#_RF6|McYH#LI#I_QEsva-|%CLiBfxTHwIqj;O9ACR*{U>#HAZ_?D1xL+4`4$@txDUh8_C~_W?qA+=K$>O*+H0f!KiEv zV!fGBITxfZWY1tMWSUV~8_b4=)_M3_i)n9At_GubqvF?&O-M7VQ{|fX9IQf_J3k)t zL?}jg1XJ?o74yp^FH?D`9oD8yc^^*TD?9`{Vv$iv4`Fc$7LPF(;6vN&_P~9vhLWqS z3SrAaw|kfl#iy=T2@QoyqcSIy<%IbfU6ai_3izZJe3aTyHWb?;C=7Y#8I@UKY!=fh zUxYDTXr0G|_rM2tuA*s=S=yAL3~rBQE%F#}9Sm&BLKxt2cpDH}Z)`ar!`HY)xrK%> zn@7iqXb6^+j1KHMMDl3|Y|!%_23sQpAuUtsAI{>!v>q*&(IVp+M2l$2P@WHG7Mv}L zA%a;FEb8d4)n9-w=azRD&wPBTw;;OUh#^-M7x7|0zcjq%oT*~8HxqAVHOYDbl4_kDrb31p8Hwk8J3}? z2**Wdw3MmAx_0~?v=}p$!JYA}$Nn2)fj8>_ delta 11008 zcmeHMdt6l2+TLr!R$v51KppM_14=3|DvSsMlL~CqY_jy|Nso$RrX-|T)=|J)$(bzj zO}AYIk7=bAGKQj+cqysO$S#_hj+BLINoqx9ah|p30>k$^=lA{feg7POzvc6+XT9rP z@4NQ8>^;7`LTXqkRjmzKbUb#h@SGq_>?sIsLVrOciUXf~ZlrkPhbPZGzy!L3Ws6hH zw4P01CAJG}y!Xt_a|FREtZ6Lm)gTIj&^jYa5H9;QFwXA;Z#|JI2(q=$UkYItRH<#P zchm>C>J#F4yL4xeq@qdc~M?`ILXw6;XMU(Am%{bQo^e`mIkYMXO!v&#glDy(d1(KH6?ToA7>JyPX5%Tko5r32@ z(LXL@SRkgbjje7h4Mf6`Q(=s}3OkVaI?3p)=EAKygYt@_+~4#gRrsS`0h!ET8yj#Z zV^7##2>hBckyiDN7tao(S9(9frqPg~17cbO{SZX#0Idujl~_B3`(M+J5cg{lPy_#` z^%;lS##OyrT}?j*UmCE*h#uA)t!%9@@=Ori6P=RQDJ`?HKEr#KubWh@hS>mzFgj+u3Qx-PBdRt`yC)u`phS8w6c25wb3O6P2}nss=l zQ(dN3t?YDt9ZMz8B|ANA`}ZEgou+~H<_LBA1J_K!oL}~?y3DF5F)}US;-4KI`w^9z zay~7NG_V__L`Je-==I3x%<~EA>guWHds*7Yv%vDw^ zc}CL6rzt2ZHmH4vQ;v4Xx~C~OYC!M3F8SOh)%p~bMGX$vf{Jz0P0R}%d`kPGD#SUv zC_VaP#wbAlmG8V6943O9w%nqnQI~pQenCu+40?p z>I>T`&9FV>#nEuEs*%ZouVKNcN6j;~>xQioyJ*{Vi^TNN>Yi73xfIO#szx8oi;pTx zY%sk!Fj9;))7gP>>?W~6p{#|%2gSr(w|8_@VRnt3n-}NBW9kzKJSO=+M$-q4(B@`i zj&Q(=rT&O1Et|FtN)cms(Ahyl+0PU>c;7wwIK8aiqPz(wNG3nYSaXLR`^+B)hFqD` ze)%?3qFog;D#KirVW{M~D*aKJ<*J0DvdmTKh02SRlsHwKosaJojf8(yJ)g(_0Q)@L=W9~t2BVqzO*YTnzhphNr}BD;=sbhw(iFggsE*U+WS$J zv4>xqTscY)=`k*a(zxVsaWbcUsVq4_G;$hFFDC~D`aY{JEh_K@h|_w2w|y+(kgwN!h_{k-sd#NlqOnMP?^aj>Q+#_X#l%Q=S&y<-yPby zCf>9)4^LwLKa`;xE-)NYeOgE}!o;rAs1bQ-tGKQ%_?N5H>9zK$=8`q1U9PksQI66& zF0GR$yN&nIp%IZoc^!|#Zyyiw(sTF+Mxkz_Y=_5VIqke15hscogHu8( zQY#2lC$C!GCY1J8v!b8VV}oxjbHy-GHR31b5M3~3Wtd0SqYa&cG3+Y0+2@b*P>)F) zpz!nY^77VJENQE>76N|}D#C!Pm(l)=p)unj@xNnIx|6|`2Go)DEsxv$N6u#KEZv{^ zvN$x6BC^J^Z|I(^JK1_VkhPtCN3*ksvpRY5dtzYpYIs53 z@v+YK|1B0^FY)o5SneYK$LLC+9GS0i&VUo2QPE}45&u`G{-3eaKFDeB!fTi+o^gv4 zPdf21#}qWwIfX4wT<^q{PF&=~0w+$SFLDa+=p67n=YVIN_?{E@JMk4Ko>cMDfwytZ zbpG-CjsNLwmvR#rm3Y6#EOaS1nvAk}Y{^)`%-6K*ud!QQKhCqg`H-W2+KCn89raz~ zX}_F1xWZ-bliuFrMDynQv0MBfES@#b6@owq$Hq|G*eTx4DXLY7 zZRWT*7S{J@M@Q3&D>GGwx1w0)#6YB#_0s%6L5}ChYErnoa50jLAV0m3~WJZ2j@679Q$*( z1FwPi0_T_$AqYBf3vek)95~10C`NFOk&%Kha<@<}=s~iha66%aqZMTeIL93*bHF)% zic$p5u^vARl!9}dqZfn)7kAZVMh_VTsEyvdr0>$IU3M;2hWX7la$&98aQn*Euj77qb@J3~WV- z0OzQ~CsqQut{mhJloV7r)}xrgISTm38xPL02IVerju8U|VH!Bc^MeFo9ymt{-x^E7 zIc`T;4PFZjOT^;^*8?Y`JO|G4A(Zm1sBog7)Pi%Io+JowfOGs4r3swlkYvmRILEO@ ztPgOGhlgT)fO9;F@A-CcJ1`pWsNOaQD&Sghjt5a9z#CKW{NG0<0TmqV!eYGJ8o@bM zp^OCQcnW0D79#)1%{cCJvhfPC{5rN;Nnrp9=rk=gU>-bIL8*0E8rYgj6wF`9GB-H`#rD+ z-bB%YbKH=N?7=zSU7m;RQMntq10@BV_%Azj(b~(9EU{-jyqdejPevXE@X7VjsTy}2`+45CvO1mLfHq-(T;KyoFi^) zp&6W`0p%<>N8H}R*Wes+g9~lo9N$H`39h#YLOhDk>om*z+WNVJP0bS=ugp?!K?q0T zbIZ}!$4l~==b9_|-80ujI=opgeF|T-bZd3AbeRvOGB1p3rbG47QZiUG*J#W0eVJWtErM39YB!%> z$&9LYN$tVC1d5nouCaJZ-fR#vM5=xvR=NYSh0EeSA~he3l^%!Cs0w>T%Bqf)&O)f= zgHp?8J`|W}@}joqVx_-%AvD+;ShZ@fx;g7$hSGJjh0&-Dpn{@`?_qBN(+~kLWhGnFV;z_DIMC|k1YT6(b&6< z^tWwsVzZw*(oT43@pF0Mj`u;Cs&Og#3m+(6P>7qyt++;lgLB*JG{&CpjMXgmY>yKy zy-0sBEb*>;?<<^8{GhNDE2lG)58?l~TXA`_P|Qm<>bosYQ_;;~#LIC^Pq)5oD9;XX z`MIaCbVk8~Qo-t0c;v0{yu(Ae4&_s~GWXtvbGTi7pvw=hb--qh)}@pd&$yQx)wq?> zrHhJgn^htlls%-p!ct)`Hcw|_zE}_;K`w=NvlJHl80t2Dx6*8R(N>FVH1J(t4`175+I!q?<(=lE#XDVVdTz;p5JBDGO{)r>XRlBW@kYQV!1qM_J%Bd7n(A(5WmNMzcBW$>{r))8 zzV1iQG=yo|x*2YxN%eWGnfrUv=q-!=JG=v7X|%e`CR-*4}4_>V+s z-|reTPTQ`j)KYwd0k_kSHUsepsv6=nRo!e3)8}1mPHXJl+CQPl1Kh{+^^R=q@ih0q zd}gMP4lK|ZaUgdc@Epy0!ypO+)XCNF_oKe`L8Ptmr4QaPXezoHU!^{8s>av=;d4tC z6)wivC=77r?0T>Q6~Bp<)2;Kbl=qfF)bf#XY3BhydgHAyjo#lgoPPBCTLz}3=!1Fr z6;8)IT)f`l7@aZDF_c3Y1!ef4uF4%y$~=@=P<-gMg9bK}U+vOf)Jyo)?&}IxOW}u$yw^anbHYtw(Y-GrO7JO?MuhDpm}oSC7V~#SC*rz$au2PNx>9;+T*F zP*$Y4Y+MPVv(MXgn%Zuj3+epZ2C*U)Q4S{KJ6Re5mu1&Ti;3P*4YbDx)A*(^`tzMQ zjisB>qm*|{HR6Z+&lvw^s%v~6qlB%z0bd%O2U{4FyYX$&sSJm*!$Y|p%I_XZ0hH}& zU3)Ep@`Z=;L_bL5N4SjK>8Fyu347f$aPfJO8b1r8pm$3(Mtt5l&Y_{S`@K9WX$r!w zrXSvYitVOV?-|6BbaKo=9JRl9Leu8y3jc9>`F*F+e2p3J4qa#QecF6nZFD?uUtA8Y z$Llmz-ORqAgCF3GOLt!_pgt$+H1=+Gm+AZoTrC+cJG?Lr_|T>?;{BxSsJ~Fhhk0T} zhPtcgH_MueZU&ijsu|CX`-#fP!0{%GbWPlh;)R7v?=2N7+zNk^V_~z)Lzx0a%ipm3 zEeErEw5^4rBkM;Cf(@B2zue3B&>Q*o%P4(VJv)Q~k9J=iWe>O&_anr2rsDzS;~hC1 z7eyZ`Jz1sE;)TwUb&z^DHFrs}=2WQIoJmzJDYWuqSv;LdCEukI`y@}aJJhmIWUXp+nTc*01@_8K2vs=&4r*A*cXM4C8wZ4EF&lHJThk3ylvZ!-VJE-14 z|8`au6CCs`sL?_H`lT$UIq2yxWp)^&ID zzBW`~m2F(L_bnx^`}ge+e~y4 z_zBR`A=AVkO>_d-{G(~ZcqX$Z-ebdiOs3o$CPii-M?v1fkYGDc*w*raBv)QT*Q zweeJyY%i8C{_Mz=D+?5zH^WZKRvz(YQ^fXc#SUbGGD2cgsrFZm^1Q@ur=;IB$}gPk z{LQ2+>w)pTl|wyQxMJ_Y28((#-=oUXp3sB1j`PvXcd26WVMQ!idDDlbatU9m>f4{% zp#Vob|7uTQdS$yWTOg&GamdhxebE{{KIEK-sdB3yQ$k9dg5v}INt{v5naUMEh6knu zYS`2enfJx<<}irCi_gq#WtoPh^q+@c!a7?XLyK0mb$#tW3&rlOe5PT!VoA0V)r+Ns znDI%%$9H%efVYd6vXr@K5%*;)&-G%l!JYwaghiF|Q7>i)NplZ3W43yT3sbTbAAj~) zyv2D|io%Q;r4KKhbzh;~ea>Pm;Raq0%!*e4n;NY37=JcyyIQ3g7-*Gm zVE_k_eOPL+(cE=0v3~d^OesV|h}L5wr=g+ETY0q)dz>{YnSHT96FdyI;8S{Smhwtp z78_FHF=h)|HenZ{h2MzY{aCfQG+WsQjBoSs@c=%oU-FoMHBe+_few>houyRi;G!y9 z*`ve8uE1m!9qxZNY{(NTQX<0F`% zzs~K3KljCG=-gJ0y@Q{~vXq4pJb^5wDT2lJw|J}-uV`#^x0l8E9jI_2ez?Y)L?mXm z!ozkXY?o#!xxB^f-iv(X3bZuhxZo|#YOt>L{W@BzvXr_=?3HSdmN9z1(=<`Y)Z)h?*LTstg126O4*=XNN%y`j;pD&}9%x)C%0