From 09e8e8e6b3361b3cf4eac38acabdf751c2e57ba8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 6 Sep 2014 16:03:09 -0700 Subject: [PATCH] Remove isMouse() and replace it with more precise has*() functions --- jni/evdev_reader/evdev_reader.c | 29 ++++++++++++++++++++-------- libs/arm64-v8a/libevdev_reader.so | Bin 5368 -> 5368 bytes libs/armeabi-v7a/libevdev_reader.so | Bin 13476 -> 13476 bytes libs/mips/libevdev_reader.so | Bin 5424 -> 5488 bytes libs/x86/libevdev_reader.so | Bin 5176 -> 5176 bytes libs/x86_64/libevdev_reader.so | Bin 5632 -> 5632 bytes 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/jni/evdev_reader/evdev_reader.c b/jni/evdev_reader/evdev_reader.c index df2b1352..16586d43 100644 --- a/jni/evdev_reader/evdev_reader.c +++ b/jni/evdev_reader/evdev_reader.c @@ -26,22 +26,35 @@ Java_com_limelight_binding_input_evdev_EvdevReader_ungrab(JNIEnv *env, jobject t return ioctl(fd, EVIOCGRAB, 0) == 0; } -// isMouse() and friends are based on Android's EventHub.cpp +// has*() and friends are based on Android's EventHub.cpp #define test_bit(bit, array) (array[bit/8] & (1<<(bit%8))) JNIEXPORT jboolean JNICALL -Java_com_limelight_binding_input_evdev_EvdevReader_isMouse(JNIEnv *env, jobject this, jint fd) { - unsigned char keyBitmask[(KEY_MAX + 1) / 8]; +Java_com_limelight_binding_input_evdev_EvdevReader_hasRelAxis(JNIEnv *env, jobject this, jint fd, jshort axis) { unsigned char relBitmask[(REL_MAX + 1) / 8]; - ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keyBitmask)), keyBitmask); ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relBitmask)), relBitmask); - // If this device has all required features of a mouse, it's a mouse! - return test_bit(BTN_MOUSE, keyBitmask) && - test_bit(REL_X, relBitmask) && - test_bit(REL_Y, relBitmask); + return test_bit(axis, relBitmask); +} + +JNIEXPORT jboolean JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_hasAbsAxis(JNIEnv *env, jobject this, jint fd, jshort axis) { + unsigned char absBitmask[(ABS_MAX + 1) / 8]; + + ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absBitmask)), absBitmask); + + return test_bit(axis, absBitmask); +} + +JNIEXPORT jboolean JNICALL +Java_com_limelight_binding_input_evdev_EvdevReader_hasKey(JNIEnv *env, jobject this, jint fd, jshort key) { + unsigned char keyBitmask[(KEY_MAX + 1) / 8]; + + ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keyBitmask)), keyBitmask); + + return test_bit(key, keyBitmask); } JNIEXPORT jint JNICALL diff --git a/libs/arm64-v8a/libevdev_reader.so b/libs/arm64-v8a/libevdev_reader.so index bd427cf2688981adc8d360517553902a47dd2943..669f25f9882d11346aecfee27dfa5988764865b8 100755 GIT binary patch delta 1787 zcmeyN`9pJp1mlK@lI~nTco@Lo2hYT;HpLQdFoyx1_JIg9_)HdLY_^qRU|?WoU|n#OB0$D7Ffe35gc&A7#Wgr5e_~QI48Wm1 z2WoK$$W;ss3=^Q*qbD0Oi%Z7g&~92G&tWkEaUGM2!Q6J%aJG!ZV(-*Skj&(JteZfw$-uCI7ZT*mED!@XOkT+5ED7~A zSm*>lLa|@FxEFSTy$L05%hqW zNz0L8L(!vThKZl68CDkCFbHq{|9^TyoxE^8lYBNqjcjnD9D|_ZhRIUJObpz`Tns{w zni(b*GckB8Gc*J#)-Ve@9#HI7Xo$BcR=6ycz{J4yx!Pgn|7M1X2bklp{XfibF%fDH zBjbi5klxS13@huWFfdH`$Ib8)WZ{&5?mwHE9DY6)XZSeHnRX>Mtt7T*b4Y z=xa6O%Bc(t6F@ElIq1t`hKXDMx&M5`EV61b$YJgbKlA?opAHHUSZE~I$qOgf$OeNP z^2iL4g$iN)*wVK;;<$q@;a1bR-Hso|?44PcY>F(?E z|Gzk+G_$n_G+##i{r^9Ofq|jr@BjZT3=9lg{{H{Jgn@zK$>0C~k1#MW`273-{|N&F z!-IeS|MM_1Fckd%|KEm@f#Jvh|NnC)|K(J!fAi=6e{f=U;uCP2$Kr9%1(IB37#J9A z7#J9S{Q3VMoOqr11iV1 zJ*FzmlXID@GDQiZ^eRLxC!?(3!lFOPfQ5k%6J*-~a!U6Pbi3f8aVe`2a76 zlQqcAY2pz(Fk_$E+3#ODkQg`0^BYK=UA|Oa>X~0aXSqIvBbp&*bwL zs$d7nF)%Z-{% Uh4h6EKr0IvZNa!%O86cl0H;Q7ZvX%Q delta 1349 zcmeyN`9pJp1S7*lNq4RnTnu3Ff@@+{o8l2pFoyx1wt)yU*i05=Y_^qPU|?WoU|Ft9Q(Fz`V6AWD>hfq{>KfdOQV2m=Fy*yM|h#*t+aWEB= zH!w>uon)MRi%G721=Nxrs3q@lXx0X4W?*M9fqJC_s$LfASQ)4}I#BULIL!HuDn2=# zMN`xRsu$+bX&}2M8#0Pa-pTTxJ+s(1zqB}Y5?lD>iENt$H}FD2iz`!&4EW0>3)?l&^kYq(C|791S{D+-qvJE50W(5vQ#(HO_ zi;7D+f*5%=6nze6SUH)2VZuLdhM!-UnY11)W|;VZSwt)OpZm{b28W-I-5Gwa`~QEs z!W|3Ceqwxgv21B1{)1_rYS%?_3fEDS>OJPd^o#OF&D|8xKO z$lc**B9p_kb)5HVJ@z)kie#qs{IBBvbx4Ui6|Nr8Q z(#+Nt(4-sj@BjZ01_p+ffB*lNFfcG|`S<_-6b1%{C;$Hc-@?GaQ1Ji%|2qr}3_t$= z|IagdFSm02pTGbAgX71EPrz*+i^n||Q1WJAkYQk80A&-7fB*l3u>&ql@$}|b z{CbRxYbHwy>I=fGg42^D1@#4C4uaAAlV=L*b4`FcU;^9ZOM+%xF!vl_n=B+`CWvnT xgvpMK;*$%6Bqpni2rwOCoIFcNPY|Qjn|xD9UkF@ufqVtc7%vz$O9|g&1OS6h^FaUr diff --git a/libs/armeabi-v7a/libevdev_reader.so b/libs/armeabi-v7a/libevdev_reader.so index 50e4346d1880525487bc333d7cb29d249387b8a0..f95ed9b59cbe327c501b3846b46317a538552963 100755 GIT binary patch delta 2846 zcmZ3Ixg>K!3!8uj1A~CZ#I8KS2WkuqFl@lcz+f<$ld+g-FaP8^MmeD!G7JnH3=9lP z3>*xF3=9lc`6sVql&gQs&%hwTz`!8Hz`^j6fq{WlfPujU%2#J(VAufF29md9WMJ?V zU|>jq%GWS5z=04014AzoUyy-;VLl@R!%8IeHyIfiI0YFP?4bGunHcI(3=m^tU~m^? zU|@qP@MnTcGk`1zWny4B0Cf<^A2~?!N(>APEldmy9tsdWAP3K9Vqma9;_qN$V2D8C z-(jj}V8}oc_|C+@@BxW0#0)VEM1mY3!OXy*qQJl)0(GDkn!F)114D@@B%nbKaA0O& zs1apgSOQfa!_2^-AjZHT1Lc?1Gcz#Qh%qpfKn1#(85lN*F))DK05V`DGXui~F$M+} zsQfNw28JtQh$y?n%)szQjDaBrD*uR?fuTSg!T-d}!0U1#5`Q`i149B5 ze+LT#!x{v?p5X!u0|Sd9#7Q6nU$CGC@gEij1_?z51{J6UqO7QV9aaVg8zgyKG`Uh;unM28I|lXc{qP;9xLiV_-;u2{3Rl_^>fBuz*Zs02%V}e=r(9o^5j! zs}>_yMq+VLYK~(?X7S{MtYVXou$h8{9FvN{LfvdClbP9#*)kG~y;CbE2e6rJ{>e6( zrJli=0g}UQAYsm6#K6E{$-uy1&A`B53l%eAU|>*YU|_IkU|?`$U|?W}ii0RnTxo(B z3=9l>3=9mQJgCb6$<@XT3=FCakgxzL0Yw^!hGA!<49_6Sz`%f%f52(poPmKsoPmMC z45|Z^`an4w%4INQU|>*ZU|^7AU|^79U|?`!U|=w1U|`^6U|=v{U|`T^U|^7BfaDKQ zCIb~iAibc-0MT5aoU6saz@W##z+lC|z+l0^z`!xtQ7xEJc(S9Kz9py#lV)IGkO!#- z#~_5k&%nSS3t=*7fXYb*NHGNx;$>i95SgsVBg`qrz`&rxz`&pe;!Q5#;ecsj&;}_) z!rUPCWL;hhL0$%iE%poyq9P0o2SBve>q1H&5-EyBR? z0YpnNFnj^gG7JnqK(smo!ygc>!N9=sK=&!jgZWSS9`rxp_^|Kk0Z_mk>wm<2s^`&x z4||?6K-oKx*c*`8D?aRbS`SmS07+s75_Gd}Ej%EB=JDFZ|Q zgWLcAzlt$nVBk=g|CB*s!DA+c{s));|7U*XVK8|fp9GW7?#Vm&4C;lq3b^rlGOm(w z`~SV~J&zaDYDNVm2L`Qu`y=GRYHCOC-vV6l;KVA>$C zSIL#Bft`V&!Cyj|9ilD)(r-Gm0dZ&hWqFg+;f>y8JANfbzRijJ%8Xn!x(o~@x(p0Cx|90^)ELbsZxy)A z<)O>KAOOabCkd`&y7q6flh8TFrIQ7P;~9H57YY|MGU{%ADiX}h7&qBcBA?N9@=A%< zj9iVR+{HOdMdLAr!@&7+E|HzB~ z|0iEi@tCB_Q-9~h|N0gG|JT2H@xOk}|Nr%WUi`1$@c(~3&&&Vy8&)tjc!21YEDa05 zv{b{7m;dWmb8KwTd-cD5!-fqFE+Be6Q^NxgypEp z@Q6L690j$kK*iq_K1dq_RD6N358vcVdU}=}tPBiX3=9l&K{Wyc1A_(+0|Ur;DQpnB z5K31<=|(n45#2S}Qa?Wo)RY6Y0zoY(klmn$BdECuVk6@(d<+c42-2Og?BR z&k1rL2+y7T(okLx1A`CWWHTcrHjuxk@J)_0 zQsRWUV9Df##=?{581Zm|0u6+}Ox|cD&)K8KzyQJ_VEH#jJe(lEfUv=4M&red0ACcF A-~a#s delta 2580 zcmZ3Ixg>K!3!8-+1A~Ry#I8I+2~`FL7*=3pU{ILM$ym&^kZ*DwqnywODFy}(1_lNt z1`dWo1_p+me3REP%GF=wV_=YAU|i#w`E~qc!Ip2*VSs54}ASrN1 z<43YGFleYSFgQRRn8V7zkfFlBAOPhzvobJLs378eF)IVZ6ct1o*~QAhFb9c$k(Ggg z1!Ncl1A~Al!^i(OkOde%{(r){xr$Ybkv+56H@~zvbuu%%%H&6^qLYuXnQorKKAELn zm4Si5iGhJZoq>VDh=GAYih+T_jDdl{f`Ng7m4Si5783sq<_ruB!k~Q10Lha!3=9m` z3=9nVPGF>yMl;-*6!*U1aA5rKZP(;0{03nLTW4<&_7Qax za1-#XaZ$-&T&0{LIr;zhj`tdFJf2x@|GziApZi0NLEr-;1KWkUKNuJoJ}@&JmWyzT zaFm>-oH5IZ@xuS_W$&do80=MaO=wVZWolSsFqutIi7{ofrl2w-my13FgN;4|gNgp+ zFd;R@#L2Znm$?M=85nNpf$-!g;dM-m|0i>aoMXH&`KCxbWf>gIJan>cl{fBk>W;h_66^Vk2^748Sz7!J&T%KxF~ zLBPxZ|B?9xFaQ6ayg|)i@&+}P`i__X>sS2$Uq9pJ|N1rm|JSd0`M-X{|Nr$nK=ewf z298(%>sNDZY_NOvzkb7p4Gke6dOcIa2N1nsLxaWZ|MeSIGBudI0m-jum;t6YG;9FV zs~ULT{;ywOw5dVo9Y}rym|ksf(QpF7uWz^mW~^%Pcn?u<#OR znID?lkJvMSGhhM(12~6Q@Iq={P!0uQ1K!D(^zs4)4U zp*$zZeITqf`K6(}9>{edyo3?rIglNo+8u;J1uUq11eH1lybKHmypzq0l-NN2uHc;< zXQadlbHNf&;W>GZ5f3LQ&_LK@@W2rF!6G+xXI0L)=m ADgXcg diff --git a/libs/mips/libevdev_reader.so b/libs/mips/libevdev_reader.so index aeee0210a20eb681a8a39c8c4b50a67ea9c8625e..85604e9258fa0dc87ea2066a2670331ba855014e 100755 GIT binary patch delta 2111 zcmdm>^+9Wb1ZM#o1A_?z14G3`MQ64-JPZtTcqV4~2`X?iFu<@60|SH4#FOo|QVa|X zk_-$C0t^fctPBhcA`B3~#lXNI%)r1P4&j1HQ3eJE9x#i6L6CugL1=O>qp~STfEh$U zF(;G;QDO`X47>~s4BQM13=#|s4EziX415d>3>=d;G73+A!YIQBaw|wBGXoog7Sm)Y zCb{|}j0_AjxF8yY7}yvBm>3vL1Q%vu2kHU<$!1_lofxcYhq3p5SUX#5^V28I`$3=A8f7OF8Y zFl=CBVDNzQ4bjwlq4DDw7#M!AAsp<2A|JuW@Ezn?P?&)YWMGJ7U|{$FiV-Lu6k!jL z`1=_d7%m|3LCgan0;+x*$bnp&^O%JhxiS)qgHm%GD>92GA7C*7aUGM2VO+M1#A5H% zN|4OtJuC+%SF^fKUcku5B4ab5bMi4(Ii`Zn$Y?E$#l4bl|eB;kcol8 zd!i1*{(eRV9u<}h9!3p@jr}SN8~RlQR@XCfFg##3VA!h;)Aav8iz-OtkN<2cAkC^4 zZ43wlUZ`L(1a1ZsgN)6Nc2o~>;PH^MYdzI{1a}Nk9;#;`?4uWL5Fb@QqbR|F)usj- zMGZ(%)WWcTy&{QGR1XSjP%wjnxCJSW8W=YA*FfS3?4u4Mq6nfN;UR2hfTBnO>Y)q& z_f8IHU&@rxI{6>FoQNcYgo;4J%znj+2h5-(Ccz+~GFgDbVR8Y7h#M%EaxgG3O!)o( ze*yyo!;Rnn|JQ)Zr$7Jy&tPC+i1_pW{}u)Y293Y}|33ib)W84#^Dr_nocQCWk+`)jGly>o71d z9ARK!c!E&e!HCObkOvtU7``wtFtkke?h03Vu-40;(Vc1Q@~9h6LN> zJbp7lP|YL6z)%1x%!C;j3PdJviZoC$wt;K1k$@jl0o!CjMlmi~ z1_lOsQ2c?poG|W&$p;1G8GnGtdQfe^z`)S(=l}ozAP0f40s{jBOl<`_NQ4r_7+JS+AAEyN~xIkXnTp_5!$hc+lTp@W*1||ju5MD6(sE|At zC@4X=jA`;aAvrb)HUw#h=mN?f3L0bvK0$#%kWY#X>37&dTCP7+q)gjem8dxhn> sa<~~7K-hqB^EP2IMn;FpXGN454@~|jqAqbkkbz-2CmVf2?hoR zaRvqkJ_ZH`Rt5$JAqEKGU|?VnWME(rg>b>7FarYvCz!>+z|X+IATYU?QCX82D#8w> zL6iss0|Pe$0|OTW1A`a?0|PGu0|U?Gw~XqO6&QKyLGA;oVrF1tSkDMD2t+V22r%$6 zfLRm3B!e)+$N!#;3=BWm85ltB6k=dwxXQ@DU?KpK7hvFHn8U!p(80#Q-~e_z8^aYe z`4x-|3^4ly7}yy0GBVVo7;ue&f#C!j149GUfCp#>2r@D-c(5}tY=FwEfn3hUz~BMp zZ$ndm9*rNzz`)>vHBS?rr%TAVuhBa6x8c-8}x71&%R7qGD~Idn}fW0PZ2=$br@ zO^%77Yw|WWH^v>4|FYRLRdi0aW4Eif=$xaj_+Tb;#s9tP1`RX&6C7A=6cr9I2r%qf z-@>qeeFMXW^@^@bRTLWzFmV1*V3uH5rY^v+r=Q7z$p)leQGtO;$<7ln9JgR(c%;+7u%VxW;Q@08!(MeJ1{r3X9UYV3 zajs+H=$Jf@OK$QVE)!XShME0}6%Uv}MhY`Xs37x&Ci8NOn^`b0Ft9N&Ff{!A|33f} zuYdpl&tYI-;Q06de+MWY{{8>I1SJ0N|NkQl3=9?j|NsBMFgc4`p7HPGE^g_FzyJS( z5)wlIpF+fZ#t1%!`{0BJGOGfMoD2g41IYY2fB*jnr5}a>z7EEi`HT~om_qm%F5K5( zU|{HBU|{$&Ih9A9bqC00nRv^_vlr*8~_C7(jVZK!6dPb4yq!=kc2fLNX3R0Vo*>GcXhg zP2S3%E(S_)phN~rSfIoNNd!nh2R4+_XL zdVt9e5a|TUJPZts4S)Xs{}0L=APfp@m<~|pVPN1#kvCvqV1UX0UVfuUsL$$rKMlOq}BnGDz`S24=f7qBxh zm@_ai2r;lTJZ4~E*uc)fkP781GBPkIa4;}5LHY5F3~(UGz`#(*$iT3HgMpzND!-bM zfx&^3fuSABe~hGFh=GCO1tSB)1x^MAC8)e26N5h7K#&4;CI$u;1&ELU!^i)6XnZTC z&1y_4j9eLs#X+e#jun~3lM|UtKwQV9VlX$5*^MnDvDiDc5+pNuI`b@7kV{1v7#P?Y z7#KioknsW_0*ZMU7#R4VY!Jl(b{zu)GXn#IFarYvF9QPu|Ky2W@{?z<@Hm0I!~#;r zz`(%Gz`(!;Wy2^=D1(cEf#HH20|Ur31_cOxMV^6yjeGJv7JW`W28KWK3=Hf7lf_sk zF-?-3yoyziDM@njEmk{5rOA?P`b?iBCVR2@F)fmqJd4eaDM@1TEjIglMF|Fm-V~KP z-6bkEy)G(poh~XI-7YE?$6Zudlw6q_I$2a+=>Plwzw<+H7<<~mAN*+tU-0(w7&Jd* z*F3lb|KE6cgE-j2 z2i=?h{Qv*IzPm=n24t7AD@Q{&Tc?YPOs|WI2+S2A+c*9F|G)D`Z#a_e7O1xW@AgrV z;rG0baDhm-nB~P%j@}d%h3L5W!!P*${r?Yg1_FZ|B>eAx{r|?p3J@1HKwQ+lM`aEJ z0|UrSimnL|H`VmIsK|ib)S@zjfq?<)~7Cck5M75@VgVG;v}+KX-%6%CN>E`KI_ap-E6s4?{JQ3v^| zcZ(XBg77BvmZ&jweuK)TO<QZ9CAz_eosEeA;%=}XYw-+IWg`(|Nny$ zEJ(Ku0|UbZ1_lP6Ka-_6<(O>#Ot#{btB?8f|34^0GdS{bG&A}0DWvjoI3DI>(O_U; z_`txxQ1j>i|5T86M?Q`=CPzM=W@djr1ExSe9>>Fc9FE8MSQr>g7#J927#SE2{Q3VM zl=(qswS&~QF+1`JG_!y-q;v5JI3DKXaXiMy;dq>n#gQAV&yFF4k%2+t@BjaxQUO!r z1V*L;Or16i3=BPt3=9R6S8`gjodH?>ck(MvDYiF^3=9)~PUhlLtAFwL|9?@BjapU;qER{QLjE{MY~gDgXZe@A>urf5pH5|L^?z z|9=KZ-S7YZcYxIW{{R2RzyJTw{Qm!+<^TWxpa8Q0nfK@a|C0az|JVHe|9{JWXf%TY z3W7H;;QGmEJ;bD+9xU$&y0KTp*8u@PFpXZbEWg4qOZjAS}W(IZsHA6JCdG Jo+`AM5dae1%_sl> delta 1257 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 XGB7Z}Xq(B3!uo<3CGh4%;rUDeYI#mE