|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<script src="www/pyodide/pyodide.js"></script>
|
|
|
|
|
<!--
|
|
|
|
|
<script src="https://ceccopierangiolieugenio.github.io/binaryRepo/pyTermTk/www/pyodide/pyodide.js"></script>
|
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
<link href="www/xterm/xterm.css" rel="stylesheet" />
|
|
|
|
|
<script src="www/xterm/xterm.js"></script>
|
|
|
|
|
<script src="www/xterm-addon-unicode11/xterm-addon-unicode11.js"></script>
|
|
|
|
|
<!--
|
|
|
|
|
<link href="https://ceccopierangiolieugenio.github.io/binaryRepo/pyTermTk/www/xterm/xterm.css" rel="stylesheet" />
|
|
|
|
|
<script src="https://ceccopierangiolieugenio.github.io/binaryRepo/pyTermTk/www/xterm/xterm.js"></script>
|
|
|
|
|
-->
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<div id="terminal" style="float: left"></div>
|
|
|
|
|
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
/* xterm.js demo */
|
|
|
|
|
/* https://www.npmjs.com/package/xterm-addon-unicode11 */
|
|
|
|
|
const unicode11Addon = new Unicode11Addon.Unicode11Addon();
|
|
|
|
|
|
|
|
|
|
var term = new Terminal({allowProposedApi: true});
|
|
|
|
|
term.loadAddon(unicode11Addon);
|
|
|
|
|
|
|
|
|
|
term.unicode.activeVersion = '11';
|
|
|
|
|
|
|
|
|
|
term.open(document.getElementById('terminal'));
|
|
|
|
|
|
|
|
|
|
term.write('xterm.js - Loaded\n\r')
|
|
|
|
|
|
|
|
|
|
/* pyodide demo */
|
|
|
|
|
var pyodide = null
|
|
|
|
|
var run = null
|
|
|
|
|
var namespace = null
|
|
|
|
|
async function main(){
|
|
|
|
|
pyodide = await loadPyodide();
|
|
|
|
|
|
|
|
|
|
let pyodideProxy = {
|
|
|
|
|
consoleLog: function(m){
|
|
|
|
|
console.log("TTk:",m)
|
|
|
|
|
},
|
|
|
|
|
termPush: function (s) {
|
|
|
|
|
term.write(s);
|
|
|
|
|
},
|
|
|
|
|
termSize: function () {
|
|
|
|
|
return [term.cols, term.rows]
|
|
|
|
|
},
|
|
|
|
|
setTimeout: function(t, i) {
|
|
|
|
|
// console.log("TIME",i,t)
|
|
|
|
|
setTimeout(() => ttk_timer(i), t)
|
|
|
|
|
},
|
|
|
|
|
clearTimeout: function(){
|
|
|
|
|
let highestTimeoutId = setTimeout(";");
|
|
|
|
|
for (let i = 0 ; i < highestTimeoutId ; i++) {
|
|
|
|
|
clearTimeout(i);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
setInterval: function(t, i) {
|
|
|
|
|
setTinterval(() => console.log('WIP -> Interval' + i), t)
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
pyodide.registerJsModule("pyodideProxy", pyodideProxy);
|
|
|
|
|
|
|
|
|
|
term.write('Pyodide Proxy - Loaded\n\r')
|
|
|
|
|
|
|
|
|
|
let zipResponse = await fetch("bin/TermTk.tgz");
|
|
|
|
|
let zipBinary = await zipResponse.arrayBuffer();
|
|
|
|
|
pyodide.unpackArchive(zipBinary, ".tar.gz");
|
|
|
|
|
|
|
|
|
|
term.write('TermTk - Loaded\n\r')
|
|
|
|
|
|
|
|
|
|
zipResponse = await fetch("bin/demo.tgz");
|
|
|
|
|
zipBinary = await zipResponse.arrayBuffer();
|
|
|
|
|
pyodide.unpackArchive(zipBinary, ".tar.gz");
|
|
|
|
|
|
|
|
|
|
term.write('Demos - Loaded\n\r')
|
|
|
|
|
|
|
|
|
|
term.write('Starting Demo...\n\r')
|
|
|
|
|
|
|
|
|
|
namespace = pyodide.globals.get("dict")();
|
|
|
|
|
pyodide.runPython(`
|
|
|
|
|
import sys
|
|
|
|
|
import TermTk as ttk
|
|
|
|
|
import pyodideProxy
|
|
|
|
|
|
|
|
|
|
def ttk_input(val):
|
|
|
|
|
if ttk.TTkHelper._rootWidget and ttk.TTkHelper._rootWidget._input:
|
|
|
|
|
ttk.TTkHelper._rootWidget._input.key_process(val)
|
|
|
|
|
|
|
|
|
|
def ttk_resize(w,h):
|
|
|
|
|
ttk.TTkLog.debug(f"Resize: {w=} {h=}")
|
|
|
|
|
if ttk.TTkHelper._rootWidget:
|
|
|
|
|
ttk.TTkHelper._rootWidget._win_resize_cb(w,h)
|
|
|
|
|
ttk.TTkHelper.rePaintAll()
|
|
|
|
|
# TODO: I need to get rid of this:
|
|
|
|
|
ttk.TTkTerm.push(ttk.TTkTerm.ALT_SCREEN + ttk.TTkTerm.CLEAR + ttk.TTkTerm.Cursor.HIDE + ttk.TTkTerm.escTitle(ttk.TTkTerm.title))
|
|
|
|
|
ttk.TTkTerm.push(ttk.TTkTerm.Mouse.ON)
|
|
|
|
|
|
|
|
|
|
def ttk_timer(tid):
|
|
|
|
|
ttk.TTkTimer.triggerTimerId(tid)
|
|
|
|
|
|
|
|
|
|
def ttk_log(val):
|
|
|
|
|
# hex = [f"0x{ord(x):02x}" for x in val]
|
|
|
|
|
ttk.TTkLog.debug("---> "+val.replace("\\033","<ESC>") + " - ")
|
|
|
|
|
ttk.TTkHelper.paintAll()
|
|
|
|
|
|
|
|
|
|
def ttk_clean():
|
|
|
|
|
if ttk.TTkHelper._rootWidget:
|
|
|
|
|
ttk.TTkTimer.pyodideQuit()
|
|
|
|
|
ttk.TTkHelper._rootWidget.quit()
|
|
|
|
|
ttk.TTkHelper._focusWidget = None
|
|
|
|
|
ttk.TTkHelper._rootCanvas = None
|
|
|
|
|
ttk.TTkHelper._rootWidget = None
|
|
|
|
|
ttk.TTkHelper._updateBuffer = []
|
|
|
|
|
ttk.TTkHelper._updateWidget = []
|
|
|
|
|
ttk.TTkHelper._overlay = []
|
|
|
|
|
ttk.TTkHelper._shortcut = []
|
|
|
|
|
ttk.TTkLog._messageHandler = [message_handler]
|
|
|
|
|
|
|
|
|
|
def message_handler(mode, context, message):
|
|
|
|
|
msgType = "DEBUG"
|
|
|
|
|
if mode == ttk.TTkLog.InfoMsg: msgType = "[INFO]"
|
|
|
|
|
elif mode == ttk.TTkLog.WarningMsg: msgType = "[WARNING]"
|
|
|
|
|
elif mode == ttk.TTkLog.CriticalMsg: msgType = "[CRITICAL]"
|
|
|
|
|
elif mode == ttk.TTkLog.FatalMsg: msgType = "[FATAL]"
|
|
|
|
|
elif mode == ttk.TTkLog.ErrorMsg: msgType = "[ERROR]"
|
|
|
|
|
pyodideProxy.consoleLog(f"{msgType} {context.file} {message}")
|
|
|
|
|
# Register the callback to the message handler
|
|
|
|
|
ttk.TTkLog.installMessageHandler(message_handler)
|
|
|
|
|
`,{ globals: namespace }
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
let ttk_log = namespace.get("ttk_log");
|
|
|
|
|
let ttk_input = namespace.get("ttk_input");
|
|
|
|
|
let ttk_timer = namespace.get("ttk_timer");
|
|
|
|
|
let ttk_resize = namespace.get("ttk_resize");
|
|
|
|
|
let ttk_clean = namespace.get("ttk_clean");
|
|
|
|
|
|
|
|
|
|
term.onResize( (obj) => {
|
|
|
|
|
term.reset()
|
|
|
|
|
ttk_resize(obj.cols, obj.rows)
|
|
|
|
|
});
|
|
|
|
|
term.onData((d, evt) => { ttk_input(d) })
|
|
|
|
|
|
|
|
|
|
pyodide.runPython(`
|
|
|
|
|
import sys,os
|
|
|
|
|
sys.path.append(os.path.join(sys.path[0],'demo'))
|
|
|
|
|
__file__='/home/pyodide/demo/demo.py'
|
|
|
|
|
__name__ = "__main__"
|
|
|
|
|
os.chdir('/home/pyodide/demo')
|
|
|
|
|
`,{ globals: namespace }
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
console.log("Run App")
|
|
|
|
|
|
|
|
|
|
let content = pyodide.FS.readFile("demo.py", {encoding:'utf8'})
|
|
|
|
|
pyodide.runPython(content,{ globals: namespace });
|
|
|
|
|
|
|
|
|
|
// TODO: I need to get rid of this:
|
|
|
|
|
pyodide.runPython(`
|
|
|
|
|
# TODO: I need to get rid of this:
|
|
|
|
|
ttk.TTkTerm.push(ttk.TTkTerm.ALT_SCREEN + ttk.TTkTerm.CLEAR + ttk.TTkTerm.Cursor.HIDE + ttk.TTkTerm.escTitle(ttk.TTkTerm.title))
|
|
|
|
|
ttk.TTkTerm.push(ttk.TTkTerm.Mouse.ON)
|
|
|
|
|
`,{ globals: namespace }
|
|
|
|
|
);
|
|
|
|
|
ttk_log("demo/demo.py - LOADED")
|
|
|
|
|
console.log("pippo")
|
|
|
|
|
}
|
|
|
|
|
main()
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|