import { hterm, lib } from 'hterm-umdjs'; hterm.defaultStorage = new lib.Storage.Memory(); // override double click behavior to copy const oldMouse = hterm.Terminal.prototype.onMouse_; hterm.Terminal.prototype.onMouse_ = function (e) { if ('dblclick' === e.type) { console.log('[hyperterm+hterm] ignore double click'); return; } return oldMouse.call(this, e); }; // there's no option to turn off the size overlay hterm.Terminal.prototype.overlaySize = function () {}; // fixing a bug in hterm where a double click triggers // a non-collapsed selection whose text is '', and results // in an infinite copy loop hterm.Terminal.prototype.copySelectionToClipboard = function () { var text = this.getSelectionText(); if (text != null && text !== '') { this.copyStringToClipboard(text); } }; // passthrough all the commands that are meant to control // hyperterm and not the terminal itself const oldKeyDown = hterm.Keyboard.prototype.onKeyDown_; hterm.Keyboard.prototype.onKeyDown_ = function (e) { if (e.metaKey) { return; } return oldKeyDown.call(this, e); }; const oldKeyPress = hterm.Keyboard.prototype.onKeyPress_; hterm.Keyboard.prototype.onKeyPress_ = function (e) { if (e.metaKey) { return; } return oldKeyPress.call(this, e); }; // we re-implement `wipeContents` to preserve the line // and cursor position that the client is in. // otherwise the user ends up with a completely clear // screen which is really strange hterm.Terminal.prototype.clearPreserveCursorRow = function () { this.scrollbackRows_.length = 0; this.scrollPort_.resetCache(); [this.primaryScreen_, this.alternateScreen_].forEach((screen) => { const bottom = screen.getHeight(); if (bottom > 0) { this.renumberRows_(0, bottom); const x = screen.cursorPosition.column; const y = screen.cursorPosition.row; if (x === 0) { // Empty screen, nothing to do. return; } // here we move the row that the user was focused on // to the top of the screen this.moveRows_(y, 1, 0); for (let i = 1; i < bottom; i++) { screen.setCursorPosition(i, 0); screen.clearCursorRow(); } // we restore the cursor position screen.setCursorPosition(0, x); } }); this.syncCursorPosition_(); this.scrollPort_.invalidate(); // this will avoid a bug where the `wipeContents` // hterm API doens't send the scroll to the top this.scrollPort_.redraw_(); }; export default hterm; export { lib };