- 更新 shared_proto_db/metadata/000003.log 文件内容 - 更新 Site Characteristics Database/00003.log 文件内容 - 添加新的数据库条目和元数据记录 - 保持数据库文件格式的一致性 - 删除Vivid2D的内容 - 重写启动加载界面
117 lines
3.9 KiB
HTML
117 lines
3.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Real Linux Terminal</title>
|
|
<!-- 引入 Xterm.js 的样式 -->
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" />
|
|
<style>
|
|
body, html {
|
|
margin: 0;
|
|
padding: 0;
|
|
background-color: #000;
|
|
overflow: hidden;
|
|
height: 100%; /* 确保 html 和 body 占满全屏 */
|
|
}
|
|
#terminal-container {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="terminal-container"></div>
|
|
|
|
<!-- 引入 Xterm.js 核心库 -->
|
|
<script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script>
|
|
<!-- 引入自适应插件,让终端随窗口缩放 -->
|
|
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
|
|
|
|
<script>
|
|
// 1. 初始化终端
|
|
const term = new Terminal({
|
|
cursorBlink: true,
|
|
fontSize: 14,
|
|
fontFamily: 'Consolas, "Ubuntu Mono", monospace',
|
|
theme: {
|
|
background: '#1e1e1e',
|
|
foreground: '#ffffff'
|
|
},
|
|
// 增加右键菜单功能:粘贴
|
|
allowProposedApi: true
|
|
});
|
|
|
|
const fitAddon = new FitAddon.FitAddon();
|
|
term.loadAddon(fitAddon);
|
|
term.open(document.getElementById('terminal-container'));
|
|
|
|
// --- 修复点 1: 自动获取焦点 ---
|
|
// 确保用户打开窗口后可以直接输入
|
|
term.focus();
|
|
|
|
// --- 修复点 2: 延迟并可靠地适应窗口大小 ---
|
|
// 使用 setTimeout 将 fit() 推迟到下一个事件循环
|
|
// 这可以确保在DOM元素完全渲染并获得其最终尺寸后才进行计算
|
|
function fitTerminal() {
|
|
try {
|
|
fitAddon.fit();
|
|
// 你还可以在这里将新的尺寸发送给后端 PTY
|
|
// term.cols 和 term.rows 包含了新的行列数
|
|
} catch (e) {
|
|
console.error("Fit addon failed:", e);
|
|
}
|
|
}
|
|
setTimeout(fitTerminal, 1); // 1ms 延迟足以确保渲染完成
|
|
|
|
// 窗口大小改变时自动调整
|
|
window.addEventListener('resize', fitTerminal);
|
|
|
|
// 2. 监听用户输入 (键盘按键)
|
|
term.onData(data => {
|
|
if (window.cefQuery) {
|
|
window.cefQuery({
|
|
request: JSON.stringify({
|
|
type: 'terminalInput',
|
|
data: data
|
|
}),
|
|
onSuccess: function() {},
|
|
onFailure: function(errorCode, errorMessage) {
|
|
console.error("CEF query failed:", errorCode, errorMessage);
|
|
}
|
|
});
|
|
} else {
|
|
console.warn("cefQuery is not available. Input ignored.");
|
|
}
|
|
});
|
|
|
|
// --- 修复点 3: 使用 TextDecoder 优化解码逻辑 ---
|
|
// 这是更现代、更可靠的将字节流解码为UTF-8字符串的方法
|
|
const decoder = new TextDecoder('utf-8');
|
|
|
|
/**
|
|
* 供 Java 调用的接口:写入数据到终端
|
|
* @param {string} base64Data - Base64 编码的原始字节流字符串
|
|
*/
|
|
function writeToTerminal(base64Data) {
|
|
try {
|
|
// 将 Base64 字符串转换为 Uint8Array 字节数组
|
|
const binaryString = window.atob(base64Data);
|
|
const len = binaryString.length;
|
|
const bytes = new Uint8Array(len);
|
|
for (let i = 0; i < len; i++) {
|
|
bytes[i] = binaryString.charCodeAt(i);
|
|
}
|
|
// 使用 TextDecoder 解码为字符串并写入终端
|
|
term.write(decoder.decode(bytes));
|
|
} catch (e) {
|
|
console.error("Failed to decode or write Base64 data:", e);
|
|
// 可以在终端显示错误信息
|
|
term.write("\r\n[Front-end Error: Failed to process data from back-end]\r\n");
|
|
}
|
|
}
|
|
|
|
// 初始化通知
|
|
term.write('\x1B[1;3;32mConnected to Local Shell via PTY4J...\x1B[0m\r\n');
|
|
</script>
|
|
</body>
|
|
</html> |