From 675014ed539b6943ed78bef600d891fd3ac5fa91 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Wed, 5 Jan 2022 15:42:42 +0100 Subject: [PATCH] Play a sound when the cursor enters a line with a breakpoint. --- build/filters.js | 5 +- src/vs/base/common/event.ts | 17 ++++ .../electron-browser/workbench/workbench.html | 2 +- .../electron-sandbox/workbench/workbench.html | 2 +- .../audioCues/browser/audioCueContribution.ts | 92 ++++++++++++++++++ .../browser/audioCues.contribution.ts | 29 ++++++ .../browser/media/breakpointHit.webm | Bin 0 -> 11224 bytes .../audioCues/browser/media/error.webm | Bin 0 -> 10910 bytes src/vs/workbench/workbench.common.main.ts | 3 + 9 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts create mode 100644 src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts create mode 100644 src/vs/workbench/contrib/audioCues/browser/media/breakpointHit.webm create mode 100644 src/vs/workbench/contrib/audioCues/browser/media/error.webm diff --git a/build/filters.js b/build/filters.js index 872ed47f9ea..6f746545e9b 100644 --- a/build/filters.js +++ b/build/filters.js @@ -32,7 +32,7 @@ module.exports.unicodeFilter = [ '!LICENSES.chromium.html', '!**/LICENSE', - '!**/*.{dll,exe,png,bmp,jpg,scpt,cur,ttf,woff,eot,template,ico,icns}', + '!**/*.{dll,exe,png,bmp,jpg,scpt,cur,ttf,woff,eot,template,ico,icns,webm}', '!**/test/**', '!**/*.test.ts', '!**/*.{d.ts,json,md}', @@ -108,7 +108,7 @@ module.exports.indentationFilter = [ '!src/vs/*/**/*.d.ts', '!src/typings/**/*.d.ts', '!extensions/**/*.d.ts', - '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist}', + '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist,webm}', '!build/{lib,download,linux,darwin}/**/*.js', '!build/**/*.sh', '!build/azure-pipelines/**/*.js', @@ -133,6 +133,7 @@ module.exports.copyrightFilter = [ '!**/*.bat', '!**/*.cmd', '!**/*.ico', + '!**/*.webm', '!**/*.icns', '!**/*.xml', '!**/*.sh', diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index ecbac6597a7..8160ace0dce 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -371,6 +371,23 @@ export namespace Event { handler(undefined); return event(e => handler(e)); } + + export function runAndSubscribeWithStore(event: Event, handler: (e: T | undefined, disposableStore: DisposableStore) => any): IDisposable { + let store: DisposableStore | null = null; + + function run(e: T | undefined) { + store?.dispose(); + store = new DisposableStore(); + handler(e, store); + } + + run(undefined); + const disposable = event(e => run(e)); + return toDisposable(() => { + disposable.dispose(); + store?.dispose(); + }); + } } export type Listener = [(e: T) => void, any] | ((e: T) => void); diff --git a/src/vs/code/electron-browser/workbench/workbench.html b/src/vs/code/electron-browser/workbench/workbench.html index 0efd6539960..47066f520be 100644 --- a/src/vs/code/electron-browser/workbench/workbench.html +++ b/src/vs/code/electron-browser/workbench/workbench.html @@ -3,7 +3,7 @@ - + diff --git a/src/vs/code/electron-sandbox/workbench/workbench.html b/src/vs/code/electron-sandbox/workbench/workbench.html index 0efd6539960..47066f520be 100644 --- a/src/vs/code/electron-sandbox/workbench/workbench.html +++ b/src/vs/code/electron-sandbox/workbench/workbench.html @@ -3,7 +3,7 @@ - + diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts b/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts new file mode 100644 index 00000000000..5a8184b1663 --- /dev/null +++ b/src/vs/workbench/contrib/audioCues/browser/audioCueContribution.ts @@ -0,0 +1,92 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IDebugService } from 'vs/workbench/contrib/debug/common/debug'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { Event } from 'vs/base/common/event'; +import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { raceTimeout } from 'vs/base/common/async'; +import { FileAccess } from 'vs/base/common/network'; +import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; + +export class AudioCueContribution extends DisposableStore implements IWorkbenchContribution { + constructor( + @IDebugService readonly debugService: IDebugService, + @IEditorService readonly editorService: IEditorService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IAccessibilityService private readonly accessibilityService: IAccessibilityService, + ) { + super(); + + this.add(Event.runAndSubscribeWithStore(editorService.onDidActiveEditorChange, (_, store) => { + let lastLineNumber = -1; + + const activeTextEditorControl = editorService.activeTextEditorControl; + if (isCodeEditor(activeTextEditorControl)) { + store.add( + activeTextEditorControl.onDidChangeCursorPosition(() => { + const model = activeTextEditorControl.getModel(); + if (!model) { + return; + } + const position = activeTextEditorControl.getPosition(); + if (!position) { + return; + } + const lineNumber = position.lineNumber; + if (lineNumber === lastLineNumber) { + return; + } + lastLineNumber = lineNumber; + + const uri = model.uri; + + const breakpoints = debugService.getModel().getBreakpoints({ uri, lineNumber }); + const hasBreakpoints = breakpoints.length > 0; + + if (hasBreakpoints) { + this.handleBreakpointOnLine(); + } + }) + ); + } + })); + } + + private get audioCuesEnabled(): boolean { + const value = this._configurationService.getValue<'smart' | 'on' | 'off'>('audioCues.enabled'); + if (value === 'on') { + return true; + } else if (value === 'smart') { + return this.accessibilityService.isScreenReaderOptimized(); + } else { + return false; + } + } + + public handleBreakpointOnLine(): void { + this.playSound('breakpointHit'); + } + + private async playSound(fileName: string) { + if (!this.audioCuesEnabled) { + return; + } + + const url = FileAccess.asBrowserUri(`vs/workbench/contrib/audioCues/browser/media/${fileName}.webm`, require).toString(); + const audio = new Audio(url); + + try { + // Don't play when loading takes more than 1s, due to loading, decoding or playing issues. + // Delayed sounds are very confusing. + await raceTimeout(audio.play(), 1000); + } catch (e) { + audio.remove(); + } + } +} diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts new file mode 100644 index 00000000000..7356c411cdd --- /dev/null +++ b/src/vs/workbench/contrib/audioCues/browser/audioCues.contribution.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from 'vs/nls'; +import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; +import { AudioCueContribution } from 'vs/workbench/contrib/audioCues/browser/audioCueContribution'; +import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; + +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(AudioCueContribution, LifecyclePhase.Eventually); + +Registry.as(ConfigurationExtensions.Configuration).registerConfiguration({ + 'properties': { + 'audioCues.enabled': { + 'type': 'string', + 'description': localize('audioCues.enabled', "Controls whether audio cues are enabled."), + 'enum': ['smart', 'on', 'off'], + 'default': 'smart', + 'enumDescriptions': [ + localize('audioCues.enabled.smart', "Enable audio cues when a screen reader is attached."), + localize('audioCues.enabled.on', "Enable audio cues."), + localize('audioCues.enabled.off', "Disable audio cues.") + ], + } + } +}); diff --git a/src/vs/workbench/contrib/audioCues/browser/media/breakpointHit.webm b/src/vs/workbench/contrib/audioCues/browser/media/breakpointHit.webm new file mode 100644 index 0000000000000000000000000000000000000000..030f938a0091bfa4b5bf17353922615d0849cf85 GIT binary patch literal 11224 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 DN0dP4 literal 0 HcmV?d00001 diff --git a/src/vs/workbench/contrib/audioCues/browser/media/error.webm b/src/vs/workbench/contrib/audioCues/browser/media/error.webm new file mode 100644 index 0000000000000000000000000000000000000000..fbaccf5b4399ab811230393e6d79f574eaf58c3a GIT binary patch literal 10910 zcmcI~1ydbevo0HVcMlRYXpo?LTGaChCfySs-FEJ$#7cXxLWZin~%&OP^@A8=RA zOjTD`_dNZq?x|WmO(?oim@5LxWHX(cWm_VZe+A)4{xnlA2j~As!d0oX`j8f7TcSR6m?}Ny%H;t7!T*TF$}Jzt z0D6tn|M-E>{MX(8kHMN`0?c%B`tKLf7e`7%16+~A3?LSfBh$Fa%&4C zyALSlg9W06VIrzZAQee@Ig!vL78ag=FD4FdHkN-E1O%DzAD8cr2VjUo&>9#5!vDqZ z6}!{+u_^nh4`yD5qNUPiCn)OaJ537px@yC&pRrXy5m)T^+YeYjCp^h)DuteJ`1s&- z^Evun95e4c2az?wWdoOj@)X}-@?h!u${@fEJ1?A`F!D8NY;=zz@4RI|`c}6&L%g>*k_R<=(PcW$(1MBAB3+(em_Ghn_U{LW)kzmdS);c*kXB~qYa$} zB>R-mnwVj1#R;6?BD&?5WGX40B+NGm4t3FN6IrXc2mXWvy7OC=Eu)f{>epj53X2>x zKU-W@RB>`Y`_!S2mNeY^C~E|_hv#rd8U7w+5rAnlUo^kl9J@{WC;bwQlwML+MD`oM z)La&V`oR!5{x8FUk_@!nR!cvLUs5$}kaR}X3$Deb8vTnn{<@7RwR^ALfp_?t0Mhv%~5^IDm zWY-DpD)5_*4m~{yI*%V9|w)zVh8=jJ!fj4EjOwUHa zIA;p)wG_C9$bS>VFtfJRTEud2ZVT19vP-$vY^W$oNg$_`OU;ETt2zC)>TX#b5hI)= z__f9MDYf(8vV?%ZhfDV-I0yw$0I!UP4Gqt9I&q+Q;hNthZ7{#tt^={?9=CgDFByMn zW3AlsU^K&KW^hzLOqLL~76rTFWBpZ;2Q{TdVFVuQZB%%6U=hJ_6$jz#LmLZCOrs9q zPt_aWNu0hezqjShGHEx%V?t_-tP)}RY6;0e?mplJXsmOu*Tdp{$q$SEJFJij&mBZk zr^yHv4l(x4lSD$s%Cus`=5=_&5ZeIA!Zd{-kvm;aP6fs4BM}6ILMQ|-fFbDoUj|o! zm_5F#*ho$|pYb&%@w%G7toJU!(v^gwJq6*tTU;oOfs`~h$-D<3^ZK5fO8(5+hRI-R z;sGg#IcM9bt%7eP^V`(fLr>1TmowxD{32s{lV--p_LS)28G8%5jGQ*+l9N29k=c?4 z04F!r)#+3UGT)9nJez4a?!^?JQkIG2&%ygM8Psu6t z`d(23LjtF?%te|)JpLYExwMF(_fMH2Q;mts^Sbt)gwFhSQ^_eFM;fdA- zTDrQB?PezW8jes)=W9IQNc))mVp@e-tyg$BsiNt`MIg<*?fngTy0Gy#vs0YE7Q*2sCJjRX$IGVfY6^#4pbv&FOqY-+xa6UpMU1?IewuZ zFKoNwtxlp23Q;tMWj223&P7pD;{RM!PE8r(}42jA}=+1$Z#p&Qmwg?Tr zMcjk>Za4l6B-66ECy@C>R=~K}^c+IE5|LXwV#>;5CTx1exCNGO-c6ex!sq7SgTuF_ z3@2ebpD}*kG!jUy)vapAFsOO46!0xihN@^qq|MvizfNH(6biQ~S(5(gBka>GU{s)1 z&u%o9^;z;u5! zjqhE~G2tv(19x|hZQOelQ0VcWMAZz6) z6jpT`r$6Z^J(ZH7DD@v~?6q2}JMA*=@C7`cA;zJjMZMaVxF%r})9~<;A&$Dpqy>2I zZ{_%71|+1DDUvdYMOQu4sOYiBwayw(_Q`=3a!~ePxhOQ#yxlEHI z3BznM^|#bvJ8S0T^X1bN`UIW%QvWB_goD{R;z=HWd)aP(N(WP>CH*|^ybyws;8mi4 zj3)#1QQq4Gs&FUYXZNh^Rh1tCTWTra6k!1*my0G#M}Uri6=t~!D%u<9fppFs>Q+%ivgI)ZJ!vl(U1@PKFk^e8 z|1EtfAvs`zh1YDOgpi3Zg89Cd?bNYb=G@s2nCZkP{dqb={t8dkt+<(`By}g+ z*~OLY`%F+n(JY&iy1jr zRfc)LOfAGLUMpE1Y*LM%zcP;E2j`hS%7sTKS~%$0?N{02JR&dLmf?&nCEs2$S949X zA0$exS(v?9Xw(JMUpEK1uJ;z+&dEr5Bf3V9(@P_!l4OKhOV`OJBand@3LeE>n@aQx zReWa;$n~(u;A9Z8^m0ZZa33kV$8kgLfSC7}aXbm)C{sJ|a6FeR1GGB4J)V6gKhgz+ zv=F?8bH0iVE64E^e22q>JJE@4w1SN7F@`aZiG6gEdA>&5=2Sz~Wu;=CJ2o(FaK%(n z3hze99_lBi7EQ;|+HDrhg=0-ga>od$0f{DWMfgO8YC)ZIE%rm2so97a5LBECIY@~Q zY@>wQd|n#bihr%+=4dhE>|kmt1i^zLqWxbcAMg$m%b?5_ncOyUhFkY7Z0^of+%vzE z#nZ>taatcT%oLseFt`QCh83@Fu%?E=Dl-WmC656q#q>q#bXJw31_|j?%I5#ZT864*`?+a2A zIQ3EzlqM8y{d9@%X5PLd6TCIYPphK0ik5qj*WM1 zRWDZJ3&&e>j0bDli55yVeZob`LCl^jgK~|9AQ&)2{zoEZlA#}%U-bR-K6O?V7OzG1*349cNa z<}ZJhLbF}5JJlQU-sQU~eYiC0_!*ZMNu`baMe4rN2S_0X!-fhIqut^;o$s{LtHiny zv#;rNIixmwEtrNE-yS#>;cAqz7(%#Vt4sgOvF3pqp^#OeU7MHw=J#OiQ-obOUVHqZ zHPki&0@rxW*|GcVa4OWZngp0-JdJ$+hxg2vs}V!)_bRyYdmPBWkAZTdzZ-)Qc@HP; zb*=NsPl@74eD9VfT^k8kBrE=`%N~)if0-Ib#3AA-1Yv<8>OXkse7Bk~VqzMad0N42 zOr08N_SHf@X88In;K3T4&6KuWAq|;)aCUKJLQ(`70cgyCmbV#hUACEy|u_Xrh8XlF=)+OJ8=EdUCL;7xN0K8HHRD^DPUM7qfU)(TA>5wICSqS&PDUdhe-wE1rl&m zjEIedchdH0yjqCn?v>8=mk4KC{H*Mcz%06b#izNi7~+xD&91V`Yr4QOYdUvHSRHZB z)d|_1IEH4s}SA-rgF;CUWkuiGzPc0 zw};-jR;maYJ3G53l+K*nU^XM(1gJ?dEe;$A*rz+B_{Xz1*8#QlkuIW)nNZ{yq0Qh; z%Mzir)!6RHN?fjX7BY4d{n%L;6NGEzqzvGSn?jz9nw&OUs3X?Z9)%p>;^zF+ynIum z8R7ai4#O&n`GGCsK*CGFRTiSN>F@4Nu92#{{0B>nV2HJk+{qbNbX|QwI{{Ap(W#M? zKxbX4G*zAJJ%QU!9M6ibi53;JH3z>lujhu2<$Uu<`W^pZrpzi0T4x?6X&AU9`D zs)b(?@k%_DSJVN`v8+Z~fh^VlcL4>ev>eWpZ=k>JZ`y5RrEn9K1(X| zBx$2(Dp&j+A~4*~*inYZkwW(EU%IaT{rY}dm(F2N0mJ8V6k8`{x=a|KUn2TKZ)pa( z!f2_xe~bEMHrcn03-FQd7i-*uO(AlBaFS}h@#^}sc^C9~?^&TIp1vK~E1{EarISfa zot7J4nx6gJVixwXh2L}vStpDPlMEh{f#JCs_%3S(`{hHoxWwFI~KGLH^9lDznf zmcNVoGKi<71(_h!Mg)VMbqq)F6ZKC)h(i30&(R(O-BPvz;Y$aCVl0m5i@9P$K%L^g zgbdzLzfVdCJNAGizQQ7-czf|ry8OM)NI`1xA_CZyDb;@<6%=v^7Dw*0?E|Mx*CayH z4kJ&aknz}Zy_kk{)rQb4TgPXy;v#=Mx$s=U6aAGvb)IBK?oK~Ss=gD(-!()D_NG6W z_hyN{RQBR71j&K{Fdx~~g&(G&sff%C^h**mPjjwZeQMpWlgIH#cJ2DaOyzCLQ6T)$iq7K4`g{_q%vM4md%@ zZRE~vLNOI?pZunURWmmd3Sk@UUaWUAmgB34;DFIzg_OmJlJ{KE*xaAkzwZ_2|0$`l z^@ci3gTiZ{p#W>&{JRaNFS5LQY`bGn6ZWlI7H7ycy`cn3ge_!!P(ybf)#)Li0Yhof z+*{}IdG|%GF4jqLzNOX6Ww^#|IMJvGbbpPERzk6K1l@O7rfy~i r~8G|CDbm5_O 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