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 zcma)7UuauZ82|3QY5v@#Y41&Enrhc%E9!KvtBx|X!z2qPb`_-^ICa>@u25$gr4j6C zG1V3w`jT)mL>a}gA;hO(H`tRzwg-{{s=XCWTy7Vrlu=&WgnI zTr?@jxsk)=dH6NfD+Qh&k$DwAxm)4dBH!bguRO-fLnbUB2IT%nJ?t;};og@TET0sO zk8)O!oCWk6>s5lG*Bh+5!O}`k)+^SQMeBlCn`p4=WCQ;fqRyJ&a7NVW1oACh7t`1) z{D-VMf%|4LEwf#Yz8y7@zhC5Q$k#E%Huj#wP$$xvq4CMs%$pf@&T)X7u{ScN`C-$` zPMAl=PxA3)iKJi&r&hdPl08__+<3mu0U4qdW+^d zhtoSripc|0H4P4h#MIVBJ)M?MbEj~vW|S35>!QrBmrMFTlyW#nh$ zDy^hNA4x(V_}7Q2n8gdsZF;HB8x}T`^#wUvzZIlrpIdQf>Lg;&i_*0Bx4I00M)E&?wBF9O$q*MNhYhOq{`3H0Gy zOc{pJ53B(v*@kC#_K$xI!#vD!f9rEgj#MRK9hZl&svlZI+&sL95Ab;WUi>)XZggrC zpF_MI@d+Ts{ow)TUUHtOtnw1waGfK1l}3?Zeywr;{sHDIsEH-_wEE*}oOgh|S|>3$Q=cZ&Y$I9X#a@BeCS)TBXgz95bVlPJv_945Gvi{q-luKvpJOp8 m$fopmy(Adgcui)X>HD<%{#ERT-lLbr&%(xo(sDI4b2isQrf0C2_i_Lgh)an?4e8xdI$`R@WF@8 zPl}?f$cKc8mA(iSD}3o8%CevcnSUOn9wH2Kp}T$O?%cA)ppX6d-S7OqbH4BFeCMqA zSNst#B~f2kUXqD!OLFw&<&vq~w3o^C>0we23hi(3q9-Eq5N3o2!OV)tLD-nXEg#u| zU}@Zl4KPi2K@Ii#?C7}=PK1O|5iGp|-)v<$BC!wxUBX^pCuN$2Jm$5rSY{GD6Fk+6 zsJbwNr`K#EUKD>ul%a&$F!ab%Y|EU!=y>GboK5( zeXjTTkogcq&5x9r9aS{Z#4|y=rIAW-)8g^*hR}uA&UBoBaW;5~Dmyj966@4_ShILw z)nbEsDvcLQb+oThm@XL|I7n@=p5<0Dh9?q9SxNG{D3s6NCDDZFF7Hf*lbs}xTnLlo z15LXc#CSFyB(a|Pei9wSvAK$1T`}(E4k5LP{y-fu5p}bToJn|Y74+i#`EVe4Ob8@9 z2>pUFZOg5Jv6MBC%+(r&Xk6@ge;elHFdYKFHQX?$X&$;!+_M|^z*_fkO4HhqFCm{r zohO4W3xH_N}gIntnbZhpTzS)H2(|+MAF<1iK~@&eWR?^?gha z{n3x0?#-f?qILnX4RyVbLXHS+hSK3JO(VrU^32;1TPY-4S@KcDAWYgSa%b?16)WMb zc{OB@>%U=$+ojNr^w|+kWGusfnBh-yKV2^&s}y9%sgjGlN7&!REFh%W=o2Sga~x3P zT*h0gTf_`M9Zz?5bN~N&{Ij!?()-|3suUyDZ-#apH3~8q3s9=$2rmE=zfo#sqn@}K uRJB&g%pZXu^+31kg)+BGn4)l9tyKPb_27eArRq-?+mrE9lJSDPS^5iuPV+$k 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 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 R4bl7r^7lXZ0=(id{};?*S1JGi diff --git a/libs/mips/libevdev_reader.so b/libs/mips/libevdev_reader.so index aeee0210a20eb681a8a39c8c4b50a67ea9c8625e..85604e9258fa0dc87ea2066a2670331ba855014e 100755 GIT binary patch literal 5488 zcmeHLU2GiH6+W|TCnf}E^FvsO5wppLY(li!6oUfw!=?}j!KJPVQV=PVv3KGfX}wE zzhK@fqHz#?L>>Q^kc0gk|IP-4TnfKA|o6l~uX%L$1!;(3)X+}cR!?4qJ;uI0 z-BsLfz;6RF8tKHJ4bCNpTxgph=sHNdrC>{%wg-=2LDIGTB7P#*_rZL={kt$9dOkfH z%;&)W!F(34g!8FI>vJCSxfHEWy={FiV|`LTU_P*4ULW{vAjb0gO#cV#6WXt=&ssjX zKFMf4Tp#Z5jQn*rEpN`6m`fk##eJsEQFC5eI7g{WOSpGa({)j2>KgcZUiL~p!LyYK z&s8jy$tyX2pVJ}-exGXQ@pzb;Ntq^O=VN-`rjEl`A|K;^L~QKCHyenJGdhQRAl!>f zfh2+;mgabizYX)>r|$rqg#=^PT5*o&PD!TQ`D6!wM+d*RgTK9l-veIXLz)`<;y>kE z0Z$HT{woO1gMI{h2{ie25L^R23;Gsl=9?gBfi8h=$M5_H-v+?|Xe|hWB4`3Kg7Lzz z7?05ZdJioAGm3V>gW0nQgtY@Zrr{V~@hkhYQr@9P*gM_vs#m-uu8$R&=M0^&CTw zzP|uoMn2|1F}K{gKg3>+U+rpkVf_!jB|?TPvZ;e<8b>v$M#0mTDD z)p-{|S%c9R-%JU-omk%`p~RYi``je_)UQ%pVxMGH`H=nj6GKmDJ%4h!Jt$0`<}s5!~HW!JatYSo^SEGkh~x8cSfcSqryB}jH`!j~+{(Q&7YMuk2w#H{W6 zRd;04cf7S`w00lQ5tdM$jrRXHX>FcOo&}x>o<*J^o=f6eXzQAVdiosGC-u|^jn|<| z8T&|iZubLe%RZiOBG0u3m?$`cFPD%ao^OR{x5wocxgSUyZb$BUVxGYwU`)b8K&{8K zMpPGql7{1B^JJvQxF#k<9Hbxu?fPl(^hdoCbci`Uc=Tz#U!l!AkmC;jFSjB?*Rr0A zHn$x0cptW4q>cc1g7!CwHs{K?;s5cF8^qOeQrf);S)i&?(}gf~d%pVPtR$b|ee2 z4=Eapl9mG%p;+*LAvO?{E?UfhU|onVbXFqdS}0wY`1LKscHqBj4ayDJSY3#|nj0YA_JGywtrppqO{fnhnHm`(;wD@;roK!~f( z#+J23pPYS|E+Vy@GlKZn&|Tl-gEWctyg`(4{jXN}??Kmo&&2*YMZ+r+{DY12NMO4O zDytHNp|dzZ(e-ZuBM)U={b*JEi&gq4;<9xIe5QU~d4sdqa9o}nCa-@O=&RG~p)+-Q z58_jGTHZKbrzfCIZ)rleRKxG5_y76V=>h(}!SN8BaP9FXJ1{PLI&zX`71EiQe1o z3A;?b#kd}&J4yHoT1HDtd?HR-TW@c>_;T=VqnoVgM9M=M6Z;D}y2UzONa^&nN71_< zk+0yTik_#rq(&R{^h};V`W|TBJYV;>^1uGBO{S#HRdh*dQMA2YN4TkRU3U+zj;AJj z$#MF?^WZ0%>!E5!(r9p--P%WP^n5^O%nfY##FXC=4IR^ z&4Yv6U-6hS6Uzg&9nw5Rp%wmAoqw@Gey=nWZdd9)zlp?rax;O=9xLXT`wG4&?zCEs zA^dsZY6q=0zdW9xPvdj&n9Fy#VYT^eOa*CvjtsMy3FfKv*=kXWxT$%wviYaxWONKq Nbyp7P8h*BF-vG2W_P785 diff --git a/libs/x86/libevdev_reader.so b/libs/x86/libevdev_reader.so index 1dfdd72dc8385b60a8bee13e1bd0cd91fd3753d3..f9ac6f6efab28b3c766576380f56899efbda7f72 100755 GIT binary patch delta 1639 zcma)7UuaWT96tBt=H@1iH-9W?TEcA_FSS0bEkm}hD>WI3pc6$`E5o9*v|T4MIvQCg zVM(o1N(`nR#)|kb<~G>Ipco(eAgm>zZuG%z;zVS02oi>j&WB=c?A`ZE(i!K=4t)1J zzx@7v=k%P@*_PRs?0|B^$=D6&)Y09Z9?aGeXN<+Cemo~Finpak-fj~oBt1D|W9(IU zyv)Y#gJ)n5R_rE;v7pM>$%=g#_WJN(@&W7__|uqE{&%p$cE-+B?E6*mUi?;oeG~pr z#oxqP8>Zz!0h>8va+23aCf9y`4YvzXJ7(Oz(Z}3=T?7dNOgl{D?(mz@<_gc0q zFy9>fh&Won}7A*6vM#R^M-{m$t8Wv&M+`?x)&(GJ3Z>_Dozh2z6c1s~q zue9+;ez8;8&A;%A3raWd_lvvAwq%o^vCM#RFC90!GEqaHj2db>YIIzW8geMcQ(YH_`|kkewMWVx;XU7vTMifq4_5k*AKshqP02-8V3*M zNoZvp=zXhj31!CfGj*kgi|Jg^G|gl>VRTWiO))i9l!psIVv z^WDw#E+gRD@!K;6wQ1jLKOa}2BY5!8;e0_u>vbt*CP5q5%p?>A%ZgHEMd_=?MTC&1 zrr0}WO$lfUlr)_(rr{)6f&V2d@tmwcNmfnfOCyCUq^z!R9CctYwx1-Ogf*T&=M&%C z!ctNEWsB8eo5u6pSK74#{xmJrJz5ky)t9!!n_1@SX3EZ7X)aOO%4Xo1T(0d>(JcDa3VvET-W3XZUgeVSq~EZ*cf^hUQEnNeB{NE&?MeWwTF4lXesDb@ktV6v38{MgV# zLm0LS?rQDqK@7bJWAvbb7x2N#*f!Y2yDCg^WcPvTO&a9lsOv<-ZB%^#ECUJ@_<&~M z6(zUk>XoFh*zaj{P%>eRi;q3Joq7;1imyD4$}mzP<|j``A&n`kc;pFL=P;cU_1;Ym fS{T8!i0xk85r$eqEf?>5b^E{nLvo*bFG>FZ65Y)x delta 1257 zcmZ8hT}V_x6rP#Adw2J`-gOs6-D2JBQbLv@(vOL`v5G}nT3Jzq#4089hZZ4{)`}sE zwKWyeQGzw5wSI-~G;<@64Ptch0?IMPo(L zkQ&t(i)xqK8{EaP<`H6yg)YCj#H-~#ULc~X?Bc$j36-&RP&~}WK7+Gtj18veJ`N*2 z+~88oZ$iHSo8k{I(mn7U#k|zcSYcYf`=5RvbHxu4Ba3}CW1PAEaXjI%T48Y8k&gP~ zr#f2YLrbkJQ*P8Dp7K);q{pJv(9=wWgEHr$Im$o|#w-A>%>Xi`+q$Ykfkguc|7Xk> z>wtH{#~AIv{3(7{fOt)wwU#)LWEL}&TR#+o?;q<0-d%^*~Ycyz7h2y+4lPqsIZmG1mu0D;(KRa(Tx+9(qlczK!>_d+I z2gh>~9asi?_nzjRiSw|}jhE!fdPg-+%8QPg+$4E!<)X-tk%$D1q5;K71e0>wu{!fK z8~8E!cqLY|wy3Pu{5`YCW6(UH+rwhJ?r+lV0bLni3RflI#CGM2^+SL41Mn9^U$RKg z+LF@g#=3!((C2TH_KX5W@YR5kQ-0KP#NMR*q4^rmz)cOjP)aMd8rPL#xV`{G(5azG z?-v2x8MZX(Q7%qux)X8sz)M{TpgX8+KYHM&oXps`q6JnR-V(L)!p=KVJJZ2?q36xW zGUtkxT?nJ@`u@u_-{E3AXH4@1e8b=N_YSO diff --git a/libs/x86_64/libevdev_reader.so b/libs/x86_64/libevdev_reader.so index fc258059487fa9341f4b182f5a704de9e9092a2b..8051dde096ca227b73b12680685427ba1f921437 100755 GIT binary patch delta 1839 zcma)7ZD?Cn7(VwVO>Sa(^VK$Ox7wsj*C{1UN7wm@i#Bk#)eqc;vvb&%Hj7Y%S;Pv1 zL|TWJ5=cE2rVQNnXG8xKTEzXCDHCCSU^|Da4p~==B!aT}Lv$a;=e_q_S~CS-c<*zc z=e*~f=bYSgl5Nkn=a0D;Jj{p%&(x`-krBZvamXxULwu+7wfv028|9dsRroGBmY7k@ z#;~Zl2n;YMTM+uwLib6g9(I|+D?)#YpOiyY{nR@3MsV9_e-&+w6BpbpKIw zY$}R^yeM#rf{1L6ytNH4K6az5ghh*h*nj8`$+LsD4U#)OF#7E9NMh`zQNC#FBAOT+ zHRy!>IS1(O;n%5!U$MVe?Z==sNC(o-{oY_JZK;a1f_w##_aKAFYNVGBNE`T4m8TYq zU^b)`w3sS>G8k$U`@zmMnQdZwSzO^Qj{7Ayf70<<0}X1$^=9*pCRF(kj!?#DH37@p zdeiJvg|_r$A+ z=M8?bg#_A|QWk=id-MW?(lp+oF)denHpJg?<}#P{FSOiH^m=FETuV~UYWhmii6VU| zx5t^9|HGS_FIML~_2bu^_sxGy2ESQOy?I6d&Z~W%n*Y_KpFO%{y4i+dN^|N+Dtv$rD?nsTA*Y)p5-g&OCsA;zBUG(Rba2 zj6+}lDUsfb+ycD~$damWzp5DLfNqW*&^HPFpwN$i?}r{1dLQ(Sc%Mf0L&vR=VJxBg z#^s%ASbjqFB~+yyjdRF63XJOm?MLOLT0d^vrN-qxw^|Pcg$eTix0XtKc7Z3&DV3QT)u?w^i$vjv`fI_ zz*XQJu;zBT{3WmlxC$Hs-UiMAH=7;RZrx|Yf;XDO@vCZS>u18! zw*r3>_`5)dxVY*BZdPV*dQ+0L%m@4(0c!;oj>-I#KjycLTX>vb^LMxkVmSrg5ZLav zwn%aEzCgEYM$9+E-wkYUh>O`QJT06v+|i-8gTAR_K53dqf*t<5{`+PJg73?J1N0Bf AtN;K2 delta 1461 zcmZ`(T}TvB6uvXMJL@>k&g@#NWw>jjL6m=_78xXHOk&W3lo^pinLb32S_XnsieTG< zd3>k{5{ZcDAu@atTPVV})Pf8GH3;0E4627%o6ecNV`6mR%y+-$!#rmmF~B4i=6V;`vjoQU z+t-6aKFo=s+)|{JHpbH~@U(U(dXY!9jFc?#=p%}jKgFoVzS+JompM%QM}H|yjHGQB zq>j#Gm%2O8!;kcnFzC5wVmBQ2qm!vAaK1FZvVqe=G;}&B>YIt41+Bt%u)IoE z8Zy^BupA7*s_qLs-jUMyPMIaaymz;d0c+l?x%|YPjMe;9B2A(|ObWp*N$ImIp64)T z7rwynFq&ORyq!`LOEy~J6XLjcmY8+;IB}79+~N0#)7lcx96mxko%oo;ZxZ(qA9nZ+ z;&dVj%eJ@LX6(>4R1%{YM3I@XEgd;f=Zp2dn~v1ASZ3^;VGS*sQP1TNMH>yxj52em z*61mVul)RN+huWc=<{?zorq~GUr_K*)*9vgOG208pG-IUm(r@!{G)L*x}}sxh&C8K zW;9?PnCq6!*h9m@Nl(98nZl0PTDKaA$Q9z?Z)lPamYkwd^AEE&fBt}z(S}yMf&6Wg z2=j7LUk>)!c)8iwaUZ&dI$g4Bq&J}ZP~SyjovJmdK1TXE^f2l>xqgQ0y~y{Y9_D&8 z>ISw)(GR2E#aIDjHLBJxHmJjb*dnW1jq0nRf@0O^Q|Nc#TjoJe5?eD+rUbp&c*$c) zs8@=P$8iiQ&fcVLzsHM7B7QJ5knVlQGf;(f$M#5~ODMZASLg$Q%X z2Ut>OxOa$HrBAXdBTZBXXtY-{_a(ZhfuNr4>*1B}R`VKFBN`PMSr1hg8kgB?-f;Qc zCjM~~U*_C>nqN8JmKqio)kOJLzN8|Kl^l<7Ji)Pz;}vP*m%mLAoC zda>><+{IB?)=M%pekdB`2C8KDh?>069H`7#KO(prsLHkYY%adxD`%klLnA>=H~BBl S#cGHIOZ0#Kz!R;(2jU-Uc}_6^