From 2ffbb6acfbb025ea465489547ec932ff1e784ac8 Mon Sep 17 00:00:00 2001 From: meganrogge Date: Fri, 13 Oct 2023 10:43:13 -0700 Subject: [PATCH] add saved cue --- .../browser/accessibleNotificationService.ts | 30 ++++++++++++++---- .../accessibility/common/accessibility.ts | 8 ++++- .../audioCues/browser/audioCueService.ts | 7 ++++ .../platform/audioCues/browser/media/save.mp3 | Bin 0 -> 30428 bytes .../browser/audioCues.contribution.ts | 12 +++++++ .../chat/browser/actions/chatClearActions.ts | 4 +-- .../workbench/contrib/debug/browser/repl.ts | 4 +-- .../output/browser/output.contribution.ts | 4 +-- .../terminal/browser/xterm/xtermTerminal.ts | 4 +-- .../services/editor/browser/editorService.ts | 11 +++++-- 10 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 src/vs/platform/audioCues/browser/media/save.mp3 diff --git a/src/vs/platform/accessibility/browser/accessibleNotificationService.ts b/src/vs/platform/accessibility/browser/accessibleNotificationService.ts index 28986f44188..6fc2bac7dab 100644 --- a/src/vs/platform/accessibility/browser/accessibleNotificationService.ts +++ b/src/vs/platform/accessibility/browser/accessibleNotificationService.ts @@ -5,26 +5,41 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; -import { IAccessibilityService, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; +import { AccessibleNotificationEvent, IAccessibilityService, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class AccessibleNotificationService extends Disposable implements IAccessibleNotificationService { declare readonly _serviceBrand: undefined; - + private _events: Map = new Map(); constructor( @IAudioCueService private readonly _audioCueService: IAudioCueService, @IConfigurationService private readonly _configurationService: IConfigurationService, @IAccessibilityService private readonly _accessibilityService: IAccessibilityService) { super(); + this._events.set(AccessibleNotificationEvent.Clear, { audioCue: AudioCue.clear, alertMessage: localize('cleared', "Cleared") }); + this._events.set(AccessibleNotificationEvent.Save, { audioCue: AudioCue.save, alertMessage: localize('saved', "Saved") }); } - notifyCleared(): void { - const audioCueValue = this._configurationService.getValue(AudioCue.clear.settingsKey); + notify(event: AccessibleNotificationEvent): void { + const { audioCue, alertMessage } = this._events.get(event)!; + const audioCueValue = this._configurationService.getValue(audioCue.settingsKey); if (audioCueValue === 'on' || audioCueValue === 'auto' && this._accessibilityService.isScreenReaderOptimized()) { - this._audioCueService.playAudioCue(AudioCue.clear); + this._audioCueService.playAudioCue(audioCue); } else { - alert(localize('cleared', "Cleared")); + alert(alertMessage); + } + } + notifySaved(userGesture: boolean): void { + const { audioCue, alertMessage } = this._events.get(AccessibleNotificationEvent.Save)!; + const audioCueSetting = this._configurationService.getValue(audioCue.settingsKey); + if (audioCueSetting === 'off') { + alert(alertMessage); + return; + } else if (audioCueSetting === 'always') { + this._audioCueService.playAudioCue(audioCue); + } else if (audioCueSetting === 'userGesture' && userGesture) { + this._audioCueService.playAudioCue(audioCue); } } } @@ -33,5 +48,6 @@ export class TestAccessibleNotificationService extends Disposable implements IAc declare readonly _serviceBrand: undefined; - notifyCleared(): void { } + notify(event: AccessibleNotificationEvent): void { } + notifySaved(userGesture: boolean): void { } } diff --git a/src/vs/platform/accessibility/common/accessibility.ts b/src/vs/platform/accessibility/common/accessibility.ts index d8b0df4eb0c..78b0ff84ee5 100644 --- a/src/vs/platform/accessibility/common/accessibility.ts +++ b/src/vs/platform/accessibility/common/accessibility.ts @@ -55,6 +55,12 @@ export const IAccessibleNotificationService = createDecorator2KgJ8!*tv+kQUZ|=l&`1aPOKI_cEzRB8)$*^UfximT zA^l1i>;5%^U*eGdMWA2T>g)cC9Dlu=d+D!I|7PN+PJVB{HSk*lzcuh%1HU!!TLZr} z@LL1FHSk*lzcuh%1HU!!&!Pd&Y7?1Tm#3IE+Ixs89U#7FK93hd9-9<;&+9OCvV^_% zT+J?%Z7Td+K!8|=`ih0s2#!`A@EJ6Or6psR!auaH4>Xf6uM%b6gi-ZjPg=6hdsk19 zT%Vub#R^0|Vn5(|#R8y_{{kMs|YuPG=q*I|#jt)r3f4Z3Uv=ZyRW*Jap(G z58$$qs)6i6VFq6H?mE0MgHc01rqGCfemBh; z^WD5U&t@2xZHy8UVzFSHhlMzZ1m6YCB5I&1BnukE`h@kLZ;jMv@CB&QQ=m(91IQcJ z4QT*IhtALVsqCzJ!3@RN!|^2O4rYK4A10KB8K8I&H{vIrAatz`?Ai-M!bnxE@2AU4 zH|1Sw-?L-SwF^5=dpW9U2DtUg+&yEMoIC{qoVh!gIL-%Z4f0$3XQh}zBm9>53o0bm zY`XB>P)bg6IDZ7S7xpdwE9@4v4)(m>l<_8FK&wc1pE9mcvYeDn$6&}*6-T6G7Fpax zD-3}qBLxNQ^46h1nk%fvD7f1WYXsv1sP-AUsQ&5AQynF5MJ2cQq2}uBLg`vznaU~+ z3pM)5dtM1Pj$IUE=Wcj;X;K3+Acz}e^NY{DT}`2NqCbfltXzNgj`IlsgsG4#5DK*> zeGEq=7Y8;aD+TS@oe*Xv3_<%~I?z3MEEEGEp>}E@WCXlLBm2iK3sBC=m63WFhIge_ zwk@{UIxS@%J^NHQ-a?LMSG0H3%RcwrIrme!$mCEz$t&0J@h+&Ku2xHb(p~!XJI58g zTN$>A-eLF4i>tZFLHPj6LF3B#)g!?GfL`PRDAGOjHfolidH_|zZcxhRJXg=|Hq$9Y zM7dtWv@osB3NLavoE7;~5h+ZgQL;|*U8($o`+cvTJCTs58jC0?Q+GK+~%kBY1+Gy1!wYsuR z^(QZm4}`o;s%pIIC8wOILgGFKHwuGf8eWYz)?Qm|`*QI?P~5tkJL=8+WWA+6_-B6c ze!#T|=jme($0B)oJv({cH?>8nSGd8p^2(>x?X>Up#llrzkI?dr1U^t_u;uYe!XFYx z00-I-Y6}hI6Q;Few$LsBZ#SrZrCgFLE+ia>j@ zYxa#^_D0`5jCh4dq;P;7aFJ%=1W4YNe+Iqh_x4n28TBby8Jy6RzoTVMn7+Aq=f0EA z4y~I74r!lf*Z)Y{EcnyQRZ~&^n#QO&A~0NCICb$2AidQBE_sBCn6h8jrR@s1^ zSRq6Ji>-~PV7*@|Q9BFyl(18a4%9AlR0|ehVyHbAdHk?a0D;x6 z`l&5sDlN(81%`8b{^qdDTMlOixn;*JAHHJ;*Mc%poM|9P_@^;B!)+YS_fr=+@6aM% z6%drIB#suSc>)C$tlN*4n%V`0ze({xD_}M;AsoUU_~-vZaU|(qb>!;vyqyjF1&$ollL;OQ%JPsJz@}Lk?Ls&i{uECLAevJNfA&mJf?i+cZ$PVW@HME7o zc{^@Jy#{YywCZP;{O@W%?7RBo;yVDK11vFcGtZK6HVx#J$&=rI2}~5AOW|_CJ)(3T zqB-aY>w>wO!eCdZkPsT?KyAmIZzRL<06<`~TrpTtL8c+qKjr&RFQ*KkBq2MABUEHq zFD84z3=m7ymGOK7z)lsuyxU6UYF(Br<2N#aOk|E@ji>q$^8ER!Spi7ZCM8x35l#i$ z&!k~gW^40&_#Kd=kKdT&ZCHNRU}#ZiJunq0eEQt=o7}2!0+;XCg>($9ooL&};ZzrK z9pxuCjY~9yfHO_;5gCQ++bd{Un=g6!-~lPySix?@eZd3X1-Um<+}&Cbd`< zZSTGJMNVMhi~rLnnyMvd4d359KUtEeb^hYfhsIeymPcnD-JG*7$Di@$a6&oX;ts7v zacW&SBY;E_F)%PlD{Ll&cr`fMIMk|2E27YLM(c%OKr4?eKS0C)2m}rd2Woe-SjZ7J z6~1;Vb{l+^m$F&$(b;rGYj3~~c$6Y0qQRu$gc;~*>$$u>iW?~V%2G46DDSNOoJwAa zewc_`da6=Y-=oiMJ}2HDRm)E|(aZ2JJLU7KVK}6sFjp_DZnkNpMYE&gs?$!jvEHx+ z`%p1nYGKuK+m1ZWr!R3&IV*1fz>V4#s&a5=M0JN&q=W6At!bfxyB;%J(vx0|&OEI@ zU5M_XY|y8h*ffV0;ElF^zC70FXWp&9YWF?j&_tY{yIG|V`%-zcDqkw~!sG_C!e?)G z2La{h${eyAJ^UI?x>w`cIAdf0#ADC^YPg2*X)_R_dKQ+}Wr8Td17!CeSNtt~cMh0a{7$SkM0A-k+j+mr%D`aicEicbz&U@nbem7ri8d^gp z)fJjz1w^&e^WChmN!ja6j*VZi5dsWw@l-sZX>k~q@DsU>01rExa@vOs?AgmZbz2XR z5Zj?7`xb!h7geNR%?48Ad8-G>;}ho|>&Q?9V;gwL%{}r5_xYS(KSEccy;#j=&*u=8 zqUYB2LcXIb&zv`fTopMMjoYUK%^rBH=pW^ut!4UHFn)M!kIROK3c-v4eob0d0K!xq zCu;S2a1)2~V}eu8`F3oU_F&c_yq-0B-&gvK*`8hWs;f?kmtpo)f<62)4F$lVJU!VY zC6BRlHiMrUw9i%D91y^fof6O76a45mksQ0jy5HFH-WR2N%r;>fiN8_Wa%3B4b?aG^ zO`q4CM=rZ@KHdD0JAc;WRvc$}(~6ox+Nm-fpT9f~9M0ORC+Ab^Fu)qqDOas5JQAnF zvK{vNpsnMCr}N=(N_=@}S49v9RM~(?SS1{Qc@QDYAu3Y_l7W*$lz_u5(=V)tA_xNv zcqw@A?e(|Zo7jN&vASbJW$PW+yD9Q_$7^q?h}^j${H{bwv(m0+Q4b96wU|e6fn?6% z2&KFYwl*{NkJZ(x3Y5y69_)DYrs82mdPTaYkA6jZq!VYPAXNFGjnwJDz&EG1>{|d> zgODtb>ujp_svF0+{;eJic&TLH6(6-E|7Kqyp6H3w)TCNJAX4zcOl&r<3anv!tot3! zt%k#o`Z$}OtL@-?vbWKdR}QtWPH=P9$cTX&m2P)dgw`jxsU60g#b6eretL z1p-uH0M}{6UTmZELAcInMFF&BJBuZTpkvr?;N9^lta>>2A+7A0wSezrFeOvU2uEhS z?@0B#EjsFmEOO#vIaaF?kE(15|5hR zNpnd%!~SvYIlgryRC%+5p?2D^+wGbV{Qj*Gb#LEEK0h()^UyU$Q@oGhmQ<5e-`M}8 zYu4~`QbT~wXGsV9F*k#zoID@9veUK=0Xa>#ZS4+vO{=OZ$rM3);;O1)1h?Ktof&-X zi;MU#N8`TYb1pRV=E#6gyoPBzK9i{5m$EG!bX+x-cpFcH4no6N5JTF?k8lygU#SRg|@_<6!NsgwwMgDO89o_aFHWJR5%~bn!ZZvw1s1$<5G?IJ)F=&3&}7l z?-cEa=G0x39F$cMrG0)2MTd3U^C^dOe>I$Aw-U$Qt=;5&b_?K1YlH^dZ3EsP&W92z zV2q&>It}i&W-ItcPQ`%u-R@iWk!sWD z%eJ0IMJmW>$LjMA>t3=#6i9dR)mUD_em;U0j+&HiOUAma2NJVK41yfCBuC4BODQso zUmM=U;jD5$fB9NN;{mUk4ZPz#H;m4Nnh`el0yr}jsjtFG=qY$Lyr0mgLXezK3D|Ng z(KevlW0U18%7wZX+aCj$ahbU55$YChogT+7C3NF&rLF9iUns;&o~+m-oYgA9PFLs0 z?a#hLshqX_ z6@O%6y_u4J5_Im1B5S`Q`(t zC!saypmfWzC!QuDhb6v;ea(yy{D6d@%=mZE1nfdICSssRWrGNe{G2V1Lo!t5<eR!njSSCs@fp zkV6QI-JpLDV9`3iG{)UC!p?8~D)iwstXtq2?8mjK=G&N zP~?*d?b(;K z#NV1B)%Pia#y|wP1=s}2S>QJIR`zZu!Iw}Qx25VdCL}JNJKWKfG`gV7GskneqSvVK zt&E`Wx)JT`8&5W3^6H}Nmzqv~dQ{2Vui7k@iLsh=mb6mbe}S$zV6h~gV6F)BKy{%R zl-wHLYLt-*8ZSq<;TK-+I@JO`AtEv{eDEOR$RCX=f&L3rdjIpauW8g>nzTRsL-do3rdRGPA_@H{fvogKZ7Au zkk}2S75wsYEfO2)s{yR&X^FxbajCm|KYjo`Bm1zkJ_I0j+6QYMnWFByW!sv_G_z*fMX;Dv1>Ru5d4 z4GFz;?)nOaa3t12xHn-&-9YhSwZ((_%Jzo7dAq~TK3>A|k3X5kYBL9S#0qcU@nvaT zZ#_>wJtv(P<7d{XDLnLW!-fM&GjnTaINSk_|Jn_-vD{2@7yND(qtr}dW<`?Lx-p=r z#WZM2J_FiQUw{Uz!=NHLg&zf!OAxVqr9fVS)me>zx|;bbS2yN=&~W=wA{`+7M8bP_ z!8(uS&kyZn*hfNk?zEdQZ#$7LLyc`LCg>$>39nn${p8Di^qRS!-DqqquZqg^!|1)2 z4%kZGzg(SfEYJ(~tIVK{tZjK~1kloN@G~eQK`TI%BU)Hx2{HS(Gkkbovmjj&R^}Dv8 zdE#~YN}y}Q>xWQWsvowU`c-IF&5|iKVX;Pv)^@PUt?`J4SDbhnA7#`s^3L-5i5Z2@ zFZFfhHoAoJZ{YRM335;-ymj-DC^0$p^^xC;qyndWPr)s@ci({L5L-xg9=1APDm%cr zd#QR)tpmZjcqx#?E(F_bj)8Hkeh>x(fI_V6@OZw6rJ}?nKa0$&sF%2ta%rJyv?TG2 zemaRcd?l_`;blv!V5O5}uG55LSmOP{rdj@PN(Wy*Gevhs6x9aSbchvtkevb))n_HW z?%X@sGr zXkns3VRaRbxF0v^KfnFj7mxZ(tI1v3(;@1d*TLs&1GlT&?)Tc_q;*_k8Xwm&cl^#L z&iOSirrtCVyCwMsWIUZzmyTjK#S` zLil0QhvX7Mwo$YsPHN3R7;sUqHN@X%v{=Vw_4J3X1iJTyQg8f4oL>59Z zG&hI`u5zSa&{r1j*E_+(gVtkH`LL;rdRWGs%|gUs1LK`g*~i;T7(kY5bSketF(L~(-Xgg`ad=+e%BgN3eqKvJ-Lr_@zJTR|_Za9&HvtRmTUG%c@ve8l=1bnQ9si2Q|w6AIJF7Xf@Q*IO^E zrx!%3uWc#Vwj-+k|A8EhR!Q>ig*GboIgw7=odD&KXF-S>0_s!EK_RLs0`Nn@qC4G% zc?6?`l)QtjF#X~#XyKWUHf*ydF2hO08TcIz>@BndO#+t9j2$cs5=Gi)w zq{C!K+*M#XN+zX{i844>DdPSOrI!aDC+Q_PI%KN0m`hZ|*Rh1|_=leSUT_7$Rz(Wl z5#XUGKq?pvZNUD7`7LeDqEP&7+J0O7fXv&keFyi~%++3ijtjm2aoOg4o8kVL53g_y zqi5fFykFC??byUw!D?^WhPAAIuvs$GCPN3>fsF|`PqAWY44?p?3>cF)1IALs@{<+V z8*&v+Fcmz)0=%s468n8S_52f@v;jSIgyPQKcenoXazq)fmveNjuzN_3Q}q+}x;iiP zN-f?WKVk8M1lCdbtS^roJW+^|uui!&cI$)iR?p&>wW_zI>Nb9A?vG@YRpzH*aN70?neC4r^4hTK{nDXAb~De)?%d@bU^kgKW@9}d1bzg9c*TtI3^hCtwz z^rmexdp6hZKkRm6F7ilC>*Eo`-uDK#w@H>9YPl?s*D8Da!i|S#Zy(?K;f3-5tS^Hg zi;y~6d>I%Yqo`HLIox>7`OFPoE9Ae8+F#FtQeD!d&Dmb2p``1i*!a^r8R#tVm1QkA znC<|jsZ$_^+os#VGBHreNa>88%BzH>;?Ldo5N~AcEz(g=OJ3OWI;My`>>>ZBd(-P3Hi_Utch z+yy3k0X@|Nm!r&R>W}msgJF6-MEtsRG0|}J;dock*hNcQUIJghQR>Hpy?0z2Q*Hzz zHvkq>)VzlK2P*4s?w9VX2K>jKGa^rboSSdE<-bNN=PbYSQ0omzh&htyK+ zKyU+V{MmD^aTJO`W9~blSE-f}h2u0Xa-Chm4mJ^Qr*oS8JFZ`zDLS~c`$Y4ju_*Sj zch{fPbSGX_Z(2^PxVbzAT|{+4r4`IzR9Qt}OU8K6Bk`&LQ@9MI1fPU*5XI0j>VBvc zUV{*nEE^Auo>GOA1^jJ|0fr2pAdCl&D|fb~=iLHs;3oonI)5Zo*C#q$JDCv@nHwGZ zoM6X`t<>n?z2$ntE9BY6WoeKxc7E#Qjeg2tMP$yV^D{e=nlJWK06%NW6BpH`u1d!7 zJpnI8>l*BL>ql7rm7V|K9_;DvCT*68GH+I*ke&&&fyOCEbqH|o94d?f>e8NoXzpB) z6xq~FX^>r6=s>R{aaiI6}TuHks6)?D6 zTRt<=S}kL*1S~TgB~O(?2~+FW)zZe{m#9<`?}XH(xWr;tNKjD-$8rGKm<%MuOr-&V zR28jnDK!4Wr;t1)eAXKs#(JK(i*Ix7ycVo{%I$RbD89l-x1}h#JzAB-D_B}Dj@~RGarT0$&*-Jd$h9ZS z$NkZ;@R(4Iy~R97M=h%L*a9j-?eezr*$LHXkcj?;oWAPSpUBnr^Z{`vDY)*W8KH$) z%ZtU_l_aESo*J!QtUaDd78OvIL3jjK!TR0^g2L_sFnf7|X2{_2ZFi2`e*F1y)>Ha^ zCs9STY3}SGjmIvd!R1`Yk**qN&&W90++Fv4HW$af>I8B#CV4Y7wGLDUh&oMv4OQP; zvX1lP40l4B(@N)Q(Rs;Rq@k<%ygf)7u-&)r>z8J@m#r=`c%2oZ#>^c#FSx`@S%=^* zXHkSPq?W3$-Agu9P4cBr6zL@K64+wnW=6zRh!BIrgzc%Em2wty4Wl?pSU;@9VQmUP zaYdB1sQjsft}2B3hD_s_hmU)*idwF>-o5L+@tbeh_KMz{5kA3dmroD=xYOm=_L6C3 zk?jX%qd_me18==01ow)_sr*=4_xZCsXN?HP!^%iOeX(ZAmPw@H-aOK@O*E;7Tm$0C zP2d5G<6ts5738PJ;7d!HVyaHQ0pVMOb=-~j*C5(ov2!sOY9piUy9KzNiH@;UfNMxE_l9s!_cTddp)K?>%El`;;Uozopmns}-8} zk@gHKT)kS(etk7RXz;?_4iw)vHDf{!A*$fu0pzY;%nuot3qvB*muP7bc(ixLW#g#f z!Y9{+AFUc!!d23q@=HiO@EBS<9X)e@{L`}I;=-Nwx1TclMs6Qhc~;zd>hht`BQSwP zx^gMSIi>=|NK8{Xb)jK{9jAU9vrAeO=sxW`{yy+pe{a2o-_S)RncfGuH>}raGW!(o zeD?+viya5^fZ+#(MDzq@LYxq!qA%sN92jS{kz7heILTh6e{*y#2x$Z2c2Pu>>ZZ7D zx%f2c655(_bXkj6i3U0H{&q}|z*W@}&!VnABGifV(jpGS-2 zV!Mvb=;hNFS2c6b7#=@6#LSLWH0ZJ{Z-yN-;~nJ9zIS4|a2u!fB)1jk7NCX{3=&Ak zosc?nHJGn$F)S%#S9rJ30Mr6cf^_IZfuq!LD4XU39e^K%;B;o(PQJ?qoI3OUvtD)Ehs-Sc(jndd8wtwfUiN1jLtJvp`1+=hpyo+oc!Z@co# zCxS-w7_cyF#`w|(7$`F!52mxiz!>Ca5a6yGv13nya^zj$Mk?NPxU;J7alB1BQXCUX zAqE`1g;9Hyg2gH+tCo#b4^I(}k12|?=&9Rv4X)gdU%Pz^Ke{tzuAX&iWJy1(ZLfsn z(ONVOMglQ14xUVFFCHav`&6+{YGeFu6Dz-BYo`Ma*QG@XeiWEZ=o$+2>RB_cXFF`@ zW?g`Jv0m`Dvk#yN5bC9hg@Deq2%V9CkPnR|SfLV#mPGeuA}WQJv4ARs8NcMMYt+7~ z*;Fw9?bfV6oAv#zmbM7rs0h??ExrzGh}E<_f|XYfU*rk5I9 z&~ineQ|r+dv=>-5o&3|uodb|tmD+!HSedUvr?^f|5R<}na%z@^Qcr&p$DKfvfmu)s ziacUX>zNcLzRs2L-m;S@u+cY-VK7vE;<4n2n~ipfOwWaJ%ck{|(k8vt;Vt_=y4ncT zcp9XOQ2acn32a#LDd3Hd;TWWv5E>{X=W*20s4n0YDJAp+wkjN*x(uC*e*vY!2mxiV zH;^hU9FnC`xU1R%Bj#w4#Y>@qwHH-va3Ywl96@+il_Rw?N8AB^>7W}+tw8!oS?<^w z%3RlO+RcpHFQfa(BC3i+Y0>9eIhk4|E}kxRk~WJ8)jU%)YGidTnJOvr|s( zV3n)pXsh$i@D7SBaK*WL__gnkV*9wYXKVi|{(_}ewj`&l%uO-4ZXFrn0-eqDRL~mf z4?1xhr8X=TFqO)KMH2435GC~fvaiAME>r?9ek%YFq`ZC`(EQ<)ebMK8NiSVt&rEA}bE# zyCFJoj5iN4fLcPP;G1DofTf_+bJ0@g1GS47L`tH-pjsL$;_C>Fn9#N1FJ;<3b;1;~8aKCwDgbX3~hj@v2yeH-qJ-r{(ZD@{Qx5QL?*QTzYQ) zT}%1eGD9<~XWBkHwh={LFp#o1V{Hxl7^nNfB0sCe_1f;FznZF2GCHai@Od z4$Y;4mss84W|lE1K~BIM>gII4#!02?h{)q;btpQ3EJ?6b5z&NGz^T!XnrPNT*Jz)@ zR_ml7`^Coh8m~M|ghQrYnBg~%WPB3G&wUs|4h zJz~x|9{9OB7?!x1=XP#*OWx^Res_A`zKoSsQ?;k6P!O^c>J$aScip)P-6yt24GQfI zdPdiRTIgT7&+p!VINDtRt=h@&+*{86==qIS2e0$#xF;4i6YJ)aRKs`i$`;b|Unt z$e31eR4Tk2Hd~5jf_T64SgL(WsxFe;&Frtw3}Q#G#Hlo^Zc9}d3izU2YQQ{(#?`gs zw0X$0e#Q4`ZMPoUez+dh&P zyw!1oP{`2^!)1mPKqvTCMij5rZzSAM6D@vc*+@{4uO^7f3lTt~KVb{ggTW7+W-y`y z1srPWGiFkZWdkuBV_ZfM&W$myf#T(QGMES&?Uei>W1D-Pse#oo-3f8)zU3$l+_0Cs zTQk*Yt3GKu8~-Zx!Q(NP)74#Hx&CMpA@K+aZbNzjW#+T=#%=PU6^f{I>e_eZ!{O2 zG-9h=h-Zw63>Yh6;<7l8JLM=rfH#c?SjugL*xJ4aPmE{?o zRjhkhXf}>wRILU27?QN!d|g|(vnu=4ci`Q;uKuCty=mTMfj^PU0+9RF+7M3zAqINu zR2;=mc$|yeLTdav318axv!IgC!TksB-O*hYZ-(hfy7S?BDsx!{qT<8?MfLi)AY_Zu z66~7HFlrIz4qwI$BN_N5WRjqc$afw*^AQ_RGgqR~dKHwi1K>)429P+r+k4tRe}*j6 zSzx92`K*$>(cb%F*c9{Jv_d)h#k3+vX%cqlxU${Ac9{mj(x=XIJ0G7|9td_)ttpt| zub6ot<@i`pDtRm^W`a8%t~et=GD16D;hzx=bW_nBikXp#RY*cLuIm*r5>f$}Xf%RK zIERwoO+m4*G{x|vZ)5vo**T}a-b$-kGj}$?-9Q83HYR z7&tW?vRT*o` zg#PK}JFuY~>SIG{ZeE0e%*kNSQQ_gr`B_knstsmzx039vtwCvA7`PK@4PJwRAio71 zOl0o^ov8P@1J`!KxkXB_GC{bLH4K1Nies#U1O&)xCz8lR*atM=qtg8dt@;L^w2pEi zZ-xB2&s)W;ZA_1Q*H46N=0w*P3qmv44?DMBy{m5IB`C))qOhN~x7Hl18qM7JF-2;d z@78CBR^D?vgq#uRWTFhDFR?ciG_np5%=;dc`xCiBD$+~MklSH}PEOlSaYur28ENA} zv#A!BvP;+t%Bl$mp-EIc6b>_k{D8NR9;_6K2I_)1(x($uG4^yC;3KW`Qa*v4NFA&Y z-FKsE%=Z*P*4#w1IMx(uesaECMyT>*(u7ku>3qjdPsYv4B*XV7ebiwVOw}AV0r_nj zEmu+$gSlPb;2+1i_?OW#3V-JmJ4D3gspWWAlpIAU!_gqt^NKlzU08@g=fT> zdjb{sEod&{{5kQ^xB|1+x_Rqc84CbuA*TSnH{C$#T`_xWyAJbikd9^G<8Rd;F9|>v zTCLY{Y1!|G7jVx;* zn$-su_y7H_Q7{CRQuP zu&sF^Iv^nP%xGUyF5&g+g`?)*uK#dlE#e1wdcME;-vMiW7U9O@Iw(bWW)nJq|ORwt`vga%qQ1p;Wn5>@QE|&v=8(B-IAk4|E`8zffsAi<>kY~qdR=#A(&OhHAH05cp7W#e z-?HbQ;25}}Q;*x8q3PJm?PW;fPTJPS?N#77&v;UEdCr@GZr8%RSbDTbc z9z7<(qOf!aWRXIWE;YC)PX&AksHDR*0xlIzOC)b9iB#b&GSc}-q(}*C7yBjV+_?Dk zwOG!km?MI><%zdd4i2))=ZwZqk(3_R-0A9EXK?kq>-~{S!o3SYer2}2_I$mvuDf_t z7g;mw76n!K`_+4eRQbz+-2@?OK^bvo5O&Rn=!h#9?Ci~%GCFFmeRVwRPEY({W1su% z!<}bcIxg({cqODHF_dzeKj~gBOuoDbjQ=wF9cfDtL(mUN+FEK>qH4w5ZV^fDFyfcg`B)}8~wWjYlk)ZCvyB=UXwzz$uNHbU-m-d zl9?33==OS}i>m9zu+2+(#ii8cu zw3Nk5PSE>$vo?L+p}ns#bLUC;tS{E$wK1h(=`LrP00X=eFxX;ZO%Xj+l+Z6BobmNA zfd@WId*o0`WNIEJ;bdH)+uP6nc=U2iVqanRvp#CCaEqG;x}Xg-7Ixh<<8W4Wd%RO+RxOGZFt$*F1?Jy>;bJU z6Av|fPBaWVs|Xv^;^W@Pqr1@iEc7*;t)yf2=|mfM;lXrJoo^TkTsL~@rdBCL45PDl zHE2KSFeoc%ew}2X3M02eKI$r(O0HWwU%W~sz7^8*fx=D>K6AF=_<&~Ial8{fp$3so z!(bu%CU}-T4tle0f#Os&C}tsNLhaJ`P?CVhf7pNFn2cS#BJy6x9u!+aqDZpGQP=3o zJ!Fq%Z&Kzh83&P0@84qdDMS=x%#YKj-*@7S+Y6&wHV*0@{fu2@KCgIC( z9EJ{>^7$=}$rm!@j1F6xIr-uN}L04et+umw@v>GIWGxrU=3hxhPN&r4Ks3J zagkeC50mES23Do#e>;c&31>k`wiI{8n6VBv`zy%PeH090Ab*PY$#wFrjl0~lzWcabiaB`U zcH0}!3O!7yV3`d(a#u*$1l}X$2{FS#K3Er$>S7YK_pzzX6=;uTZ?Z;9U!H47pv8x+ zs?U4)n$k^0tA~3%H^#_QRr&aq3?6ENJN%jj$Vd{87#z?6A^81k&~U>lkGLItc5wTE z^NY6=Oc85B?wBNS7x(_nLgcaCPbY8qz17}9{{J!hFXT+{hV)ejmTf23%Q+Zfuw3MJ z^T2qqPuUBEssEq+|2ggj6Oc=ijc+%}Z>}Wj_K-x-FoHc}9c+;RyGtZD$xlsL2|azg z(CdShcyxyYBp|BbI$b#Ra}uaLRfoPT>Ag25>A(~MbP~~#hyqm|ngzh`1fD!N)e-}f zCzZ>iuF)(lT=Fg|(_T+UziMYV2zo1uh`l6(L=|PieRco*H{c;YMWL5r#!ogQBoL;c z5dTXQ_Z=-|IN6@RMwou#ijdr^gy@=}(X*b!a3V$FORoN&FB>0Ug7yiY7w0fp31V0T zU;TqI1Xld+H5PLn0ujK=c8%Qlz`|pxfBRX5F&#`cekQ>cQgdB0@lNg6|i-l0_ zSpGZM?-z1-kv94h5^G~Tw=EZ8#MACJDFpQa3#ldSdB$(#06ruyJ*G|SHK;}hMj1wY zkLhHhgen^;z`kTWB(H$m++ydWIVPV{!cm`ky6>@+!?xy_SvPwBn4=!66i(4Zex2R2 zeIO`xxqFu(g@?toNA?3$zjB%;qZ7yXt=vj`+%2tTe(gg8{_%XITF?U}zC?7svmVDg z9ujBlN}&x)q6oW^9w(|QQvr`@MZX7xrUn>`#t4?PN7>XpD3)>3INuV%pcEb*`H;c4GPApTQcR))el<-0>@Q8T1t06AQEE+ou&wW&W|K{!*&x!}h>xuGjC+vI*l_-g) zWuNKF$Z;P19SHlsvit)%*ccbNM-D9W7vev?9Qw`1NuhuQ)=M5=_WZS?|LdmzaRTp&oAasFB6gLa6a3uOPdQ$%}+#c@S>+#7OZYQF`efcSHLMCLVJwq$6e(%${ z6)X>&61p)ft7PDWe%1$#0Z53bXeqqkDiKnqjeY+FTYNOy8hO|HMo!R_AuuzrRRG?M zV#D>7JVX)1R+1bqk#$?EHc7=DR$Mm6?m2RHs}NJmY8x?GK^!4?plxFQzukDhkgF3k zx)VC*MyHdGxha!RZViCp9uIsf*Z|C5exh)JLq&Gmds?6F`^ z-9Jg@pMOuUyB@s@?dK?Gd;5+|zK8I_+U3ts_VxhBU9sO+0^1)%=Dee9XTWIS;h{HU zwY`Z*?VQT&TR})Tl`Oey!p}GfV!9o%+NLWVRFo{*>n%bT52-03 zHB}}Bq3)FI#HZ|W!tZwqfkY~bPEVG1V|2Q{VGrqV6TIXsTYIEiaNU8>TV+P;-FZ~% zXkA-H}d z`To{=e=+p^ksI^rCW%ELQ4;hQF;-EQm!Nno>20+4hC1uM1rY2*;JduMt`>jz68@(p z?Oz1{xm>QA3X|e(qqln#m7c3`yAOD)?@E(`5%JUvWC?ph$@O0@{vVpKno=8>+{f(r zYI&vXxXDqx)FU*zGp8xFJ03mxjLiy29bLclLx^_(wXAGG&gS*s9ew=+)J!vXxkUE( zNQt(V%#>;heVea7NB6RDi4=8RT43U^0gcuBhgt)(UHQkmY|d0qN8(KVwx8&boeJ9H z>l-ls&#UU6PVO84%wr7cMMf1;Q!|VEC?W`J;-p}3XG#*6xbem<|Gc&T_tq?;8U=$* z&uDwgu;Z&eVg%=^32>>{uzX{kmuIRp`2zllW50=Vc(-eCgjS&Y%0b zKjJDd!)r({2AR_GDvMESc=(hI*U7!G52Qb34_tHjbJy@cL;7RZaI&{sCr%(uW?pA0 z5dMnfg?F#@XIXss?xDoMbRmjYZ|i&29`zB1pSmw>b%`;JGBQ{+LcSWaI7AJ*ZRjg6 zYaO;b(W-2S-jG>as~<9aFvWT7KSQ!VVIIGbYvgI8AF4fBiJ~KxZ6)#u5YJ>mA>No{Y4r|1^pI#2NiUt_;;i_p#3vX3Z={ z*^0o)_(^O8)!v3)!oDW+8#y2&rF&hTVp@0k`mIXH3`c1PF&Pujp$IVJ)Mtqlg!C;} zk^1+6c8vacza(^34qq_6L48U%TZQnT1%|XgME(==@plmY7jnnB$Zht@#Zh|~ch87e zOp8xqp-!?{d~!25S7_D_~&AgccdzT0$h9<3j%K}~&?;w?`UyMxUwdHhu{*Ff-? z&|b4npYnQnFcCTGJ(PHv_$RC1f2p{?kPAY#(Z1S?V3~!Bx+-uBZeZn^3M6aA`?9`c zG5@6k{X-TOuh#h%55Bg&;-mH)xnm4(;O&B!9co`MZ5|T;*tEv}`4*9~rd`&Re45mM zNcsPvg!+Y?4~mN%E}I`HTr@<(EsSuJ=#VKu4PL?;!2b4fKmuM=SMrVA#+|#n_`6zC z8}B+b!lk7?Twh87XdkHw_5}MAZI4&{h~|?C13WTb(AQ&MGwVnX{-G@W4T(8zr7qF$q!S)xv6&Gwxc$k{6URRB)$R?1riL| zcJ2Q#mi*HQ@(Z~bL>qM;g!2;*E)re>WEuD*j9Udb;LF1OX{z#f6!g&FG4KCzS^q)~ h3A9m(+{#nM7myBkY@d{|NZ@21OHhX_+QgG=;HtY literal 0 HcmV?d00001 diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts index 369a1668f97..385924a665e 100644 --- a/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts +++ b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts @@ -137,6 +137,18 @@ Registry.as(ConfigurationExtensions.Configuration).regis ...audioCueFeatureBase, default: 'off' }, + 'audioCues.save': { + 'description': localize('audioCues.save', "Plays a sound when a file is saved."), + 'type': 'string', + 'enum': ['userGesture', 'always', 'off'], + 'default': 'off', + 'enumDescriptions': [ + localize('audioCues.enabled.userGesture', "Plays the audio cue when a user explicitly saves a file."), + localize('audioCues.enabled.always', "Plays the audio cue whenever a file is saved, including auto save."), + localize('audioCues.enabled.off', "Disable audio cue.") + ], + tags: ['accessibility'] + }, }, }); diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts index 21cd019327c..ebd4ed9b647 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatClearActions.ts @@ -7,7 +7,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { localize } from 'vs/nls'; -import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; +import { AccessibleNotificationEvent, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; import { Action2, IAction2Options, MenuId, registerAction2 } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -118,5 +118,5 @@ export function getClearAction(viewId: string, providerId: string) { } function announceChatCleared(accessor: ServicesAccessor): void { - accessor.get(IAccessibleNotificationService).notifyCleared(); + accessor.get(IAccessibleNotificationService).notify(AccessibleNotificationEvent.Clear); } diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 5db4b41197d..7be4e8eb0bd 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -69,7 +69,7 @@ import { Variable } from 'vs/workbench/contrib/debug/common/debugModel'; import { ReplEvaluationResult, ReplGroup } from 'vs/workbench/contrib/debug/common/replModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { registerNavigableContainer } from 'vs/workbench/browser/actions/widgetNavigationCommands'; -import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; +import { AccessibleNotificationEvent, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; const $ = dom.$; @@ -978,7 +978,7 @@ registerAction2(class extends ViewAction { runInView(_accessor: ServicesAccessor, view: Repl): void { const accessibleNotificationService = _accessor.get(IAccessibleNotificationService); view.clearRepl(); - accessibleNotificationService.notifyCleared(); + accessibleNotificationService.notify(AccessibleNotificationEvent.Clear); } }); diff --git a/src/vs/workbench/contrib/output/browser/output.contribution.ts b/src/vs/workbench/contrib/output/browser/output.contribution.ts index c03fe479393..358b67f43e6 100644 --- a/src/vs/workbench/contrib/output/browser/output.contribution.ts +++ b/src/vs/workbench/contrib/output/browser/output.contribution.ts @@ -28,7 +28,7 @@ import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { Categories } from 'vs/platform/action/common/actionCommonCategories'; import { Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; +import { AccessibleNotificationEvent, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; // Register Service registerSingleton(IOutputService, OutputService, InstantiationType.Delayed); @@ -225,7 +225,7 @@ class OutputContribution extends Disposable implements IWorkbenchContribution { const activeChannel = outputService.getActiveChannel(); if (activeChannel) { activeChannel.clear(); - accessibleNotificationService.notifyCleared(); + accessibleNotificationService.notify(AccessibleNotificationEvent.Clear); } } })); diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index 1bb7bf8f194..3b3d418f5d4 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -43,7 +43,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { debounce } from 'vs/base/common/decorators'; import { MouseWheelClassifier } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { IMouseWheelEvent, StandardWheelEvent } from 'vs/base/browser/mouseEvent'; -import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; +import { AccessibleNotificationEvent, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; const enum RenderConstants { /** @@ -590,7 +590,7 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach // the prompt being written this._capabilities.get(TerminalCapability.CommandDetection)?.handlePromptStart(); this._capabilities.get(TerminalCapability.CommandDetection)?.handleCommandStart(); - this._accessibleNotificationService.notifyCleared(); + this._accessibleNotificationService.notify(AccessibleNotificationEvent.Clear); } hasSelection(): boolean { diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index dde1c5723e5..3f8e21a8300 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -33,6 +33,7 @@ import { IWorkspaceTrustRequestService, WorkspaceTrustUriResponse } from 'vs/pla import { IHostService } from 'vs/workbench/services/host/browser/host'; import { findGroup } from 'vs/workbench/services/editor/common/editorGroupFinder'; import { ITextEditorService } from 'vs/workbench/services/textfile/common/textEditorService'; +import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; export class EditorService extends Disposable implements EditorServiceImpl { @@ -70,7 +71,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { @IEditorResolverService private readonly editorResolverService: IEditorResolverService, @IWorkspaceTrustRequestService private readonly workspaceTrustRequestService: IWorkspaceTrustRequestService, @IHostService private readonly hostService: IHostService, - @ITextEditorService private readonly textEditorService: ITextEditorService + @ITextEditorService private readonly textEditorService: ITextEditorService, + @IAccessibleNotificationService private readonly accessibleNotificationService: IAccessibleNotificationService ) { super(); @@ -972,9 +974,12 @@ export class EditorService extends Disposable implements EditorServiceImpl { } } } - + const success = saveResults.every(result => !!result); + if (success) { + this.accessibleNotificationService.notifySaved(options?.reason === SaveReason.EXPLICIT); + } return { - success: saveResults.every(result => !!result), + success, editors: coalesce(saveResults) }; }