Merge pull request #396 from AtkinsSJ/xterm-fix

fix(Terminal): Accept input from Chrome on Android
This commit is contained in:
Eric Dubé 2024-05-15 18:24:02 -04:00 committed by GitHub
commit 1aa27084d0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 38 additions and 92 deletions

43
package-lock.json generated
View File

@ -4071,6 +4071,19 @@
} }
} }
}, },
"node_modules/@xterm/addon-fit": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz",
"integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==",
"peerDependencies": {
"@xterm/xterm": "^5.0.0"
}
},
"node_modules/@xterm/xterm": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
"integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="
},
"node_modules/@xtuc/ieee754": { "node_modules/@xtuc/ieee754": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@ -11561,9 +11574,7 @@
"fs-mode-to-string": "^0.0.2", "fs-mode-to-string": "^0.0.2",
"json-query": "^2.2.2", "json-query": "^2.2.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
"sinon": "^17.0.1", "sinon": "^17.0.1"
"xterm": "^5.1.0",
"xterm-addon-fit": "^0.7.0"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-commonjs": "^24.1.0",
@ -12131,17 +12142,6 @@
"defaults": "^1.0.3" "defaults": "^1.0.3"
} }
}, },
"packages/phoenix/node_modules/xterm": {
"version": "5.1.0",
"license": "MIT"
},
"packages/phoenix/node_modules/xterm-addon-fit": {
"version": "0.7.0",
"license": "MIT",
"peerDependencies": {
"xterm": "^5.0.0"
}
},
"packages/phoenix/packages/contextlink": { "packages/phoenix/packages/contextlink": {
"version": "0.0.0", "version": "0.0.0",
"extraneous": true, "extraneous": true,
@ -12180,8 +12180,8 @@
"version": "0.0.0", "version": "0.0.0",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
"xterm": "^5.3.0", "@xterm/addon-fit": "^0.10.0",
"xterm-addon-fit": "^0.7.0" "@xterm/xterm": "^5.5.0"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-commonjs": "^24.1.0",
@ -12723,17 +12723,6 @@
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
},
"packages/terminal/node_modules/xterm": {
"version": "5.3.0",
"license": "MIT"
},
"packages/terminal/node_modules/xterm-addon-fit": {
"version": "0.7.0",
"license": "MIT",
"peerDependencies": {
"xterm": "^5.0.0"
}
} }
} }
} }

View File

@ -22,9 +22,7 @@
"fs-mode-to-string": "^0.0.2", "fs-mode-to-string": "^0.0.2",
"json-query": "^2.2.2", "json-query": "^2.2.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
"sinon": "^17.0.1", "sinon": "^17.0.1"
"xterm": "^5.1.0",
"xterm-addon-fit": "^0.7.0"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-commonjs": "^24.1.0", "@rollup/plugin-commonjs": "^24.1.0",
@ -1796,19 +1794,6 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true "dev": true
}, },
"node_modules/xterm": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/xterm/-/xterm-5.1.0.tgz",
"integrity": "sha512-LovENH4WDzpwynj+OTkLyZgJPeDom9Gra4DMlGAgz6pZhIDCQ+YuO7yfwanY+gVbn/mmZIStNOnVRU/ikQuAEQ=="
},
"node_modules/xterm-addon-fit": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz",
"integrity": "sha512-tQgHGoHqRTgeROPnvmtEJywLKoC/V9eNs4bLLz7iyJr1aW/QFzRwfd3MGiJ6odJd9xEfxcW36/xRU47JkD5NKQ==",
"peerDependencies": {
"xterm": "^5.0.0"
}
},
"node_modules/y18n": { "node_modules/y18n": {
"version": "5.0.8", "version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",

View File

@ -26,9 +26,7 @@
"fs-mode-to-string": "^0.0.2", "fs-mode-to-string": "^0.0.2",
"json-query": "^2.2.2", "json-query": "^2.2.2",
"path-browserify": "^1.0.1", "path-browserify": "^1.0.1",
"sinon": "^17.0.1", "sinon": "^17.0.1"
"xterm": "^5.1.0",
"xterm-addon-fit": "^0.7.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"node-pty": "^1.0.0" "node-pty": "^1.0.0"

View File

@ -140,7 +140,7 @@
cursor: crosshair; cursor: crosshair;
} }
.xterm .xterm-accessibility, .xterm .xterm-accessibility:not(.debug),
.xterm .xterm-message { .xterm .xterm-message {
position: absolute; position: absolute;
left: 0; left: 0;
@ -152,6 +152,15 @@
pointer-events: none; pointer-events: none;
} }
.xterm .xterm-accessibility-tree:not(.debug) *::selection {
color: transparent;
}
.xterm .xterm-accessibility-tree {
user-select: text;
white-space: pre;
}
.xterm .live-region { .xterm .live-region {
position: absolute; position: absolute;
left: -9999px; left: -9999px;

View File

@ -19,7 +19,7 @@
"rollup-plugin-copy": "^3.4.0" "rollup-plugin-copy": "^3.4.0"
}, },
"dependencies": { "dependencies": {
"xterm": "^5.3.0", "@xterm/xterm": "^5.5.0",
"xterm-addon-fit": "^0.7.0" "@xterm/addon-fit": "^0.10.0"
} }
} }

View File

@ -16,8 +16,8 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Terminal } from 'xterm'; import { Terminal } from '@xterm/xterm';
import { FitAddon } from 'xterm-addon-fit'; import { FitAddon } from '@xterm/addon-fit';
import { PTY } from './pty/PTY'; import { PTY } from './pty/PTY';
import { XDocumentANSIShell } from './pty/XDocumentANSIShell'; import { XDocumentANSIShell } from './pty/XDocumentANSIShell';
@ -28,9 +28,7 @@ class XTermIO {
} }
bind () { bind () {
this.term.onKey(this.handleKey.bind(this)); this.term.onData(this.handleData.bind(this));
this.term.attachCustomKeyEventHandler(this.handleKeyBeforeProcess.bind(this));
(async () => { (async () => {
for ( ;; ) { for ( ;; ) {
@ -40,41 +38,8 @@ class XTermIO {
})(); })();
} }
async handleKeyBeforeProcess (evt) { handleData ( data ) {
if ( evt.key === 'V' && evt.ctrlKey && evt.shiftKey && evt.type === 'keydown' ) { this.pty.out.write(data);
const clipboard = navigator.clipboard;
const text = await clipboard.readText();
this.pty.out.write(text);
}
}
handleKey ({ key, domEvent }) {
const pty = this.pty;
const handlers = {
Enter: () => {
pty.out.write('\n');
},
// Backspace: () => {
// pty.out.write('\x08');
// },
// Delete: () => {
// pty.out.write('\x1B[3~');
// },
Home: () => {
pty.out.write('\x1B[H');
},
End: () => {
pty.out.write('\x1B[F');
}
}
if ( handlers.hasOwnProperty(domEvent.key) ) {
const writeKey = handlers[domEvent.key]();
if ( ! writeKey ) return;
}
pty.out.write(key);
} }
} }