From 18e2c7ed923532da7f47cb539a3f92ed8beedf80 Mon Sep 17 00:00:00 2001 From: sawka Date: Fri, 16 Aug 2024 13:42:16 -0700 Subject: [PATCH] OSC 7 parsing to track and restore the terminal working directory --- frontend/app/view/term/termwrap.ts | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/frontend/app/view/term/termwrap.ts b/frontend/app/view/term/termwrap.ts index bced1b33..b53dc57f 100644 --- a/frontend/app/view/term/termwrap.ts +++ b/frontend/app/view/term/termwrap.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { WshServer } from "@/app/store/wshserver"; -import { PLATFORM, fetchWaveFile, getFileSubject, openLink, sendWSCommand } from "@/store/global"; +import { PLATFORM, WOS, fetchWaveFile, getFileSubject, openLink, sendWSCommand } from "@/store/global"; import * as services from "@/store/services"; import { base64ToArray, fireAndForget } from "@/util/util"; import { SerializeAddon } from "@xterm/addon-serialize"; @@ -56,6 +56,7 @@ export class TermWrap { options: TermTypes.ITerminalOptions & TermTypes.ITerminalInitOnlyOptions, waveOptions: TermWrapOptions ) { + this.loaded = false; this.blockId = blockId; this.ptyOffset = 0; this.dataBytesProcessed = 0; @@ -94,9 +95,28 @@ export class TermWrap { loggedWebGL = true; } } + this.terminal.parser.registerOscHandler(7, (data: string) => { + if (!this.loaded) { + return false; + } + if (data == null || data.length == 0) { + return false; + } + if (data.startsWith("file://")) { + data = data.substring(7); + const nextSlashIdx = data.indexOf("/"); + if (nextSlashIdx == -1) { + return false; + } + data = data.substring(nextSlashIdx); + } + setTimeout(() => { + services.ObjectService.UpdateObjectMeta(WOS.makeORef("block", this.blockId), { "cmd:cwd": data }); + }, 0); + return true; + }); this.connectElem = connectElem; this.mainFileSubject = null; - this.loaded = false; this.heldData = []; this.handleResize_debounced = debounce(50, this.handleResize.bind(this)); this.terminal.open(this.connectElem);