From d76f8bc4badc512cf996add49d0b3c562a4ea10e Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 19:00:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(watchdog):=20=E6=A1=86=E6=9E=B6App=E5=89=8D?= =?UTF-8?q?=E5=8F=B0=E6=97=B6=E9=9F=B3=E9=87=8F/=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E9=94=AE=E8=AE=A9=E4=BD=8DSDK=20(agent-231)=20=E2=80=94=20?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E7=BB=8F/proc/pid/exe=E5=8F=8D?= =?UTF-8?q?=E6=9F=A5app.json=20framework=3D1=E5=88=A4=E5=AE=9A,=E9=9F=B3?= =?UTF-8?q?=E9=87=8F/=E5=AA=92=E4=BD=93=E5=88=86=E6=94=AF=20!g=5Ffw=5Fapp?= =?UTF-8?q?=20=E9=97=A8=E6=8E=A7;=20=E8=A3=B8App/=E6=97=A0SDK/=E4=B8=8D?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E4=BB=8D=E5=85=9C=E5=BA=95(=E4=B8=8D?= =?UTF-8?q?=E9=80=A0=E6=88=90=E5=8A=9F=E8=83=BD=E7=9C=9F=E7=A9=BA);=20?= =?UTF-8?q?=E9=A1=BA=E6=89=8B=E4=BF=AEwd=5Fjson=5Fstr=E4=B8=A4=E8=BE=B9?= =?UTF-8?q?=E7=95=8Cbug+=E6=AD=BB=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meow_watchdog→68850d9d; 宿主14项全过; 待跟进: fw_content.conf的watchdog md5打包时更新 --- patch_v2/meow_watchdog/meow_watchdog | Bin 80524 -> 83468 bytes patch_v2/meow_watchdog/meow_watchdog.c | 136 +++++++++++++++++++------ patch_v2/meow_watchdog/test_wd_fw | Bin 0 -> 71640 bytes patch_v2/meow_watchdog/test_wd_fw.c | 101 ++++++++++++++++++ 4 files changed, 207 insertions(+), 30 deletions(-) create mode 100755 patch_v2/meow_watchdog/test_wd_fw create mode 100644 patch_v2/meow_watchdog/test_wd_fw.c diff --git a/patch_v2/meow_watchdog/meow_watchdog b/patch_v2/meow_watchdog/meow_watchdog index abba8898e1f23c12203bc29b10966efb5b8b315e..49f5d8019d6fb033ecc86bb2cca72c079406c686 100755 GIT binary patch delta 19713 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Ð{lk9KO~V*9<}qv$5muZvju}+9Wg-SnafWJgVm;H`Sp`)sW4%H6KG`7D z5==K0@tLw4T924)j19BtI{WJ)&k{}j7!Z#LMO4Qrj-w*(!bA_fs*Yr>KB7e(U|aeaLw z+m;qJz7LfLtDvG*@HOur_ST-^2 zffUKrkju$3G{eQ@G7H#-U?q?Z>mSC!V9ZOAlfu&mR7d>g?l#uu&?Xk)0PCEm? z(Dgx9*oYzhb7q$crS}DW&h{UoUOWctVS`xjnVPV?@0GBT84IfWe$igtC%*8c^KHKr z)|;&N)j?)qD3z37qR%Dgbk?bnm3_B`f2a|TMvBv@p>07#=;DQ&?o6!f3!}A|f`AVF zed7F0>62?P<9}Vx;*G4Rooq>AMIIyOIoO9S)K}DQMW{y-qh>>WS%H;cjU2Re-tawS zZ{T`ry3@A}f?sz!t6dXIR{OO|^XML!m-e>FwwUC9StPgYuUP5)ok8>0S4A_M(@F`^mw!;xlqR7ZwUAC<#F%pcK=ebqIzR_L^5 z^)tp;lo=z-BeQaZo*dNUmH#VwiqEps#l?)A>qC9+myIkAj`=Tv8sWG(%{P=Cv84Lb zSg6mwtAY#%2BXdTeojs(+IlJSmg^A#X*Y@|@z#MU_#El1rsyr|YQd7UWljT!`DTwg%u#k$rM@K>dVjHuCW=^G`9g)R7ax@tANJ9-6 znO~0lVS40Xgo9Jjp6sN@XP3j{b=}^hLn#l&LQz1*4=|>%3u)vbEmz;dDF=39Q8wxk zh#68UMG80K(R=qLmT>#$j7OQV6qD$&Lb;?p}D-gu)KoGkGLF^U;v1<^-?m-Z{2tn*71hK0icN{{o2h)f_3X=nU z&M?t>7)%Tv3(s|EW*BW}3i1;@KBeHptGr;>g*$T=j&$cZ5c|A;H7&=&!kwGfviNU@ z8r6XiVp8B?J)CfP$ct;e6$rPfci!Tx9O@zU?lHYn`LGUJ^+wqIECV|xO(%xEE!_~b zuQDH-7Hi0g}vNQ4#-1_WP5FcJelAFDox zT?A%S3Sumt9EWKl6ns<2&Kx%l)h*y+B;9o*E4tYijZuuINs4Onuq3@eB6ANTyRfh{ z33uo{N??wg2kNMb;&x=k>2>nhJlR8sX)Z$9o5CT~p*Wb{hfCYCha-_nY$_OKq=;ph z4@;vM)saOU{uWE4k0pV4_K6e`V@FV74thG@^G)Q4#g$@bZ(zAZu`@lS0(z(Q+$dIo zI7h?nG`Q3hLrWU1^J5^51bu!V2dSkPD2yqR?HJhIb6#R>PSaDEjh~%YjF{IcGX@i; z^i452DmA2_fiy#SYY%!hREoTx0rA4P2?-0gLH}8HHic8{BTkI7@!mM`*|_>#xqir^ zF-sdbYGA1D)l@`WG_Gmm1@VEAWKLxw5w31LEjqGo9E9G}JlH{UwmOshhQ4RY$m zl3UY#*kTEAlZurO$Hu|rfWzd5VWxVn!*ayP4A?|?GLW7!j$K!m3iEd-yZnA>xb_$q zNiUt2+c(4%t7cD8zd`>4{`K>E%`GtVFhr%}*#EuXP%!4_b8}Kystn@7r|)k+IzmZc z6LJ3Lz>H0V-W0B!v|??gRKbS|aEcWn$!}O32BW7!k7(=?NBNgAb|`<2T;Zdv^njv1 zC)pQ1{b;?BC7}n;1Kv>3c6v*F5~dIG>Qv=;oEtjV7M;{2EyzfSF1wvefqJ}%qcws4 zPea%THlj{7e0pAe%jw!h^=+rO_iwG#K_nmQBKeQR&@eHz5QMaON$dB25;JKxjJ+Ky zPh~$6FW)vX^WWAX@cS0IVS_H|OTwWrWmkySBI4?8$%)$bB;!dzO;<@l;m*zXg-#nG zFu$~<=$wh&XUwOGm|u&~C#RFu}D5G+}Rue9T_Xsh?(@v)ew+fU!wFT9L6@nvqVGuh-;E!Yt-fwpENj8kt&4kpO0 zd5xGl-kPru27cWS=}s5-&VF$-4xwxsU&x=@Aufz}^L2e9HqXf)*(uWVviX*vD9@Yk zq#iX&Nnm#cnXsoM~90FrC z?QN~%iyzq%mz{BjK}}6z+Fo*FpRg4qQ?t1R?t}$r<^??N6`&I^s<>vUO3BX5K!NPwEr3x99Tf)`&y5TM3-MJ(G~;LMPwYCo&7Iwq<9w z!4<@!<<@o!Hc(t^m?@q$ONpb%{6ZU*tS!u?CJz-(x0a%S*?yN4b8nxjzK))g_gobc z>37UjJ`&I0F~YpSM02BK-Ptu_%N><*Kh@@MF|>DdF7=+?NdnL4^ZK+VjmE1|QjD*+ zaFvKQ57ppnYec!Xgdb}a9o|g-_8M^kplppuD9Yx2YeaF;Ql2$T>?yKYZ&=Gre~Ao- z8fk;w3td!j7eaH}TJc3uq1lGuf@6*biQMAabb58=dHJ6sEfAZ_ZDO(RDDLmTO#*I; z#EDOfoqX+DVV*d%L<-%*xx+J@V`K&C9W_;leLPQrfhNIK(l$8ZDQbQWJduPPc5IK5 z!aS*{J6`T-!OS`)+Q{180eBHyPPC1RHn8?TR21Jec|_@?YLddyN#%u6x0np;!N6*d z5zIuBSOg(fB;v>!Yiec`D7YHKELs+}q?Z-tcRKmOwPN+1i-_PCca|m7XsrX+v~{_T z_h9o@Q8%}W^2y2h-yx_(2*y_`t!bF&)aW}I{X}e~C&ISsRD||2S1Qejd9&q=Z%4R5cmwbrc)>b`Aky!$`PTIv4Mb-xa>DzmdLD+R-^(7RUVu!ZzUyE@(7^THP}!Br zw*KDHJF!B&rQXncREiOpSqRdmgNfxz7b4+ds@+Ii2y8fi1dUMPfekTn{w}MNB=*B? zh~z1`+}b5dra0rt4*VcOak&U>PZFUiMlzN4Q!aQy@qqtfr?;d~vtc85KbyXp{M;Vz-sj)J_Ty zcVgy9pXyE^)=4Buyd{WEl}}wnojNhqmOzbB#T1O?U%Vo|nVO#bsI;gsbmv8+It=c% zfOBcb(QT7xwtv^)w?;yMsl43pM~$rMdHNo#4CTzh?~> z;gXGskD>oQ7#=nC_ed_(;T}*B7g%XDfYT_jEz-fARw>Y?|0%K)Q8PeH!I7Dp#);7ao|Lyoq9W zL{sZQN?{LVkY{^)y~v+obN)@wVoZ^nveA`#t>lVv>jtr6Mq#ol4~QA7V8;3fb*p@^ zL%cJiBvT`9=O0Mo(=#aQIC-WhKxzdO?BtnAfww`8(yW^2KXpP$W*aof3W0^OZ zx_B)ft3Vmxc>9V1(Y2qqZ-AW3U&_Fsb*8N(%EgT!iBk)7F%eO^1ChHEL1~fXgt#ET zN7W2yk~oSsna9S}|KEsR;?xbIc4j%>)F?ik={83tG_ye@KbXy%(S--ot#fz4w%~$e zAaz%x7r{VGeX405uWk_a4?4+5bw5~Weo61(^-bc+gXw%jgK*Ev<$r4w<+BR;<_588 zR(c{GP=AdRR8`mC=MCcgtaO@;Vjs$P-yoM=3{feKcP3XE(EoT$Ef}mQLVM*$U^J zMp6*(xYi~ymI<%cH;S^KEGfA(-=T7-{n-3sKtln-zYZ1QT6o?ZoYp8E6ed>8b0DJ8 zg1hLbGwADgnqj9Q&rD}sc2QpG6nV4bd7w#5o;{!cwNZ4;&gFlBI%XI0zDD7GxH#cg zk^^$QjQy%nJpJ${tCec|{Xk3%;0lW+j~P00SamzpnOW|((2Q{Ej0%HN3i{4CwfTg+ z0u97dXT<9AOn%P>(Oo{BkJ}((AF=U;+l2cOH=nsdl;8~tS@OsV0-rrnGGxaF8kNrQ zR&rK^oLS-KJ2r?_6}kL@HnFFomXL*W%K5t+#HKkmZfp{V<}BjwCXrrwluv0AUsPsJ zCzio4{z?O}`fR)qp&;ojk6G%!i?IG3^NVNH0Oe6>>ch!v-o1U4FP6;BCChD{yM<QO^ z4X=rJ9#7^EzA8R_Jd@s%m!w;t?ZKvkFRoxL?hlf@$lKGTzPLw}EwLq!YKM4%!Vtr% zx`NS$K^1Q4EwS=vd&G_XBCkOu9*bAG4^$A<@Qqm6s^(bu$ z=|Q{X2`9;F=@Z4K{Zsu-AiLwj($uEDlvWZT{f{ zLB+QSKpvF(%xOQ)_6ENVi>uX3`MY7U^vO&r|BEEdmNpHzZGn1ptk2PiU zzsZ%c#XYH6lr7zo_%3*MS&k?OWr9QvWD=gTxob94SInxb%P*q|SKSeXu|Yef)plOF zNlbq#o!9RWtDdrPTpZc-R5F1*cmtWUPvz%-0=-diL^Eb5rAa~k-M+}BC@5c79IkV9 z=#rYcOe$~wvK8FXD?VD5%in{pewxq!yh+UbX*zdo7OQ{S#FIAn*q&aZ@P*By{+Ud& zr9;oy_~EVM!ZZ0)(YkzXLbQ)luo(`<_Aft_O!Bs~Hbie=NLtKAGL`ygUrH})W+o$> z0?l2Nft@Q$R}ZPIzjzqDi{cea`Gm08v!Ze`>(zUT67A3sZJuFC7Wysqx-IK}==GT` zdauiW<|aOBe^yA~H$PiZC~eJqku&zzT03)OVWyT-6`cxX;q)M?TiS1Ndp`t=M|c({ zs3|xUf)%VJ@Y7+*dF+j#Zq2dJl{p#Y;Hs-&jc6#V_|esy_`EHm@&z}4a*KHBg=`Z4p%$MQ`5?aZxx$< zo=?d0KQAU=tCjA#yf!@{Ypd3Wli)uKUb)sLRaomxBmt&+R5lGINRS}*S*;XW?2Arc z)H@A`hMBGlDSVLQ2vZujW7~f{B8ibR!47%*p!}9W>A`rJzP8?r;Nm{GIx9Ou)2Z10 z;yCwPTS>)X>?&Gtel*?vce!~q&izZ2RalZrei5#r&KVyby3|7;lR!z} zEN2K*UY_jyM+*@cu14o_m&waU$ic`}3*+^_Z4vb^=TmHY;^nD437)rpg?0Wmy0^{M zqeEiYVa1@1VX1QT&fg|>V0xl#MD+b@{#lroXqN@q*}-%(WgBF+m>*o!A4$>@uoP>L zU?v4|385v_=&Dez21bbAhwh-=w1hR&2~@6`$W$~;J+CvI&Z58v^weqf3k?=}7pVBAtUr9I9((f}IsgK$& zmb}txrB|vtYP&{m;9X>{pIO)xlZ{m%Za(60qINs%0)cR{9&i(WsBr*~1;1QO5Jwb- zeSAh7UGKKt3CcCEIUyU4voMDBg;G$nF;zyJ;3>8tKmI3r+D#gYay z2ZWR9PC zEZLBp*at$c#tKEk1q8+V4O6X_Hio0v=FWI*cTgBX7q~D11fJa~u54I=3(Df@rl)x> z_AZ*1Qt(>&YOOOW$Cpvpb(ElB(a*_TZLwbR&2;JCJ7f)EYQDiWQrpnoUPB582t*`WAq3^sk2+ncH%JsV0>X zB|1337P35jO%b1Le2{#n>|;xo?Jl+fQZZ+x!5%cmOen(?t}PBz zjzA*w+Uc-%<1oF2f=*fR3JTKQV!G81B)g0T?QFXo zm}6KNHv_mjn$=1}9LAb6M(Jy9BhtBgI)d9HjJ*(YSl$Bd=Ru`7MDxAdX;6Ja9y9f(CaHL!_w zj7@AbFejk1(T#ItDu)I#h)F7odn9S`xCVzFcc!K|L4>a8(`NbBPMklg*UMwyFmTNQ zBijbXa2%ZXyp(dWfn5UOOK2bsFbxe{0z(x^F7!}qh<<|OH=?^Be9_>tz!nCbU0_~F zC`xw!9XzEBvS!-Yr&}wR&hUC#M^W{T4sl^~vJa>ZWMgMsH(gY7nBKiR^hCQ25&!o+yW8B=N9HlYY7~ z30o9Q-h^!ysbR-WQLDvIL^@|9&*k?+cZe=AHvkvxw_Z^c9-mMqTk*?Q%65p_@N}NO zL!1v6^4U9twb`1OP9(4*!SDA_wOPElLriWira~_@JALQ=c`!{i9`3Xo4|R?*?(Ix5 z?&(Z2zR_th_IAb_dpb?V?oOj|cPBGyM?qsv$C*)DZZbO0Rko8lIYM~yFaUzPIN+v%+eTDrULCSzs z21{sgy1$GMJ&-Se#w$lxp*I~6cMxI^Li|CfAqaH@p_U-j6NH+AP!|-*JET1ryQGWt z7!Rghgk9k$Hn`N>gP-DbuVclEb3#vYp~;^GrT>r9q+iCd@h_MKw>)+OA(Q=Hv8ljFBdnJp#s zwyI@j!e^+WuyJlWtQy`fK5CgxtNPq+dz|I%m~rb=Mvzp@uOG&)8gQ%?=g2aCegDex zc9GDU$pH#mt^BcFqO3L7{I^|NoU^=LG__9Whug&$t=YLo$cIJ>IS+^BeyOb2u_2-2 z?!~K;Je;BK-cELEWxLzO%f|XZAN|&Z+ai(Rnzri{yd?G}qP>0ISxj$}J9Cxq#B-f@@WM`Us59IAM=)Ua7h%&wTIQe zjTf>a%8o>`ayCQqx8m4AF%@~3$)Zvf{ASpFg*o#z5>9rcQ@qqw=%(%1QOq51V26Ny z1*V;xX5r+tRNBgQ_9FJj4)H}-GA%!1cb8|Xotp585c6B)m3@s$RzTt)R)QR}A!@GO zJvmVe-tJ;q`YZ?bKii#6ai*<%6>sbmo4RKb_@-MPv}g8MDdL^llbIOZe5PSVOOJ!# zx<}SL)Z?bJ+fRF(M919gw0x$UZ#3w{(ND6N-kWcxJ#GpQSy#{c-d4^tyF}sMO8#z_ z*s?b>f7EUaHh(j`N(~0s^PcDy#$^bUL5Nzu!bdT`ywh&{*Xos{u(fghZeiY+$w%!L z`TNps(NZ*7r(#m@vbQp>*Nq)TR_}8sM2lG9y6)`~d-m;^JaIR122Td}xga7JsElwX z;Nr1mVS-oO*ahzsn$D>Dw?0e3V5sre)B3CP3jZToc{80)?-m_zy3?n3qgSCK9&O=Z z#E*Me-a*v&Nb14e;_91Nf_00T2bS`2-QvW7LZV?lm`$MYpp8KJ!RZ9L4?YdhlYZ!F zh5xx*Hdodon=9-2-!<3JEt|{kkc+5UMQIm zUGEOzdNTB1LzF_1e*y(5wqkK2a(ramq@sazn@kTS0&(BUv?3xWM#id@gN$P zbk{(c(!2W0@L6|>vXg~;*V41BK8BUoGLl^YHEMExbLP?eV=5oV4BGPy^U9t zP$^!cfi?*YCrkS4@Jl7)Jj%6~iYvdj8J7LHKPPVGkBJ(SV%VprBkx+3A4`hrOn@=U zOtJqR8^8RZIRB2#aD0|lyYvqp!{>S$edO^ENmgqf>L+g4IFOF(duX8BDP{d-;_PLF zmwMnyKasjUKATVx@uzo2#vLoCw5GnUM+VX}DzvoktW~KLSNg`_|MRD8hTgdYq&-zs zMrwmEsFEEDNnq%z>MzA}=865M#&FG$1$rWl`o{mZDf6V=9h*-!%P-9r`S01{au#Uq z-tmq#Rwfnk$jJ$DSquA{iff6ckB{V8i^P@puws5pSWnvw#^6A+$JdB5ph9ak6xr6L zwPOG2Lawfptd>d;*YXNc9x67&bV}D#S{gm~;D8hTJ=xe#((wLWeIkm0l%Gp&$6Md`$e|~ZCREhy# z=pZ*EwSzBn^t}1UhYfLk+o^=o;LB3(5anMNiOmv zGl+%(U&s*u{P>^&pTiJue)3!#efB~M;lxNDkAU*ias$3-5v3eQU$VfT81uo+J@J2u zR}A=q1!eYRT{^DtKu6D&zuJtvx~s?f#RVQm-=`oGK727h7E3Uq`=|3G4fq~~c=fbR z>6U_}uTAJJ#?jX$sKO(sN1Ets669uu|92_8cdxW6d?>>DWjUYyE3x9stGxYJ;>y`V z13m#E{`see4fy1P#>!V7LmYkUVL*x(^SOV&IRE!UeBXZ2^sSA5dw|9&UwH^#Ym9PO zT={kr&pIrc{!z|r@CJRi9UerW{7RVtAA*RA!9YiBq|vN@O)=oZ53y*G4?Ql`YQqtu>H-0|K> z1HShlGcG49vl{}Vl?=Z4?S}oM@%fU_@Aj72lue2OUwDwTs{c5uA;YdL<{$r_y29U) z=)I@xipOBUXB?=|UR$i{v>qGVy2B z0CNB;c&Lu{EiYU+;tikWDYk58MUEA>Loj(p|DyFK073OA>y(}2!KX928}cV8wpi_( zVGZRI6z34_`(pTFMZ@k1%J7Db6O{Pa(mn$#?Q7^jeryHOv-%p&PEgz&@G4;JtUeH3 c(vY67IQgvNhLU{69W!B~!hY7Evbyu_>k2 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 diff --git a/patch_v2/meow_watchdog/meow_watchdog.c b/patch_v2/meow_watchdog/meow_watchdog.c index 144cd50..c70b403 100644 --- a/patch_v2/meow_watchdog/meow_watchdog.c +++ b/patch_v2/meow_watchdog/meow_watchdog.c @@ -22,6 +22,10 @@ * 音量±(115/114) -> 写真实 DAC(CS43198 amixer numid=1/2)+ 持久化 settings.conf(同 launcher 同源)。 * 播放/上下曲(164/165/163/19) -> 捕获 + 日志 + 消费,不路由(媒体会话落地后转活跃会话)。 * (8s 强关的「防误触 / pm_interacted」逻辑在 launcher 的 show_power_menu 内,此进程只做兜底。) + * - M2.86(226) SDK 框架 App 让位:启动时经 /proc//exe 读同目录 app.json 的 framework + * (true|1|yes)。判定为 SDK 框架 App -> 音量/媒体键让位 SDK 输入层(meow_ui_input.c 已消化, + * 防同一次按键双步进);电源仍由本进程兜底(SDK 对电源是 no-op)。裸自绘 App(framework=0/ + * 无 framework)或 app.json 不可读 -> 音量/媒体键仍由本进程兜底(不造成功能真空)。 * Exits when the app process disappears (kill(pid,0) -> ESRCH) or on * SIGTERM from the parent. * @@ -116,27 +120,6 @@ static unsigned char *fb; static int xres, yres, line_len, bpp; -static inline void put_px(int x, int y, uint32_t color) -{ - if (x < 0 || x >= xres || y < 0 || y >= yres) return; - unsigned char *p = fb + y * line_len + x * (bpp / 8); - if (bpp == 16) { - uint16_t c = ((color >> 8) & 0xF800) | ((color >> 5) & 0x07E0) | - ((color >> 3) & 0x001F); - *(uint16_t *)p = c; - } else { - *(uint32_t *)p = (color << 8) | 0xFF; - } -} - -/* 5x7 "<" arrow + border */ -static void fill_rect(int x0, int y0, int w, int h, uint32_t color) -{ - for (int y = y0; y < y0 + h; y++) - for (int x = x0; x < x0 + w; x++) - put_px(x, y, color); -} - static int read_state_file(void) { /* returns 1 if immersive */ @@ -194,6 +177,10 @@ static int down_valid = 0; /* a press is currently being tracked */ static int down_x = 0, down_y = 0; static unsigned long long down_ms = 0; +/* M2.86(226):1=当前前台 App 为 SDK 框架 App(音量/媒体键让位 SDK;M2.87 起左缘返回 + * 手势 SIGUSR1 也照样让位 SDK——框架 App 经 SDK on_swipe 处理返回)。在 handle_touch 前声明。 */ +static int g_fw_app = 0; + /* ---- M2.22(A)+ M2.24 电源键接管:息屏/亮屏 + 长按菜单/强关 ---- */ static int wd_fbfd = -1; /* fb0 fd(main 里打开,供 FBIOBLANK/FBIOPAN 用) */ static int wd_saved_bri = 60; /* 熄屏前亮度快照 */ @@ -427,15 +414,96 @@ static void handle_touch(int immersive, int app_pid, down_valid = 0; if (now_ms() - down_ms > SHORT_PRESS_MS) return; /* held too long */ /* M2.21:返回键彻底移除。watchdog 不再有「按钮命中->SIGTERM」路径(那是 - * 虚拟返回键的年代)。返回手势统一为「左缘起点 + 向右滑 SWIPE_DX」→ SIGUSR1, - * 不论 immersive 与否(返回键没了,所有 app 都靠左滑返回)。app 卡死仍可由 - * 外层强杀序列(音量减x3)兜底。 */ + * 虚拟返回键的年代)。返回手势统一为「左缘起点 + 向右滑 SWIPE_DX」→ SIGUSR1。 + * M2.87:SIGUSR1 只发给「裸沉浸 App」(framework=0/无 framework 的自绘 App, + * 其自己处理 SIGUSR1 当返回事件)。SDK 框架 App(g_fw_app=1,如 hello/files/ncm) + * 自己经 SDK on_swipe 处理左缘返回/顶部下拉(meow_ui_input.c),若 watchdog 也发 + * SIGUSR1 → 默认动作杀死 App(ncm `signal=16` 崩溃根因)→ 本进程不发、避免双处理/误杀。 + * 裸沉浸判定 = 非框架 且 /tmp/meowapp_state=1(app.json immersive 声明,launcher 写)。 */ if (down_x < EDGE_W && (last_x - down_x) > SWIPE_DX) { - wd_log("swipe -> SIGUSR1"); - kill(app_pid, SIGUSR1); + if (!g_fw_app && immersive) { + wd_log("swipe -> SIGUSR1 (bare immersive, framework=%d)", g_fw_app); + kill(app_pid, SIGUSR1); + } else { + wd_log("swipe ignored (framework=%d immersive=%d) -> SDK owns back", g_fw_app, immersive); + } } } +/* ---- M2.86(226) SDK 框架 App 判定:app.json framework=1 -> 音量/媒体键让位 SDK ---- + * 背景:App 前台时 SDK 输入层(meow_ui_input.c)已消化音量/媒体键;若 watchdog 也消化, + * 同一次物理按键会步进两次(冗余双处理)。判定「SDK 框架 App 在跑」用 app.json 的 + * framework=true|1|yes —— 这是同类候选中更稳的一个:launcher 启动应用前已读同一 app.json + * 并成功 exec(app.json 必然可读、结果确定);SDK 侧无稳定「框架注册」标记 + * (/tmp/meow_app_activity 交互节流、/tmp/meowapp_sbar 仅状态栏模式变化时写),不宜作判定源。 + * 判定为框架 App -> watchdog 对音量/媒体键让位(交给 SDK),电源仍由本进程兜底(SDK 对电源 + * 是 no-op,见 meow_ui_input.c);裸自绘 App(framework=0/无 framework)或 app.json 不可读 -> + * watchdog 保持兜底,绝不造成功能真空。 */ +/* 极简 JSON/扁平值提取:与 launcher util.c json_str 同语义(键前缀须独立 + ':'/'=' + 可选引号)。 */ +static int wd_json_str(const char *buf, const char *key, char *out, int olen) +{ + out[0] = 0; + if (!buf || !key || olen <= 0) return 0; + const char *p = strstr(buf, key); + if (!p) return 0; + if (p > buf) { /* 键前缀须独立:防 "x_framework":1 被误命中为 framework */ + unsigned char pc = (unsigned char)p[-1]; + if ((pc >= 'a' && pc <= 'z') || (pc >= 'A' && pc <= 'Z') || + (pc >= '0' && pc <= '9') || pc == '_' || pc == '.') + return 0; + } + p += strlen(key); + if (*p == '"') p++; /* JSON 键右引号 */ + while (*p == ' ' || *p == '\t') p++; /* 键与 ':'/'=' 间空白(宽松容错) */ + while (*p == ':' || *p == '=') p++; + while (*p == ' ' || *p == '\t') p++; + if (*p == '"') p++; /* 值左引号 */ + int i = 0; + while (*p && *p != '"' && *p != ',' && *p != '\n' && *p != '\r' && + *p != '}' && *p != ']' && *p != ':' && *p != ' ' && *p != '\t' && i < olen - 1) + out[i++] = *p++; + out[i] = 0; + while (i > 0 && (out[i - 1] == ' ' || out[i - 1] == '\t')) out[--i] = 0; + return i; +} + +/* 读 /app.json 的 framework 字段(true|1|yes = 1)。返回 1=SDK 框架 App。 */ +static int wd_app_is_framework(const char *dir) +{ + char path[576]; + int n = snprintf(path, sizeof path, "%s/app.json", dir); + if (n < 0 || n >= (int)sizeof path) return 0; + FILE *f = fopen(path, "r"); + if (!f) return 0; + int fw = 0; + char buf[256]; + while (fgets(buf, sizeof buf, f)) { + if (!strstr(buf, "framework")) continue; + char v[16] = ""; + if (wd_json_str(buf, "framework", v, sizeof v) > 0 && + (!strcmp(v, "true") || !strcmp(v, "1") || !strcmp(v, "yes"))) + fw = 1; + break; /* framework 每 app.json 至多一次,读到即定 */ + } + fclose(f); + return fw; +} + +/* 经 /proc//exe 反查应用安装目录(exec 与 app.json 同目录),再判 framework。 */ +static int wd_framework_from_pid(int pid) +{ + char exe[576], link[64]; + snprintf(link, sizeof link, "/proc/%d/exe", pid); + ssize_t r = readlink(link, exe, sizeof exe - 1); + if (r < 0 || r >= (ssize_t)sizeof exe) return 0; + exe[r] = 0; + char *slash = strrchr(exe, '/'); + if (slash) *slash = 0; /* 目录 = exec 所在目录(app.json 同目录) */ + if (!exe[0]) return 0; + return wd_app_is_framework(exe); +} + +#ifndef WD_NO_MAIN int main(int argc, char **argv) { if (argc < 2) { @@ -452,7 +520,11 @@ int main(int argc, char **argv) setvbuf(stderr, NULL, _IONBF, 0); wd_log_init(); wd_vol_load(); /* M2.24:音量初始值读自与 launcher 同源 settings.conf */ - wd_log("app_pid=%d sim_tap=%d sim_swipe=%d", app_pid, sim_tap, sim_swipe); + /* M2.86(226):SDK 框架 App 判定(app.json framework=1)-> 音量/媒体键让位 SDK。 */ + g_fw_app = wd_framework_from_pid(app_pid); + wd_log("app_pid=%d sim_tap=%d sim_swipe=%d framework=%d%s", + app_pid, sim_tap, sim_swipe, g_fw_app, + g_fw_app ? " -> yield vol/media to SDK" : " -> watchdog owns vol/media"); /* cooldown anchor: ~the moment this watchdog started (== app launch). */ unsigned long long start_ms = now_ms(); @@ -540,12 +612,15 @@ int main(int argc, char **argv) } else if (type == EV_KEY && code == KEY_POWER) { handle_power(val); /* M2.22(A)/M2.24:电源单击=息屏/亮屏,长按 tick 里判菜单 */ } else if (type == EV_KEY && code == KEY_VOLUMEUP) { - if (val == 1) wd_vol_adj(+1); /* M2.24:音量+ = 系统音量 */ + /* M2.86(226):SDK 框架 App 前台 -> 音量键让位 SDK(防双步进)。 */ + if (val == 1 && !g_fw_app) wd_vol_adj(+1); /* M2.24:音量+ = 系统音量 */ } else if (type == EV_KEY && code == KEY_VOLUMEDOWN) { - if (val == 1) wd_vol_adj(-1); /* M2.24:音量- = 系统音量 */ + if (val == 1 && !g_fw_app) wd_vol_adj(-1); /* M2.24:音量- = 系统音量 */ } else if (type == EV_KEY && (code == KEY_PLAYPAUSE || code == KEY_PREVIOUSSONG || code == KEY_NEXTSONG || code == KEY_PREVIOUS)) { - if (val == 1) wd_log("media key captured (code %d) -> consumed, no route", code); + /* M2.86(226):框架 App 前台 -> 媒体键让位 SDK(接媒体会话路由)。 */ + if (val == 1 && !g_fw_app) + wd_log("media key captured (code %d) -> consumed, no route", code); } } } @@ -555,3 +630,4 @@ int main(int argc, char **argv) } return 0; } +#endif /* !WD_NO_MAIN */ diff --git a/patch_v2/meow_watchdog/test_wd_fw b/patch_v2/meow_watchdog/test_wd_fw new file mode 100755 index 0000000000000000000000000000000000000000..da55ff7437c7616a4c3adf47fe167c227c43ee45 GIT binary patch literal 71640 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 VOTY1aE{^HzSGk_$z5t&p{u>rbfSLdR literal 0 HcmV?d00001 diff --git a/patch_v2/meow_watchdog/test_wd_fw.c b/patch_v2/meow_watchdog/test_wd_fw.c new file mode 100644 index 0000000..d1222f6 --- /dev/null +++ b/patch_v2/meow_watchdog/test_wd_fw.c @@ -0,0 +1,101 @@ +/* test_wd_fw.c — 宿主单测:meow_watchdog 的「SDK 框架 App 判定」逻辑(M2.86, issue 226)。 + * + * 编译:#include meow_watchdog.c(去 main 拿 wd_app_is_framework/wd_json_str/wd_framework_from_pid)。 + * gcc -Wall -Wextra -Os -DWd_NO_MAIN -Wno-unused-function -Wno-unused-parameter \ + * test_wd_fw.c -o test_wd_fw + * (meow_watchdog.c 含仅 main 使用的静态函数,宿主去 main 后须 -Wno-unused-function 静音; + * mips 目标构建不定义 WD_NO_MAIN,不受影响。) + * 运行:./test_wd_fw;全 PASS -> exit 0。 + */ +#define WD_NO_MAIN +#include "meow_watchdog.c" + +#include +#include +#include +#include +#include + +static int g_pass = 0, g_fail = 0; + +static void check(const char *name, int got, int want) +{ + if (got == want) { g_pass++; printf("PASS %s\n", name); } + else { g_fail++; printf("FAIL %s: got %d want %d\n", name, got, want); } +} + +/* 在 / 建目录并写 app.json;写失败返回 -1。 */ +static int fixture(const char *base, const char *name, const char *appjson) +{ + char dir[512], path[560]; + snprintf(dir, sizeof dir, "%s/%s", base, name); + if (mkdir(dir, 0755) != 0 && access(dir, F_OK) != 0) return -1; + snprintf(path, sizeof path, "%s/app.json", dir); + FILE *f = fopen(path, "w"); + if (!f) return -1; + fputs(appjson, f); + fclose(f); + return 0; +} + +static int expect_fw(const char *base, const char *name, const char *appjson, int want) +{ + char dir[512]; + snprintf(dir, sizeof dir, "%s/%s", base, name); + if (fixture(base, name, appjson) != 0) { g_fail++; printf("FAIL %s: cannot write fixture\n", name); return 0; } + char label[256]; + snprintf(label, sizeof label, "is_fw(%s)", name); + check(label, wd_app_is_framework(dir), want); + return 1; +} + +int main(void) +{ + char dir[] = "/tmp/wdfwXXXXXX"; + if (!mkdtemp(dir)) { perror("mkdtemp"); return 2; } + + /* 框架 App:各值形态 */ + expect_fw(dir, "v_num", "{\"name\":\"x\",\"framework\":1,\"exec\":\"/a/b\"}", 1); /* JSON 数值 1 */ + expect_fw(dir, "v_true", "{\"name\":\"x\",\"framework\":true}", 1); /* true */ + expect_fw(dir, "v_yes", "framework=yes", 1); /* 扁平 yes */ + expect_fw(dir, "v_str", "{\"framework\":\"true\"}", 1); /* 字符串 "true" */ + expect_fw(dir, "v_space","{\"name\":\"x\", \"framework\" : 1 }", 1); /* 空格容错 */ + + /* 非框架 App */ + expect_fw(dir, "v_zero", "{\"name\":\"x\",\"framework\":0}", 0); /* 数值 0 */ + expect_fw(dir, "v_false","{\"framework\":false}", 0); /* false */ + expect_fw(dir, "v_none", "{\"name\":\"x\",\"exec\":\"/a/b\"}", 0); /* 无 framework 键 */ + expect_fw(dir, "v_sub", "{\"x_framework\":1}", 0); /* 键前缀歧义:不误判 */ + + /* 多行 JSON(framework 单独一行,值独立) */ + expect_fw(dir, "multiline", + "{\n \"name\": \"x\",\n \"framework\": 1,\n \"exec\": \"/a/b\"\n}\n", 1); + + /* wd_json_str 直接断言(防 "myframework" / 前缀干扰) */ + { + char out[16] = ""; + check("json_str exact", wd_json_str("{\"framework\":1}", "framework", out, sizeof out) > 0 && + !strcmp(out, "1"), 1); + check("json_str prefix-reject", + wd_json_str("{\"x_framework\":1}", "framework", out, sizeof out), 0); + check("json_str no-hit", wd_json_str("{\"name\":\"x\"}", "framework", out, sizeof out), 0); + } + + /* wd_framework_from_pid:自进程 /proc/self/exe 目录无 app.json -> 0,不崩 */ + check("from_pid(no app.json)", wd_framework_from_pid(getpid()), 0); + + /* 清理 */ + { + char path[560]; + const char *names[] = { "v_num","v_true","v_yes","v_str","v_space","v_zero", + "v_false","v_none","v_sub","multiline" }; + for (unsigned i = 0; i < sizeof names / sizeof names[0]; i++) { + snprintf(path, sizeof path, "%s/%s/app.json", dir, names[i]); unlink(path); + snprintf(path, sizeof path, "%s/%s", dir, names[i]); rmdir(path); + } + rmdir(dir); + } + + printf("\n%d pass, %d fail\n", g_pass, g_fail); + return g_fail ? 1 : 0; +}