changed xtermjs to use the unicode 11 rules
This commit is contained in:
@@ -257,6 +257,9 @@ func (pty *client_pty_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
case "xterm-addon-fit.js":
|
case "xterm-addon-fit.js":
|
||||||
status_code = WriteJsRespHeader(w, http.StatusOK)
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_addon_fit_js)
|
w.Write(xterm_addon_fit_js)
|
||||||
|
case "xterm-addon-unicode11.js":
|
||||||
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
|
w.Write(xterm_addon_unicode11_js)
|
||||||
case "xterm.css":
|
case "xterm.css":
|
||||||
status_code = WriteCssRespHeader(w, http.StatusOK)
|
status_code = WriteCssRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_css)
|
w.Write(xterm_css)
|
||||||
|
|||||||
@@ -2344,6 +2344,10 @@ func NewClient(ctx context.Context, name string, logger Logger, cfg *ClientConfi
|
|||||||
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
||||||
c.ctl_mux.Handle("/_pty/xterm-addon-fit.js/",
|
c.ctl_mux.Handle("/_pty/xterm-addon-fit.js/",
|
||||||
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
|
c.ctl_mux.Handle("/_pty/xterm-addon-unicode11.js",
|
||||||
|
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm-addon-unicode11.js"}))
|
||||||
|
c.ctl_mux.Handle("/_pty/xterm-addon-unicode11.js/",
|
||||||
|
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
c.ctl_mux.Handle("/_pty/xterm.css",
|
c.ctl_mux.Handle("/_pty/xterm.css",
|
||||||
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.css"}))
|
c.WrapHttpHandler(&client_pty_xterm_file{client_ctl: client_ctl{c: &c, id: HS_ID_CTL}, file: "xterm.css"}))
|
||||||
c.ctl_mux.Handle("/_pty/xterm.css/",
|
c.ctl_mux.Handle("/_pty/xterm.css/",
|
||||||
|
|||||||
2
hodu.go
2
hodu.go
@@ -126,6 +126,8 @@ type json_xterm_ws_event struct {
|
|||||||
var xterm_js []byte
|
var xterm_js []byte
|
||||||
//go:embed xterm-addon-fit.js
|
//go:embed xterm-addon-fit.js
|
||||||
var xterm_addon_fit_js []byte
|
var xterm_addon_fit_js []byte
|
||||||
|
//go:embed xterm-addon-unicode11.js
|
||||||
|
var xterm_addon_unicode11_js []byte
|
||||||
//go:embed xterm.css
|
//go:embed xterm.css
|
||||||
var xterm_css []byte
|
var xterm_css []byte
|
||||||
//go:embed xterm.html
|
//go:embed xterm.html
|
||||||
|
|||||||
@@ -366,6 +366,9 @@ func (pty *server_pty_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
case "xterm-addon-fit.js":
|
case "xterm-addon-fit.js":
|
||||||
status_code = WriteJsRespHeader(w, http.StatusOK)
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_addon_fit_js)
|
w.Write(xterm_addon_fit_js)
|
||||||
|
case "xterm-addon-unicode11.js":
|
||||||
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
|
w.Write(xterm_addon_unicode11_js)
|
||||||
case "xterm.css":
|
case "xterm.css":
|
||||||
status_code = WriteCssRespHeader(w, http.StatusOK)
|
status_code = WriteCssRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_css)
|
w.Write(xterm_css)
|
||||||
|
|||||||
@@ -479,6 +479,9 @@ func (pxy *server_pxy_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
|
|||||||
case "xterm-addon-fit.js":
|
case "xterm-addon-fit.js":
|
||||||
status_code = WriteJsRespHeader(w, http.StatusOK)
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_addon_fit_js)
|
w.Write(xterm_addon_fit_js)
|
||||||
|
case "xterm-addon-unicode11.js":
|
||||||
|
status_code = WriteJsRespHeader(w, http.StatusOK)
|
||||||
|
w.Write(xterm_addon_unicode11_js)
|
||||||
case "xterm.css":
|
case "xterm.css":
|
||||||
status_code = WriteCssRespHeader(w, http.StatusOK)
|
status_code = WriteCssRespHeader(w, http.StatusOK)
|
||||||
w.Write(xterm_css)
|
w.Write(xterm_css)
|
||||||
|
|||||||
19
server.go
19
server.go
@@ -3,6 +3,7 @@ package hodu
|
|||||||
import "container/list"
|
import "container/list"
|
||||||
import "context"
|
import "context"
|
||||||
import "crypto/tls"
|
import "crypto/tls"
|
||||||
|
import "encoding/base64"
|
||||||
import "errors"
|
import "errors"
|
||||||
import "fmt"
|
import "fmt"
|
||||||
import "io"
|
import "io"
|
||||||
@@ -906,7 +907,7 @@ func (cts *ServerConn) ReadRptyAndWriteWs(id uint64, data []byte) error {
|
|||||||
}
|
}
|
||||||
cts.rpty_mtx.Unlock()
|
cts.rpty_mtx.Unlock()
|
||||||
|
|
||||||
err = send_ws_data_for_xterm(rpty.ws, "iov", string(data))
|
err = send_ws_data_for_xterm(rpty.ws, "iov", base64.StdEncoding.EncodeToString(data))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to write rpty data(%d) to ws - %s", id, err.Error())
|
return fmt.Errorf("failed to write rpty data(%d) to ws - %s", id, err.Error())
|
||||||
}
|
}
|
||||||
@@ -1792,6 +1793,10 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
||||||
s.ctl_mux.Handle("/_pty/xterm-addon-fit.js/",
|
s.ctl_mux.Handle("/_pty/xterm-addon-fit.js/",
|
||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
|
s.ctl_mux.Handle("/_pty/xterm-addon-unicode11.js",
|
||||||
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-unicode11.js"}))
|
||||||
|
s.ctl_mux.Handle("/_pty/xterm-addon-unicode11.js/",
|
||||||
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
s.ctl_mux.Handle("/_pty/xterm.css",
|
s.ctl_mux.Handle("/_pty/xterm.css",
|
||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.css"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.css"}))
|
||||||
s.ctl_mux.Handle("/_pty/xterm.css/",
|
s.ctl_mux.Handle("/_pty/xterm.css/",
|
||||||
@@ -1813,6 +1818,10 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-fit.js"}))
|
||||||
s.ctl_mux.Handle("/_rpty/xterm-addon-fit.js/",
|
s.ctl_mux.Handle("/_rpty/xterm-addon-fit.js/",
|
||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
|
s.ctl_mux.Handle("/_rpty/xterm-addon-unicode11.js",
|
||||||
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm-addon-unicode11.js"}))
|
||||||
|
s.ctl_mux.Handle("/_rpty/xterm-addon-unicode11.js/",
|
||||||
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "_forbidden"}))
|
||||||
s.ctl_mux.Handle("/_rpty/xterm.css",
|
s.ctl_mux.Handle("/_rpty/xterm.css",
|
||||||
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.css"}))
|
s.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "xterm.css"}))
|
||||||
s.ctl_mux.Handle("/_rpty/xterm.css/",
|
s.ctl_mux.Handle("/_rpty/xterm.css/",
|
||||||
@@ -1877,6 +1886,10 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm-addon-fit.js"}))
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-fit.js/",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-fit.js/",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-unicode11.js",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "xterm-addon-unicode11.js"}))
|
||||||
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/xterm-addon-unicode11.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_PXY}, file: "_forbidden"}))
|
||||||
|
|
||||||
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/ws",
|
s.pxy_mux.Handle("/_ssh/{conn_id}/{route_id}/ws",
|
||||||
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_PXY})))
|
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_PXY})))
|
||||||
@@ -1927,6 +1940,10 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi
|
|||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm-addon-fit.js"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm-addon-fit.js"}))
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-fit.js/",
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-fit.js/",
|
||||||
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-unicode11.js",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "xterm-addon-unicode11.js"}))
|
||||||
|
s.wpx_mux.Handle("/_ssh/{port_id}/xterm-addon-unicode11.js/",
|
||||||
|
s.WrapHttpHandler(&server_pxy_xterm_file{server_pxy: server_pxy{S: &s, Id: HS_ID_WPX}, file: "_forbidden"}))
|
||||||
|
|
||||||
s.wpx_mux.Handle("/_ssh/{port_id}/ws",
|
s.wpx_mux.Handle("/_ssh/{port_id}/ws",
|
||||||
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_WPX})))
|
s.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_WPX})))
|
||||||
|
|||||||
8
xterm-addon-unicode11.js
Normal file
8
xterm-addon-unicode11.js
Normal file
File diff suppressed because one or more lines are too long
13
xterm.html
13
xterm.html
@@ -88,6 +88,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script src="xterm.js"></script>
|
<script src="xterm.js"></script>
|
||||||
<script src="xterm-addon-fit.js"></script>
|
<script src="xterm-addon-fit.js"></script>
|
||||||
|
<script src="xterm-addon-unicode11.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const xt_mode = '{{ .Mode }}';
|
const xt_mode = '{{ .Mode }}';
|
||||||
@@ -142,22 +143,26 @@ window.onload = function(event) {
|
|||||||
const term = new window.Terminal({
|
const term = new window.Terminal({
|
||||||
lineHeight: 1.2,
|
lineHeight: 1.2,
|
||||||
//fontSize: 14,
|
//fontSize: 14,
|
||||||
fontFamily: 'Ubuntu Mono, Consolas, SF Mono, courier-new, courier, monospace'
|
fontFamily: 'Ubuntu Mono, Consolas, SF Mono, courier-new, courier, monospace',
|
||||||
|
allowProposedApi: true
|
||||||
});
|
});
|
||||||
const fit_addon = new window.FitAddon.FitAddon();
|
const fit_addon = new window.FitAddon.FitAddon();
|
||||||
|
const unicode11_addon = new window.Unicode11Addon.Unicode11Addon();
|
||||||
const text_decoder = new TextDecoder();
|
const text_decoder = new TextDecoder();
|
||||||
|
|
||||||
term.loadAddon(fit_addon)
|
term.loadAddon(fit_addon);
|
||||||
|
term.loadAddon(unicode11_addon);
|
||||||
|
term.unicode.activeVersion = '11';
|
||||||
term.open(terminal_view_container);
|
term.open(terminal_view_container);
|
||||||
|
|
||||||
let set_terminal_target = function(name) {
|
let set_terminal_target = function(name) {
|
||||||
terminal_target.innerText = name;
|
terminal_target.innerText = name;
|
||||||
login_form_title.innerText = name
|
login_form_title.innerText = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
let set_terminal_status = function(msg, errmsg) {
|
let set_terminal_status = function(msg, errmsg) {
|
||||||
if (msg != null) terminal_status.innerText = msg;
|
if (msg != null) terminal_status.innerText = msg;
|
||||||
if (errmsg != null) terminal_errmsg.innerText = errmsg
|
if (errmsg != null) terminal_errmsg.innerText = errmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
let adjust_terminal_size_unconnected = function() {
|
let adjust_terminal_size_unconnected = function() {
|
||||||
|
|||||||
Reference in New Issue
Block a user