From 3f11b136b766809a6c559c75b54ea83326e423c4 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Tue, 27 Apr 2021 00:29:02 +0200 Subject: [PATCH] early-access version 1636 --- README.md | 2 +- dist/icons/overlay/osk_button_B.png | Bin 741 -> 2653 bytes dist/icons/overlay/osk_button_B_dark.png | Bin 767 -> 2721 bytes .../overlay/osk_button_B_dark_disabled.png | Bin 781 -> 2689 bytes dist/icons/overlay/osk_button_B_disabled.png | Bin 791 -> 2694 bytes dist/icons/overlay/osk_button_Y.png | Bin 726 -> 2695 bytes dist/icons/overlay/osk_button_Y_dark.png | Bin 502 -> 2073 bytes .../overlay/osk_button_Y_dark_disabled.png | Bin 694 -> 2631 bytes dist/icons/overlay/osk_button_Y_disabled.png | Bin 699 -> 2647 bytes dist/icons/overlay/osk_button_plus.png | Bin 626 -> 2226 bytes dist/icons/overlay/osk_button_plus_dark.png | Bin 676 -> 2288 bytes .../overlay/osk_button_plus_dark_disabled.png | Bin 645 -> 2233 bytes .../overlay/osk_button_plus_disabled.png | Bin 664 -> 2254 bytes .../overlay/osk_button_shift_lock_off.png | Bin 281 -> 936 bytes .../overlay/osk_button_shift_lock_on.png | Bin 274 -> 894 bytes dist/qt_themes/default/style.qss | 36 +++---- dist/qt_themes/qdarkstyle/style.qss | 36 +++---- .../qdarkstyle_midnight_blue/style.qss | 36 +++---- src/core/CMakeLists.txt | 2 + src/core/frontend/input.h | 12 ++- src/core/hle/kernel/transfer_memory.cpp | 4 + src/core/hle/kernel/transfer_memory.h | 3 + .../hid/controllers/console_sixaxis.cpp | 90 ++++++++++++++++++ .../service/hid/controllers/console_sixaxis.h | 80 ++++++++++++++++ src/core/hle/service/hid/controllers/npad.cpp | 4 +- src/core/hle/service/hid/controllers/npad.h | 2 + src/core/hle/service/hid/hid.cpp | 30 ++++-- src/input_common/gcadapter/gc_adapter.cpp | 11 ++- src/input_common/gcadapter/gc_adapter.h | 1 + src/input_common/motion_input.cpp | 10 +- src/yuzu/applets/software_keyboard.cpp | 18 ++-- 31 files changed, 276 insertions(+), 101 deletions(-) create mode 100755 src/core/hle/service/hid/controllers/console_sixaxis.cpp create mode 100755 src/core/hle/service/hid/controllers/console_sixaxis.h diff --git a/README.md b/README.md index 1e6e5f67f..497532c16 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 1635. +This is the source code for early-access 1636. ## Legal Notice diff --git a/dist/icons/overlay/osk_button_B.png b/dist/icons/overlay/osk_button_B.png index f4a04117857cd2c50ba830151e6ec7006622164a..2664b5923bb043f6ec7bc977b4ec7cf1a88b37a9 100755 GIT binary patch literal 2653 zcmcImc{tm76aS&;I=Y*p7Qr^Wv?%LnU6DExMAaSYP8;e-ozWt$RJSXLvqh=WQdeAU zT#dT6RYF{^G^o49#uZ2FKHu!$`}aG~Gv9e;zB7N!GxK~tlW1dQCM+N+004k6(j0Eb zv0fZqJ=BLmtORs(|H_Bv0)KG{6ENg{$%if@-g9C~lbd7kc>D^* zn?9{nbdny5HP80;(PfQDVg{U;nq1%!ADRImM$FH+>@0hhz3 zBEc^?xq}~&nfX{!PP{@+vlV9EZK9x{U`kS-IF)^X3OI5_IXPn)Eh0HTZ_({4whRDR-X@q3j(6KR3$S-)G~=X< zV2^UlxW>-TE`vk+DKi&_C5_{_WllCjsnLBK8yix`U0+7$=jSgGY*~{?GQNOVW%f*v z`6sy`d$(fap(KU3<1s8g!I$Pn#^1{JF60m9A%sVz9!Fu>pJ12=nky=m4fiAbOg-RU z*5K}@(Uol``M_!Lt(ryVJkLJ~yY;)x&?kpldV0-uj+HTI2!j)i5Xj8NueDJha%Eji zmQOpO{9yeaOwQHO8u$09S90is+z~lt=~gJGTUgIc(c0oxWluOvFs=Vm@8aU36==V) zJKYoxW2<|ZaRX!}=WI3*96vZa)tD}itN~>-^4|efR4nUP7tVwZwAxiNPsZ4Ro-2l@ zdW2ph@#_<*I;l>PNz4qOA9;^_@N9k7K+Eenu_dVBb|p|loQtq8dpxXle3?LJNxZ)T z(v?dps&4z%fB`ymn^eOfX-YusRb5?bDZ?1@oy2OPS_WtUXwrVLOb=8^pH;I|PrwD1 z4gNvKw+%+HpKWe#%DLbI#Pb3V!)EFn-|wG!COwxg*jCdEWG7e+rxIKKJgwH@{eAaO8=ii}ayuZA zcu%uyvcan-^RzxWw{*!5Xako|&#sV#(8xu3c4x@yeJ|ac3^8EM=p7X!_wd`Aw+-4P z+Jdpg4WvOCTx&`%*p1l*b>P|J5#w&mgiG_(GRe2*z8_x+5udQ{UB zu3+ETU=Q->%7m$znf^Jjqf(X=L(Bc=*$^NZnhies=*ssy-|YNQ;yE}R_HgadA9YXZ z-Z`a9h46V-TTz4QK&nn^AqQnH0HZsuEFqNi53x#VIf%Zo;$|Q4&JcC#R_!>r^zNm) zHrE(iIYefqw|vidgkiTz%E~>(P*k5>I`Op)0jb6Cc$ykzd=O*$}FxX8>hP0 ztifO~T)&3Y4Y;;?tY1?vUcStnu(!9j=B!kr%_Xx1ci>TcQAg|3B>bmvc{et2!d zjc8uAJ3EJ@o}Qkp0V-?gM4jp}CDy&E81wmaGS&5C_?wP(MWCOx@&b3=?6ltobzGB> ziN98PF$8>_2YsV}cdwM3Oi?+MfcDYPXB<{F#O>NR4({lClrP`+9oV@Q?B6hM>zr)> z%-YL*U`nNQZOeS?qsI!r9f4Jnn-<*7ue+q|-EH-V19e2g?j+Hwvn&>LW#9gtwQJa3 zUkgogUdYGlC-|$fCeLH~s(e^CN`}93+AK$5g#a@CHBm(*LnI&PlSFgg zh9>&ETKwl3~1@#TEnN5*te^^;s<~t~5H3B-Sh6YqW;kjC=r&lmtEo!CN zs_xA(=#$~F0Q?7QYE>MAtUf3@|Ln!L0bF-SlF@nbpk=+s)Rj~{@SN?eo zaRQrsAO+e-fV)ox@|B-K+i!gj1F)_^Oy@@@>*4Lfv+AHo8@Pd4t1bF|dsoPq!nVFj--M#ujT2MgN^ delta 678 zcmV;X0$Kgt6y*gWiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*$7j zL_t(YiS1QAYZOrwJ!fXc1vB$@vcW=P8iW1>BLOjjg-NkhnqVPV*a#LPT3H1lK`UD= zgRN15AmT@1A{Lf{iYZ*NNV3_PT@4%L?XlQd9g=yQM6k>0=HBz}xp(fn_W}FZ$NvKJ zjO**`L!ReNk(_9^+s8ZnvMLe}Y}KthL8o zm!aT!-V_{7PLgC;(ro|@0KWh{2*dDA9LIM7OlPP?-}k2g%;buYoRH+Iv>(7^=6e9Z zq@?fUw%b4M6iMeGSAk?A={d=tl2%FHm*gi&av_I1?8>x2vg~q(VfYcixvZ^TuUAN( z+RByWj8h=FCh16?Gt-kFf0CM>=RGsV%-8Gn^CVwwp|3eb04xK@6+xyaBq8Z?wOWm$ zD0&^o@mByt8SWRCh$m^m<=hIA?*<14HzgI&nVT$}aXf4796Gyb8^SPrk4`oH8yg#k zj4`K4wv!~el-j#!S!*9UlLLS_j%NW}?;0h2AbB-Y!2wBqB#V;Hd;qwJzncI6W=f^f z&7LCZ_I(Lp#6|3ZC1cDO$xRo*OEYcxzFz^bw3q0T7Jc8Z^b+_Z0suh}tQcd)0L;SC zqYPT;{Gzi#5UlQ$Ozx=HYPF;3E*d8}ENLK}r_TVMrZ3~Soq~7q8`_NZ@y@WCssI20 M07*qoM6N<$f@%3Ui2wiq diff --git a/dist/icons/overlay/osk_button_B_dark.png b/dist/icons/overlay/osk_button_B_dark.png index 2d2bffccaf7d650b43846a2b9b24254cebdc15ef..1bd3745719068de59e5b74cb47b6779f9ce0a9bc 100755 GIT binary patch literal 2721 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 nPwyl>kTmW4{^ymF7cc8K;&t#m--NTLL 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 I^<88C3vH+Q(*OVf delta 719 zcmV;=0xou|X>*1F8B7IgD_o9Fqy&-Z!ed7tNn zJ?!CsLBfpre7+k`^EXzs)lc6Hj zYZ`@4ASn{u56iN;fFWbds;V|}2O>oX<{%Wtn1YBr^?m<`F=ky=Z!at?SgWh67eeSg zQE_4f%?yR(IPZZo^)}aaf6t3ZZwNgyPK;oZ4~99bJ-G>N0^e2jaXOv8KRY{n*7yAv z4fKsD5d*A5ISG0)1f&34MDFEsxpv#OUjm;SxSt|LL}amv$To<`n_{uJH9kHb13DUf zk#S<4=gnJ|H3qabI*Y~P+e9MK31C^)*6{G~Pk@=3nM(v!)==_1fA4N&a@9jqK&HUEvtL2!8JZU6{%mxIzYb;8D zS~jUvs#GqQ2Z7~g zX0wN?yJ&!5lDmKnB~|?>B9DwQ^R{h&-6?ntzX07!-)FksuH^s#002ovPDHLkV1jzN BM`Zv2 diff --git a/dist/icons/overlay/osk_button_B_disabled.png b/dist/icons/overlay/osk_button_B_disabled.png index 5900982f69066b420e16fa4b9fa7ca1ef348efd7..0f35cd8f26e02fd11b120f88eb2981cedbff3401 100755 GIT binary patch literal 2694 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 TJ{OdQJ0pO%alkRHeNz7ecXJh; delta 729 zcmV;~0w(>26_*AfiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*% zZ6UmQqc9L?AwfmfB8wI+g^FBMxKJCZEJhx4Pm6JMnBE&LXy>=P=Y02k_v4;>F6?3# z{|gco^nJh87?V=f^CEH>H~_4uf9isW%s7sd>+S9R{7)j|kg~xWf9p^XI~Mx z6Ncene}8{*$0EM(A2h~10FLkUgurWSZC56fS*k}ePf^q?zUhgHiL=() z=ha*hS&0)ds=5%HG$u*;4*G#B!2Ntazc-aiy#PMd&_Bl35s{g=WGzJG&HViQ`t0m% zg7UkmMr@sg<2boesWb#M)+Sq8THY=$E+zri*4EYs1_pisWV6{zePR}Bz7gvLAPmDn*L6>@HCm3T>XT|> zM9Wt2YISvWC@#6_1U9Ge6!1rT*1=puL&Jrho}T4;q)p42OlGN2D4YUDDgPJsP*l~C zLZNVaI{}FK87C(vFArI3QyZhA4QQtPGk!3}JW|!1=XqbYD_+5GyH5YN{V)@)00000 LNkvXXu0mjfIA2pZ diff --git a/dist/icons/overlay/osk_button_Y.png b/dist/icons/overlay/osk_button_Y.png index b08b4e26b9cde9477f9541ccfeba2f14cfc7ce7b..2cd1934818160858b1a3614fd1f671e3e7b06584 100755 GIT binary patch literal 2695 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 diff --git a/dist/icons/overlay/osk_button_Y_dark.png b/dist/icons/overlay/osk_button_Y_dark.png index 1fba9ca93dd607194f860d9f908f0493ff7701a8..0cce567d3f230e632978bc7cbc5091f1db764ba7 100755 GIT binary patch literal 2073 zcmchYZ9LP98^(tk$?Pl&lV?LJ)yc??NS5tKO`0`%sDx?cA%08Eo)ciQW%*s;rWz63AHH*G1xwMMEI!{QpTIZ>zfQYN!Jq@B)bu6p-d0 z6$GKtXjatl(C7gF$RMkTsNkZn_DBdsnGIl_JmWai?|ts;k@TL=eoM|2rV2C44`gPz zthuc!Jhk3Z(M;1Qq^MJQ2ViieQ@i7(v%!qQMUnVs27_V7zqW8IRf`dJg=+G#us#FZ z%f4{IVmqpnr}bgahOB%a`IsL9JWq#9u`Y%2Ns@Yhx9M=z6l2B9l*!=XQTPUJuRTX?m&qsy1oG z{dN7R{Th3fGm1hS-#OrG#Aq&fiHl~%mM1XXe${guu31U1nMnLtLIA_LX_OU%75K5N zEd1adfcG})dAdvaTmmqbUzI;)`YInR`_G;Y&)`mW2hU`t^vha4$6v66*0tKERN{aNlB?f%+5Dh`x#Sh> z)bQ^|BRr$<0z25LtC-D^UV?MeeG}TIVcNB~Y+Ngr=3^_k$yarP!_sOJPjzY2>d3Vw z+2EhtvVcwdSq=k+!m-YGaw2Q=?UcN4CHAxT@NpO%5EO6M+~1$y z_K>&b%N>K2AC2%BA{BhFy#dX5;@MuB~F6NsGnebczeNz2Ki%R#@zU7z1D?$cs+i(N2| zan1s##>w#VS_3al1QR{rMKzs+w_e7)su*lzjDwb8Oz`E|Ez$JS3d#!_tN&W4T1s%E zdiP5Nw-eQRcf#fflD6bKEZblYSzmO5LOy9OFJ;mlM>-OOdIZrMx%8}d_9{&<&-NCao z9KSRgYTsi@4^1(#%e{U}UFpOdy&sRE68E+zD4H>``w(IlFQZIXc<&KyO?Oh z)1K>w8^3ofX}1z_7%v>+Y)@0K=5d3TDY^<8DXp{QX0wQZVd;{_I)PT-}Xf9`tDIH zI0O#S1>kJX>l5uK4o~z{M$=K7<>US5xM&ZvuWCt``rh!EU_g($$U|^Nw%u-Yu(04i dVxa5$31sO>jDC>o$m$!100#)zs{JQZ{{f`)^T7ZB delta 438 zcmV;n0ZIOu5cUHhiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*tqz zL_t(YiS3m=O9Md^MehbNRtEe?qe-J62=;=Nm7t9XHdgj(tv|s?8WH>l0SRhluolr+ z3s#~{jFli_kyyyFmGsC`-dg|$~6hsAqqNFuROOhre4NH2F z^eCw&sS*T1<5xsr04M`({AvMvf51RmKpwb>DIQiG$fsFBJtd%{Yap8hQtnFn1df3! z&0gC)QgAF^k5Q=Zw_(~|=0t!CJPQ(_x0b_Rl)W&XsJ|G7)BXYKV zkjsb!fRnD3z6102{m|jR@Ijs(NdU{%Gi%2=%$Y^0>4SWDAPr#9`uc%8e~-8AVq|3g zWS7PzZQ18_Nz)#$vra~)Rrr*%<4}z6!3U|uBq!CG4^olj+|Pt+OFD8wY&Sjd6qo{5 zCCzv|`>|b_|L9#7l(z|KbOnqi0(610K#A|oFG?+7H|YvoH)BEOW?YmsDQQIJKe(54 gE^{+JCH?p>{Rsm-VnHa)3;+NC07*qoM6N<$f(w7SdjJ3c diff --git a/dist/icons/overlay/osk_button_Y_dark_disabled.png b/dist/icons/overlay/osk_button_Y_dark_disabled.png index 6ce53f9e436caa8b4510b3fa44b242787198b271..de619efa32d0d309e93f20fef388cae8ee8d280c 100755 GIT binary patch literal 2631 zcmcImX*k>27ygA1!<0ta+G=TN8Cy&2u{04S#!$u*TUAQbR_kAc+R`!!-B8sio!Y9^ zT7z0j>7dcZzSVBp)EZl(b~2gI^ZEZi&$;J0=RWttx#zv_J=Dv#mdAvpg#iFKhPA>t z@VpPt*g}H5l?>wlo9Dn0Xsn|U4>yH;D7^TmP%GC601$2e*FafnqB6XsRHOwi^7jxz zB+)zE7a$Uen*KKeBd&Re`f7%R`#o7TmgXI7$6`>9(YY&A!FN2Iq#)~DPGr*rxw`Bn zpMWF2wLmXXsP37b1z7<5FniN{__K6oY6q>MFslLC@T=f zbl{ZxMQREjjtYiS&(jqq9!(kEmnSsVOynU$wtb@xxh*v`!-%KK9A;kZ{A5HAALc(e zaTcq%z(d&AuU{ozENLT;Udn=*J1PCIAN#t?@uC$hfdH79uDZ6*5^L zW}LivEenStE8y(QoJU_Qbr80$0EeDYyQ+zvgso>3Hsf3PeTxT#CA<;_g|_*)WZ zgvuycvP1_l+2`Tk`JI~8GP@28dvIZ?#R{n7xt?XtX6NC{05eVTk`QE8qNlFHRWE<#L7P$DK35tl1q#K3ciR^Q5ECrYwB3NMlFbK!pU78R4Yzdxnh=MYN1M7v zkm2keB-KRFu$BT+a&o54Ze`Pu*+~iq`|&Fw>h3(Lw>Xax87xucq519;Gpb^g0&meiNo7*S5){)q=#Nk3+sU;0Pi9!f~!s&x6pBvU-H zx(RD`XSZy`1W}>nh#TkUj!1>+36ICLdpW9D$m)|t)cmANzpK{Pld>PMZi?t{@t&8dwb}Ld68r?EL|N4q^~J=c6PSNjy&_wthluD z{*188{X2Kwo-Js}$x*ecbvp!)pFRx6$2E8yUB%t9IY$?1C5|r)0@2CnHr;^Z;I>5C zRMNtn$O4PS`T$>gMXFRhlHY5d0cp{ZYc2b$ef@t^sZghxVGGvfjjuK>?(S3d6T$%mFUxHN+)oKkwFw@G zsT|hoTp;$uy}GQTV{BID*;JQ0exl%#@{S(_0!i~m2|^$h0-^Tv{wWB$!A#*VMn*<4 zxirt?5xFPRB+eg2;`ng!gR7Mn#*4SM|1v%Y4G%hHWUOb7VSOC`E z$Mk~7H^~v@q3z}se2nDg&h0}n{`%@=wj1n2ayz71z0fcm-5nkJoK!wI&R&% zHOgScDz1b z`MW4k#l84zT0tGlKtm)if~ec{Ef#kiyxh&ssLvGM2%iM~dl>`mOA11!)35vc`ufBX z6OSB|?;)L)CNPFS$*S+U|D?*KM6(`<1pQi&{+gORxe@HJI!VV?kRL*bd}UJcTwz z-pYnBeFYWzp>u`84qkR|5MAIH8pU{)G!4Uc8qeL!FTEjf`8REOx`8L$f))-i22gT{us1nRn`%a zDyP!c9EbCOj4LkUweMan`8J39oF3WoS?1}ZB_h_0usu9_1M1oz*Z~;j9`d9)LPSE- zgF0@t@LF0{j~?QvnzdaVr#oylDpSJ~PPOhJWK2Rr=ez}r?tiopXfe8MUOmP>gu!5b z&!TE{5b0Bwu_lP>7`t-^n(&0a2&HpPgG;sv6wbM40h(OEnhCTpmVT&n8UnTzo D6qDS^ delta 631 zcmV--0*L*`6t)E+iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*!Z} zL_t(YiS3m?Xj4%Xhre?|wO#s%6$iC0brPIaI!FZ}RIuXEp_2i@rQY{w$!HBCS}m`k z=^`$j3dN#=Si~;fOm|1IgF4j;sW?RPp4TBSRYLAdEV%VIJ4U;x+wwnStte~O~z>FMdu`+_VjE%om1?%oF`fx{_zHDJ;6yqSDH zU+Wq&H#c{zr>Ex?aIV`K0-N=EeXLL@Yc>xsx>OP$_KCNtrLB)@5^`c<`@6c2zO zfL|;YqrSerhrsbRIiqPS8FGwWFO^EyeBb}1s+WD=-zb$z!`9kc4*%&i$bf55L>9~C za=$TVvsf%15|O7#PCGg4e<+PkcIjjs$F~8p+3XGAOp4c8M}e)BL`1|(K98jNfR9dy zh^%!;?pCjzkSL0l`O{eYRV|L=71v;9eSQ6VE|>FwVTb2iE|-gei@;fjC!Cs^df|d7 zfaiHLz^21<6?jIYY1^rys&`$0JxD&Euhr}IF`$xWZliaqI+k`hP3}Pe3WdV9s*YG| zAJh4aYQQ5^y=08}+G!?jU&b&D2a~&Kltw2X1$L~pA4KGhsxBL2T5o8legg}au)l!{ RzQh0k002ovPDHLkV1hV9A~OI0 diff --git a/dist/icons/overlay/osk_button_Y_disabled.png b/dist/icons/overlay/osk_button_Y_disabled.png index 25db07f665add24f59d5a64735be51b3eaf3d363..8d607bc1216cdf54710226e4baa4a20e5bf8b2b9 100755 GIT binary patch literal 2647 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 RrJ0{V0B(eUy)$%;`!8@1;4%OJ delta 636 zcmV-?0)ze66uSi>iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*!p3 zL_t(YiS3oYYg17a$3N%3yqKwlC=Qx-u^RV?DvO}jga9n`6o)WIR;$vX~t*pTMF)Ph^Tun|SkHQ)EQl1v8LD=@~q{zm}7s4-@>TrMZAx(#t%cMceh zW08ow1Xh6WUH+eOe1-Ow0gPp{*++?xAP9z4b*3|>s_UNT6-4A#r&(1Wf5h=+Ak#5) zw_dLgSs})lVvj?9ytK4*x>PE?2VTXoPq|#~d85%7RMmwpe)R* zU|eaokMD~WA|h*jk`E+ReQSj{j#FdrVI5YjR4TP>g~Z*o``&lzY^_$i0i3rPRP|X> zS55(hVL0o$?j`nGOQ$AObt0jNk2^a%4->}sb>UTDEGeN&AJXacQe>e}_>pA#d*^-M z-)c6Sd0?LYXVg;Fr_E;baz6lAe#UyeJ`_b!F>VzjzzNzv<7Z>cJ5{ZDp4Z)>t@;DN W?$59&C%1S20000Zk3uF3-<|Wz`5(T|>-D^z_w)Snyr0)|OFrd%Qe8zyMM+6X z9l+bVDy*N9lJYd{R|VotIoK%7`Uq>l9j1`0Fu$7$e^VHq5TT@`(e<|~=NM|h6+vyP zofp+DltiWZg!?PeXf%_+ke~=(pD=%u&~S1gWTB&^1VaP1C)}fpzJT7T?quy}-$e5- zQ6_c#V^8gJwyWzH*cYb2JmLFT0hMo;Hr5^NnND*GauVFvx^(eg&xk6#d2G6vlWb2h zLnL5R|49oK^$=4zsLCXv+bG;8x!_%VqlKhYI);(P2d~8(7F*0dv zzJrWZ(EL}9=hvhUR903B#>dCs^C?;R!Bm+Ot1btFFvwXLgvw1>hXFFuGKlmHTrr^G ztjx`0{lK=!wL11H$}R|BG1OYApHhrS*afX_2hdQ&9W;J9jjOAH*hx83=#qVk^aT}+ z=YkhR0hmSn@?%b#2MJi_a&#S*=`19p_GtCt91OCr0lqKpEq@Vz$^G`j)J{-$6G9q% zq>z_Z1U_M)xm4 z9kcv=(^4-UeT4!x8%?I@C{q3k;BGgyj)s?A83bt+fy-1d@qE=((tllCc!-2BysGX* zk`SQr%$$aBZ-~zmt4h@q%>z8UCQmML?@1$vW zIRZp4^mQaXmZJdq$#!kl1T@2^Fl3>1{SE43Dpr)eP>yd_yJ38#M0AF%>{!y!R{9rX z=fm9VA0b_bp@omw2CaYEu+{n~-K?l8_bZwv$}SJwZ65vF&6E9lY1v~`4QSh+@HGc} zV{H~D*0_ti8_jO1K-Mm_b=w2=H4k!C`?>N$U!Lafa}#85w^78xR)F;+XdgTZTPz1x zpej|#CHy->aop`WBr&|Vw}H~gp*=JDBQswZ44T?ww9LBr9W@1{GPMWjE;VyeCX~4> z_f6WIOeEyCqdZ4`B;^TDz8RmM_1KdqWU>>BNmX?KLa?j&1BaYagIj-yeKY1`fp5 zh^r+GaXiwXCu?}lf??}Qm~B|iLIMVitAsfVTy0|F@wf=ty1)WY?8puz@yw@H`c>1HkKfnx%XW!Bot{aq($Lm~tO$`kUa~07d&JF(J|CE~nDsZBoB~** z9W3=mBkp@XBzedYScdSBrm z`|={D0|9;);?guNY!@G$tz~qna0B!PK$!z7Sfv*h28eEIN1wK7n-Obt|1&4okpNxG zY<^JJkI*9Ir|XYlpH3lHE+@Y4uy4=EAy&4Q>9;hUt;N~(W;JznbBy{rd`YFLgy(-A zYLplDPm;@~OctL;aob50iZqW~e~UP9?I>Yece!V^AbHo5X+e8)&~OPVrEGXcgWU

%Qc%Jl2=K$GbPBT>3X- zu6!d>eWIT!$DG^N9UNFtx6pX%o~H#9SsmunkJd}a?#R-yxP@9<(N?zN3@u58jrD@g z$oSS(M-*7ZWyFSrK#}odYLydiPPzV}+0^>{_6lj7xAK1)*Uit*d#6|?jAc0NZW4>d zaK1Dml5UWf4=T3ev#ENY=l9`BqL%fDKS?)>>YGDgrE}#OeCbAj^|SUfuFi!W+f zQEhS!Ak`b>8Hq$n*O18Y%KtvH|5K#@ilI!*aC8fWPF4I}B4FoiTW9^p GjsF2zWAz^Z delta 563 zcmV-30?hrg5%L5fiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*y1F zL_t(YiS3m!YZO5g$N&GCpn+p=7FH|{&L)Rlx`45aow2w+_!0aJ7Gk5Fk0td&bhlJi@70ro?jM` zX8^9vTOoiq*4l28B*%3@1{m!?M4m1P0DyH7d7`RyyBq9zo%OA!T)~iv8_)&}cMP0etk{w@AK=B?535 za~M_Kty#E;o<|`fvV&1Ce>#f_5qTVilox0_8eq&T@BM(}hZ@MEx~@!M(tTed-dgIk z=bYOh`8!%D0FW%KwOs&vi)2^T*Vfu@9bf_hfFwzdopT!i9%A+x6#yQjX?i0`lJB#M zIrU}i_xtU#7j2U4sOqKiJ{?k&PDHLkV1gi7 B`_KRY diff --git a/dist/icons/overlay/osk_button_plus_dark.png b/dist/icons/overlay/osk_button_plus_dark.png index 4cadb438b791e44f51be3e15285e50a3794cda23..dbe7b0c66cf7db596d8c0038aa84831943a0911a 100755 GIT binary patch literal 2288 zcmds2`8V6?9@f**x*c1cmTPOTiYi)0Y_$_hgkp+nsXZh}?ID(8+G}l?MC_t9t&p*l z(J&fnX{#t9L}N`v7p*1zqLx%NapR}?AMSI`dp_^-dC%v4&iOp=lmDw5RO*z{DKRlI zDVUSJhbV@Mi5**!I3b$#eQ~xEg`W~2FfR!a?n;E_iPry$b@E9N6O$e|8pld?q?JXR zifD&hXwMh~8WS8JCWgUabR(is3Gm?9Fx{AVBoVMs5)+e%g4x@8C0BoC2Nw8+DGqIM zwt-M{bky;DsT+U#vfIPH$Y6D5nU`kmwH|D_Z=HY_EIQdp39$-6A>!~I2xMSjDLY>( ze^9&1>o)waB3Yd>W+HMtDWcI<{Hb_HiMBu35~pDPwEa$}dH0tWNCaQtXEZjqod%{? z8z2|AA7MbEhyDYbvgW*rwzjrX3WYM`H2(=u21S7>qoAH^3=KlgJW&W`^l7MKcx2F6 zmh8E5LxZbVpJ#@IeCTs{S3?e$YM5CkP8qV-fZH@~A>l+hbyNW)aAYhRx?pu)BW8vSw ze}8s4eji1!stmT&=icgwWDf0pUEtlF%%&k>NA%X&f?Ocu#w^kN4%Rl5|WdX9f}e!&*I~$ zKN4ZBI4>8If1@%xwP~i-cJrM6Oj$~W?l&QVvLAH%<+gFCC_Rzt_h?c)w$Us%v&6a1 zwYaz#3O`9t8__Nw4V=stRqbkLMy9vrEtRXNb@)cn*ynG&xV``<$ft2a{!6;Kd}|c@ z5Y00g=slzRP;ed)hP_dRSkK-u=JZxbp*rR*fsC|8@eZkqIe)^Us+K#$humCLRMZ6O zQAZr}2L|_CJHyAroh07>tQ~&Qxig+eAEKGF@u@w%0gSYe99~}3O~1G|P4Mi8(RtmO zPO85P1OD@>zrX)vZT3TcZZ}6or+w!6K`uN@JR(|-NGfcDq!m_1{pqEBb7=S!0sZaM zTjh|f-Dk3pk_K0@n@L*ROeqXpTvGX$G zwMYfsmFZ7j6TFk23n1s{v4Pv#m2)o(c+}q4U(Hied2+DUud#=faXgl?9F1$Us3r&r z3JSWoQSggM^MQ;zi?-=Y0}~Sy@RZ!FJvnH48^P@njXR_ND9So9zsqFfkAU*}h?1F0 z?XQ!DB-X>!vM#k=$CLIx1X2TScm6tF=m@{yII$YTMC{oV^q=cc_nuhIk(89=POv;2 zuX?TllZ(w{Wkx{W@=)9TwBd0OOem+rEx2cc>2vWwc>c=&EmyWz$zZb}2LuDp1<-#= zNOE;`73dewt3ISgdU3) zU0G3){CD1FLWY})Y5b@DDkD@t#$(IIAOz1?sW1&Y61XYkak*TihJzw_MGjXNp|q>N zLb)=Fx673tD|4f-6eWLElZ0!Z(S&p-+?@0y#NRWM=(1t8V=ObQ@uso)IL!>)TK z)z{ZoA@%}b{?zZAV9O1_;{DDyQ9+RSi2P~5sW3Z1X}kThuTTZXu`fZO=ed! zwl2RG$;w$G7)QEXqoehTv+%PP=1ozY^AJUnOePn5H0;Rl?lEUFFdSCY7{2UkK;rk! z_qFTOPY>Lhm`a8elcwCy+g%3&f)yV0w(mhpnAK>8S`%~a0F>_O-wO&lUGbM$5F7JhAV12$z~DMGy8ObFr)!;uq7kKAqsL%9 zUGJXDyvFMItli3J(I|F0Ku4IMy$O8@ii$BNQt5^?-fkJDr`W2$@wyEqX1UGNt2ixWIP- z!^=DFt&spU#M`Co)?p_2yD5ww323!yYFI`iPL6T=k6M_`H$SrZ|8qRsw%)36Tp~9U Q5003^9Ng?%AVK&42aE_Om;e9( delta 613 zcmV-r0-F8s5u^nniBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*z&% zL_t(YiS3m!Yg17a$A9P6mnI=pu;LJG37GBOcClbx#l<>gFAlnko8aUiE(%V51p|&M z7C(Ss1kIAXWYAh7>JTXvOGEN%n&a@27(?!BYjNv;yXXAx`Q7{OJNLq|j`hDJlY+kQ z&l_V_RrM-x4ww~@O;z0xku_Baub-{VXMq8;>lz2}Dn04(=IRSAZ#>T{tgo+!ai(E2HJi=W%*@Oa&+`(%d7>V2siUfo!Z5s1JFnNb_gl%tm(f}~ zCnBq=x*{TZRXyGBr;j4?N<@m4O6BW*#RvKg*?hx`4b~ap00000NkvXXu0mjfP|P4{ diff --git a/dist/icons/overlay/osk_button_plus_dark_disabled.png b/dist/icons/overlay/osk_button_plus_dark_disabled.png index b8eb8dc3db923577c9b16b56e8896444c74e3a93..a79af6501c9f1cd0e71ebb1e28156fb77f4ab51d 100755 GIT binary patch literal 2233 zcmds3`%}`}7N^s>W|;;j&3si9zIvdhJ+#0Zib|H2DW;`H38eT$3>8T$!7MGqeBg6R z)T4za9A6oF(^50Y#774W(7KAK=c}d3Bptl;)A=9nn%T2Hd(E0Pdp@68d#$W9KA!rU zOgDi*AbpINyPwvFgFx$Mbak|-Q*qKw>wZl@Vf=NqmZ}?mTYKLa=M|Iy0vWvedDi9c zGceNzO(^K|lyk8J3Kd7jgQ!$0JR*jaa0M5KhsTnMCBSi05J>kh#{GnUQt4mP3s3z6 zEqcGm)7I@c5j~Sv*u2*iQhA!I+l;nkoqsu;6j5Q{GoyFP4X(PrczwWzCkk*0Sz2u$5z1C_9+!W$AECf|H%lE zY{RE84u>n=m9^|Y|LjsFoBo^%GwhMBg%jik&{V!(?T<%&Pj?%MbDd7d&QV+{4)JqX z+YBE#WS$b==kFgs+wdU`;!Kl~qrKXtp-Ny2Cb&XzU4iq}#gVG~z6VGc%litMP9>r$ zLUV}t)}1u>i>If7`}>3c_`NxKX*%s;h;T&M4iyoWkdEV)%6#YHbDXV!<`NgHJ|STU zr;5#3)k^mQd|09Xo5u34HgybD?%(jiw=m>wRDCTpFE8({OW8Y>rL;T&(P&OqsUw@l z_;_P-+YK{uOpAOPpp6J}&G6PA>2BJRi4w-e{hN95#nmKBMD1WK6DH^vt~3R6RRtk^ zuUC;Mu~SG1UJ{D2JMgUhU}?c09l>0{t{q%Ez;rUrx!|Vj8lXZB9d(%kNSTwL=j!y8 z^c$|0$`Qz{?NB^5?A(g+-=+G>vN7ZVrNx6;+wn)>uHutbUn_Wqa=Gky^cN7(7j`tP70kEq5KS04!vy5|0QO%QLHmY_0f3XXQUw)k{s zP*4Fq;6tn<2cWmvNpQ%x|9$m)Jz7}y zv$NB{+0aV+Lx-APNdtRz&ElztOmkkNGc(w1_6W=Bj)Cd=t5f9 zxa=ysun~!Z8Kq?yTBN`HHL=EA(If5sZj=0ICVc{EV@An4=%r@lx|wt^s_$5Ml&j9t z^`&=Kt?C4HX11QA+I!GMZzQCCcZ&k*T?j{vMmD9Uhb6xV=KfSfMBqmfDombnEZ4`l z7FId~B&?ojzDT{RK^}0xEKc1)Tqu_0uw?cVnkD}vx0`GWxJ&rO<(^~4drzG@WuEIl zmUT`jE-gW|E<-E4R@Is-n$YC=yO2nIwd0j$m zt(L~P$_AK#rswh9wmxU7e4B%>*r@zQOE4FMDcSSkU{vu)WYdmgl+jEKG=s~!=UI<0 zDm|JoEnGQxlNjw)<>x#F+(J^f8^;h-u@c@?xXEN->c_DQf`q_V!A$fq3~Oh;5mK?V z0Pa%2&~12on1PS4uVN$T@q!8-GnA&JJ>=0|EQrH-3LxjNh30=QUJCU_KMy83NsgMArZ zvVjFl=FOwtnI%2MRSqVRba4%w5)a7?i7KBMoqi#p`M>hXG7+EWg;>ac}TarQzvsU_u(&+h)tm{@vYeKX2Xlw1`{IAaPt4`Z8!P*q< zM3SjhR*5whb|Y&W!)?TgE{$wU;deB|EDOoVr|_=q{ZsQ- delta 582 zcmV-M0=fOU5rqXIiBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04_De*ywY zL_t(YiS3oYYg17a$3OSHMhgKSQE@2L#jf27>ez19A$xJjl%+iKg9lDEh)Ww%68r-) z1)Rmw(ajWe6bHqCs7nngA!CR=v#$p{_kDjalgacJmXyoo zTZu&CC2)7q4uO*>iqc^ip3apFzu+}+?;L^=O%d4)g5b9+AOORk$R#)fei~ysj{1FT z?bEm}WO&KDu7ELSE0@b%x7KdNWP(bivg(wm>LcPWc@dU9&)acIfCm>8e~j366_yyh zgGp3X*T!9ldG%5$2D9iQ^sKcnTtx#=tyT|!(2+R`~Uy|07*qoM6N<$f-2Pu&j0`b diff --git a/dist/icons/overlay/osk_button_plus_disabled.png b/dist/icons/overlay/osk_button_plus_disabled.png index c23e9d95d2a1abc572252e8d6ff8b0ff94e19151..52ace8ecae694c60f5fcee70509dc0e046ccd416 100755 GIT binary patch literal 2254 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 diff --git a/dist/icons/overlay/osk_button_shift_lock_off.png b/dist/icons/overlay/osk_button_shift_lock_off.png index 585500b3a32a77789c701b1f9ffa59c1baed3bc2..b506f456fcc232f6f43213957b8990538791bea7 100755 GIT binary patch delta 875 zcmbQqw1Qo+Gr-TCmrII^fq{Y7)59eQNIL-W8xA%gd1U(n?}>^&^~|cCE{-7;bKc&x z?~qBAIrj0n`OZgroXdL!92GfZv<&|p{Ib*Oh<9q?jX8&Rhvy|qu67Q&kgekTDly^e zhQ^SIOHg9ykvi8)kx|((N{g>a~(^9*i)m>V;c#_=S-M_;p*A={M^9to$1U@`<#%q8bNcbGj{VxUhO*tZ*H^FFu6sIe`tLK$e4BM& z#!R{9#8LmI)Ipb9qbo_#c(=;;<;P5(Y|Tk~HWdi0zrR}%%a|HzSHD`qe)5+a5$tBS zC)^C0_uTyd#>zE{ze7ZhI;qtzE%dKDkfXe7zkt&XnVeH0gqy}SSRao+#`GeR%cDz=zYyd~>C5+@w4F@&?h9vo&Uj@(&N zuju%t{q)(ise2eai!x*D_a2xt?cciJ)j_iV*i`S|KfZlfOK@!B)CoYH5A2VoUz}yP><8R90Th__OKi%RMjN zRMkH4N|5dn z7wqc)eRyA7>}_PN`%=>LxXG8wm`l0S*PVXT-F)|*I>>)-k{Dqr51DpE<`7`N@IM&# U$~Eg+*kq7GPgg&ebxsLQ0Er}(82|tP delta 215 zcmZ3%K9fnYGr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM}bd!!%D9#}JF&w|yH0 zn;ZmO?^l^Dury5&z18Ak9^&96%qJVe7}dyVJ7dypt1|+{+uhXoc8DDCzW;7EzqGVM zcApbRrP?K}ISe9J(}RMm?$2%%aC+x5@4!QM-oULlA{%{{%&la*VLfrRgTe~DWM4fP_IoH diff --git a/dist/icons/overlay/osk_button_shift_lock_on.png b/dist/icons/overlay/osk_button_shift_lock_on.png index 09077ab015f84fdee0e2303dcfeb2eb1e7b8480a..eaa4e98ed0ad17089a6c53edbcfc6c9f57a15f17 100755 GIT binary patch delta 833 zcmbQl^p8!kGr-TCmrII^fq{Y7)59eQNIL-W8xA%gd1U(n?}>^&^-RA#T^vIy=DfXm zK3gVL=J?0&-*0N2Y?pLzjJUb&!D~u(GmY#wmBF3Z^g4VV$!swYc-ezkmMH zTQ)bu%#ZlmT|d2CKPQ~g z`u-pBH-DeBU)yw~FsZI~$AUM(7v`S6cW}i=#oy+Y4epDcMSl8oq`)zoOQZCW?t>E& zi~6QkJ^1=?cG(=J%8vyh`<}jA|E)Yr+53#(=htg3n7p2fJf3ZHpk(DvmRt*_qExl4 znDj5R=j^?7e$&^2&+Z2l#3cVeVO%D0r~ZG^W7a7TQYPQ*6`x=^P5XcDrq3&naVu2p zIrv6>mOew8)S0>kysRdxcv=74O8BOKR(wKCw!!bL$E+?-mOk6`bJs_vtfF-X-<*#s z(7rRf&uS;1Pp{?9`KiU*J}Ni7$YZH7_!jZ0cG2#OHH;3rJ9%=(OGu@)D^m%D?%KHQ!wQ3gb-?I<5zL9w)R9x>cn~UMZ)tf7Ja@p*%XZ)Bv z?QP|wBm9R|-&(M?CDqw_?_*i>_VA1Q={M^Vzdu=+%gS)%&{Li7vZ_C8&L8v9OX&ov zHs8K3E1r>|@XPWyGF5gR<_-UBdrFi$wwIs#xqlw(pL*R_a%}SbF>`fIrwhfUewn?r zPT>7jq0@&~|9!hQnYZt!`>A)wA75Acu`2D$i!b(yyQF>Jt%Ic~ jc+w(`@kPA;ySm87lk-kb*|rpzD;PXo{an^LB{Ts5+8meD delta 208 zcmeyzHi=2GGr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM}bdL%*ksV~9oX+X;$% zhXMp#?yqqdiSNzv74|zYa|g>y+XpNiSx$yGs&o{8&f{Zq&8XwQurWXV)20n6oEg`q z{tjAp^j>ZBT+!+)JU6P;+FbT46ZlY*EHU{&ay_W;FMI#qdyHV zmI*$W^xuvkwAP3z>u_u(-EpZ>gc`{k7Mo5a>t-Pgg&e IbxsLQ0KQ^Tod5s; diff --git a/dist/qt_themes/default/style.qss b/dist/qt_themes/default/style.qss index 3bc92b69d..cee219374 100755 --- a/dist/qt_themes/default/style.qss +++ b/dist/qt_themes/default/style.qss @@ -515,45 +515,35 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_B.png); + image: url(:/overlay/osk_button_B.png); + image-position: right; qproperty-icon: url(:/overlay/osk_button_backspace.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_Y.png); + image: url(:/overlay/osk_button_Y.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_plus.png); + image: url(:/overlay/osk_button_plus.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift_on.png); qproperty-iconSize: 36px; } @@ -645,16 +635,16 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - background-image: url(:/overlay/osk_button_plus_disabled.png); + image: url(:/overlay/osk_button_plus_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - background-image: url(:/overlay/osk_button_B_disabled.png); + image: url(:/overlay/osk_button_B_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - background-image: url(:/overlay/osk_button_Y_disabled.png); + image: url(:/overlay/osk_button_Y_disabled.png); } diff --git a/dist/qt_themes/qdarkstyle/style.qss b/dist/qt_themes/qdarkstyle/style.qss index 8ce6d75f7..3d0ccbb9e 100755 --- a/dist/qt_themes/qdarkstyle/style.qss +++ b/dist/qt_themes/qdarkstyle/style.qss @@ -1805,46 +1805,36 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_B_dark.png); + image: url(:/overlay/osk_button_B_dark.png); + image-position: right; qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_Y_dark.png); + image: url(:/overlay/osk_button_Y_dark.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_plus_dark.png); + image: url(:/overlay/osk_button_plus_dark.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift_dark.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); qproperty-iconSize: 36px; } @@ -1936,18 +1926,18 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - background-image: url(:/overlay/osk_button_plus_dark_disabled.png); + image: url(:/overlay/osk_button_plus_dark_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - background-image: url(:/overlay/osk_button_B_dark_disabled.png); + image: url(:/overlay/osk_button_B_dark_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - background-image: url(:/overlay/osk_button_Y_dark_disabled.png); + image: url(:/overlay/osk_button_Y_dark_disabled.png); } QDialog#QtSoftwareKeyboardDialog QFrame, diff --git a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss index 64e1ecbcc..51bec2fd7 100755 --- a/dist/qt_themes/qdarkstyle_midnight_blue/style.qss +++ b/dist/qt_themes/qdarkstyle_midnight_blue/style.qss @@ -2740,46 +2740,36 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:pressed { QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_B_dark.png); + image: url(:/overlay/osk_button_B_dark.png); + image-position: right; qproperty-icon: url(:/overlay/osk_button_backspace_dark.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift { - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_Y_dark.png); + image: url(:/overlay/osk_button_Y_dark.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num { color: rgba(44, 44, 44, 1); - background-position: right top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_plus_dark.png); + image: url(:/overlay/osk_button_plus_dark.png); + image-position: right; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift_dark.png); qproperty-iconSize: 36px; } QDialog#QtSoftwareKeyboardDialog QPushButton#button_shift_shift { - background-position: left top; - background-repeat: no-repeat; - background-origin: content; - background-image: url(:/overlay/osk_button_shift_lock_off.png); + image: url(:/overlay/osk_button_shift_lock_off.png); + image-position: left; qproperty-icon: url(:/overlay/osk_button_shift_on_dark.png); qproperty-iconSize: 36px; } @@ -2871,16 +2861,16 @@ QDialog#QtSoftwareKeyboardDialog QPushButton#button_return:disabled { QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_ok_num:disabled { - background-image: url(:/overlay/osk_button_plus_dark_disabled.png); + image: url(:/overlay/osk_button_plus_dark_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_shift:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_backspace_num:disabled { - background-image: url(:/overlay/osk_button_B_dark_disabled.png); + image: url(:/overlay/osk_button_B_dark_disabled.png); } QDialog#QtSoftwareKeyboardDialog QPushButton#button_space:disabled, QDialog#QtSoftwareKeyboardDialog QPushButton#button_space_shift:disabled { - background-image: url(:/overlay/osk_button_Y_dark_disabled.png); + image: url(:/overlay/osk_button_Y_dark_disabled.png); } diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 04cf3f5b9..c28abc24c 100755 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -393,6 +393,8 @@ add_library(core STATIC hle/service/hid/xcd.cpp hle/service/hid/xcd.h hle/service/hid/errors.h + hle/service/hid/controllers/console_sixaxis.cpp + hle/service/hid/controllers/console_sixaxis.h hle/service/hid/controllers/controller_base.cpp hle/service/hid/controllers/controller_base.h hle/service/hid/controllers/debug_pad.cpp diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h index 88ebc6497..0c5d2b3b0 100755 --- a/src/core/frontend/input.h +++ b/src/core/frontend/input.h @@ -11,6 +11,7 @@ #include #include "common/logging/log.h" #include "common/param_package.h" +#include "common/quaternion.h" #include "common/vector_math.h" namespace Input { @@ -143,9 +144,10 @@ using VibrationDevice = InputDevice; /** * A motion status is an object that returns a tuple of accelerometer state vector, - * gyroscope state vector, rotation state vector and orientation state matrix. + * gyroscope state vector, rotation state vector, orientation state matrix and quaterion state + * vector. * - * For both vectors: + * For both 3D vectors: * x+ is the same direction as RIGHT on D-pad. * y+ is normal to the touch screen, pointing outward. * z+ is the same direction as UP on D-pad. @@ -164,9 +166,13 @@ using VibrationDevice = InputDevice; * x vector * y vector * z vector + * + * For quaternion state vector + * xyz vector + * w float */ using MotionStatus = std::tuple, Common::Vec3, Common::Vec3, - std::array>; + std::array, Common::Quaternion>; /** * A motion device is an input device that returns a motion status object diff --git a/src/core/hle/kernel/transfer_memory.cpp b/src/core/hle/kernel/transfer_memory.cpp index cad063e4d..1dd65468d 100755 --- a/src/core/hle/kernel/transfer_memory.cpp +++ b/src/core/hle/kernel/transfer_memory.cpp @@ -36,6 +36,10 @@ std::shared_ptr TransferMemory::Create(KernelCore& kernel, return transfer_memory; } +u8* TransferMemory::GetPointer() { + return memory.GetPointer(base_address); +} + const u8* TransferMemory::GetPointer() const { return memory.GetPointer(base_address); } diff --git a/src/core/hle/kernel/transfer_memory.h b/src/core/hle/kernel/transfer_memory.h index 521951424..59328c0fe 100755 --- a/src/core/hle/kernel/transfer_memory.h +++ b/src/core/hle/kernel/transfer_memory.h @@ -56,6 +56,9 @@ public: return HANDLE_TYPE; } + /// Gets a pointer to the backing block of this instance. + u8* GetPointer(); + /// Gets a pointer to the backing block of this instance. const u8* GetPointer() const; diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.cpp b/src/core/hle/service/hid/controllers/console_sixaxis.cpp new file mode 100755 index 000000000..801e14b79 --- /dev/null +++ b/src/core/hle/service/hid/controllers/console_sixaxis.cpp @@ -0,0 +1,90 @@ +// Copyright 2021 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/settings.h" +#include "core/core_timing.h" +#include "core/hle/service/hid/controllers/console_sixaxis.h" + +namespace Service::HID { +constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C200; + +Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::System& system) + : ControllerBase(system) {} +Controller_ConsoleSixAxis::~Controller_ConsoleSixAxis() = default; + +void Controller_ConsoleSixAxis::OnInit() {} + +void Controller_ConsoleSixAxis::OnRelease() {} + +void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, + std::size_t size) { + seven_six_axis.header.timestamp = core_timing.GetCPUTicks(); + seven_six_axis.header.total_entry_count = 17; + + if (!IsControllerActivated() || !is_transfer_memory_set) { + seven_six_axis.header.entry_count = 0; + seven_six_axis.header.last_entry_index = 0; + return; + } + seven_six_axis.header.entry_count = 16; + + const auto& last_entry = + seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index]; + seven_six_axis.header.last_entry_index = (seven_six_axis.header.last_entry_index + 1) % 17; + auto& cur_entry = seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index]; + + cur_entry.sampling_number = last_entry.sampling_number + 1; + cur_entry.sampling_number2 = cur_entry.sampling_number; + + // Try to read sixaxis sensor states + MotionDevice motion_device{}; + const auto& device = motions[0]; + if (device) { + std::tie(motion_device.accel, motion_device.gyro, motion_device.rotation, + motion_device.orientation, motion_device.quaternion) = device->GetStatus(); + console_six_axis.is_seven_six_axis_sensor_at_rest = motion_device.gyro.Length2() < 0.0001f; + } + + cur_entry.accel = motion_device.accel; + // Zero gyro values as they just mess up with the camera + // Note: Probably a correct sensivity setting must be set + cur_entry.gyro = {}; + cur_entry.quaternion = { + { + motion_device.quaternion.xyz.y, + motion_device.quaternion.xyz.x, + -motion_device.quaternion.w, + }, + -motion_device.quaternion.xyz.z, + }; + + console_six_axis.sampling_number++; + // TODO(German77): Find the purpose of those values + console_six_axis.verticalization_error = 0.0f; + console_six_axis.gyro_bias = {0.0f, 0.0f, 0.0f}; + + // Update console six axis shared memory + std::memcpy(data + SHARED_MEMORY_OFFSET, &console_six_axis, sizeof(console_six_axis)); + // Update seven six axis transfer memory + std::memcpy(transfer_memory, &seven_six_axis, sizeof(seven_six_axis)); +} + +void Controller_ConsoleSixAxis::OnLoadInputDevices() { + const auto player = Settings::values.players.GetValue()[0]; + std::transform(player.motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN, + player.motions.begin() + Settings::NativeMotion::MOTION_HID_END, motions.begin(), + Input::CreateDevice); +} + +void Controller_ConsoleSixAxis::SetTransferMemoryPointer(u8* t_mem_1) { + is_transfer_memory_set = true; + transfer_memory = t_mem_1; +}; + +void Controller_ConsoleSixAxis::ResetTimestamp() { + auto& cur_entry = seven_six_axis.sevensixaxis_states[seven_six_axis.header.last_entry_index]; + cur_entry.sampling_number = 0; + cur_entry.sampling_number2 = 0; +} +} // namespace Service::HID diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.h b/src/core/hle/service/hid/controllers/console_sixaxis.h new file mode 100755 index 000000000..ac0501683 --- /dev/null +++ b/src/core/hle/service/hid/controllers/console_sixaxis.h @@ -0,0 +1,80 @@ +// Copyright 2021 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include "common/bit_field.h" +#include "common/common_types.h" +#include "common/quaternion.h" +#include "core/frontend/input.h" +#include "core/hle/service/hid/controllers/controller_base.h" + +namespace Service::HID { +class Controller_ConsoleSixAxis final : public ControllerBase { +public: + explicit Controller_ConsoleSixAxis(Core::System& system); + ~Controller_ConsoleSixAxis() override; + + // Called when the controller is initialized + void OnInit() override; + + // When the controller is released + void OnRelease() override; + + // When the controller is requesting an update for the shared memory + void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, size_t size) override; + + // Called when input devices should be loaded + void OnLoadInputDevices() override; + + // Called on InitializeSevenSixAxisSensor + void SetTransferMemoryPointer(u8* t_mem_1); + + // Called on ResetSevenSixAxisSensorTimestamp + void ResetTimestamp(); + +private: + struct SevenSixAxisState { + INSERT_PADDING_WORDS(4); // unused + s64_le sampling_number{}; + s64_le sampling_number2{}; + u64 unknown{}; + Common::Vec3f accel{}; + Common::Vec3f gyro{}; + Common::Quaternion quaternion{}; + }; + static_assert(sizeof(SevenSixAxisState) == 0x50, "SevenSixAxisState is an invalid size"); + + struct SevenSixAxisMemory { + CommonHeader header{}; + std::array sevensixaxis_states{}; + }; + static_assert(sizeof(SevenSixAxisMemory) == 0xA70, "SevenSixAxisMemory is an invalid size"); + + struct ConsoleSharedMemory { + u64_le sampling_number{}; + bool is_seven_six_axis_sensor_at_rest{}; + f32 verticalization_error{}; + Common::Vec3f gyro_bias{}; + }; + static_assert(sizeof(ConsoleSharedMemory) == 0x20, "ConsoleSharedMemory is an invalid size"); + + struct MotionDevice { + Common::Vec3f accel; + Common::Vec3f gyro; + Common::Vec3f rotation; + std::array orientation; + Common::Quaternion quaternion; + }; + + using MotionArray = + std::array, Settings::NativeMotion::NUM_MOTIONS_HID>; + u8* transfer_memory; + MotionArray motions; + bool is_transfer_memory_set = false; + ConsoleSharedMemory console_six_axis{}; + SevenSixAxisMemory seven_six_axis{}; +}; +} // namespace Service::HID diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 113a41254..249c300f6 100755 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -654,8 +654,8 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing const auto& device = motions[i][e]; if (device) { std::tie(motion_devices[e].accel, motion_devices[e].gyro, - motion_devices[e].rotation, motion_devices[e].orientation) = - device->GetStatus(); + motion_devices[e].rotation, motion_devices[e].orientation, + motion_devices[e].quaternion) = device->GetStatus(); sixaxis_at_rest = sixaxis_at_rest && motion_devices[e].gyro.Length2() < 0.0001f; } } diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h index c3b07bd41..085f42c48 100755 --- a/src/core/hle/service/hid/controllers/npad.h +++ b/src/core/hle/service/hid/controllers/npad.h @@ -8,6 +8,7 @@ #include #include "common/bit_field.h" #include "common/common_types.h" +#include "common/quaternion.h" #include "common/settings.h" #include "core/frontend/input.h" #include "core/hle/kernel/object.h" @@ -467,6 +468,7 @@ private: Common::Vec3f gyro; Common::Vec3f rotation; std::array orientation; + Common::Quaternion quaternion; }; struct NfcXcdHandle { diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index 2aa1942cb..9c4bf6d16 100755 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -26,6 +26,7 @@ #include "core/hle/service/hid/xcd.h" #include "core/hle/service/service.h" +#include "core/hle/service/hid/controllers/console_sixaxis.h" #include "core/hle/service/hid/controllers/controller_base.h" #include "core/hle/service/hid/controllers/debug_pad.h" #include "core/hle/service/hid/controllers/gesture.h" @@ -67,7 +68,7 @@ IAppletResource::IAppletResource(Core::System& system_) MakeController(HidController::UniquePad); MakeController(HidController::NPad); MakeController(HidController::Gesture); - MakeController(HidController::ConsoleSixAxisSensor); + MakeController(HidController::ConsoleSixAxisSensor); // Homebrew doesn't try to activate some controllers, so we activate them by default GetController(HidController::NPad).ActivateController(); @@ -78,8 +79,6 @@ IAppletResource::IAppletResource(Core::System& system_) GetController(HidController::CaptureButton).SetCommonHeaderOffset(0x5000); GetController(HidController::InputDetector).SetCommonHeaderOffset(0x5200); GetController(HidController::UniquePad).SetCommonHeaderOffset(0x5A00); - GetController(HidController::ConsoleSixAxisSensor) - .SetCommonHeaderOffset(0x3C200); // Register update callbacks pad_update_event = Core::Timing::CreateEvent( @@ -1404,8 +1403,9 @@ void Hid::ActivateConsoleSixAxisSensor(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const auto applet_resource_user_id{rp.Pop()}; - LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", - applet_resource_user_id); + applet_resource->ActivateController(HidController::ConsoleSixAxisSensor); + + LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); @@ -1455,8 +1455,9 @@ void Hid::ActivateSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const auto applet_resource_user_id{rp.Pop()}; - LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", - applet_resource_user_id); + applet_resource->ActivateController(HidController::ConsoleSixAxisSensor); + + LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); @@ -1518,8 +1519,15 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) { ASSERT_MSG(t_mem_1->GetSize() == 0x1000, "t_mem_1 has incorrect size"); ASSERT_MSG(t_mem_2->GetSize() == 0x7F000, "t_mem_2 has incorrect size"); + // Activate console six axis controller + applet_resource->GetController(HidController::ConsoleSixAxisSensor) + .ActivateController(); + + applet_resource->GetController(HidController::ConsoleSixAxisSensor) + .SetTransferMemoryPointer(t_mem_1->GetPointer()); + LOG_WARNING(Service_HID, - "(STUBBED) called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " + "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " "applet_resource_user_id={}", t_mem_1_handle, t_mem_2_handle, applet_resource_user_id); @@ -1542,8 +1550,10 @@ void Hid::ResetSevenSixAxisSensorTimestamp(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const auto applet_resource_user_id{rp.Pop()}; - LOG_WARNING(Service_HID, "(STUBBED) called, applet_resource_user_id={}", - applet_resource_user_id); + applet_resource->GetController(HidController::ConsoleSixAxisSensor) + .ResetTimestamp(); + + LOG_WARNING(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); diff --git a/src/input_common/gcadapter/gc_adapter.cpp b/src/input_common/gcadapter/gc_adapter.cpp index ec3167bea..4c0ba8081 100755 --- a/src/input_common/gcadapter/gc_adapter.cpp +++ b/src/input_common/gcadapter/gc_adapter.cpp @@ -155,12 +155,19 @@ void Adapter::UpdateStateAxes(std::size_t port, const AdapterPayload& adapter_pa for (const PadAxes axis : axes) { const auto index = static_cast(axis); const u8 axis_value = adapter_payload[offset + 3 + index]; - if (pads[port].axis_origin[index] == 255) { + if (pads[port].reset_origin_counter <= 3) { + if (pads[port].axis_origin[index] != axis_value) { + pads[port].reset_origin_counter = 0; + } pads[port].axis_origin[index] = axis_value; } pads[port].axis_values[index] = static_cast(axis_value - pads[port].axis_origin[index]); } + + if (pads[port].reset_origin_counter <= 3) { + pads[port].reset_origin_counter++; + } } void Adapter::UpdateYuzuSettings(std::size_t port) { @@ -375,7 +382,7 @@ void Adapter::ResetDevice(std::size_t port) { pads[port].buttons = 0; pads[port].last_button = PadButton::Undefined; pads[port].axis_values.fill(0); - pads[port].axis_origin.fill(255); + pads[port].reset_origin_counter = 0; } void Adapter::Reset() { diff --git a/src/input_common/gcadapter/gc_adapter.h b/src/input_common/gcadapter/gc_adapter.h index 7a6c545bd..e5de5e94f 100755 --- a/src/input_common/gcadapter/gc_adapter.h +++ b/src/input_common/gcadapter/gc_adapter.h @@ -70,6 +70,7 @@ struct GCController { PadButton last_button{}; std::array axis_values{}; std::array axis_origin{}; + u8 reset_origin_counter{}; }; class Adapter { diff --git a/src/input_common/motion_input.cpp b/src/input_common/motion_input.cpp index 6a65f175e..1c9d561c0 100755 --- a/src/input_common/motion_input.cpp +++ b/src/input_common/motion_input.cpp @@ -195,7 +195,8 @@ Input::MotionStatus MotionInput::GetMotion() const { const Common::Vec3f accelerometer = GetAcceleration(); const Common::Vec3f rotation = GetRotations(); const std::array orientation = GetOrientation(); - return {accelerometer, gyroscope, rotation, orientation}; + const Common::Quaternion quaternion = GetQuaternion(); + return {accelerometer, gyroscope, rotation, orientation, quaternion}; } Input::MotionStatus MotionInput::GetRandomMotion(int accel_magnitude, int gyro_magnitude) const { @@ -218,7 +219,12 @@ Input::MotionStatus MotionInput::GetRandomMotion(int accel_magnitude, int gyro_m Common::Vec3f{0.0f, 1.0f, 0.0f}, Common::Vec3f{0.0f, 0.0f, 1.0f}, }; - return {accelerometer * accel_magnitude, gyroscope * gyro_magnitude, rotation, orientation}; + constexpr Common::Quaternion quaternion{ + {0.0f, 0.0f, 0.0f}, + 1.0f, + }; + return {accelerometer * accel_magnitude, gyroscope * gyro_magnitude, rotation, orientation, + quaternion}; } void MotionInput::ResetOrientation() { diff --git a/src/yuzu/applets/software_keyboard.cpp b/src/yuzu/applets/software_keyboard.cpp index fd3368479..653486493 100755 --- a/src/yuzu/applets/software_keyboard.cpp +++ b/src/yuzu/applets/software_keyboard.cpp @@ -1027,10 +1027,8 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { ui->bottomOSK->setCurrentIndex(static_cast(bottom_osk_index)); ui->button_shift_shift->setStyleSheet( - QStringLiteral("background-image: url(:/overlay/osk_button_shift_lock_off.png);" - "\nbackground-position: left top;" - "\nbackground-repeat: no-repeat;" - "\nbackground-origin: content;")); + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "\nimage-position: left;")); ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); @@ -1040,10 +1038,8 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { caps_lock_enabled = false; ui->button_shift_shift->setStyleSheet( - QStringLiteral("background-image: url(:/overlay/osk_button_shift_lock_off.png);" - "\nbackground-position: left top;" - "\nbackground-repeat: no-repeat;" - "\nbackground-origin: content;")); + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_off.png);" + "\nimage-position: left;")); ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize()); @@ -1056,10 +1052,8 @@ void QtSoftwareKeyboardDialog::ChangeBottomOSKIndex() { caps_lock_enabled = true; ui->button_shift_shift->setStyleSheet( - QStringLiteral("background-image: url(:/overlay/osk_button_shift_lock_on.png);" - "\nbackground-position: left top;" - "\nbackground-repeat: no-repeat;" - "\nbackground-origin: content;")); + QStringLiteral("image: url(:/overlay/osk_button_shift_lock_on.png);" + "\nimage-position: left;")); ui->button_shift_shift->setIconSize(ui->button_shift->iconSize()); ui->button_backspace_shift->setIconSize(ui->button_backspace->iconSize());