From 5256fd2e0a4e943026eedefcdff364511d246ea6 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 4 Jul 2026 19:11:30 +0300 Subject: [PATCH] LibInput: Add support for right super and application keys --- base-sysroot.tar.gz | Bin 942573 -> 942587 bytes kernel/kernel/Input/PS2/Keyboard.cpp | 20 ++++--- kernel/kernel/Input/PS2/Keymap.cpp | 12 +++- kernel/kernel/USB/HID/Keyboard.cpp | 8 ++- userspace/libraries/LibInput/KeyEvent.cpp | 10 ++-- .../libraries/LibInput/KeyboardLayout.cpp | 4 +- .../LibInput/include/LibInput/KeyEvent.h | 56 ++++++++++-------- .../programs/WindowServer/WindowServer.cpp | 2 +- 8 files changed, 66 insertions(+), 46 deletions(-) diff --git a/base-sysroot.tar.gz b/base-sysroot.tar.gz index c9cc9d929b13a746c83a7eb77af052399d1567cd..77155719d2bdea45f44feeb73e406d84c153556c 100644 GIT binary patch delta 19101 zcmZ6RV{qn8u=Znfqm6Cb=Em80V{L5nAKTfDHnz2~&5do_#+~FoPrdb?FX!XcS54Pc zO;yjYr{{8jA2h%p7z!B*6$%{+6ABv&7YZMW5Q-Rz6p9>*5{lZ0HiiI9yKaF%ADwB( z{L@)7D0$tUr^jvqRQ$9yyOA{(%kgy}nm8-87GSl$MtOI>%>hu zWbMR{7;TAMf03SPjq4WJtI)MJslVRJf8@T&9x@xXc3 z;z{8&9FQ%Dj)4FB;YeO^hgJ-*a&21RMTRf_?Gcnh$oC z{Et&zMbW2g-;BPKj~9k7=FuC=FFqFvPm=r&eYX~mZ4^ynM+)vfnDaHb1eV!yhU+Y{=6 z-l(ls@lgNjn>MB|%xrB56l@!NuKy}{68R$_#5uX?2{)!!*}hpAa7H92cYLwTtnBu8 z^UWuw$*e9W`grH9iim2+M*+!XtLBs zcL#>NeyIDhJm1Yn&+R@VDyuwSjInJ0E%meXR~cjFY;_d5 zRCgB=*QS)5uU0!0;4}|v1}z0vDr4al1IXKid>6Be+OxWoxJr}gYl}a9RsuA&BIiCA ztCGYt9=*2kPTSk8Za|Dv5gfmPGL8kS$pBl{gxYSx9UkLOZgOwQ9o$9yaa(Nnr%4$P zHTU7+t<{9qj`D_|*xl@;`KwZ~1vQ%@u8|)b9U(RXB*nHef2bLMCd|6#q>|jcdR;2% zEw0x8woK2W`!kt4!dsrLdaAIR{F*<#VqUl>6`=_~;>OUnp03omu5Y&tj5p)k{QgE% zm9oKaP|HxgSetK=r9m}w0 z6|W0Wk!e_bHoB_)fX%q1W_9#-ES^A!xUI#4a&vnU7U2UeJEt6^(KsR?`zWxE6Z-mj zF4Dzt*AvhB(3`xj|KXztCtW*_Mf^MS7?t2>(cYu_|2^j{8Hd34MQ5Za4)CkoR(nEEijU{Aqt4P_pJAAw?hXH^r`eg|r>Ef= zob&aHYu2m$m3U@WK_P#CFEM{pO6#dJ`=|4XsB={GsY@4O@P@~~#3AIrJ;E-24LqR7 z>g=a@$C~VfM_xIAhlicpfa5iCti6dG6D8N6aZ#k=v#sts%TMp#{<2| zov11~E^j3`j|BM>ei?A*vI3hjk(tYGU`e^BxQz>n zqr;<_rOf=)TmsSS?gLO~@$N(CXii9zZp`qSW;qX|zEyVg1*@64=-)26+DkG)d&=Sf zBOKQFI4sHE%28Jj|Pzf2LG4`x23*?A)<$P+CxD4rOvp<=Bz}Q)tH3 zWPm4Mo9TU>q*mvkU;W_&G$%$_bx!D+)gtljSxOsQln@0`+lI(7|J~?6JHx z`BQ+}X@NUs>b0jWg9zVxBw(hY2zbkib2V;Nq;{d%@xfgq<6tGQ!&{D|+A$dBg(_!&6ri_@9@QGDYW zzq$XO&m7o4$?`cf3r1s=g02u&&f7sJ#W7Xo`=WN&zNLI!B97(p?yP0)LISx%J-PL7*4wJJGDd1+cj zzdOT4OmEY4F^Sy&G?C_{`wOVlb{MPk3cDAdu4I2a{PIY+RrE9WwT07kc$S_(rA5~_ zJoD5Q^!<)B&zq-ld~hCBE6ZIz1LX<0#3{2Ed@sPQZgu_ku~f8Ob0k#}c1Nz)-J9|wuycz(5L;kZ!?*07cbJIjV5fCu(GU{6@_V_toq*R0 zIB4eT27R)Sfx@@@AjfG;as~e=&W2NN8jX}(kHx>7X!{mce&lU$u{x@x5ud)M3sai~ z?V6_FV`|$pxVWqdZCOyQ$E)%602{TnZ>f#H8vLudc`J-GjHW)My;~PMk2I%L7&T7s zvuX8}JxaInA3@G$&)uGBXeJS>P{eOHKrHXEgML`qn?o-yZ625)-FumH!Et z60L51F#AsD6!pTrJq|RVT5o1gcc*)Z4tyR&l+QL=E1;8#n72QD;MzCb0hJxJv}dpS zr)6j3A2VCYo1q^y*6uiK{?vD59H7VYMaKSh!?b*Nvuyf5D#KV!hf^oL0>@9z>c;P_ zjoxjGI3WkokCErZcmnPELG%Gf*^|lPzbeqln|6&Ze)u}@5~gN^GRu$Gx3tRU$Hwv6 zP*DkD#37WxD`4gDRnqY4015awmpHyclmlYx>i#}Yd~I+gV`LTi27pA}zWRunB%!0Q zN~3;3r!BtoW-V9oJ}IeN9sQC)3qSYD_Knx)jq&<|UJt+0hKt`JWaS_^q6TvEYa~@l zQEF=jToQMPe$Eqeqozo4iCz6_oS6z=1xMq9%Qpq7ExU?&)89&H0MAg-z_7_gjzBw# zlCx7&&dq0_!N-2ysrl~-^yb#p)?}zi++lHQbQc?e@8M*XJj|I(jaAm0vA#sS9bFC$ zW*1th0wqoNtJwTShZSchmJNce1~>XQ=F_Wr!6|96!e;sm7AYjL>-ed+{auEqg9X0M zg3!Z6JvCb;XIttmfVDyRqg-wl@)UY|E~&p4jq@QFf2|<>({tolkW^ec6oaN`6}P+9 zQV2y@cj{V31Qesj9~2pz(JK{&^PY#I@usR4O%Y8p4a=tSN?RLcgUh`$7p6wD@}a+! z%Cs!PF0_j*_TNP?6Pp0}Lhbp}2Vs>T6cwx>x>iF2k4p-Az@x;qI7=TisbGds?TvGJ zeC-@5Q;HP_mCLJ7W0&5rU=i?|G8q4NHUSW10~Q-#2?#Hn^l$~B_UVN{2FHqbX zH(0Wfv<`{?GKp!Ae-}=rnP07&7w0TXI2AkneWOL3tZ2{V)u7_M#|U^zCqv zjB+|XO5tJ(@LiCp$mXgnCthj{Pd6f}RyJ(*?VL|l@Wv)K;7{?2QByizt#@3$jMU@n z(y06?{f*023UtQSzayyqGnO=6)itKkI#gV)&7&$>aA?@IhQWK}%F>dF`ROG7jl}CY zyrL!z)^e$J;%E$VbAy;S4VKBeb4fNT(@YXt;eySZ+Pl92sA{=aN9hv-fZ50&^ z&tAh@K)u;t$L$UVLY3%-tMd4RRAzzJw+6i^d!opFK`tk$W@I%c@P$13T~2u9s7z+BuW^gX>5mNiC!LILQ1DGjb=_ z9;4(T5sp%9T%12DTKGZrr43kYUAfC(L%qhbRK#W>E+=&(C+*l)Z?^f}QCrNZ(ld9q z?t(HSRVuc5EHjI9@B8r41h>opdf3tfV1L3xA~K*q-*5jhe#{^8X8*^7@5yH96Vq^$ z^<&#e&tbEb$s%Gnoo5@#cb-Y90~)ud8fG^fn^FBtsHL5{9OON|={hp9wOMgD#xrES zBmMfQT*|{k1G7duND#Xz>*_ewtEyX%M12JLSdfL}#U-K9P<10%h>N9EYv#jjuqB8(DKzYx=AXv?v^ zrkeui$?uebQ+m7Q^2T*-b>ztIY~R9_gZD#bD-)~1_!HwA@#%xtJ$-|twb-|;TDU%QDwbjD@6b^eJxQQmM42Lyuk7Q88&}KKjELZnBH$83RpN=fiEdTSoekrmYVT%e{+^$J5-O zrrd!V4`!pL{Y=j&vtAYua7G_3^Jk&4g~{fP%}-(v75PtcGymaOwdE?}sY31MO*tKi zt!dNeYXykKEp_OI<~OWli?#BfAs2z&W}m{Jes24+;t#!epwgE~VLWnP!pb>rG$FkAUTlC|wnRR;RANwA&@#{E@3}V$;4Y zF0E3Oh)(jO9zWnT#c}KYe7h&WIuUw281R^Q*tU787pf9=D>`mRRTb5EV9xDptSzQgJ#2{jy(BXIN*d zq;-ltnyeZ3s?qyoneYo+e=wWnzhpAYX7yQL`Ni1|G;&1z+quvL*~@sx0XzjJ$y4h4 z#2%Ei(i3#0ztz7CuvEvQG4n2|&O{ll7#Z@vW;@T9sP(m|6zG|R3*XQ zXV>>IYQBJEfcE(ibE*Re*N_&)5~FrX6cC*KH(1VYU$wTH{t}wcKJ>aEjVUX{hgvD{6W85x{$%o@590EIERz#A0S*A z&`OhxLsGM(xuxbi`cxR+SNCm1w|ZI7W}^Z{KtiwrO^a0z{~NN0uHW~+0d=5~eP$3+ z$j=-U-;b`=dI4Upc;OE7j-eRH!$yvnoh;3W%F6AcZZrHIP7bgZ*Q;2szQ2)F_-8<3 zHihNx@oX`E_*UCF>w$qm&yo)HBmny6nMUtPV5TuU(A}oV4M(Fc%QCG8x^emT8fQ(v zz5exlDeR|SLM_p@u$7X_5r}fV+y~hRG|!cV8S&Y)$ZhrfvC-N(zu-?@+KeOZrip$g z&{b;2-zVHh(d3>jXsM~(<*)ZGWT}v53g&I9S+jke(8_2Z_`CWvmZq_A13caG=otN3 z?-re?fod!CMv{+u-C7+(lD3~8DXJpvcYZ(6u%RmL*7dOeA^qM9sjc<$m1_pB;Ui9# z|G@Cit=~QwcxA`pH@d>~+onR>QKnHPp_S_rC@|UXAti%o?Wt}6jmMH#@8q{bMrEn@ zEdRaF$mt#GZ7Gi)2G6grxq#1n)pOG^Zs~$*h***=T!k#k%!x*W+#g4GTg77StB66G z{mVnV@J=fJ6+2~?Zuy&Y%6%@QZ4hr$GQGP)wQzZ5^Tz5X*tTZ=K|!k0-Cv$HpkA=u zs`GB9)E+CvZi>di_wT4s>E4-xg{QgM(`@psQUhn>ue2e3KKxxSML^y1YHnb&En~~( zT+33%zGV0cFx<=Pnb~^l8jbXHtHjy$}&CTzu;Ri+D6b87*D) zgM~Ba{N6&7Jr{f>WfvPymcqxg)W!AG>|8$~bBz}F*<^NJB;YB`z{2YmniSQ&P#Qcd-1AE8BH`OWI*7x*F$LQu>f| z^(Segm>yB*J?rD;fQjwLDxLR&C2Ak}^MX-@@`q}4`u%$nyQU}o8Huc-yqV>R5I3*y zr`^QG^nY`=vw+1!Oq(?0(!8oh{s8s6{jTa$%TwNOrxotD+RP2?);uEWHc3{FKX-N6 z+I);1Vx?6kQ2yZGeHQQ5;FS<~uF?`AX~b<}0Aj__-RD=43EU;Zq?=eQUaalT)8!2= z^KG>kKP7X?^TYE^A{GUeN2EO}1r-@8z&E>+h-M$ZD}YDg+KBbvMzW$jg~Cb!n3zUB zKHa|z92`J9>zLZj8#`A~1`L_MIG#u4)v>TrVjf^R$PY>V{#N>{_)f@V`ws=2iZ*ra zd24HHJ2+fr4pgdtJEW#wcVTJqzchBo&d2}z-3(ogR2v00joVNm(D6v+?n zl%9;`vuIJKLYs$y^l71>MRDaVYCC>>G)E^@~+QjZ?N!*&>sey!ec3;I;c!URnrohzsrbSK zuXr6hy@B*Wj0Vs`rEKqhAyB37mG>h=uvz)tB3B_P54XM*IXT@dn%jx;++uVZ#L&c& zp;cgQ4VgJu=s&QDV{(DHMl+;CpuacZ@3j1%ipv1mI2Dq813*UkVx$Sj(+lV0)5H7u z_9pQ5W&c0CFAPbf2Uj4yCxJvoJ|X#e>eE%=M#(y3pypx_JnqtH8tI`By@NhvB^Vfu zG_=CSA{{N1idhS!kdMRXemo;N6eK?rRx3%1;e2Av0x5U!H{FNN!?%|Wh=nL4Gh!=&Z7KcClEh4 zME&X|Cf>@LGKT$x6*kn*hl?p>%F%X{5CzalU!ag~RELsD6MYF&3!O=COvKB=*s&KN zLAQ||u|Xm;;g$;QX(;^}CDL8cOV0xRdGrY5bX#wT$*QXq7#|Po-#lkFVT)H5cO555YNq}_xec8XEXv9MrMFIOYZLYa1&WT3qeb?(+hY( zf7a>K`J}4q+Lh+!=7wdm5{;Oj+$GyYk>LxOjr+=pgoN~USdKQO&zMaRvu0g>NuHNw zx)c~3P{5}_fL9q7*Ll&fBrl9qRVq`V3>h=!AV^A>5q3af`M%J9C?T0tF#MD`M^Qx@ z6CIt-)hQ%!06*kvShwIrpfIwx@CsC#Ty_plq=g7}PZy9Swg<06y^7N$;slF^d2LWw z;r$vZFpG!Xk8RQ+F)=}rFohIllPZOm?*qZPGMVzl+7f4@T>?R~Sx{BrsGD@G;Q7rN z6)u_&N-d*wdYuH%rP&N}lrmP>+mZ8cQeMQWvLga{m=g)gMp5ig@aGUWfjf;XzpoV6HO0ot)-p) zX*QaM6YLs7~i1cm*6gK#*OO!Lc{}p%G=<+KN*4c{>U5mcNO4U8R zcjH$j^74ZG7Wb{tq?*@cNuyEHM<8rKWn{Nh^5xby*X;5GVIanx_n)A$+E5Igp(D04 zrd>z>5`^Ch{R~<{!o#pbDBPATI>D0O=1Oey&!L%b>`a4$i|KuA@c^pj?FhZlTkq{Y ze8E6m28|p{YB5X5z|0WmHO&`iQKB9xBgKw%T;lk$<{v7BRk}DBxjq{qikgaM?(7BZ9;%T7YQ-z2|Y-Vo6l4HEARYeYDD3-Wd0=58I&J`dbwXHUeIg6)+=#@+3Y8cI89Z~0 z#8{Z@d11j>A4lw;N&Ju5VZA)Y9X6{fl4PxVBsjW%1-C2?yo2?9xuJ>OeaWU;V84Jr~0JzD?6~E zCI8}*&KG`sE2_aW|6-HQ7kyk=YV{kPFYEYLM8k98h50Xk2n$lFReCxQ#<)mqLqacG zmKbtEe%Q!tKbDoho6PRFMm8K~p)lMW8RY3aAk1>MpR19LnE9U=GUseRQ{#>P`7B-I zjnEG-NaoH++@FPEX*2yqjW--WykME%QJFiVaSbJrU1$5xtxQOMctJD&lhsRb5IawC zfne*8V$1xd-J1XhAxl*P;g9(K0kIP-bwMH{g4s&R4(&ud=NQVT4Y?e+rJd^r;o!RK z0hsxJxl!1Qf1?`Zx|Q<(;`Dva(aEATagmsYc~zbVA*l(eRb4s|(YQ!L z18d$z44ojMg^|Q6KOKl;ygRtTWTB?u0~6tQPD#7W$Du}VnXTN_k_=2)?Car;D_EA#8{}RIEBZruzfcZaV0fOGlpw^A;doF zY$wH|0cD@z&Le!}lsPGDzR5XjDZm?p%KIZkG?MXK@mUE z1wF2PgfUf^Qzi0=l-fd=Y{)%|$Xx07DY99wJ2H9+jHwvIL7cg};k&!LVBke6=d1GI z0p~wwalR{DMELT~ypA$nfTifTsjcPRDaq+V1ZoaTcTW?~nmzZZMLS27{7_ntbq><) z6Q&sXo;Es`)sSTLl@;mbkkN#L6R#2@0j``73&h?>>iJbLn9=;^6?qxz1{<>TiQS1i zkT8T%=3WXz+y^sYSiV1IA4s!g!k~S5P3Uh6V#NpvX^I*%WoPdr@FaD%?rstCz>3zY zXCImFsn3on$ANj>_h+8l_5z)BJ?=+nFN9*jBMsE^@E{Gm-bcw6YL1ycGAEDbPP(F) zB_kMUhH-p_A_$fnMiKY-cJ{pwaV6vN;$3|&467G&WXZZ#6A}(*0z|V$J%@v5r2?i+ zgopKh4ieK$AsjK56dUhKZgl8`;z2?qtd+u1v-5Y|-a0ur^2tp+Bv5?BkeQz2rHYo& zU_P75b3{hGQoj;#8R|Y zyrlR6e7=oQ{&Kn{0+jh}`kitlDq2JbhjV4kP-YY)^Xi>?aOzY;h1A%J`Br?!kFSGf zG=Qou=+{kZnm|ef-0>*L%WysMo$eg6Ue+5-^scSL|@Aff~V!Z0v9YR$<28E*Fi` zHzp$X$6Y7YllWu~lFg0)V-UKQh>GLMFwQSld9%ZqIUVl;fUDU)@(R%LQ6o@bZ5D+h zjJ!@;d0S-B@5%G-hn1WW-KDt4pD_A0e1}(Dk1}XgBE=`tt(c_CzZtVj7<7tQi#*Pl zOjj#c&`A;XPQ8DRhYhT&joZ$_YDKWh(G&6;Olzs z;Z{Q8r!D({05(32o(R8CCsX(s;&#Fh z5H;^aUOlfsQOKJi$FF!p%=1LgDc(9MjxpiJQ{%Uxz07LM-A|*pzW3=F`%WWw!ZxQJ zG1pNXBbM;RIT}-(^LGbD&AhRVi-sb;_n!pfU8S6lWJm! zKp<2eR4TNVaT|p!W+;^{w~J8&R2!*ol2BMD6eFhmGR!;DSJWA(Sjbpu z7IJNi+KH_cP3m*8PUjm%LN<~N1rjv-Oo(T!B#u=~3?9TWsb8bxz(L;uxw-3|F+z51 zZ1}M{2J)S19vwy+(hTGY)C0sD1au&IARHT%qBIKG6IUxIoTBVcv2(?pDQq@qHY{T} zHh3KfCP=M7T?pG=yFgT9G!BxtY22#|2v^8^h9TXiT zo$yBM!ZPFyW?6@^G*b~YJYYA2u$OoT@&<+t!Z7eRgkvv5uMGs&4)hJ|3*34xR}3fw*g6Q4z@|X=K&J!kll(^~yr9lNwPmVGn^bE^`2LhXff5jePRLG#84z8n zFrGt!f`J`@zJVYJv^*G9Bsypzv0s6DB>kI|V*ESoJBWGz6;M?~F96O9tqiIYLIc_c zqUkHTq;Px?K;#6K2z{GaZ}@CpXd$NeihP=sId(HR*l8ug?nMkC}+7 zgKq7Tc+S?t0__fquh3on4YnpS@K}3yj9ZL_r$kH;LMPBK50e?^PW6ueE4ywPj@kr# zjr@;pC(YTr2*z&{=<+o-fwO^85W<1%#&|nxwKS^F`f~oniSX&Q)X>v-R%3nc`AcN2 zEK3AX+LqP3PVTb=h}!K-wNCEKnGo9HsVw?kO(lK5%emoe(t1VFlmU%PaMG3K8=#^! z)AK;wOL`7=e?Tb{NPYvLp`$gxU{5~i;4BSrg4`o`@2Ykg%ot@sy9icz1b_bk_b7o? zO8+yyfAna8S^r-Y>OV7vmHvMtV3jkl^Qm|!cR(FH`L`8Y=dbPK1&u5rSP7BRbf7?w zW#A4N4K@x@I$&@iQ=xN$pQ&Ns|TfBr>_((Ohw3dutmv5}d7~3e^9DQQ@ z=k5chsreF+J5m%vSWY(VU)BQ76IGM~6=EOf&27Ey5os`dA?1^64VWEV z#^O7_J>>TG=2n9{BPPY266coC%N!B+Yv&bK-b1091yj6-kV)X~9VT!l4!+zH(|mcZ zpvMe&icIfMG$gCp&cjPT`~DdFNT*?-P7>$bT%Oo-3cL4);1d)jxSerhC8cPH7dr5c zhLbwI?&x)wW+{Ot58TD*1gw}4E~B%V#J=p07<0r~zf(rBhe#mdsjzBwYw|q_>hfWP z?!Slf*S{IR%0^yHBT#JRMh?DL7plt5gv3&)d1pdC?mnXrq)YJPvQF#NiOz*RVxbPF z>EwSR7E+I=U6ATUy~aPniEUqQWJvPLu*WbTIj=j!s~bV z5q@@m@&70kpx==tk6V-#p9};G9_OAg<_lGcibkI>qAp;IM4z)tKV-bjA{XkqKWu$s zGVsCfQ>yCRfD{w~@)Gdi{dw_WlouEoyMPaDEQ*4&sEzO!HVvcgU2)9;t^e>|3XtPZ_!SQz>?THW-DI zh$w*O%iErl^J_c>3;6a94^cMs&7!mCRdfV52fgks`ZSF^dEdUQsqyRG!$W~QCB;bd$d#`uOg6+b{i2LCbS+mo_ zh^W)~d_HRDkM_uJVn-v^$v@X(uJyFRFKjt`Z!b=WuNgEl^Hf$<0M+BGAHlxpEFvor zsoD?o{`)V_%3g+^Vm`C??zO>bvirxjY9FG_`%!brX9`igg^GP`$FdQ(*V~rh2tXIy zH2V4I0W4bp+iR>kSJzF?>J%5r19qQqSRNB59soh8qYKn}PktyBzZ$5=2my4!MkwYj z0hu40$P}>(#ehL^$mZLN84B&v#S>%`irseYl5Vj>&i{|c341q^=qITh4N=N~9gOS) zrVip0xv@uZW@w5_L36N;Kbx&Mz}#=m|Id^yCXpdR7xn5lh_j;))KGmU6eEr#Zp_J- za-*wk%v+|C*hr)=)oTZzjbL;T@Ke-EVl-{Q4#5(Gjj=z;AI2jz9_E`uztNjAXTe@|SK&|WOfRzgHoTB6^C0F2NF<3<8aR&XM_6E7|sS{~|G^mK@Hgmjp6lyoRE2skKn zNSD9>2x&0@B1sHCtRQ5^fz}uz@c&~C9E2o990rmFLEolEFV}y!u0SugFA=BN14NjSfKr-uhMNyg1SLF^l-~IF^@# z;u&dY|BQdzoDH8q9csW0ncqrX&&@hnu%iu9&I7?_&3*59ZKCsW$m@(1$RMySAyJ<%)_X^DpPzhLVIOC0 z*-kSXEEi{%41jEjw5?=Z+b4CmkGtF47Y6kSn&r{CiBk`F5p^Jp)g@D-!yYSt*tQ_N zn7&5q+WOgfY``7+d`g)EhAUuB$YeS>a*aMmx(3G? ziZbk*wrPv>uLTvil-fQ-S~29cxo?lFe2#Dav_;cZUQZ)Cm<+%N82vm;f zw!Eg&edv+xwR-ot%R=R2f>b)xmCsa&XVKbS-?^e;3GuHRx2jsQU?evBj>9P$E>yiTY= z*OTmR?5$-JYR0cDPjdfw_^_iH24X`b!*+p!W7lvh(RV9irZw6<+o+juYo8Sgp(z2= zh;s@;pM6U@6otxB??4?+D#G=z(H?aQFsWSvU`NZU5JXP26REb}TQ^Urp-!6jeiAHhHb==Z-HGs^~ za{&UXEYUs5UHIlkq8y)=@14TXP-DGp2V#JVXI7RR+K*FwnWvk3Vthg=4+}P-&5$}; zb7M+5f&{RLL5v~#UD)oZb!5V`WXOCK9dLAK1g7L~1?2a_&>O=3 zA=vKLI*CD6iTrM4Fkej|!%a1BZX-V3A0Jg03XOxf>U(?1rXd_t3rKK~0gf-Ina9_s zf}|XeVe#k>Xc`OieFdt6#JmjC!2vBz zFo=Stp~1C4YgWuJW*k_m3-KU~k|oFeF9bT>nl|VKINg%&3+B&tJ?vaI|dD5rrJKUMZEy+ zhwq(Tq7IV%n@5(jz(!VRWtP_iDegzEoxvASiq-e}>Rn6UKL^7@Dxm%DyT1mtp6FPW z_X)n}7vU?PG?{=_U93V8jsyD&3IDusy69UcSC=K`?VXTtr^yU94l2r6>bqrXA7sFa zgMe$8u$}FSRvX*GbU!Pd>O*30!i3=54rsp~CZIv^P6ef4|BY5K zKajd!>7Mpa!O0O*@~KL*oNEA6gSleimU_fNz9iF8k1t^TF1j1A0Uk=#X6WX!yeww32BU%W3SIRBw#oC~IqguT z$#F5vCk94I=@pMEtLVBQ9sIrmgmSuQ4F)d_otNJEAe=~{bzY2g{iF)n9MYXj!h;=> zol``3Z@~Y*p9k|;SX3yZO93J~1E#2goH)3=+N>(FfOG|BfaNaUS!J0dxunEOwEf41 zHshJBRpGb~J9Vy+}$ql`sqJao3Ki%2sJ_pjL?3Rh(3?-|ZyE@klEvqUQ8yV~H zGrTl3!K&eGZ)B(HY@&o=ft4J!AOpc!q9r528IXKTPax5RgAS^F3-X31l!*8|=U?l!N;y z(9D^USRKT&3hBs&LtsDcTZDf4I*T&O`SFplbtQC~h4f*}I*Qgh%DXbMy%-|I68SAW zt{+clgga6wULdKeu(Ga;v{G~To$bu@Dk3YBjo&!Wh4w;$W#Zhqk9ptxe92OM?STxz4m})?ISd;LJN7@E75Tskodz-7yh$47XnP)# zOFH#{10lgiAT3;?A?I*Q4-ZRpMBN4y5xK0#B))H&OhNUe-;vPyb5h{7_xQqygJ8ap zRXdPJNs^IA84!0QYt?<}H&y~sYkE(GFrw27)}%`YQc;QFlCcdB!?{w)7@K{(c7U!| zS1qXH#rSK^YTmdw{gs}Boaxq!g7#7en2wRS#ygpi1t4LPYSU0$6#=1C-nZS7qo?< zeAfqWLffGrbdGhxo}sseymgy=u}Sv#ojr6JoB5T(ADsvDC`*BF7z8^(uX_+kF*GXeozl~{A~{my!VFC zYsM+&cV6g#EoZiX_N2z!c8!OHJhFv7MD|9Zd*2T64z#D*(~VGjcB8O6?nfO$ZdvSo z{SZ7v?HAHJ7Le|F#2D(%Y=)Y%TSR+A^{4Bg_}m(l6CYaJmWVr#A5M z^#6S)?AW(k_#M)JhtNnX>^K$`I+QNjbROCc?T4eh-fq;_zZ`r+*a6DRXQl~$uU`Y0 zzM8;qDvqVxrB9Z2E3b@S#<#t0GVJ``O)OwAb&nW3a@suJ0pW47x9{UTC(u?V(Kddh z#pnMh$sNo4hNG}$9A)=IeEuJD_W-9eO5vgua=gzw-0zp!BnP!4I}seW?VNU0w#-vpC-2Ug%`}K2Gn) z@m5{h2xV96_;|U_%_pEfzKu2>9_C98e@8K|P8}H%o4qUE- zWfu#e5~`tkqEhgc#((&&fwIqQt#v{9r8ThP%Bx%lx1-14?HC)vM?+%#>^(a5XIt->w5LerJEd${%#?9ccNz)p zrTt#Ne%-pi6WlGox{hmow}Z>7WwaYwCc3z+Ilp)xoa`2INq-Y_Z8%sDn@%-?_Oy^M zpEtXroZ3%?p!s48Y(BS%$Hng9ZOB(6bRP~0AAy`#p09vP#_s~rUu38S!pGXU9x&g* z?FRcUzq%e?xsnfmxcLgK{$!;U->cF71D}_P_NW)Nc)#Ye0&c%C^&tE>SnyKHQ4FYpZyNH&MQ(*F#r#O8=S6fyFKD zA6R0s_Zsp#L-$-??!b2MgFZ_ zeIlo=2il;0IK=Iv6}c*#tO6}p6E=@BZ~C+zLg$*qJAY8_trvq(f1w^CAGL5D3Y~9* z4HFIgecfXnusRyfR#<;wGyHivAIdJ5TI<=GPs$Gj+$ zyY{uiy5o5NQ(>p9yyj#BY&_E})(1xhp$eb1#hQpIs7EZGbRO>#JT4UDZaA?KHlL~! zdY+zI&VM&<-sHa3%1d#U7uN+3=a=tOkyptxTUVu8Q{7j7Svynk_t%4O!k+y-*7_=n zYs~fo6rX567#fa12-jWVcX6G%cMv*9B5^xF8)=zngO;ffwCxQ-aBmv~r^MQe>BC#^ zy(!{5u7zS}!q9s%2rZLag)i{4_}L75KJ1O}uYa(=qASHvda2yn^OR4mhUzONyng@0 z0ECW)h3|cc-hVvE-@k2N2s%ILg!VBiCwp$42wCH6-`l~*EBAWa-yeW&7<=m{H$dab zbr7BCfIaWL0S0m)A?3_?V)2y4P`QR>dt!bDoml%tDU^OuA)XNxAD6=Vi#4L1X6wsI{mb=`e7`*7kk>3N zzJHeGa(~F$@by(2bew1wdO>z+kDt=l%6}N^(H)S1&yOG;bC~?qpR%h#M4c8NHFUo`IY~pzM z_!$4DZ9FJ*-L3Qdl;fBD)44}r|htg{F@i`G5Gl z{0vj{XmM(w!r8slCHjRH~ZaMq7 zzwuX#pT)^D_~dT{33&z~=^WqCQh%R4%l0YG_^mQ|u8ExP#637WljuD-z|k=j7XBJ- zuJ0c)XhI*(&PSwQVK%_IGjzctdzR1zuPk3emRWf?Zx=h8)=bnFTH~O;Mc>(#c(ykS z*f}=y!Rchb!Tcf!zPcPDudRe!lvDrmH4u7zB`m;oj#KW1-6njE+!~}GbAR!B_v_^( ze%&^1ZQpsU?<@9iFv;8`ms@pGe7|#~dWWqqrtCXSJh*+ITqw|x_oXA;DhLl$xu#iVxo+JD8_%{U^A3el(dg2%aZ%z(AF9*d&2IA9gFQG+PP(1Ii;^n!LNgVpCW!8qJ9Fu)Ss|7C(6U*h{tl>@&o!jGcI4^ z($25Uv-6l-F7lmxO`+)`M!R(}&n(}=SWm{u9 zYw!O%axuNMWC_1wO1_u&U=AREb!An4h2O7L1Oioa)w^B!cQoZa_3PjM>g7NF?l*qM z{Ze0^xOnr53iAu_>dmVvu3B5T^q2Xi`K5Iwf$GY<9Fc={a;Q??@<2fyuUxcv>B~jM zmHx8)RfT@M76mG+3Jd%zD*`3{k~;qils4W4$_gv;tBOlk`77(Nyu`m(ob~>*K;=`| zC!dc{j10Tw e)B3iht&&PAsicxhDyj7Cr~d-z&*Jg`=n?>?A^Z9O delta 19087 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 diff --git a/kernel/kernel/Input/PS2/Keyboard.cpp b/kernel/kernel/Input/PS2/Keyboard.cpp index a0ca4b95..37142245 100644 --- a/kernel/kernel/Input/PS2/Keyboard.cpp +++ b/kernel/kernel/Input/PS2/Keyboard.cpp @@ -151,16 +151,18 @@ namespace Kernel::Input uint16_t toggle_mask = 0; switch (dummy_event.key) { - case Key::LeftShift: modifier_mask = KeyModifier::LShift; break; - case Key::RightShift: modifier_mask = KeyModifier::RShift; break; - case Key::LeftCtrl: modifier_mask = KeyModifier::LCtrl; break; - case Key::RightCtrl: modifier_mask = KeyModifier::RCtrl; break; - case Key::LeftAlt: modifier_mask = KeyModifier::LAlt; break; - case Key::RightAlt: modifier_mask = KeyModifier::RAlt; break; + case Key::LeftShift: modifier_mask = KeyModifier::LShift; break; + case Key::RightShift: modifier_mask = KeyModifier::RShift; break; + case Key::LeftCtrl: modifier_mask = KeyModifier::LCtrl; break; + case Key::RightCtrl: modifier_mask = KeyModifier::RCtrl; break; + case Key::LeftAlt: modifier_mask = KeyModifier::LAlt; break; + case Key::RightAlt: modifier_mask = KeyModifier::RAlt; break; + case Key::LeftSuper: modifier_mask = KeyModifier::LSuper; break; + case Key::RightSuper: modifier_mask = KeyModifier::RSuper; break; - case Key::ScrollLock: toggle_mask = KeyModifier::ScrollLock; break; - case Key::NumLock: toggle_mask = KeyModifier::NumLock; break; - case Key::CapsLock: toggle_mask = KeyModifier::CapsLock; break; + case Key::ScrollLock: toggle_mask = KeyModifier::ScrollLock; break; + case Key::NumLock: toggle_mask = KeyModifier::NumLock; break; + case Key::CapsLock: toggle_mask = KeyModifier::CapsLock; break; default: break; } diff --git a/kernel/kernel/Input/PS2/Keymap.cpp b/kernel/kernel/Input/PS2/Keymap.cpp index dec6649d..1f7af2cc 100644 --- a/kernel/kernel/Input/PS2/Keymap.cpp +++ b/kernel/kernel/Input/PS2/Keymap.cpp @@ -95,7 +95,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x38] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x39] = keycode_normal(4, 3); m_scancode_to_keycode_extended[0x38] = keycode_normal(4, 4); - m_scancode_to_keycode_extended[0x1D] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x5C] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x5D] = keycode_normal(4, 6); + m_scancode_to_keycode_extended[0x1D] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x45] = keycode_numpad(0, 0); m_scancode_to_keycode_extended[0x35] = keycode_numpad(0, 1); @@ -208,7 +210,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x11] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x29] = keycode_normal(4, 3); m_scancode_to_keycode_extended[0x11] = keycode_normal(4, 4); - m_scancode_to_keycode_extended[0x14] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x27] = keycode_normal(4, 5); + m_scancode_to_keycode_extended[0x2F] = keycode_normal(4, 6); + m_scancode_to_keycode_extended[0x14] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x77] = keycode_numpad(0, 0); m_scancode_to_keycode_extended[0x4A] = keycode_numpad(0, 1); @@ -321,7 +325,9 @@ namespace Kernel::Input m_scancode_to_keycode_normal[0x19] = keycode_normal(4, 2); m_scancode_to_keycode_normal[0x29] = keycode_normal(4, 3); m_scancode_to_keycode_normal[0x39] = keycode_normal(4, 4); - m_scancode_to_keycode_normal[0x58] = keycode_normal(4, 5); + m_scancode_to_keycode_normal[0x8C] = keycode_normal(4, 5); + m_scancode_to_keycode_normal[0x8D] = keycode_normal(4, 6); + m_scancode_to_keycode_normal[0x58] = keycode_normal(4, 7); m_scancode_to_keycode_normal[0x76] = keycode_numpad(0, 0); m_scancode_to_keycode_normal[0x4A] = keycode_numpad(0, 1); diff --git a/kernel/kernel/USB/HID/Keyboard.cpp b/kernel/kernel/USB/HID/Keyboard.cpp index d6fb9e8d..5b955e63 100644 --- a/kernel/kernel/USB/HID/Keyboard.cpp +++ b/kernel/kernel/USB/HID/Keyboard.cpp @@ -56,6 +56,8 @@ namespace Kernel READ_MODIFIER(0xE4, KeyModifier::RCtrl); READ_MODIFIER(0xE2, KeyModifier::LAlt); READ_MODIFIER(0xE6, KeyModifier::RAlt); + READ_MODIFIER(0xE3, KeyModifier::LSuper); + READ_MODIFIER(0xE7, KeyModifier::RSuper); #undef READ_MODIFIER #define READ_TOGGLE(scancode, key_modifier) \ @@ -340,8 +342,10 @@ namespace Kernel s_scancode_to_keycode[0xE3] = keycode_normal(4, 1); s_scancode_to_keycode[0xE2] = keycode_normal(4, 2); s_scancode_to_keycode[0x2C] = keycode_normal(4, 3); - s_scancode_to_keycode[0xE6] = keycode_normal(4, 5); - s_scancode_to_keycode[0xE4] = keycode_normal(4, 6); + s_scancode_to_keycode[0xE6] = keycode_normal(4, 4); + s_scancode_to_keycode[0xE7] = keycode_normal(4, 5); + s_scancode_to_keycode[0x65] = keycode_normal(5, 6); + s_scancode_to_keycode[0xE4] = keycode_normal(4, 7); s_scancode_to_keycode[0x52] = keycode_normal(5, 0); s_scancode_to_keycode[0x50] = keycode_normal(5, 1); diff --git a/userspace/libraries/LibInput/KeyEvent.cpp b/userspace/libraries/LibInput/KeyEvent.cpp index 552f219a..133deb34 100644 --- a/userspace/libraries/LibInput/KeyEvent.cpp +++ b/userspace/libraries/LibInput/KeyEvent.cpp @@ -18,7 +18,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", - nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -37,7 +37,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", nullptr, "@", "£", "$", "€", - nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", nullptr, nullptr, nullptr, nullptr, ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -62,7 +62,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -81,7 +81,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", @@ -100,7 +100,7 @@ namespace LibInput "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", - "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + "\e", "\t", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "'", "*", "^", "~", "\e[A", "\e[B", "\e[D", "\e[C", ",", ";", ".", ":", "-", "_", nullptr, nullptr, "<", ">", "|", "¬", "¦", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", diff --git a/userspace/libraries/LibInput/KeyboardLayout.cpp b/userspace/libraries/LibInput/KeyboardLayout.cpp index 55c3143a..cd1dd874 100644 --- a/userspace/libraries/LibInput/KeyboardLayout.cpp +++ b/userspace/libraries/LibInput/KeyboardLayout.cpp @@ -394,11 +394,13 @@ namespace LibInput TRY(s_name_to_key.insert("LeftShift"_sv, Key::LeftShift)); TRY(s_name_to_key.insert("LessThan"_sv, Key::LessThan)); TRY(s_name_to_key.insert("LShift"_sv, Key::LeftShift)); + TRY(s_name_to_key.insert("LSuper"_sv, Key::LeftSuper)); TRY(s_name_to_key.insert("M"_sv, Key::M)); TRY(s_name_to_key.insert("MediaNext"_sv, Key::MediaNext)); TRY(s_name_to_key.insert("MediaPlayPause"_sv, Key::MediaPlayPause)); TRY(s_name_to_key.insert("MediaPrevious"_sv, Key::MediaPrevious)); TRY(s_name_to_key.insert("MediaStop"_sv, Key::MediaStop)); + TRY(s_name_to_key.insert("Application"_sv, Key::Application)); TRY(s_name_to_key.insert("N"_sv, Key::N)); TRY(s_name_to_key.insert("Negation"_sv, Key::Negation)); TRY(s_name_to_key.insert("None"_sv, Key::None)); @@ -443,6 +445,7 @@ namespace LibInput TRY(s_name_to_key.insert("RightControl"_sv, Key::RightCtrl)); TRY(s_name_to_key.insert("RightShift"_sv, Key::RightShift)); TRY(s_name_to_key.insert("RShift"_sv, Key::RightShift)); + TRY(s_name_to_key.insert("RSuper"_sv, Key::RightSuper)); TRY(s_name_to_key.insert("S"_sv, Key::S)); TRY(s_name_to_key.insert("ScrollLock"_sv, Key::ScrollLock)); TRY(s_name_to_key.insert("Section"_sv, Key::Section)); @@ -450,7 +453,6 @@ namespace LibInput TRY(s_name_to_key.insert("SingleQuote"_sv, Key::SingleQuote)); TRY(s_name_to_key.insert("Slash"_sv, Key::Slash)); TRY(s_name_to_key.insert("Space"_sv, Key::Space)); - TRY(s_name_to_key.insert("Super"_sv, Key::Super)); TRY(s_name_to_key.insert("T"_sv, Key::T)); TRY(s_name_to_key.insert("Tab"_sv, Key::Tab)); TRY(s_name_to_key.insert("Tilde"_sv, Key::Tilde)); diff --git a/userspace/libraries/LibInput/include/LibInput/KeyEvent.h b/userspace/libraries/LibInput/include/LibInput/KeyEvent.h index 46de73c7..f6a625c2 100644 --- a/userspace/libraries/LibInput/include/LibInput/KeyEvent.h +++ b/userspace/libraries/LibInput/include/LibInput/KeyEvent.h @@ -44,7 +44,7 @@ namespace LibInput ExclamationMark, DoubleQuote, Hashtag, Currency, Percent, Ampersand, Slash, Section, Half, OpenParenthesis, CloseParenthesis, OpenSquareBracket, CloseSquareBracket, OpenCurlyBracket, CloseCurlyBracket, Equals, QuestionMark, Plus, BackSlash, Acute, BackTick, TwoDots, Cedilla, Backspace, AtSign, Pound, Dollar, Euro, - Escape, Tab, CapsLock, LeftShift, LeftCtrl, Super, LeftAlt, RightAlt, AltGr = RightAlt, RightCtrl, RightShift, + Escape, Tab, CapsLock, LeftShift, LeftCtrl, LeftSuper, LeftAlt, RightAlt, AltGr = RightAlt, RightSuper, Application, RightCtrl, RightShift, SingleQuote, Asterix, Caret, Tilde, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Comma, Semicolon, Period, Colon, Hyphen, Underscore, NumLock, ScrollLock, LessThan, GreaterThan, Pipe, Negation, BrokenBar, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, @@ -65,36 +65,42 @@ namespace LibInput { enum Modifier : uint16_t { - LShift = (1 << 0), - RShift = (1 << 1), - LCtrl = (1 << 2), - RCtrl = (1 << 3), - LAlt = (1 << 4), - RAlt = (1 << 5), - CapsLock = (1 << 6), - NumLock = (1 << 7), - ScrollLock = (1 << 8), - Pressed = (1 << 9), + LShift = (1 << 0), + RShift = (1 << 1), + LCtrl = (1 << 2), + RCtrl = (1 << 3), + LAlt = (1 << 4), + RAlt = (1 << 5), + LSuper = (1 << 6), + RSuper = (1 << 7), + CapsLock = (1 << 8), + NumLock = (1 << 9), + ScrollLock = (1 << 10), + Pressed = (1 << 11), }; - bool lshift() const { return modifier & Modifier::LShift; } - bool rshift() const { return modifier & Modifier::RShift; } - bool shift() const { return lshift() || rshift(); } + bool lshift() const { return modifier & Modifier::LShift; } + bool rshift() const { return modifier & Modifier::RShift; } + bool shift() const { return lshift() || rshift(); } - bool lctrl() const { return modifier & Modifier::LCtrl; } - bool rctrl() const { return modifier & Modifier::RCtrl; } - bool ctrl() const { return lctrl() || rctrl(); } + bool lctrl() const { return modifier & Modifier::LCtrl; } + bool rctrl() const { return modifier & Modifier::RCtrl; } + bool ctrl() const { return lctrl() || rctrl(); } - bool lalt() const { return modifier & Modifier::LAlt; } - bool ralt() const { return modifier & Modifier::RAlt; } - bool alt() const { return lalt() || ralt(); } + bool lalt() const { return modifier & Modifier::LAlt; } + bool ralt() const { return modifier & Modifier::RAlt; } + bool alt() const { return lalt() || ralt(); } - bool caps_lock() const { return modifier & Modifier::CapsLock; } - bool num_lock() const { return modifier & Modifier::NumLock; } - bool scroll_lock() const { return modifier & Modifier::ScrollLock; } + bool lsuper() const { return modifier & Modifier::LSuper; } + bool rsuper() const { return modifier & Modifier::RSuper; } + bool super() const { return lsuper() || rsuper(); } - bool pressed() const { return modifier & Modifier::Pressed; } - bool released() const { return !pressed(); } + bool caps_lock() const { return modifier & Modifier::CapsLock; } + bool num_lock() const { return modifier & Modifier::NumLock; } + bool scroll_lock() const { return modifier & Modifier::ScrollLock; } + + bool pressed() const { return modifier & Modifier::Pressed; } + bool released() const { return !pressed(); } uint16_t modifier; uint8_t scancode; diff --git a/userspace/programs/WindowServer/WindowServer.cpp b/userspace/programs/WindowServer/WindowServer.cpp index d7d9d2ce..e4b407d9 100644 --- a/userspace/programs/WindowServer/WindowServer.cpp +++ b/userspace/programs/WindowServer/WindowServer.cpp @@ -481,7 +481,7 @@ static void update_volume(const char* new_volume) void WindowServer::on_key_event(LibInput::KeyEvent event) { - if (event.key == LibInput::Key::Super) + if (event.key == LibInput::Key::LeftSuper) m_is_mod_key_held = event.pressed(); if (event.pressed() && event.key == LibInput::Key::VolumeDown)