diff --git a/.gitignore b/.gitignore index d98b130..503eb0c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ gotty -bindata/static builds +js/dist js/node_modules/* diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..55f1ee1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch GoTTY", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${workspaceFolder}", + "args": ["-a", "127.0.0.1", "-w", "bash"] + } + ] +} \ No newline at end of file diff --git a/Makefile b/Makefile index 2e02dc3..bcaa59f 100644 --- a/Makefile +++ b/Makefile @@ -9,50 +9,28 @@ gotty: main.go assets server/*.go webtty/*.go backend/*.go Makefile docker: docker build . -t gotty-bash:$(VERSION) -.PHONY: assets +.PHONY: all docker assets assets: bindata/static/js/gotty.js bindata/static/index.html bindata/static/icon.svg bindata/static/favicon.ico bindata/static/css/index.css bindata/static/css/xterm.css bindata/static/css/xterm_customize.css bindata/static/manifest.json bindata/static/icon_192.png -.PHONY: all -all: gotty docker +all: gotty -bindata/static: - mkdir -p bindata/static +bindata/static bindata/static/css bindata/static/js: + mkdir -p $@ -bindata/static/icon.svg: bindata/static resources/icon.svg - cp resources/icon.svg bindata/static/icon.svg +bindata/static/%: resources/% | bindata/static/css + cp "$<" "$@" -bindata/static/index.html: bindata/static resources/index.html - cp resources/index.html bindata/static/index.html +bindata/static/css/%.css: resources/%.css | bindata/static + cp "$<" "$@" -bindata/static/manifest.json: bindata/static resources/manifest.json - cp resources/manifest.json bindata/static/manifest.json - -bindata/static/favicon.ico: bindata/static resources/favicon.ico - cp resources/favicon.ico bindata/static/favicon.ico - -bindata/static/icon_192.png: bindata/static resources/icon_192.png - cp resources/icon_192.png bindata/static/icon_192.png - -bindata/static/js: bindata/static - mkdir -p bindata/static/js - -bindata/static/css: bindata/static - mkdir -p bindata/static/css - -bindata/static/css/index.css: bindata/static/css resources/index.css - cp resources/index.css bindata/static/css/index.css - -bindata/static/css/xterm_customize.css: bindata/static/css resources/xterm_customize.css - cp resources/xterm_customize.css bindata/static/css/xterm_customize.css - -bindata/static/css/xterm.css: bindata/static/css js/node_modules/xterm/css/xterm.css - cp js/node_modules/xterm/css/xterm.css bindata/static/css/xterm.css +bindata/static/css/xterm.css: js/node_modules/xterm/css/xterm.css | bindata/static + cp "$<" "$@" js/node_modules/xterm/dist/xterm.css: cd js && \ npm install -bindata/static/js/gotty.js: js/src/* js/node_modules/webpack +bindata/static/js/gotty.js: js/src/* | js/node_modules/webpack cd js && \ npx webpack @@ -89,4 +67,4 @@ release: ghr -draft ${VERSION} ${OUTPUT_DIR}/dist # -c ${GIT_COMMIT} --delete --prerelease -u sorenisanerd -r gotty ${VERSION} clean: - rm -fr gotty builds js/dist bindata/static + rm -fr gotty builds js/dist bindata/static js/node_modules diff --git a/bindata/static/css/index.css b/bindata/static/css/index.css new file mode 100644 index 0000000..26c6f33 --- /dev/null +++ b/bindata/static/css/index.css @@ -0,0 +1,7 @@ +html, body, #terminal { + background: black; + height: 100%; + width: 100%; + padding: 0%; + margin: 0%; +} \ No newline at end of file diff --git a/bindata/static/css/xterm.css b/bindata/static/css/xterm.css new file mode 100644 index 0000000..831a89c --- /dev/null +++ b/bindata/static/css/xterm.css @@ -0,0 +1,170 @@ +/** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + */ + +/** + * Default styles for xterm.js + */ + +.xterm { + position: relative; + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; +} + +.xterm.focus, +.xterm:focus { + outline: none; +} + +.xterm .xterm-helpers { + position: absolute; + top: 0; + /** + * The z-index of the helpers must be higher than the canvases in order for + * IMEs to appear on top. + */ + z-index: 5; +} + +.xterm .xterm-helper-textarea { + padding: 0; + border: 0; + margin: 0; + /* Move textarea out of the screen to the far left, so that the cursor is not visible */ + position: absolute; + opacity: 0; + left: -9999em; + top: 0; + width: 0; + height: 0; + z-index: -5; + /** Prevent wrapping so the IME appears against the textarea at the correct position */ + white-space: nowrap; + overflow: hidden; + resize: none; +} + +.xterm .composition-view { + /* TODO: Composition position got messed up somewhere */ + background: #000; + color: #FFF; + display: none; + position: absolute; + white-space: nowrap; + z-index: 1; +} + +.xterm .composition-view.active { + display: block; +} + +.xterm .xterm-viewport { + /* On OS X this is required in order for the scroll bar to appear fully opaque */ + background-color: #000; + overflow-y: scroll; + cursor: default; + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; +} + +.xterm .xterm-screen { + position: relative; +} + +.xterm .xterm-screen canvas { + position: absolute; + left: 0; + top: 0; +} + +.xterm .xterm-scroll-area { + visibility: hidden; +} + +.xterm-char-measure-element { + display: inline-block; + visibility: hidden; + position: absolute; + top: 0; + left: -9999em; + line-height: normal; +} + +.xterm { + cursor: text; +} + +.xterm.enable-mouse-events { + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ + cursor: default; +} + +.xterm.xterm-cursor-pointer { + cursor: pointer; +} + +.xterm.column-select.focus { + /* Column selection mode */ + cursor: crosshair; +} + +.xterm .xterm-accessibility, +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; +} + +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; +} + +.xterm-dim { + opacity: 0.5; +} + +.xterm-underline { + text-decoration: underline; +} diff --git a/bindata/static/css/xterm_customize.css b/bindata/static/css/xterm_customize.css new file mode 100644 index 0000000..8e4ddd9 --- /dev/null +++ b/bindata/static/css/xterm_customize.css @@ -0,0 +1,19 @@ +.terminal { + font-family: "DejaVu Sans Mono", "Everson Mono", FreeMono, Menlo, Terminal, monospace, "Apple Symbols"; +} + +.xterm-overlay { + font-family: "DejaVu Sans Mono", "Everson Mono", FreeMono, Menlo, Terminal, monospace, "Apple Symbols"; + border-radius: 15px; + font-size: xx-large; + color: black; + background: white; + opacity: 0.75; + padding: 0.2em 0.5em 0.2em 0.5em; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + user-select: none; + transition: opacity 180ms ease-in; +} \ No newline at end of file diff --git a/bindata/static/favicon.ico b/bindata/static/favicon.ico new file mode 100644 index 0000000..e97f5d6 Binary files /dev/null and b/bindata/static/favicon.ico differ diff --git a/bindata/static/icon.svg b/bindata/static/icon.svg new file mode 100644 index 0000000..bbb78c0 --- /dev/null +++ b/bindata/static/icon.svg @@ -0,0 +1,66 @@ + + \ No newline at end of file diff --git a/bindata/static/icon_192.png b/bindata/static/icon_192.png new file mode 100644 index 0000000..29a3cf9 Binary files /dev/null and b/bindata/static/icon_192.png differ diff --git a/bindata/static/index.html b/bindata/static/index.html new file mode 100644 index 0000000..fe45cb7 --- /dev/null +++ b/bindata/static/index.html @@ -0,0 +1,18 @@ + + +
+=i)return 0;if(128!=(192&(u=t[h++]))){h--,c=!0;break}this.interim[d++]=u,_<<=6,_|=63&u}c||(2===f?_<128?h--:e[a++]=_:3===f?_<2048||_>=55296&&_<=57343||65279===_||(e[a++]=_):_<65536||_>1114111||(e[a++]=_)),this.interim.fill(0)}for(var g=i-4,v=h;v=i)return this.interim[0]=r,a;if(128!=(192&(o=t[v++]))){v--;continue}if((l=(31&r)<<6|63&o)<128){v--;continue}e[a++]=l}else if(224==(240&r)){if(v>=i)return this.interim[0]=r,a;if(128!=(192&(o=t[v++]))){v--;continue}if(v>=i)return this.interim[0]=r,this.interim[1]=o,a;if(128!=(192&(n=t[v++]))){v--;continue}if((l=(15&r)<<12|(63&o)<<6|63&n)<2048||l>=55296&&l<=57343||65279===l)continue;e[a++]=l}else if(240==(248&r)){if(v>=i)return this.interim[0]=r,a;if(128!=(192&(o=t[v++]))){v--;continue}if(v>=i)return this.interim[0]=r,this.interim[1]=o,a;if(128!=(192&(n=t[v++]))){v--;continue}if(v>=i)return this.interim[0]=r,this.interim[1]=o,this.interim[2]=n,a;if(128!=(192&(s=t[v++]))){v--;continue}if((l=(7&r)<<18|(63&o)<<12|(63&n)<<6|63&s)<65536||l>1114111)continue;e[a++]=l}}return a},t}();e.Utf8ToUtf32=r}},e={};return function i(r){if(e[r])return e[r].exports;var o=e[r]={exports:{}};return t[r].call(o.exports,o,o.exports,i),o.exports}(795)})()}));\n//# sourceMappingURL=xterm-addon-webgl.js.map","/*!\n * xterm (https://npmjs.com/package/xterm)\n * @license MIT\n * @version 4.12.0\n * ==xterm/LICENSE==\n * Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)\n * Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)\n * Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var r=t();for(var i in r)(\"object\"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(()=>{\"use strict\";var e={4567:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.AccessibilityManager=void 0;var o=r(9042),s=r(6114),a=r(6193),c=r(3656),l=r(844),h=r(5596),u=r(9631),f=function(e){function t(t,r){var i=e.call(this)||this;i._terminal=t,i._renderService=r,i._liveRegionLineCount=0,i._charsToConsume=[],i._charsToAnnounce=\"\",i._accessibilityTreeRoot=document.createElement(\"div\"),i._accessibilityTreeRoot.classList.add(\"xterm-accessibility\"),i._rowContainer=document.createElement(\"div\"),i._rowContainer.setAttribute(\"role\",\"list\"),i._rowContainer.classList.add(\"xterm-accessibility-tree\"),i._rowElements=[];for(var n=0;n