From 245f62685aaeebff40ac6a315fee0d5bc4814947 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 9 Aug 2017 20:01:08 -0400
Subject: [PATCH 01/24] If bell() gets called emit bell event and add default
bell sound
---
src/InputHandler.ts | 7 ++++++-
src/utils/Bell.ts | 1 +
2 files changed, 7 insertions(+), 1 deletion(-)
create mode 100644 src/utils/Bell.ts
diff --git a/src/InputHandler.ts b/src/InputHandler.ts
index 61fe581e8b..2208d91ee2 100644
--- a/src/InputHandler.ts
+++ b/src/InputHandler.ts
@@ -7,6 +7,7 @@ import { C0 } from './EscapeSequences';
import { DEFAULT_CHARSET } from './Charsets';
import { CharData } from './Types';
import { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX } from './Buffer';
+import { Bell } from './utils/Bell';
/**
* The terminal's standard implementation of IInputHandler, this handles all
@@ -106,7 +107,11 @@ export class InputHandler implements IInputHandler {
* Bell (Ctrl-G).
*/
public bell(): void {
- if (!this._terminal.options.visualBell) {
+ this._terminal.emit('bell');
+ if (this._terminal.playDefaultBell) {
+ (new Audio(Bell)).play();
+ }
+ if (!this._terminal.visualBell) {
return;
}
this._terminal.element.style.borderColor = 'white';
diff --git a/src/utils/Bell.ts b/src/utils/Bell.ts
new file mode 100644
index 0000000000..f95bbdb0a8
--- /dev/null
+++ b/src/utils/Bell.ts
@@ -0,0 +1 @@
+export const Bell = 'data:audio/ogg;base64,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';
From 0eab4d68f6cbaec6e5564c5118200ee30eb8cdaf Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 9 Aug 2017 23:09:28 -0400
Subject: [PATCH 02/24] Rename Bell.ts to Sounds that has BellSound constant
---
src/InputHandler.ts | 2 +-
src/utils/Bell.ts | 1 -
src/utils/Sounds.ts | 1 +
3 files changed, 2 insertions(+), 2 deletions(-)
delete mode 100644 src/utils/Bell.ts
create mode 100644 src/utils/Sounds.ts
diff --git a/src/InputHandler.ts b/src/InputHandler.ts
index 2208d91ee2..4b633e7d3b 100644
--- a/src/InputHandler.ts
+++ b/src/InputHandler.ts
@@ -7,7 +7,7 @@ import { C0 } from './EscapeSequences';
import { DEFAULT_CHARSET } from './Charsets';
import { CharData } from './Types';
import { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX } from './Buffer';
-import { Bell } from './utils/Bell';
+import { BellSound } from './utils/Sounds';
/**
* The terminal's standard implementation of IInputHandler, this handles all
diff --git a/src/utils/Bell.ts b/src/utils/Bell.ts
deleted file mode 100644
index f95bbdb0a8..0000000000
--- a/src/utils/Bell.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const Bell = 'data:audio/ogg;base64,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';
diff --git a/src/utils/Sounds.ts b/src/utils/Sounds.ts
new file mode 100644
index 0000000000..2169aec5aa
--- /dev/null
+++ b/src/utils/Sounds.ts
@@ -0,0 +1 @@
+export const BellSound = 'data:audio/ogg;base64,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';
From fd51d0acf380f0a2008248e76d7d1705da09dd6c Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 9 Aug 2017 23:17:32 -0400
Subject: [PATCH 03/24] Preload bell audio
Allow the bellSound to be more easily configurable. You can pass false
to the bellSound and no sound will be played or you can pass it any
source you'd like.
---
src/InputHandler.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/InputHandler.ts b/src/InputHandler.ts
index 4b633e7d3b..6ee081d25f 100644
--- a/src/InputHandler.ts
+++ b/src/InputHandler.ts
@@ -108,8 +108,8 @@ export class InputHandler implements IInputHandler {
*/
public bell(): void {
this._terminal.emit('bell');
- if (this._terminal.playDefaultBell) {
- (new Audio(Bell)).play();
+ if (this._terminal.bellSound) {
+ this._terminal.bellAudioElement.play();
}
if (!this._terminal.visualBell) {
return;
From 6b46e0837fc35e9f0f2367bd1475e5274a3be1f1 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Thu, 10 Aug 2017 18:27:05 -0400
Subject: [PATCH 04/24] Move preloading bell audio to open() and append it the
the terminal element
---
src/Terminal.ts | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 8edb406d04..6cda1a6b1a 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -689,6 +689,14 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.viewportScrollArea.classList.add('xterm-scroll-area');
this.viewportElement.appendChild(this.viewportScrollArea);
+ // preload audio
+ if (this.options.bellSound) {
+ this.bellAudioElement = document.createElement('audio');
+ this.bellAudioElement.setAttribute('preload', 'auto');
+ this.bellAudioElement.setAttribute('src', this.options.bellSound);
+ this.element.appendChild(this.bellAudioElement);
+ }
+
// Create the selection container.
this.selectionContainer = document.createElement('div');
this.selectionContainer.classList.add('xterm-selection');
From 8a1f365a7ecdc8b46891f95ce2bb4c1f38fbf8ef Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 12 Aug 2017 11:28:29 -0400
Subject: [PATCH 05/24] Add ability to have a visual bell
---
demo/main.js | 3 ++-
src/Interfaces.ts | 6 +++---
src/Terminal.ts | 23 +++++++++++++++--------
src/Types.ts | 8 +++++---
src/utils/BellStyles.ts | 5 +++++
src/xterm.css | 6 +++---
6 files changed, 33 insertions(+), 18 deletions(-)
create mode 100644 src/utils/BellStyles.ts
diff --git a/demo/main.js b/demo/main.js
index 9098c2f02d..1464bcc64e 100644
--- a/demo/main.js
+++ b/demo/main.js
@@ -70,7 +70,8 @@ function createTerminal() {
term = new Terminal({
cursorBlink: optionElements.cursorBlink.checked,
scrollback: parseInt(optionElements.scrollback.value, 10),
- tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
+ tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10),
+ bellStyles: [1, 2]
});
term.on('resize', function (size) {
if (!pid) {
diff --git a/src/Interfaces.ts b/src/Interfaces.ts
index e9db3f9c5e..741ae09b4b 100644
--- a/src/Interfaces.ts
+++ b/src/Interfaces.ts
@@ -3,7 +3,7 @@
*/
import { ILinkMatcherOptions } from './Interfaces';
-import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData } from './Types';
+import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData, BellStylesEnum } from './Types';
export interface IBrowser {
isNode: boolean;
@@ -113,6 +113,8 @@ export interface IInputHandlingTerminal extends IEventEmitter {
}
export interface ITerminalOptions {
+ bellSound?: string;
+ bellStyles?: BellStylesEnum[];
cancelEvents?: boolean;
colors?: string[];
cols?: number;
@@ -123,14 +125,12 @@ export interface ITerminalOptions {
disableStdin?: boolean;
geometry?: [number, number];
handler?: (data: string) => void;
- popOnBell?: boolean;
rows?: number;
screenKeys?: boolean;
scrollback?: number;
tabStopWidth?: number;
termName?: string;
useFlowControl?: boolean;
- visualBell?: boolean;
}
export interface IBuffer {
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 6cda1a6b1a..5c9b51a2fe 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -39,6 +39,8 @@ import { CHARSETS } from './Charsets';
import { getRawByteCoords } from './utils/Mouse';
import { CustomKeyEventHandler, Charset, LinkMatcherHandler, LinkMatcherValidationCallback, CharData, LineData, Option, StringOption, BooleanOption, StringArrayOption, NumberOption, GeometryOption, HandlerOption } from './Types';
import { ITerminal, IBrowser, ITerminalOptions, IInputHandlingTerminal, ILinkMatcherOptions, IViewport, ICompositionHelper } from './Interfaces';
+import { BellSound } from './utils/Sounds';
+import { BellStyles } from './utils/BellStyles';
// Declare for RequireJS in loadAddon
declare var define: any;
@@ -147,8 +149,8 @@ const DEFAULT_OPTIONS: ITerminalOptions = {
geometry: [80, 24],
cursorBlink: false,
cursorStyle: 'block',
- visualBell: false,
- popOnBell: false,
+ bellSound: BellSound,
+ bellStyles: [BellStyles.Sound],
scrollback: 1000,
screenKeys: false,
debug: false,
@@ -1882,12 +1884,17 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
* Note: We could do sweet things with webaudio here
*/
public bell(): void {
- if (!this.options.visualBell) return;
- this.element.style.borderColor = 'white';
- setTimeout(() => {
- this.element.style.borderColor = '';
- }, 10);
- if (this.options.popOnBell) this.focus();
+ this.emit('bell');
+ if (this.options.bellStyles.indexOf(BellStyles.Sound) > -1) {
+ this.bellAudioElement.play();
+ }
+ if (this.options.bellStyles.indexOf(BellStyles.Visual) > -1) {
+ var cursor = this.element.querySelector('.terminal-cursor') as HTMLElement;
+ cursor.style.backgroundColor = "#fff";
+ setTimeout(function() {
+ cursor.style.backgroundColor = "#e6e6e6";
+ }, 200);
+ }
}
/**
diff --git a/src/Types.ts b/src/Types.ts
index 0de78d5261..e32f6295a5 100644
--- a/src/Types.ts
+++ b/src/Types.ts
@@ -2,6 +2,8 @@
* @license MIT
*/
+import { BellStyles } from './utils/BellStyles';
+
export type LinkMatcher = {
id: number,
regex: RegExp,
@@ -26,10 +28,8 @@ export type BooleanOption =
'cursorBlink' |
'debug' |
'disableStdin' |
- 'popOnBell' |
'screenKeys' |
- 'useFlowControl' |
- 'visualBell';
+ 'useFlowControl';
export type StringOption =
'cursorStyle' |
'termName';
@@ -41,3 +41,5 @@ export type NumberOption =
'scrollback';
export type GeometryOption = 'geometry';
export type HandlerOption = 'handler';
+
+export type BellStylesEnum = BellStyles;
diff --git a/src/utils/BellStyles.ts b/src/utils/BellStyles.ts
new file mode 100644
index 0000000000..5534ea5447
--- /dev/null
+++ b/src/utils/BellStyles.ts
@@ -0,0 +1,5 @@
+export enum BellStyles {
+ None,
+ Sound,
+ Visual
+}
diff --git a/src/xterm.css b/src/xterm.css
index 89daf9e3e1..299b1e37a4 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -94,12 +94,12 @@
}
.terminal:not(.focus) .terminal-cursor {
- outline: 1px solid #fff;
+ outline: 1px solid #e6e6e6;
outline-offset: -1px;
}
.terminal.xterm-cursor-style-block.focus:not(.xterm-cursor-blink-on) .terminal-cursor {
- background-color: #fff;
+ background-color: #e6e6e6;
color: #000;
}
@@ -107,7 +107,7 @@
.terminal.focus.xterm-cursor-style-underline:not(.xterm-cursor-blink-on) .terminal-cursor::before {
content: '';
position: absolute;
- background-color: #fff;
+ background-color: ##e6e6e6;
}
.terminal.focus.xterm-cursor-style-bar:not(.xterm-cursor-blink-on) .terminal-cursor::before {
From 44ed0b9cebaeeced6afcc6ebe193797ea876d8dd Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 12 Aug 2017 11:40:50 -0400
Subject: [PATCH 06/24] Dont hardcode as many color codes in xterm.ts
---
src/Terminal.ts | 3 ++-
src/xterm.css | 6 +++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 5c9b51a2fe..62449654ef 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -1890,9 +1890,10 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
}
if (this.options.bellStyles.indexOf(BellStyles.Visual) > -1) {
var cursor = this.element.querySelector('.terminal-cursor') as HTMLElement;
+ var originalBackground = cursor.style.backgroundColor;
cursor.style.backgroundColor = "#fff";
setTimeout(function() {
- cursor.style.backgroundColor = "#e6e6e6";
+ cursor.style.backgroundColor = originalBackground;
}, 200);
}
}
diff --git a/src/xterm.css b/src/xterm.css
index 299b1e37a4..7ccad12f7b 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -94,12 +94,12 @@
}
.terminal:not(.focus) .terminal-cursor {
- outline: 1px solid #e6e6e6;
+ outline: 1px solid #eeeeec;
outline-offset: -1px;
}
.terminal.xterm-cursor-style-block.focus:not(.xterm-cursor-blink-on) .terminal-cursor {
- background-color: #e6e6e6;
+ background-color: #eeeeec;
color: #000;
}
@@ -107,7 +107,7 @@
.terminal.focus.xterm-cursor-style-underline:not(.xterm-cursor-blink-on) .terminal-cursor::before {
content: '';
position: absolute;
- background-color: ##e6e6e6;
+ background-color: #eeeeec;
}
.terminal.focus.xterm-cursor-style-bar:not(.xterm-cursor-blink-on) .terminal-cursor::before {
From 8c94ef8aa09eb478098b99f0698ac8ff1fe7373b Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sun, 13 Aug 2017 16:05:37 -0400
Subject: [PATCH 07/24] Clear out any existing vidualBellTimers. Set colors
back to all white.
Use visual class instead of setting colors codes in js.
---
src/Terminal.ts | 15 ++++++++-------
src/xterm.css | 10 +++++++---
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 62449654ef..e9b499b1f4 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -150,7 +150,7 @@ const DEFAULT_OPTIONS: ITerminalOptions = {
cursorBlink: false,
cursorStyle: 'block',
bellSound: BellSound,
- bellStyles: [BellStyles.Sound],
+ bellStyles: [BellStyles.Sound, BellStyles.Visual],
scrollback: 1000,
screenKeys: false,
debug: false,
@@ -180,6 +180,8 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
private helperContainer: HTMLElement;
private compositionView: HTMLElement;
private charSizeStyleElement: HTMLStyleElement;
+ private bellAudioElement: HTMLAudioElement;
+ private visualBellTimer: number;
public browser: IBrowser = Browser;
@@ -692,7 +694,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.viewportElement.appendChild(this.viewportScrollArea);
// preload audio
- if (this.options.bellSound) {
+ if (this.options.bellStyles.indexOf(BellStyles.Sound) > -1) {
this.bellAudioElement = document.createElement('audio');
this.bellAudioElement.setAttribute('preload', 'auto');
this.bellAudioElement.setAttribute('src', this.options.bellSound);
@@ -1889,11 +1891,10 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.bellAudioElement.play();
}
if (this.options.bellStyles.indexOf(BellStyles.Visual) > -1) {
- var cursor = this.element.querySelector('.terminal-cursor') as HTMLElement;
- var originalBackground = cursor.style.backgroundColor;
- cursor.style.backgroundColor = "#fff";
- setTimeout(function() {
- cursor.style.backgroundColor = originalBackground;
+ this.element.classList.add("visual-bell-active");
+ clearTimeout(this.visualBellTimer);
+ this.visualBellTimer = window.setTimeout(() => {
+ this.element.classList.remove("visual-bell-active");
}, 200);
}
}
diff --git a/src/xterm.css b/src/xterm.css
index 7ccad12f7b..0996742b39 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -94,12 +94,12 @@
}
.terminal:not(.focus) .terminal-cursor {
- outline: 1px solid #eeeeec;
+ outline: 1px solid #fff;
outline-offset: -1px;
}
.terminal.xterm-cursor-style-block.focus:not(.xterm-cursor-blink-on) .terminal-cursor {
- background-color: #eeeeec;
+ background-color: #fff;
color: #000;
}
@@ -107,7 +107,7 @@
.terminal.focus.xterm-cursor-style-underline:not(.xterm-cursor-blink-on) .terminal-cursor::before {
content: '';
position: absolute;
- background-color: #eeeeec;
+ background-color: #fff;
}
.terminal.focus.xterm-cursor-style-bar:not(.xterm-cursor-blink-on) .terminal-cursor::before {
@@ -124,6 +124,10 @@
height: 1px;
}
+.visual-bell-active .terminal-cursor {
+ background-color: #fff !important;
+}
+
.terminal .composition-view {
background: #000;
color: #FFF;
From 3027b1d3d491d14250aa9280087c5f690a0621c6 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sun, 13 Aug 2017 16:07:27 -0400
Subject: [PATCH 08/24] Set the visual bell color to a light gray
---
src/xterm.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xterm.css b/src/xterm.css
index 0996742b39..32f2a7c810 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -125,7 +125,7 @@
}
.visual-bell-active .terminal-cursor {
- background-color: #fff !important;
+ background-color: #ccc !important;
}
.terminal .composition-view {
From 96c9d50ee292bf65bfcbbe43930c76a44beaec3f Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sun, 13 Aug 2017 16:09:06 -0400
Subject: [PATCH 09/24] Fix some quote lints
---
src/Terminal.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index e9b499b1f4..69d5c90836 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -1891,10 +1891,10 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.bellAudioElement.play();
}
if (this.options.bellStyles.indexOf(BellStyles.Visual) > -1) {
- this.element.classList.add("visual-bell-active");
+ this.element.classList.add('visual-bell-active');
clearTimeout(this.visualBellTimer);
this.visualBellTimer = window.setTimeout(() => {
- this.element.classList.remove("visual-bell-active");
+ this.element.classList.remove('visual-bell-active');
}, 200);
}
}
From d8717d64bac4f522a60ca599663f2be894c97ca2 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Mon, 14 Aug 2017 18:11:22 -0400
Subject: [PATCH 10/24] Add visual bell styling for underline and bar cursor
types
---
src/xterm.css | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/xterm.css b/src/xterm.css
index 32f2a7c810..0da9e04103 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -91,6 +91,7 @@
.terminal .terminal-cursor {
position: relative;
+ transition: background-color 150ms ease;
}
.terminal:not(.focus) .terminal-cursor {
@@ -108,6 +109,7 @@
content: '';
position: absolute;
background-color: #fff;
+ transition: background-color 150ms ease;
}
.terminal.focus.xterm-cursor-style-bar:not(.xterm-cursor-blink-on) .terminal-cursor::before {
@@ -124,9 +126,13 @@
height: 1px;
}
-.visual-bell-active .terminal-cursor {
+.terminal.focus.xterm-cursor-style-block.visual-bell-active .terminal-cursor {
background-color: #ccc !important;
}
+.terminal.focus.xterm-cursor-style-bar.visual-bell-active .terminal-cursor::before,
+.terminal.focus.xterm-cursor-style-underline.visual-bell-active .terminal-cursor::before {
+ background-color: transparent;
+}
.terminal .composition-view {
background: #000;
From 2f1380a31d4872d20f934f59083de07c7a6360f2 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 16 Aug 2017 19:13:29 -0400
Subject: [PATCH 11/24] Make bellStyle singular. Preload sound on option
setting. Use strings as options
---
demo/main.js | 3 +--
src/Interfaces.ts | 4 ++--
src/Terminal.ts | 36 ++++++++++++++++++++++++++----------
src/Types.ts | 5 +----
src/utils/BellStyles.ts | 5 -----
5 files changed, 30 insertions(+), 23 deletions(-)
delete mode 100644 src/utils/BellStyles.ts
diff --git a/demo/main.js b/demo/main.js
index 1464bcc64e..9098c2f02d 100644
--- a/demo/main.js
+++ b/demo/main.js
@@ -70,8 +70,7 @@ function createTerminal() {
term = new Terminal({
cursorBlink: optionElements.cursorBlink.checked,
scrollback: parseInt(optionElements.scrollback.value, 10),
- tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10),
- bellStyles: [1, 2]
+ tabStopWidth: parseInt(optionElements.tabstopwidth.value, 10)
});
term.on('resize', function (size) {
if (!pid) {
diff --git a/src/Interfaces.ts b/src/Interfaces.ts
index 741ae09b4b..9ab16c3c7b 100644
--- a/src/Interfaces.ts
+++ b/src/Interfaces.ts
@@ -3,7 +3,7 @@
*/
import { ILinkMatcherOptions } from './Interfaces';
-import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData, BellStylesEnum } from './Types';
+import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData } from './Types';
export interface IBrowser {
isNode: boolean;
@@ -114,7 +114,7 @@ export interface IInputHandlingTerminal extends IEventEmitter {
export interface ITerminalOptions {
bellSound?: string;
- bellStyles?: BellStylesEnum[];
+ bellStyle?: string[];
cancelEvents?: boolean;
colors?: string[];
cols?: number;
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 69d5c90836..fae8e380a1 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -40,7 +40,6 @@ import { getRawByteCoords } from './utils/Mouse';
import { CustomKeyEventHandler, Charset, LinkMatcherHandler, LinkMatcherValidationCallback, CharData, LineData, Option, StringOption, BooleanOption, StringArrayOption, NumberOption, GeometryOption, HandlerOption } from './Types';
import { ITerminal, IBrowser, ITerminalOptions, IInputHandlingTerminal, ILinkMatcherOptions, IViewport, ICompositionHelper } from './Interfaces';
import { BellSound } from './utils/Sounds';
-import { BellStyles } from './utils/BellStyles';
// Declare for RequireJS in loadAddon
declare var define: any;
@@ -150,7 +149,7 @@ const DEFAULT_OPTIONS: ITerminalOptions = {
cursorBlink: false,
cursorStyle: 'block',
bellSound: BellSound,
- bellStyles: [BellStyles.Sound, BellStyles.Visual],
+ bellStyle: null,
scrollback: 1000,
screenKeys: false,
debug: false,
@@ -486,6 +485,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.viewport.syncScrollArea();
break;
case 'tabStopWidth': this.setupStops(); break;
+ case 'bellStyle': this.preloadBellSound(); break;
}
}
@@ -694,12 +694,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.viewportElement.appendChild(this.viewportScrollArea);
// preload audio
- if (this.options.bellStyles.indexOf(BellStyles.Sound) > -1) {
- this.bellAudioElement = document.createElement('audio');
- this.bellAudioElement.setAttribute('preload', 'auto');
- this.bellAudioElement.setAttribute('src', this.options.bellSound);
- this.element.appendChild(this.bellAudioElement);
- }
+ this.preloadBellSound()
// Create the selection container.
this.selectionContainer = document.createElement('div');
@@ -1887,10 +1882,10 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
*/
public bell(): void {
this.emit('bell');
- if (this.options.bellStyles.indexOf(BellStyles.Sound) > -1) {
+ if (this.soundBell()) {
this.bellAudioElement.play();
}
- if (this.options.bellStyles.indexOf(BellStyles.Visual) > -1) {
+ if (this.visualBell()) {
this.element.classList.add('visual-bell-active');
clearTimeout(this.visualBellTimer);
this.visualBellTimer = window.setTimeout(() => {
@@ -2288,6 +2283,27 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
return matchColorCache[hash] = li;
}
+
+ private visualBell() {
+ var styles = [].concat.apply([], [this.options.bellStyle]);
+
+ return styles.indexOf('visual') > -1 || styles.indexOf('both') > -1
+ }
+
+ private soundBell() {
+ var styles = [].concat.apply([], [this.options.bellStyle]);
+
+ return styles.indexOf('sound') > -1 || styles.indexOf('both') > -1
+ }
+
+ private preloadBellSound() {
+ if (this.soundBell()) {
+ this.bellAudioElement = document.createElement('audio');
+ this.bellAudioElement.setAttribute('preload', 'auto');
+ this.bellAudioElement.setAttribute('src', this.options.bellSound);
+ this.element.appendChild(this.bellAudioElement);
+ }
+ }
}
/**
diff --git a/src/Types.ts b/src/Types.ts
index e32f6295a5..c287030db6 100644
--- a/src/Types.ts
+++ b/src/Types.ts
@@ -2,8 +2,6 @@
* @license MIT
*/
-import { BellStyles } from './utils/BellStyles';
-
export type LinkMatcher = {
id: number,
regex: RegExp,
@@ -32,6 +30,7 @@ export type BooleanOption =
'useFlowControl';
export type StringOption =
'cursorStyle' |
+ 'bellStyle' |
'termName';
export type StringArrayOption = 'colors';
export type NumberOption =
@@ -41,5 +40,3 @@ export type NumberOption =
'scrollback';
export type GeometryOption = 'geometry';
export type HandlerOption = 'handler';
-
-export type BellStylesEnum = BellStyles;
diff --git a/src/utils/BellStyles.ts b/src/utils/BellStyles.ts
deleted file mode 100644
index 5534ea5447..0000000000
--- a/src/utils/BellStyles.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export enum BellStyles {
- None,
- Sound,
- Visual
-}
From c41bd81526be41650af1c72e0d065e50ff61b020 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 16 Aug 2017 19:29:35 -0400
Subject: [PATCH 12/24] Swap out bell sound for a free one
---
src/utils/Sounds.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/utils/Sounds.ts b/src/utils/Sounds.ts
index 2169aec5aa..65c20c3c6e 100644
--- a/src/utils/Sounds.ts
+++ b/src/utils/Sounds.ts
@@ -1 +1 @@
-export const BellSound = 'data:audio/ogg;base64,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';
+export const BellSound = 'data:audio/flac;base64,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';
From 3beb1f5c7c1e2c0b38c92ae590dc44132b741ac3 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 16 Aug 2017 19:32:22 -0400
Subject: [PATCH 13/24] Add return types on new private functions
---
src/Terminal.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index fae8e380a1..d344a96465 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2284,19 +2284,19 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
return matchColorCache[hash] = li;
}
- private visualBell() {
+ private visualBell(): boolean {
var styles = [].concat.apply([], [this.options.bellStyle]);
return styles.indexOf('visual') > -1 || styles.indexOf('both') > -1
}
- private soundBell() {
+ private soundBell(): boolean {
var styles = [].concat.apply([], [this.options.bellStyle]);
return styles.indexOf('sound') > -1 || styles.indexOf('both') > -1
}
- private preloadBellSound() {
+ private preloadBellSound(): void {
if (this.soundBell()) {
this.bellAudioElement = document.createElement('audio');
this.bellAudioElement.setAttribute('preload', 'auto');
From 1d6f71d6808313b8bed944e1cb5da01c3b63c555 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 16 Aug 2017 20:31:29 -0400
Subject: [PATCH 14/24] Fix bad merge
---
src/InputHandler.ts | 13 +------------
src/Interfaces.ts | 1 +
src/Terminal.ts | 5 ++---
src/utils/TestUtils.test.ts | 4 ++++
4 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/src/InputHandler.ts b/src/InputHandler.ts
index 6ee081d25f..3ec2aaf389 100644
--- a/src/InputHandler.ts
+++ b/src/InputHandler.ts
@@ -107,18 +107,7 @@ export class InputHandler implements IInputHandler {
* Bell (Ctrl-G).
*/
public bell(): void {
- this._terminal.emit('bell');
- if (this._terminal.bellSound) {
- this._terminal.bellAudioElement.play();
- }
- if (!this._terminal.visualBell) {
- return;
- }
- this._terminal.element.style.borderColor = 'white';
- setTimeout(() => this._terminal.element.style.borderColor = '', 10);
- if (this._terminal.options.popOnBell) {
- this._terminal.focus();
- }
+ this._terminal.bell();
}
/**
diff --git a/src/Interfaces.ts b/src/Interfaces.ts
index 9ab16c3c7b..22531fa354 100644
--- a/src/Interfaces.ts
+++ b/src/Interfaces.ts
@@ -87,6 +87,7 @@ export interface IInputHandlingTerminal extends IEventEmitter {
viewport: IViewport;
selectionManager: ISelectionManager;
+ bell(): void;
focus(): void;
convertEol: boolean;
updateRange(y: number): void;
diff --git a/src/Terminal.ts b/src/Terminal.ts
index d344a96465..7e3b9a2dbb 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -1882,9 +1882,8 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
*/
public bell(): void {
this.emit('bell');
- if (this.soundBell()) {
- this.bellAudioElement.play();
- }
+ if (this.soundBell()) this.bellAudioElement.play();
+
if (this.visualBell()) {
this.element.classList.add('visual-bell-active');
clearTimeout(this.visualBellTimer);
diff --git a/src/utils/TestUtils.test.ts b/src/utils/TestUtils.test.ts
index 8e18c1f47f..8d47556093 100644
--- a/src/utils/TestUtils.test.ts
+++ b/src/utils/TestUtils.test.ts
@@ -97,6 +97,10 @@ export class MockInputHandlingTerminal implements IInputHandlingTerminal {
throw new Error('Method not implemented.');
}
convertEol: boolean;
+ bell(): void {
+ throw new Error('Method not implemented.');
+ }
+
updateRange(y: number): void {
throw new Error('Method not implemented.');
}
From 0bb5ff8b091f3122104f3d3b04487a6594a23bcb Mon Sep 17 00:00:00 2001
From: npezza93
Date: Wed, 16 Aug 2017 21:00:57 -0400
Subject: [PATCH 15/24] Fix lints
---
src/Terminal.ts | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 7e3b9a2dbb..38235ee213 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -694,7 +694,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.viewportElement.appendChild(this.viewportScrollArea);
// preload audio
- this.preloadBellSound()
+ this.preloadBellSound();
// Create the selection container.
this.selectionContainer = document.createElement('div');
@@ -2284,15 +2284,15 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
}
private visualBell(): boolean {
- var styles = [].concat.apply([], [this.options.bellStyle]);
+ let styles = [].concat.apply([], [this.options.bellStyle]);
- return styles.indexOf('visual') > -1 || styles.indexOf('both') > -1
+ return styles.indexOf('visual') > -1 || styles.indexOf('both') > -1;
}
private soundBell(): boolean {
- var styles = [].concat.apply([], [this.options.bellStyle]);
+ let styles = [].concat.apply([], [this.options.bellStyle]);
- return styles.indexOf('sound') > -1 || styles.indexOf('both') > -1
+ return styles.indexOf('sound') > -1 || styles.indexOf('both') > -1;
}
private preloadBellSound(): void {
From c88f50125bffdd09a1004d804a6edc55c7439199 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Thu, 17 Aug 2017 18:02:12 -0400
Subject: [PATCH 16/24] Add a bellStyle dropdown in the demo
---
demo/index.html | 11 +++++++++++
demo/main.js | 6 +++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/demo/index.html b/demo/index.html
index ee765c2057..daa60b6f5e 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -38,6 +38,17 @@ Options
+
+
+
diff --git a/demo/main.js b/demo/main.js
index 9098c2f02d..cb346de2af 100644
--- a/demo/main.js
+++ b/demo/main.js
@@ -15,7 +15,8 @@ var terminalContainer = document.getElementById('terminal-container'),
cursorBlink: document.querySelector('#option-cursor-blink'),
cursorStyle: document.querySelector('#option-cursor-style'),
scrollback: document.querySelector('#option-scrollback'),
- tabstopwidth: document.querySelector('#option-tabstopwidth')
+ tabstopwidth: document.querySelector('#option-tabstopwidth'),
+ bellStyle: document.querySelector('#option-bell-style')
},
colsElement = document.getElementById('cols'),
rowsElement = document.getElementById('rows');
@@ -53,6 +54,9 @@ optionElements.cursorBlink.addEventListener('change', function () {
optionElements.cursorStyle.addEventListener('change', function () {
term.setOption('cursorStyle', optionElements.cursorStyle.value);
});
+optionElements.bellStyle.addEventListener('change', function () {
+ term.setOption('bellStyle', optionElements.bellStyle.value);
+});
optionElements.scrollback.addEventListener('change', function () {
term.setOption('scrollback', parseInt(optionElements.scrollback.value, 10));
});
From 8a6bff42c9afd116333880e6c05e1c2fb5583d9d Mon Sep 17 00:00:00 2001
From: npezza93
Date: Thu, 17 Aug 2017 18:27:49 -0400
Subject: [PATCH 17/24] Remove bellAudioElement if it is not used. Remove extra
import
---
src/InputHandler.ts | 1 -
src/Terminal.ts | 2 ++
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/InputHandler.ts b/src/InputHandler.ts
index 3ec2aaf389..f2d9775113 100644
--- a/src/InputHandler.ts
+++ b/src/InputHandler.ts
@@ -7,7 +7,6 @@ import { C0 } from './EscapeSequences';
import { DEFAULT_CHARSET } from './Charsets';
import { CharData } from './Types';
import { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX } from './Buffer';
-import { BellSound } from './utils/Sounds';
/**
* The terminal's standard implementation of IInputHandler, this handles all
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 38235ee213..ac00f390ff 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2301,6 +2301,8 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.bellAudioElement.setAttribute('preload', 'auto');
this.bellAudioElement.setAttribute('src', this.options.bellSound);
this.element.appendChild(this.bellAudioElement);
+ } else if (this.bellAudioElement) {
+ this.bellAudioElement.remove();
}
}
}
From 68cd79db34c0c871ebae2ed3360ccd89f8b56b35 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Thu, 17 Aug 2017 19:44:37 -0400
Subject: [PATCH 18/24] Set bellStyle to a string type instead of an array of
strings
---
src/Interfaces.ts | 2 +-
src/Terminal.ts | 8 ++------
2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/Interfaces.ts b/src/Interfaces.ts
index 22531fa354..943003aec3 100644
--- a/src/Interfaces.ts
+++ b/src/Interfaces.ts
@@ -115,7 +115,7 @@ export interface IInputHandlingTerminal extends IEventEmitter {
export interface ITerminalOptions {
bellSound?: string;
- bellStyle?: string[];
+ bellStyle?: string;
cancelEvents?: boolean;
colors?: string[];
cols?: number;
diff --git a/src/Terminal.ts b/src/Terminal.ts
index ac00f390ff..82bb958922 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2284,15 +2284,11 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
}
private visualBell(): boolean {
- let styles = [].concat.apply([], [this.options.bellStyle]);
-
- return styles.indexOf('visual') > -1 || styles.indexOf('both') > -1;
+ return this.options.bellStyle == 'visual' || this.options.bellStyle == 'both';
}
private soundBell(): boolean {
- let styles = [].concat.apply([], [this.options.bellStyle]);
-
- return styles.indexOf('sound') > -1 || styles.indexOf('both') > -1;
+ return this.options.bellStyle == 'sound' || this.options.bellStyle == 'both';
}
private preloadBellSound(): void {
From b0164e1f964d46cdd18f4267336965299f0cafd0 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 19 Aug 2017 08:38:19 -0400
Subject: [PATCH 19/24] Update bell sound
---
src/utils/Sounds.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/utils/Sounds.ts b/src/utils/Sounds.ts
index 65c20c3c6e..413a7a29e3 100644
--- a/src/utils/Sounds.ts
+++ b/src/utils/Sounds.ts
@@ -1 +1 @@
-export const BellSound = 'data:audio/flac;base64,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';
+export const BellSound = 'data:audio/wav;base64,UklGRigBAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQQBAADpAFgCwAMlBZoG/wdmCcoKRAypDQ8PbRDBEQQTOxRtFYcWlBePGIUZXhoiG88bcBz7HHIdzh0WHlMeZx51HmkeUx4WHs8dah0AHXwc3hs9G4saxRnyGBIYGBcQFv8U4RPAEoYRQBACD70NWwwHC6gJOwjWBloF7gOBAhABkf8b/qv8R/ve+Xf4Ife79W/0JfPZ8Z/wde9N7ijtE+wU6xvqM+lb6H7nw+YX5mrlxuQz5Mzje+Ma49fioeKD4nXiYeJy4pHitOL04j/jn+MN5IPkFOWs5U3mDefM55/ogOl36m7rdOyE7abuyu8D8Unyj/Pg9D/2qfcb+Yn6/vuK/Qj/lAAlAg==';
From 668b25eeb25e2bad7eef10f56a7be1ee8fb24580 Mon Sep 17 00:00:00 2001
From: Daniel Imms
Date: Sat, 19 Aug 2017 11:03:58 -0700
Subject: [PATCH 20/24] Fix license info and lint
---
src/Terminal.ts | 6 ++++--
src/utils/Sounds.ts | 8 ++++++++
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 82bb958922..93524abe55 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2284,11 +2284,13 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
}
private visualBell(): boolean {
- return this.options.bellStyle == 'visual' || this.options.bellStyle == 'both';
+ return this.options.bellStyle === 'visual' ||
+ this.options.bellStyle === 'both';
}
private soundBell(): boolean {
- return this.options.bellStyle == 'sound' || this.options.bellStyle == 'both';
+ return this.options.bellStyle === 'sound' ||
+ this.options.bellStyle === 'both';
}
private preloadBellSound(): void {
diff --git a/src/utils/Sounds.ts b/src/utils/Sounds.ts
index 413a7a29e3..6d20c67122 100644
--- a/src/utils/Sounds.ts
+++ b/src/utils/Sounds.ts
@@ -1 +1,9 @@
+/**
+ * @license MIT
+ */
+
+// Source: https://freesound.org/people/altemark/sounds/45759/
+// This sound is released under the Creative Commons Attribution 3.0 Unported
+// (CC BY 3.0) license. It was created by 'altemark'. No modifications have been
+// made, apart from the conversion to base64.
export const BellSound = 'data:audio/wav;base64,UklGRigBAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQQBAADpAFgCwAMlBZoG/wdmCcoKRAypDQ8PbRDBEQQTOxRtFYcWlBePGIUZXhoiG88bcBz7HHIdzh0WHlMeZx51HmkeUx4WHs8dah0AHXwc3hs9G4saxRnyGBIYGBcQFv8U4RPAEoYRQBACD70NWwwHC6gJOwjWBloF7gOBAhABkf8b/qv8R/ve+Xf4Ife79W/0JfPZ8Z/wde9N7ijtE+wU6xvqM+lb6H7nw+YX5mrlxuQz5Mzje+Ma49fioeKD4nXiYeJy4pHitOL04j/jn+MN5IPkFOWs5U3mDefM55/ogOl36m7rdOyE7abuyu8D8Unyj/Pg9D/2qfcb+Yn6/vuK/Qj/lAAlAg==';
From 147fef74c6101c22b0863daa2009181266f46946 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 19 Aug 2017 15:16:21 -0400
Subject: [PATCH 21/24] Use removeChild instead of remove for compatibility
---
src/Terminal.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index 93524abe55..a2129079f1 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2300,7 +2300,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.bellAudioElement.setAttribute('src', this.options.bellSound);
this.element.appendChild(this.bellAudioElement);
} else if (this.bellAudioElement) {
- this.bellAudioElement.remove();
+ this.element.removeChild(this.bellAudioElement);
}
}
}
From 121143515a475f0d2d2baa757beb7194dab32ee3 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 19 Aug 2017 15:17:04 -0400
Subject: [PATCH 22/24] Change opacity on visual bell instead of
background-color
---
src/xterm.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xterm.css b/src/xterm.css
index 0da9e04103..7b9de5ee1e 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -127,7 +127,7 @@
}
.terminal.focus.xterm-cursor-style-block.visual-bell-active .terminal-cursor {
- background-color: #ccc !important;
+ opacity: 0.5;
}
.terminal.focus.xterm-cursor-style-bar.visual-bell-active .terminal-cursor::before,
.terminal.focus.xterm-cursor-style-underline.visual-bell-active .terminal-cursor::before {
From 42c3eff3f7402d41c06655174a8e87dd9dfb90c3 Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 19 Aug 2017 15:55:19 -0400
Subject: [PATCH 23/24] Update css transitions
---
src/xterm.css | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/xterm.css b/src/xterm.css
index 7b9de5ee1e..14b0a58d4e 100644
--- a/src/xterm.css
+++ b/src/xterm.css
@@ -91,7 +91,7 @@
.terminal .terminal-cursor {
position: relative;
- transition: background-color 150ms ease;
+ transition: opacity 150ms ease;
}
.terminal:not(.focus) .terminal-cursor {
@@ -109,7 +109,7 @@
content: '';
position: absolute;
background-color: #fff;
- transition: background-color 150ms ease;
+ transition: opacity 150ms ease;
}
.terminal.focus.xterm-cursor-style-bar:not(.xterm-cursor-blink-on) .terminal-cursor::before {
@@ -131,7 +131,7 @@
}
.terminal.focus.xterm-cursor-style-bar.visual-bell-active .terminal-cursor::before,
.terminal.focus.xterm-cursor-style-underline.visual-bell-active .terminal-cursor::before {
- background-color: transparent;
+ opacity: 0;
}
.terminal .composition-view {
From 1f930c112b68de79603b52c7370ea21ad45c50ec Mon Sep 17 00:00:00 2001
From: npezza93
Date: Sat, 19 Aug 2017 15:56:58 -0400
Subject: [PATCH 24/24] Add bellAudioElement to helperContainer instead of
element
---
src/Terminal.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Terminal.ts b/src/Terminal.ts
index a2129079f1..98780f5c26 100644
--- a/src/Terminal.ts
+++ b/src/Terminal.ts
@@ -2298,9 +2298,9 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT
this.bellAudioElement = document.createElement('audio');
this.bellAudioElement.setAttribute('preload', 'auto');
this.bellAudioElement.setAttribute('src', this.options.bellSound);
- this.element.appendChild(this.bellAudioElement);
+ this.helperContainer.appendChild(this.bellAudioElement);
} else if (this.bellAudioElement) {
- this.element.removeChild(this.bellAudioElement);
+ this.helperContainer.removeChild(this.bellAudioElement);
}
}
}