changed xtermjs to use the unicode 11 rules

This commit is contained in:
2025-12-17 22:52:52 +09:00
parent 2ea3f52fd1
commit 80ebd23858
8 changed files with 50 additions and 5 deletions

View File

@@ -257,6 +257,9 @@ func (pty *client_pty_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
case "xterm-addon-fit.js":
status_code = WriteJsRespHeader(w, http.StatusOK)
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":
status_code = WriteCssRespHeader(w, http.StatusOK)
w.Write(xterm_css)

View File

@@ -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.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.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.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/",

View File

@@ -126,6 +126,8 @@ type json_xterm_ws_event struct {
var xterm_js []byte
//go:embed xterm-addon-fit.js
var xterm_addon_fit_js []byte
//go:embed xterm-addon-unicode11.js
var xterm_addon_unicode11_js []byte
//go:embed xterm.css
var xterm_css []byte
//go:embed xterm.html

View File

@@ -366,6 +366,9 @@ func (pty *server_pty_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
case "xterm-addon-fit.js":
status_code = WriteJsRespHeader(w, http.StatusOK)
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":
status_code = WriteCssRespHeader(w, http.StatusOK)
w.Write(xterm_css)

View File

@@ -479,6 +479,9 @@ func (pxy *server_pxy_xterm_file) ServeHTTP(w http.ResponseWriter, req *http.Req
case "xterm-addon-fit.js":
status_code = WriteJsRespHeader(w, http.StatusOK)
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":
status_code = WriteCssRespHeader(w, http.StatusOK)
w.Write(xterm_css)

View File

@@ -3,6 +3,7 @@ package hodu
import "container/list"
import "context"
import "crypto/tls"
import "encoding/base64"
import "errors"
import "fmt"
import "io"
@@ -906,7 +907,7 @@ func (cts *ServerConn) ReadRptyAndWriteWs(id uint64, data []byte) error {
}
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 {
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.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.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.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "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.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.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.WrapHttpHandler(&server_pty_xterm_file{ServerCtl: ServerCtl{S: &s, Id: HS_ID_CTL}, file: "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.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.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.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.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.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.SafeWrapWebsocketHandler(s.WrapWebsocketHandler(&server_pxy_ssh_ws{S: &s, Id: HS_ID_WPX})))

8
xterm-addon-unicode11.js Normal file

File diff suppressed because one or more lines are too long

View File

@@ -88,6 +88,7 @@
</style>
<script src="xterm.js"></script>
<script src="xterm-addon-fit.js"></script>
<script src="xterm-addon-unicode11.js"></script>
<script>
const xt_mode = '{{ .Mode }}';
@@ -142,22 +143,26 @@ window.onload = function(event) {
const term = new window.Terminal({
lineHeight: 1.2,
//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 unicode11_addon = new window.Unicode11Addon.Unicode11Addon();
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);
let set_terminal_target = function(name) {
terminal_target.innerText = name;
login_form_title.innerText = name
login_form_title.innerText = name;
}
let set_terminal_status = function(msg, errmsg) {
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() {