diff --git a/sail.js b/sail.js
index 80448e7..224fae2 100644
--- a/sail.js
+++ b/sail.js
@@ -1,46 +1,52 @@
-function startReloadUI() {
- const div = document.createElement("div")
- div.className = "msgbox-overlay"
- div.style.opacity = 1
- div.style.textAlign = "center"
- div.innerHTML = `
`
- document.querySelector(".monaco-workbench").appendChild(div)
-}
-
-function removeElementsByClass(className) {
- let elements = document.getElementsByClassName(className);
- for (let e of elements) {
- e.parentNode.removeChild(e)
+(function() {
+ function startReloadUI() {
+ const div = document.createElement("div")
+ div.className = "msgbox-overlay"
+ div.style.opacity = 1
+ div.style.textAlign = "center"
+ div.innerHTML = ``
+ // Prevent keypresses.
+ document.body.onkeydown = ev => {
+ ev.stopPropagation()
+ }
+ document.querySelector(".monaco-workbench").appendChild(div)
+ }
+
+ function removeElementsByClass(className) {
+ let elements = document.getElementsByClassName(className);
+ for (let e of elements) {
+ e.parentNode.removeChild(e)
+ }
}
-}
-function stopReloadUI() {
- removeElementsByClass("msgbox-overlay")
-}
+ function stopReloadUI() {
+ removeElementsByClass("msgbox-overlay")
+ }
-let tty
-window.addEventListener("ide-ready", () => {
- window.ide.workbench.onFileSaved((ev) => {
- if (!ev.endsWith(".sail/Dockerfile")) {
+ let tty
+ let rebuilding
+ function rebuild() {
+ if (rebuilding) {
return
}
+ rebuilding = true
- const srv = window.ide.workbench.terminalService
+ const tsrv = window.ide.workbench.terminalService
if (tty == null) {
- tty = srv.createTerminal({
+ tty = tsrv.createTerminal({
name: "sail",
isRendererOnly: true,
}, false)
} else {
tty.clear()
}
- let oldTTY = srv.getActiveInstance()
- srv.setActiveInstance(tty)
+ let oldTTY = tsrv.getActiveInstance()
+ tsrv.setActiveInstance(tty)
// Show the panel and focus it to prevent the user from editing the Dockerfile.
- srv.showPanel(true)
+ tsrv.showPanel(true)
startReloadUI()
@@ -52,11 +58,31 @@ window.addEventListener("ide-ready", () => {
}
ws.onclose = (ev) => {
if (ev.code === 1000) {
- srv.setActiveInstance(oldTTY)
+ tsrv.setActiveInstance(oldTTY)
} else {
alert("reload failed; please see logs in sail terminal")
}
stopReloadUI()
+ rebuilding = false
}
+ }
+
+ window.addEventListener("ide-ready", () => {
+ class rebuildAction extends window.ide.workbench.action {
+ run() {
+ rebuild()
+ }
+ }
+
+ window.ide.workbench.actionsRegistry.registerWorkbenchAction(new window.ide.workbench.syncActionDescriptor(rebuildAction, "sail.rebuild", "Rebuild container", {
+ primary: ((1 << 11) >>> 0) | 48 // That's cmd + R. See vscode source for the magic numbers.
+ }), "sail: Rebuild container", "sail");
+
+ const statusBarService = window.ide.workbench.statusbarService
+ statusBarService.addEntry({
+ text: "rebuild",
+ tooltip: "Rebuild sail container",
+ command: "sail.rebuild"
+ }, 0)
})
-})
+}())
diff --git a/sail.js.go b/sail.js.go
index b63dc92..10c30e1 100644
--- a/sail.js.go
+++ b/sail.js.go
@@ -1,4 +1,4 @@
package main
//go:generate go run sail.js_gen.go
-const sailJS = "function startReloadUI() {\n const div = document.createElement(\"div\")\n div.className = \"msgbox-overlay\"\n div.style.opacity = 1\n div.style.textAlign = \"center\"\n div.innerHTML = ``\n document.querySelector(\".monaco-workbench\").appendChild(div)\n}\n\nfunction removeElementsByClass(className) {\n let elements = document.getElementsByClassName(className);\n for (let e of elements) {\n e.parentNode.removeChild(e)\n }\n}\n\nfunction stopReloadUI() {\n removeElementsByClass(\"msgbox-overlay\")\n}\n\nlet tty\nwindow.addEventListener(\"ide-ready\", () => {\n window.ide.workbench.onFileSaved((ev) => {\n if (!ev.endsWith(\".sail/Dockerfile\")) {\n return\n }\n\n const srv = window.ide.workbench.terminalService\n\n if (tty == null) {\n tty = srv.createTerminal({\n name: \"sail\",\n isRendererOnly: true,\n }, false)\n } else {\n tty.clear()\n }\n let oldTTY = srv.getActiveInstance()\n srv.setActiveInstance(tty)\n // Show the panel and focus it to prevent the user from editing the Dockerfile.\n srv.showPanel(true)\n\n startReloadUI()\n\n const ws = new WebSocket(\"ws://\" + location.host + \"/sail/api/v1/reload\")\n ws.onmessage = (ev) => {\n const msg = JSON.parse(ev.data)\n const out = atob(msg.v).replace(/\\n/g, \"\\n\\r\")\n tty.write(out)\n }\n ws.onclose = (ev) => {\n if (ev.code === 1000) {\n srv.setActiveInstance(oldTTY)\n } else {\n alert(\"reload failed; please see logs in sail terminal\")\n }\n stopReloadUI()\n }\n })\n})\n"
+const sailJS = "(function() {\n function startReloadUI() {\n const div = document.createElement(\"div\")\n div.className = \"msgbox-overlay\"\n div.style.opacity = 1\n div.style.textAlign = \"center\"\n div.innerHTML = `\n
Rebuilding container
\n
`\n // Prevent keypresses.\n document.body.onkeydown = ev => {\n ev.stopPropagation()\n }\n document.querySelector(\".monaco-workbench\").appendChild(div)\n }\n\n function removeElementsByClass(className) {\n let elements = document.getElementsByClassName(className);\n for (let e of elements) {\n e.parentNode.removeChild(e)\n }\n }\n\n function stopReloadUI() {\n removeElementsByClass(\"msgbox-overlay\")\n }\n\n let tty\n let rebuilding\n function rebuild() {\n if (rebuilding) {\n return\n }\n rebuilding = true\n\n const tsrv = window.ide.workbench.terminalService\n\n if (tty == null) {\n tty = tsrv.createTerminal({\n name: \"sail\",\n isRendererOnly: true,\n }, false)\n } else {\n tty.clear()\n }\n let oldTTY = tsrv.getActiveInstance()\n tsrv.setActiveInstance(tty)\n // Show the panel and focus it to prevent the user from editing the Dockerfile.\n tsrv.showPanel(true)\n\n startReloadUI()\n\n const ws = new WebSocket(\"ws://\" + location.host + \"/sail/api/v1/reload\")\n ws.onmessage = (ev) => {\n const msg = JSON.parse(ev.data)\n const out = atob(msg.v).replace(/\\n/g, \"\\n\\r\")\n tty.write(out)\n }\n ws.onclose = (ev) => {\n if (ev.code === 1000) {\n tsrv.setActiveInstance(oldTTY)\n } else {\n alert(\"reload failed; please see logs in sail terminal\")\n }\n stopReloadUI()\n rebuilding = false\n }\n }\n\n window.addEventListener(\"ide-ready\", () => {\n class rebuildAction extends window.ide.workbench.action {\n run() {\n rebuild()\n }\n }\n\n window.ide.workbench.actionsRegistry.registerWorkbenchAction(new window.ide.workbench.syncActionDescriptor(rebuildAction, \"sail.rebuild\", \"Rebuild container\", {\n primary: ((1 << 11) >>> 0) | 48 // That's cmd + R. See vscode source for the magic numbers.\n }), \"sail: Rebuild container\", \"sail\");\n\n const statusBarService = window.ide.workbench.statusbarService\n statusBarService.addEntry({\n text: \"rebuild\",\n tooltip: \"Rebuild sail container\",\n command: \"sail.rebuild\"\n }, 0)\n })\n}())\n"