From c8a2394b19fbcf404ce61267accff1a6a06b01b1 Mon Sep 17 00:00:00 2001 From: Sagnik Ghosh Date: Sun, 5 May 2024 11:16:08 +0530 Subject: [PATCH 1/2] Migrate to python3 and make sox play work with root priviledges --- README.md | 2 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 155 bytes .../detect_keyboards.cpython-312.pyc | Bin 0 -> 916 bytes .../__pycache__/play_sound.cpython-312.pyc | Bin 0 -> 1324 bytes linux_clicky/detect_keyboards.py | 6 ++--- linux_clicky/play_sound.py | 6 ++--- main.py | 6 ++--- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 154 bytes third_party/__pycache__/evdev.cpython-312.pyc | Bin 0 -> 26985 bytes third_party/evdev.py | 22 +++++++++--------- 10 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 linux_clicky/__pycache__/__init__.cpython-312.pyc create mode 100644 linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc create mode 100644 linux_clicky/__pycache__/play_sound.cpython-312.pyc create mode 100644 third_party/__pycache__/__init__.cpython-312.pyc create mode 100644 third_party/__pycache__/evdev.cpython-312.pyc diff --git a/README.md b/README.md index ef2e0da..eb04e24 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ If you are worried about malicious code, the script is pretty small you can easi ## Dependencies - Linux (tested under Ubuntu 12.04) -- Python (tested under 2.7.3) +- Python (tested under 3.12.2) - SoX (in debian based systems install by typing "sudo apt-get install sox"); ## Future diff --git a/linux_clicky/__pycache__/__init__.cpython-312.pyc b/linux_clicky/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15f36dc9e6cae488b182c22dd14b1e363d54433b GIT binary patch literal 155 zcmX@j%ge<81X(iXX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?Oow=celCWTt17 z=m!+#XQd{W6a%?=r4_o#Iho1Xl@LxmloKDHnU`4-AFo$X`HRCQH$SB`C)KWq6=)PA R5Ep|OADI~$8H<>KEC4DOC2arz literal 0 HcmV?d00001 diff --git a/linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc b/linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b66751c1f7abcb90f3378e1db64be747ebe05aee GIT binary patch literal 916 zcmZWn&rcIk5T3WYZMOxMLLty<6BEF&{-7F6ybv+QgD0ZV6VYtSz6Wf(-EH1(39W6? zg9lAGaDzWV!a=5(^YQAk z1n?^WeN%eL`2r?8K!Fk)N@Q6gK&20`EHj15#aRHZNx&lL@_vu9Pc9PzRi&!vk>3H- ziHMnQschNI?A3*z7)BZW{3nJT@Oxaqc~sg*Re?2N4I0D`>O!M(e?~*9Lm|>X|M%@{ zc@FO$B44ITUETnXY^gL7Wc+rW6oT2;j7IBHA%5);Vf|_%jinLS(EAz)Y|SfxItKpd z^>q-alh>fDOSOqynY(6grQ+o*r(E%Klx zTwI~GfuOR-;lab`QK7hH=7=HA*4U=edtMReEKhCA!Jg5484IY0ty&Jv+qQ_9w(Bun z5d*9ECye!Qf`}Jcb;Zqd>WN6$ODG{fSb|$<7teC*Zi(e=Yi-@nz2t6znZAe6schai zZObfHFM-hml=)a;T(zAmS4HyrAx~j@72RuKXu@f7>~MVUKyD`=HScz`WK%y)OzaM~ z6SK{kj+Q>rrdrxmTbnrpMILU_PHbfR%~34fiEG=_pRyfwBVF9X(y_6u!N=3m)LTiY~eMA(BcjPp# zqPA31do2_b$J%C{(JC>eSS<%l>c>iXy?oJ5T~m(7%4h+EM~I>dCa5A2+(#9eNWhhr zY$|cC>{eUXg2*TK_^KpO$l^EpAqfvB=}-d-J4_w4Gqz*Y!5w5xeL50o)4VNsd&yLo zIEb^B<@io$S#h@JxYVzDG}i6~Zsbu@julSb8WV7`Bfz)_F%0A2T%jI#wBR~->S3YG zf(Eri4yqshv~0VMz12z;YpgV(I*W_)PBdFA2U*(l(~3__o*?ewOTfBlU(p8}y^ZbS zp0YSRy3{T9uMFoGy2Xc=M_@_$45{1p#^rr8hu2Ol>$IlHg#ULNoIcmIpYT zOb9?o_Fk!_E}xH%a$Ca{WSD5ssDO$?|X!a2VMtc!;F$;af+tv|MQ_49vS*wxpbeEDqo z@8w}3X0n4$ud{vkd1hf>JMzz5X;0f2 zYMDX3S08vi?_uypMcG9rdQvh~u_$6WU{Q3-@&XdMLY}j%yHV9mEy-ZBk0IbUl*A>E zXBjw1m>3x@itMAek}NNd^o)Egbre1&Q;Tz9@|WWHchdFLd33wU0-JKqrf{YiKND%i t>yldzvgguAeak+FGqE3h5!f3UWBg7>_|uo@i~qDdKDMpBL-0vL{|8t&9ykC1 literal 0 HcmV?d00001 diff --git a/linux_clicky/detect_keyboards.py b/linux_clicky/detect_keyboards.py index 6883db4..4d43765 100644 --- a/linux_clicky/detect_keyboards.py +++ b/linux_clicky/detect_keyboards.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 2 -*- # Author: Fábio André Damas @@ -8,7 +8,7 @@ def detect_keyboards(): file_handle = open('/proc/bus/input/devices', 'r') keyboards = [] - regex = regex_compile("event\d{0,3}") + regex = regex_compile("event\\d{0,3}") for line in file_handle.readlines(): if 'Handlers' in line: if 'kbd' in line: @@ -19,4 +19,4 @@ def detect_keyboards(): if __name__ == '__main__': - print detect_keyboards() + print(detect_keyboards()) diff --git a/linux_clicky/play_sound.py b/linux_clicky/play_sound.py index ad2b692..3a7d367 100644 --- a/linux_clicky/play_sound.py +++ b/linux_clicky/play_sound.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 2 -*- # Author: Fábio André Damas @@ -13,10 +13,10 @@ def __init__(self, filename, volume): self.volume = volume def run(self): - cmd = 'play -v ' + self.volume + ' ' + self.filename + cmd = 'XDG_RUNTIME_DIR=/run/user/1000 play -v ' + self.volume + ' ' + self.filename p = Popen(cmd, shell=True, stderr=PIPE, close_fds=True) # TODO: Test if limits the number of clicks p.wait() if p.returncode != 0: - print '\033[1;31mWe found a error with SoX, did you install it?\033[1;m' + print('\033[1;31mWe found a error with SoX, did you install it?\033[1;m') p.stderr.read() diff --git a/main.py b/main.py index 45aeb74..a7213c1 100755 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 2 -*- # Author: Fábio André Damas @@ -14,8 +14,8 @@ # Handle CTRL+C def signal_handler(signal, frame): - print '\033[1;32mCTRL + C Detected. Exiting ...' - print 'Ignore any errors after this message.\033[1;m' + print('\033[1;32mCTRL + C Detected. Exiting ...') + print('Ignore any errors after this message.\033[1;m') exit(0) signal(SIGINT, signal_handler) diff --git a/third_party/__pycache__/__init__.cpython-312.pyc b/third_party/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5694e278735e12986f727709a9eb2292cee810ab GIT binary patch literal 154 zcmX@j%ge<81X(iXX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?Xux=celCWTt17 z=m!+#XQd{W6a%?=r4_o#Iho1XmHH(anMEn_1&Ku^mHP4VnR%Hd@$q^EmA^P_a`RJ4 ab5iY!Sb-)n0&y{j@sXL4k+Fyw$N~WT_$3Gc literal 0 HcmV?d00001 diff --git a/third_party/__pycache__/evdev.cpython-312.pyc b/third_party/__pycache__/evdev.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10b813a0cc21f4e5cb9978c1fcc32eefeb2a03d6 GIT binary patch literal 26985 zcmeHvdwdhwdA4LrvLwscU>j_%;*P;wZ0@kjB3rU8EKA0+0h^0gcw`vxZAUU-V*{IP z8avs|;%ri&*#u}d0lI0HG-q#{+_SrE-8pSJW|L$&W^S`f*5^!Zjx1BHNwPg> zl5$?n5}~&_vrN%k$^I&yL07)1&BZ2;G?P3wai*EfV3XW5lY9=_g|PFY&R4TVXl(^- zIs>K_NGd$J%4AaPc$(u?5v0j%8ps;RDl3Zo2Oi>% zo|2-c*7XfIoz2JPm>d5QcjG|(cyEte?ukd0&PYep9q)C=k4N1Bxu^dOjQjfI?$|&q z9_?NkLjcj9xEq1U9np18AF-IbBhuqO8g(nth~(~6db{1=y?xOh-F2tj6@`%mZymi- zRH8@qx?_EEXXk*kPdvT%=!s}YJhsl=j3;xjZrzAO@9m4ry*-hxt^s;bXEKb4+siR= z3b%-MB#vnGDbW~5jFQpO+uhd{jYr+Fcm%SylM^RWfWYLQWA5(W9y#8tM5T33XLWDi zfFd6|9(S**E^}9I*syUe#3pxx+z~nM_V%8R54fM`CbGLHa!Ov;ab}mEnSDy{F(uMX zncAsD@x0#7`00oe-RU0a?dMeB334p1$VdAT5jjqIvc6Zr<0Tn60fYV?DXMV%P!`>> zWMpfDE$-TAPgIF?xf}bBcF7$moQ`Nu4A~lU_mN5LIP&D^fRj>OLr)LuPj}b!BGd?F z-%fW_hP~oG6;)#3?#ko?^w7%Py^3=cvJeqgP=e&C46z(=cOmNxf5;`SJ!uI}rHe|J zQ*azLKokfPc3ST0qLS;6MLYYu%ALpo_kMqKU8tqm?FqKJ_j{U}Ji+GHop6cT2wSRX z9FC0QlaV-Nr4s2u?)P>&8+=XGb#U*g@(29Qt%$a}#@`(Dg~RTeP?Ou^ZuB%Y`>R_5 zo+fu=OH*Sg>|5t{hmkEvzw@VLXD1hj5=B*wN93*;lG=*Giy=x~lKXh%6xH&MsC)_$ zilA!sQFJ((?;of$($$MfMhSyU)DAu0cDm(GcTaD;+LEPsnRQV`+GXp zmAf}@cQ;3=O1m4o&|1sg;ePVHapQ(^cU5mJ-rG~|Zt%F>8!9U*D%MtP+_2T{ZV7vw zDs>3KGIPQz_jbg)61k%3)GEFGeI0sd!8hti(N~xrjc`XA*Sk8CDXw>d=zuNh9t5V& zbgn7c#SNPrrXkaboX6cIJEmdtkonn{;*O+?cy1C6nUkR;?`G4G`GhNJpSnxg+~M`X zc1FrHi6k@IMqpczG)vu26sB+zq1)9{tISTt4E~FfE>icTOS7qG!~ft3)}%kBc*+wp z#4zd7YO;}Gwy85FD3k?hjCmyQAW7JX- z_83N$YM7Q~C9?7OgjK|x>Y&^G-j?;pd%L6SyQrsL->CHR=mCl$Yi$QQ$dd!>(bg2H zy$>M{tWS=635yi%?p5YcAo#_`ATF4GXgB4~{zS*6<73A!KXX~R*frr?dZGHBGxuIW z;iVa4GbRe$Bi4Jl1$T1iKXA?b#IlS1FRgjoweVhk(TjtlgO?AymB0Mv^4HefTJ!qM zw^r}CS6Fgs$Jma$g{#I3SKTaryKw!3qSDLDudchY?)yb$_loCUY8z|2TfBO_c=gTA zZx>ex+tpWAzg@Ikn`z2*Jwl{RQ<`M52|n5Zn@gss2|A65^cmjuVYB=7c2{?dpt?U$-(F zGGT9Tm!S%@w+|Mk@@ZYta3h?=sOnrW-7A_sVtL+iZ%!$0u6so#BbFB&N(tYvWHDJY%+AWu(5nPCu}OS1_$$=&~ud1_2i(9OXtZ! zN3w99e9yeAEL&NGaFqol7Lss7OiMg9%*PTh47ZVM3gKDPJFbEk{U7yTj9(gfY2ezj z8|9xZ*Rst88#I&Iu|Z@)dQyz>BnaP^OsVl?h%&^SDcOTI6BPKQT0ERJl%+r!AIeIN z3{Y$FSC$nVbclYeeR&K$Mb0sd+wr)f!qu1?7Y5n#PXtR)OE3idaAeV?*BUpH; z@~-FIjJ|f_)``~_Pq?3Wz5knMzjk)qz30E5k8uP?O(1hBPnneb%r-;jQuqv0?xgo7 zFr({4a=I@l%OOnklevwKF>CNl6S75y-XL_Nenp|lD{CC2wqsKTo2G)T0!C!Fo=n0WSg5q7n=Khq!S(rt3u+oj%) z_I70n9;YlPQAVPi1P#GT1&K`%w@e%|cd5!;G9|GdzZg}*=S&Z?vaGq2wrp$Zq%+I9 zVbY#$EuM6mt?MUkW@|Z#dh;V&j&-dFhkVQb_Vu3(%m4ZHchAdz{&n*?`I}$=hw~jU zH?HJh|A;#2|DHB9U@OZ>*mS*Tmj?xZ6ch1CM|_HI7bc3)Z>W00K%%Ht^i}Y zhBb`z>SzpZZ*yFzvWqKY7hz0~%%-?efirarL*_VjM0}mFCsFF2X6sCuCea}Dj$}iC zI%IS^abuEnf;x+7*Q+{*4`Wi69CMtaaH&EhvU;K0)ACNj9%^s$hJu0CgfrA03-nZ?GAIvJcv~q0aPXX5GW9>`m5c(S0K^4T zBeRocsiMG)*K{H`Wu8Rwyd)Yje<3S5>r37-`>S1QiW`++nMuhun_5i+=F_G#*{!D2 z=CbU;bxmSbf>m;?FF^B#dX6=h$SEviM2=#$Kq&EI5*38pWr zwXE#CIS)$bU7d4f&b6W&bFR<1x$L#|x7JUT?zm{vY^J=KFV>INzihp>@9mQEw_R(s zTvL9*kAG-070sJ8ne*n{FPIG#GjGm&F{-#9T&$%>1F+z?T%{Sxv zhK0t!VN3$zq|ow}X)QxCRuu+OlZVYbCo*C&l$B}y;sniPrd`P{z-u~u&}2G<5+2ST zwxm6qw8UwbWc``BOT9W@LzY3@Q+b^1q=v0=()Rd@)9}cbWE-+3T_kgF*g9lIE1H#b zle!OOlWz3w#*%8 zVuo*@KU7^C^fdU|H&;~hgd5J}9!a4NG-0Pzu7*foEMbH8(cck=Nu;ZTN5))eBpzs^ z{+`a>L=KIIaF}pFDWt{W?wC?XA>@fCAae8otY*mwBzsWqE3=77U_H6AA*}95pLo8l zr@#AXR7u!a?~TQ%!y+9u*>$_9<8Q#UnN-}tLVd_hH|&Ow*!LjNmCr04v7uWoo_l%O z)s+mDzq4@T<@nWsD+5>0T{(ACnpm{)PSGZ^hp$<4E-f5e zc+EaOvuwn6Z)Wk!wyXJ9@^9u$lx!HExdBG=7K~WlwwK(SzvOE0O7QOdP2=-7P0Zgi zY07q#j|N7(7gszeo_Fc+*x_qizu>#Q?5iukwDKEIzPV+5=iWQv)`{}AiQMAhd&}31c<;LAkGtkyZhp(PT`rQ3*(I&Lg@4`EG*%y7@9`ye`cqZ7+U7{-8}3Oe2GQ1&2H1<67kx@0Ba zhz;cQD|2jknrMdFU`e{qpf=bBcZX5`#Ow%FrnigUOYxM5-_X%g9bUN{i@Fc4ttfX_ z9L9n&Ef1#E)S%LY2Pk_Xj_FU@tpn{T)X6ror6D_Eua6F}LXog`cJ)T$ViALSeN18( zlQUkXvB*^at^C*+Mc$~WJo6YV((7kxX#;KH9NfiDL11oV$#xWCN~BMKd^h%7-!opg ze#DFFH*@wy>GI~Wlb9A2U#}mZy?&x#1J-pHuedSq`n;R*+rC?8#~1H-Jv#2L{#M7h z+y7?uxH~j$qWj|?=9mgfpp!TX@4IF}Cvg-Co#X?ho+YL?mN-1?vfo&1h76Y36`HRp zTS#mrL2GDYQWYT7L4xN~+X>OwDkf4p36VI2UyMf2=S=r4b(2}y*2+m&j&{S0-DkDg#P>=>y%M)a5^`p1h z1Bz0O3>E6SEz*Y>nZ&h5q4|VDb3GoG^!Al-&_pXp6D=|4BABr0flh5|OW-%z)c6IV zF$H@bHn9N+tPtso--X5K-tAN8SkLFbQ?i&^N##i0JuDXoMgwquat#J1E z`+ixzpdGz+;iCLRQb4JV~6(f;*vu0mfHMVNfWN|DQsk)ax z^Wxr*oKDXCW?gH((SE&sqIB~`+k=t?Jlnfyy*Fq6$6cBO9yFJ!py=@erf!70k{W>b zTa!hhU{*kHl`}29yb7OmVK!ZqYE)UuNth|r8|$-Mr4M+@)E2{4f9&|+%=CO=qwD07 z-lU)@B&)I6F&FBFYZlFBUubxUDn9q|4?-+n+9&M}>&nU5c5BgOQI>V?BfHI7EXovaj7!gB(>QQ?Nh-bcm3JE(-x&hP1I$578PUZ(DaN`{R&Vy{%W zn^vEraEXmU@u$^#m5=qHc=a&F9;@Wj^!KyR^kbd@H`u%*HVGv| zlVmJ*(?+0mZV%Rz#3Z5|Ta7UEcSicVuzdwV>6=%&(IuUVrd|e5Q3xn=xfS0oF~YX`fWCgENz5W{ihlhHWjtq zmMkCf(qMSG_$}8W>K;~zs+5Ibl9!QBJ7DsD-9x564mq0k{zJSh%;JP9^!h>J_t*5K z^=SWQJ zG0u`1i7(<8n+-udMmAn|*e%u-lPtE4i>)zTWsa%nB(I%)k&SXPuaNEKj} z(niQl(q_ml(pJcA(ssxl(oV=Hq$eSFNl!uUmOPMEQZ=Mk@r5Itke&bwl<@y^wv`%> zU4i@s=~Iv|OP_}PjC2+9nsgoV7p2caz9M}N^7GOS$eYqF$X}9Ph5Ul_%aC7`UW2?X zeF^ecq%T8$Mfz39Uz5J7Kk0SpYv5m(ejV}~(r-Ziru0q7Z%J=J{+9IHkl&Vm2l98N z??ApO{T}4+OW%e31L=E^e<=MC59vR_|4aJGOXiE%|Ae2JQ5H}(BMXp~kqsz^ksZjv$O)9o z$OV+gXa-O|qXM9rjAj89GAaTpW;7dU4xXeFanKxK?p1Fd0H4z!lhI-vE8HUL#Hss!4|XcN$8Mq7ZkGTH{TozV`U zos6CUdXmvDpr?%3?gsO)c@LnjDkQRMvXvw88rcg z88rj7Fxm&SpV0xJRz__=2N@j#I?U(@P&=cifg(n1kAiiuxdaqt)CqKq(QzP|(FvfF zjJklj8TA15GU@|*hLHjkV-yGKXLJhaG@~;>1B?cN&N3PT8fJ73=scqfK+iJz0MG}G z*ggmLAvXUxpbs+|0UBlW5ulGUdLHNnMjr!uk;{|P1iHoOmw;Yn^aY?_X7oj% z*BIRf`VymG0s1nduK@ijqhAC1Dx=qdzQ*Y5K)=rD8$iFo=r@7B$>>`^Z!r2Tpx^_u{+iL>0R1hazXMW@*#14(Kd|{f0{s)C ze+K#&MjFsVMw38~82u3FM~waz=v_uX2KqNf?*aWgqyGTg^o`gX$|wsc zn~?>`%E$(k!^jTgVB`eKrP$)`!Y>cM8TjSnSAgG4{AS@-h+h$Y#VKGt=7>rS0R>j{b<{-gRz&oObjkCxHosO-r^OI4fC)$PCsWE@0kTH|R8g!&T-iu8n zICg_0K*=yNJz76y5p^%c^c0)md3$_JJO^`I-UPAkcrt{+?A?LDpykQBx-Nd{*A#A6 zXjx1UUqA^ZNkh1r4Ff(e-@`$1Z}K%_v&+8rnwl~P@A~2;I+bQwDou7(n$4-SUaZnP zYZVh$lS*$o*m1&zo%8KYzOb)ppU=x)6FFq$3s);Iz*WLZtU~#ifh(044ZKmMS+a1m zNu{+xfj6t12==>0r3DgUzE!0?0RnGR>1C3@+tpkHZ%}ESB;lavHu!@rVU<>s1^4Z3 z@dQ*_SWe`TeU+!WKHTW3_NlZxLBt$qa#Whyh>-Ux7Y)2$88fg?Ei`bG@^J$`Tc;b&Cqqu6 zFWBsBQt366C=2pf-P{yVX<<)<>rrV(g1}+bZD6mu*uXXF5(C$&OATD7E;H~Rb-97- z)fEN~s4EF`j)r{={_0R56jWD{8OPg$<4es=p~gC&T1JK(@7gBMKA*bU@JR6v*ZFIj z)is707f-+wu2aj&jH^SNy4Ju4)O7}~R@WPNpGwOG!hMxmVc?)zY2XHxRue>AszVJ8 z9(5COuDsq*vr5xxVH@TcV7)xO7(`U*rI<)#eWNFgg7AmyRay*88!ObtG{=?d z-ZZvRZAxPs)G#rwarKQMkocs818qGf=ei2$^t05siSl2X#g3aoO4D0GpW2^de1`Rd(g6fA2*WAykBZhU29|b&0lyjrHrCI%m zVOi%3G^!spXoD}9I5J14H}Png$%gFy#6L%b+aD>;4hF_0ac{x*6M(7KQbz`KdgR=j77!u z_yg+8hR>={sJ_9|R3BD9O=g@XDr;2lCiOFhFB%lpt31dMTJ;q&;`B5IJguV2f6nmT*hIUyTEgt~ z^JL6l?Yd6UM(v#+)jDusKkn{@N5?seW||->AMm zg>O>7Hid6izdnU;QGb03->QCN3g4#w#uUC?{Y`@hJV8|PZ%*Nr>bIuwjp`dy_$KwY zrtr<`Z%^S{)NfDWTh-s0!ndivJB4po-z3fzh3XV4%I}c@7a~_MnEbxsg<9oC^}AE} zCiQ!Uk8n#E{gPMxL&F7Ed-Z|gq9s@#q|xRbGMPoqu!;+d4%u_z{(vmF7*iIg2zdDn z)e&cb+c(H&16Rn{#-N*5%GkfINfj7%G18Sq|O(R@rXgZL-6_+vNhn zc6u(=GUOk0xme)+-Tjce``SD(#$186j%Eji9D-2vER~ool z-e}+h@+Jef%9{<`CT}5Z<1_~3ttrwZZzCd7AE=bKr&v>^yn`5LRT%0@b+f#a3^=vn zW_-#)rafdLwhbYa){};N&f0*yYpOw$yqgSMBCkV%c2suRLq_?AQBzA*m9Hr=!!W37 zY6;h+Ie?#Pe;_f_aNzMbO?QLg8%3WMNCWzHUn0-&6YvGYA|cJ8mg+h^k67(XHu#es9(9 zZ3!2dH`g_VnwtZ@gp*yhc)iFS2VoI`9D=nTWC;Px(Cd8y)_IyY97w@d16HI=D^jMF zDbvc7>Bf}l##Rv_jJ4r#OOsD9uOHPZSgl8|*&k>|@;IuDTN8GQmYzX0;3zbzC^U2^ zG(IRa2qHJ33`O{FzIo+bJ1%H7o@lAhzc}q^@&%Gc*%&@iWJhWrj;*MipF;6cOIPGBG`yT zguDp{*0tKJ1AZLivJ>xMED;t1*k4V!K zhd`d&V%T4-B-EmAr4-dO9ZO_hv ztGtwL5)Ii>uJps>>Q8XtWS}E1V_RfA(%r`g$Hh_FLU~GuDxZYKa=)(T2;bzVBK}2h!bQXNHl*2;YGp7YNM*|M!20 z02yvWz|$^#qQLrT2TtPJf`c=k;FPm{ygE?Yz(UZzDgo8afnex{S zs~9Cr-?F$IFqNs|O9ksFQ^`VnsUY~#;AQVs|EK)d;x`69JAhLItG~ROzE`k|zE`kI z%X-A+snUG{zmykWoSGY|e-UA=g@gS~_u$MM<*Uz$5QfWs)g3O{ zr-g--4O_9d-qcRz$``Z{iL^{%OGF3;r{;N>ipI zx#(dw!+oY!m@yRYVW^rWq z8tXB90k4PJGIl1H)0e~2TQk38o!;E}6|ZRH@6)n_$0!*Wo?GWB%S#*IxY^dhCe?O@ zYVa~O<>$yEpG2z7lj5c;X$dpVT4HR(7Y3Biko&77u93J7@wk>o4;pldVX~i-?o8~uHyt(pC=fv9ZxPA4A^WvUsmRFo;;n#|9mX0s3953C-8;Eg` zGB6gnTeN1pXwA(%6GdBDBb?qbl+33t;+k|rzAlfKY`9ypbG&5d>w6|jYDc`!`*Ehe zbSb`dkOzej04DcJ&>g*y;bTQcV?T~W@_u8Zk-Y z>BDsGt%|&o_!fS#f5retdyOsDT+NANjTij)@(M51{9wlHd++;S{IJkj;(TOs=I36h zeK_A#I8QVAE%TlC?2eILS~kIV0Jm#af~YOiBbPWippYy*7`@d_fj4Sx6+LEn?y(;@1{4Swf`t z;Zi2cm}twHtPo@+lU0J0FIHVLws$rd6ZZ7Y*) zAa`8zwe8GykX605lgSfAg4&Zzb`h!7o??QPD`p-uQ>+RxtriqZLqsQif?|D$ZEFRs z)2UxjtQoOwy`We)V%i{RP^Te58<~c*y@ECorO1Z`Z)WRytwqp%y6gRd9?)s4plwWR zwS$5l(&=GAkLa{r(5H185%j1|I|P+<8Wprt(8*(h9%ovw$%39>>eo&R+NIle3)(}J zlGH1BUy?r~xWdjGw3wjKTaaD#TEC#DmVuSJ?tTF^5( z9T0R-r)LEn(&@0E=X82r(B0W0WDobNS{2gjd^dX(uwtwT_WX`2=mw3Fzayan1Z!H=``5lt2pC!6r3gW5?! zyO$uhf_4%erxF(Yxb9jO6w^iI9ZFcxE}eD@+QYO}>lL(5w|z!X z9MOc|Lz6K9krmV z%}ftYwg|e9X{)wh&;z>TRzcgC9?=d8dWh*^?XaLnn6_!{f3%^E2*;DHg0|_l2L(MOY_-FJ9w9oO zw^(Zz{As}#X%WGXg3lN|t#t@0=`<>6r%sOvdR(Wnpjd)ozb6Il(rLG#Jv!|bv`?qc z2#Pn4>^CN8T&Mklo?<$vofh;A)3e%up!hm4{0>c?6?8~x+ znTJ(O2eoQJy}GSW&>E&^wOT>zm=0-vLH95n(CP&ZFdfty1P$trLxMKywtEF_VtQ5! z3)-yH7D4yvbibenblNItn@$f3dWh-Zlc3;MK9BZ3~)X@{VaPNRZ$>hzeP z$8{5tQ%q65f}YVG z4+x6SSF+!;f(|h~rwt2wj_7#4`{8-PciT+`?)&-pU&3N@YicwL(@ujJbo_H63pe=!q+T!d8K59FM zT+Su&DOz%AA%}MHSv9{m`GK`6e=~of%exy)=H+)y%O*_A{?s(*o!pX<^%rs`EqUe@?=D`5Io0zr!&dl`}X562JuU#aWeG1E)%6@1oGdG$?+J0!F`@8$h%gn_O wO%U$}&H3i?hbD-3m$lf;J06-yYJDz~#WgbcR(9!qi~U12TDHj|K3DR;07j*pi~s-t literal 0 HcmV?d00001 diff --git a/third_party/evdev.py b/third_party/evdev.py index fd6b656..c3e75a3 100644 --- a/third_party/evdev.py +++ b/third_party/evdev.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ evdev.py @@ -37,12 +37,12 @@ def demo(): while 1: event = dev.next_event() if event is not None: - print repr(event) + print(repr(event)) if event.type == "EV_KEY" and event.value == 1: if event.code.startswith("KEY"): - print event.scanCode + print(event.scanCode) elif event.code.startswith("BTN"): - print event.code + print(event.code) class BaseDevice: """Base class representing the state of an input device, with axes and buttons. @@ -83,10 +83,10 @@ def __getitem__(self, name): # evdev ioctl constants. The horrible mess here # is to silence silly FutureWarnings -EVIOCGNAME_512 = ~int(~0x82004506L & 0xFFFFFFFFL) -EVIOCGID = ~int(~0x80084502L & 0xFFFFFFFFL) -EVIOCGBIT_512 = ~int(~0x81fe4520L & 0xFFFFFFFFL) -EVIOCGABS_512 = ~int(~0x80144540L & 0xFFFFFFFFL) +EVIOCGNAME_512 = ~int(~0x82004506 & 0xFFFFFFFF) +EVIOCGID = ~int(~0x80084502 & 0xFFFFFFFF) +EVIOCGBIT_512 = ~int(~0x81fe4520 & 0xFFFFFFFF) +EVIOCGABS_512 = ~int(~0x80144540 & 0xFFFFFFFF) class Device(BaseDevice): @@ -145,7 +145,7 @@ def __init__(self, fileNames): for fileName in fileNames: self.devices.append(Device(fileName)) for device in self.devices: - print repr(device) + print(repr(device)) self.fds.append(device.fd) def next_event(self): @@ -167,7 +167,7 @@ def close(self): try: os.close(fd) except: - print "Warning - failed to close on or more device file descriptors" + print("Warning - failed to close on or more device file descriptors") pass @@ -179,7 +179,7 @@ class EnumDict: def __init__(self, numberMap): self.numberMap = numberMap self.nameMap = {} - for key, value in numberMap.iteritems(): + for key, value in numberMap.items(): self.nameMap[value] = key def toNumber(self, name): From 4cc9eb9ebfbad44303bc48a0689ea91a396825ef Mon Sep 17 00:00:00 2001 From: Sagnik Ghosh Date: Sun, 5 May 2024 11:36:40 +0530 Subject: [PATCH 2/2] Remove __pycache__ --- .gitignore | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 155 -> 0 bytes .../detect_keyboards.cpython-312.pyc | Bin 916 -> 0 bytes .../__pycache__/play_sound.cpython-312.pyc | Bin 1324 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 154 -> 0 bytes third_party/__pycache__/evdev.cpython-312.pyc | Bin 26985 -> 0 bytes 6 files changed, 1 insertion(+) create mode 100644 .gitignore delete mode 100644 linux_clicky/__pycache__/__init__.cpython-312.pyc delete mode 100644 linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc delete mode 100644 linux_clicky/__pycache__/play_sound.cpython-312.pyc delete mode 100644 third_party/__pycache__/__init__.cpython-312.pyc delete mode 100644 third_party/__pycache__/evdev.cpython-312.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b42097e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/__pycache__/ \ No newline at end of file diff --git a/linux_clicky/__pycache__/__init__.cpython-312.pyc b/linux_clicky/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 15f36dc9e6cae488b182c22dd14b1e363d54433b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmX@j%ge<81X(iXX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?Oow=celCWTt17 z=m!+#XQd{W6a%?=r4_o#Iho1Xl@LxmloKDHnU`4-AFo$X`HRCQH$SB`C)KWq6=)PA R5Ep|OADI~$8H<>KEC4DOC2arz diff --git a/linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc b/linux_clicky/__pycache__/detect_keyboards.cpython-312.pyc deleted file mode 100644 index b66751c1f7abcb90f3378e1db64be747ebe05aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 916 zcmZWn&rcIk5T3WYZMOxMLLty<6BEF&{-7F6ybv+QgD0ZV6VYtSz6Wf(-EH1(39W6? zg9lAGaDzWV!a=5(^YQAk z1n?^WeN%eL`2r?8K!Fk)N@Q6gK&20`EHj15#aRHZNx&lL@_vu9Pc9PzRi&!vk>3H- ziHMnQschNI?A3*z7)BZW{3nJT@Oxaqc~sg*Re?2N4I0D`>O!M(e?~*9Lm|>X|M%@{ zc@FO$B44ITUETnXY^gL7Wc+rW6oT2;j7IBHA%5);Vf|_%jinLS(EAz)Y|SfxItKpd z^>q-alh>fDOSOqynY(6grQ+o*r(E%Klx zTwI~GfuOR-;lab`QK7hH=7=HA*4U=edtMReEKhCA!Jg5484IY0ty&Jv+qQ_9w(Bun z5d*9ECye!Qf`}Jcb;Zqd>WN6$ODG{fSb|$<7teC*Zi(e=Yi-@nz2t6znZAe6schai zZObfHFM-hml=)a;T(zAmS4HyrAx~j@72RuKXu@f7>~MVUKyD`=HScz`WK%y)OzaM~ z6SK{kj+Q>rrdrxmTbnrpMILU_PHbfR%~34fiEG=_pRyfwBVF9X(y_6u!N=3m)LTiY~eMA(BcjPp# zqPA31do2_b$J%C{(JC>eSS<%l>c>iXy?oJ5T~m(7%4h+EM~I>dCa5A2+(#9eNWhhr zY$|cC>{eUXg2*TK_^KpO$l^EpAqfvB=}-d-J4_w4Gqz*Y!5w5xeL50o)4VNsd&yLo zIEb^B<@io$S#h@JxYVzDG}i6~Zsbu@julSb8WV7`Bfz)_F%0A2T%jI#wBR~->S3YG zf(Eri4yqshv~0VMz12z;YpgV(I*W_)PBdFA2U*(l(~3__o*?ewOTfBlU(p8}y^ZbS zp0YSRy3{T9uMFoGy2Xc=M_@_$45{1p#^rr8hu2Ol>$IlHg#ULNoIcmIpYT zOb9?o_Fk!_E}xH%a$Ca{WSD5ssDO$?|X!a2VMtc!;F$;af+tv|MQ_49vS*wxpbeEDqo z@8w}3X0n4$ud{vkd1hf>JMzz5X;0f2 zYMDX3S08vi?_uypMcG9rdQvh~u_$6WU{Q3-@&XdMLY}j%yHV9mEy-ZBk0IbUl*A>E zXBjw1m>3x@itMAek}NNd^o)Egbre1&Q;Tz9@|WWHchdFLd33wU0-JKqrf{YiKND%i t>yldzvgguAeak+FGqE3h5!f3UWBg7>_|uo@i~qDdKDMpBL-0vL{|8t&9ykC1 diff --git a/third_party/__pycache__/__init__.cpython-312.pyc b/third_party/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 5694e278735e12986f727709a9eb2292cee810ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmX@j%ge<81X(iXX(0MBh(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?Xux=celCWTt17 z=m!+#XQd{W6a%?=r4_o#Iho1XmHH(anMEn_1&Ku^mHP4VnR%Hd@$q^EmA^P_a`RJ4 ab5iY!Sb-)n0&y{j@sXL4k+Fyw$N~WT_$3Gc diff --git a/third_party/__pycache__/evdev.cpython-312.pyc b/third_party/__pycache__/evdev.cpython-312.pyc deleted file mode 100644 index 10b813a0cc21f4e5cb9978c1fcc32eefeb2a03d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26985 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