template for Pygbag build
This commit is contained in:
430
PDA.tmpl
Normal file
430
PDA.tmpl
Normal file
@@ -0,0 +1,430 @@
|
||||
<html lang="en-us"><script src="{{cookiecutter.cdn}}pythons.js" type=module id="site" data-python="python{{cookiecutter.PYBUILD}}" data-LINES=42 data-COLUMNS=132 data-os="vtx,fs,snd,gui" async defer>#<!--
|
||||
|
||||
print("""
|
||||
Loading {{cookiecutter.title}} from {{cookiecutter.archive}}.apk
|
||||
Pygbag Version : {{cookiecutter.version}}
|
||||
Template Version : 0.9.2
|
||||
Python : {{cookiecutter.PYBUILD}}
|
||||
CDN URL : {{cookiecutter.cdn}}
|
||||
Screen : {{cookiecutter.width}}x{{cookiecutter.height}}
|
||||
Title : {{cookiecutter.title}}
|
||||
Folder : {{cookiecutter.directory}}
|
||||
Authors : {{cookiecutter.authors}}
|
||||
SPDX-License-Identifier: {{cookiecutter.spdx}}
|
||||
|
||||
""")
|
||||
|
||||
import sys
|
||||
import asyncio
|
||||
import platform
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# screen pixels (real, hardware)
|
||||
WIDTH=1024 # {{cookiecutter.width}}
|
||||
HEIGHT=600 # {{cookiecutter.height}}
|
||||
|
||||
# reference/idealized screen pixels
|
||||
REFX = 1980
|
||||
REFY = 1080
|
||||
|
||||
def u(real, ref, v):
|
||||
if abs(v)<0.9999999:
|
||||
result = int( (float(real)/100.0) * (v*1000))
|
||||
if v<0:
|
||||
return real-result
|
||||
return result
|
||||
return int( (real/ref) * v )
|
||||
|
||||
def ux(*argv):
|
||||
global WIDTH, REFX
|
||||
acc = 0
|
||||
for v in argv:
|
||||
acc += u(WIDTH, REFX, v)
|
||||
return acc
|
||||
|
||||
def uy(*argv):
|
||||
global HEIGHT, REFY
|
||||
acc = 0
|
||||
for v in argv:
|
||||
acc += u(HEIGHT, REFY, v)
|
||||
return acc
|
||||
|
||||
|
||||
# do not rename
|
||||
async def custom_site():
|
||||
import embed
|
||||
|
||||
platform.document.body.style.background = "#7f7f7f"
|
||||
|
||||
platform.window.transfer.hidden = true
|
||||
platform.window.canvas.style.visibility = "visible"
|
||||
|
||||
apk = "{{cookiecutter.archive}}.apk"
|
||||
|
||||
bundle = "{{cookiecutter.archive}}"
|
||||
|
||||
# the C or js loader could do that but be explicit.
|
||||
appdir = Path(f"/data/data/{bundle}") # /data/data/{{cookiecutter.archive}}
|
||||
appdir.mkdir()
|
||||
|
||||
|
||||
# mount apk
|
||||
|
||||
cfg = {
|
||||
"io": "url",
|
||||
"type":"mount",
|
||||
"mount" : {
|
||||
"point" : appdir.as_posix(),
|
||||
"path" : "/",
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
track = platform.window.MM.prepare(apk, json.dumps(cfg))
|
||||
|
||||
marginx = ux(.020) # 20%
|
||||
marginy = uy(.045) # 45%
|
||||
|
||||
print(" /////////////////////////////////////////////////////////: ")
|
||||
# wait until zip mount + overlayfs is complete
|
||||
while not track.ready:
|
||||
await asyncio.sleep(.1)
|
||||
|
||||
|
||||
# preloader will change dir and prepend it to sys.path
|
||||
platform.run_main(PyConfig, loaderhome= appdir / "assets", loadermain=None)
|
||||
|
||||
|
||||
# wait preloading complete
|
||||
# that includes images and wasm compilation of bundled modules
|
||||
while embed.counter()<0:
|
||||
await asyncio.sleep(.1)
|
||||
|
||||
main = appdir / "assets" / "main.py"
|
||||
|
||||
# test/wait user media interaction
|
||||
# Starte sofort, ohne auf User Interaktion zu warten
|
||||
platform.window.MM.UME = True
|
||||
|
||||
# start async top level machinery if not started and add a console in any case if requested.
|
||||
await TopLevel_async_handler.start_toplevel(platform.shell, console=window.python.config.debug)
|
||||
|
||||
# now that apk is mounted we have access to font cache
|
||||
# but we need to fill __file__/__name__ that are not yet set
|
||||
__import__(__name__).__file__ = main
|
||||
|
||||
|
||||
def ui_callback(pkg):
|
||||
print(f"installing {pkg}")
|
||||
|
||||
await shell.source(main, callback=ui_callback)
|
||||
|
||||
# if you don't reach that step
|
||||
# your main.py has an infinite sync loop somewhere !
|
||||
print("noctxl.html: ready")
|
||||
|
||||
shell.interactive()
|
||||
|
||||
asyncio.run( custom_site() )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# BEGIN BLOCK
|
||||
#
|
||||
# now this is the html part you can (and should) customize
|
||||
# It is not mandatory : pygame-script when it reads the first line (also called
|
||||
# shebang ) of above code create absolute minimal widget set
|
||||
# required for running with default rules
|
||||
#
|
||||
# do not alter that comment block it is separating python code from html code
|
||||
# =============================================================================
|
||||
# --></script><head><!--
|
||||
//=============================================================================
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
{%- if cookiecutter.comment != "" -%}
|
||||
{{cookiecutter.comment}}
|
||||
{% endif %}
|
||||
|
||||
--><script type="application/javascript">
|
||||
// END BLOCK
|
||||
|
||||
|
||||
|
||||
// this dict is available under PyConfig.config from __main__
|
||||
|
||||
config = {
|
||||
xtermjs : "{{cookiecutter.xtermjs}}" ,
|
||||
_sdl2 : "canvas",
|
||||
user_canvas : 0,
|
||||
user_canvas_managed : 0,
|
||||
ume_block : {{cookiecutter.ume_block}},
|
||||
can_close : {{cookiecutter.can_close}},
|
||||
archive : "{{cookiecutter.archive}}",
|
||||
gui_debug : 3,
|
||||
cdn : "{{cookiecutter.cdn}}",
|
||||
autorun : {{cookiecutter.autorun}},
|
||||
PYBUILD : "{{cookiecutter.PYBUILD}}"
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<title>{{cookiecutter.title}}</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="viewport" content="height=device-height, initial-scale=1.0">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||
|
||||
|
||||
<link rel="icon" type="image/png" href="favicon.png" sizes="16x16">
|
||||
|
||||
<style>
|
||||
#status {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-top: 20px;
|
||||
margin-left: 30px;
|
||||
font-weight: bold;
|
||||
color: rgb(120, 120, 120);
|
||||
}
|
||||
|
||||
#progress {
|
||||
height: 20px;
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
div.emscripten { text-align: center; }
|
||||
div.emscripten_border { border: 1px solid black; }
|
||||
div.thick_border { border: 4px solid black; }
|
||||
|
||||
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
|
||||
/* average size of droid screen 470dp x 320dp */
|
||||
canvas.emscripten {
|
||||
border: 0px none;
|
||||
background-color: transparent;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 5;
|
||||
|
||||
padding: 0;
|
||||
margin: 0 auto;
|
||||
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: arial;
|
||||
margin: 0;
|
||||
padding: none;
|
||||
background-color:powderblue;
|
||||
}
|
||||
|
||||
.topright{
|
||||
position:absolute;
|
||||
top:0px;
|
||||
right:0px;
|
||||
}
|
||||
|
||||
.bottomright {
|
||||
position:absolute;
|
||||
top: 40%;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.trinfo{
|
||||
position: relative;
|
||||
right: 0px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
.framed{
|
||||
position: relative;
|
||||
top: 150px;
|
||||
right: 10px;
|
||||
border: 1px solid black;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
/*
|
||||
if (navigator.serviceWorker)
|
||||
navigator.serviceWorker.register("{{cookiecutter.cdn}}pygbag{{cookiecutter.version}}.js")
|
||||
else
|
||||
console.warn("Service workers not supported")
|
||||
*/
|
||||
</script>
|
||||
|
||||
<script src="{{cookiecutter.cdn}}/browserfs.min.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="transfer" align=center>
|
||||
<!-- <div class="spinner" id='spinner'></div> -->
|
||||
<div class="emscripten" id="status">Downloading...</div>
|
||||
<div class="emscripten">
|
||||
<progress value="0" max="100" id="progress"></progress>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<canvas class="emscripten" id="canvas"
|
||||
width="1px"
|
||||
height="1px"
|
||||
oncontextmenu="event.preventDefault()" tabindex=1>
|
||||
</canvas>
|
||||
|
||||
<div id=html></div>
|
||||
|
||||
<div id=crt class=bottomright >
|
||||
|
||||
<div id="system" hidden>
|
||||
<div class="button-container">
|
||||
<button id="aiostop" disabled>AIO ⏏︎</button>
|
||||
<button id="aiopaused_true" disabled>AIO ■</button>
|
||||
<button id="aiopaused_false" disabled>AIO ▶</button>
|
||||
<button id="pygame_mixer_music_pause" disabled>Music ■</button>
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
<div id=load_min>min</div>
|
||||
<div id=load_avg>avg</div>
|
||||
<div id=load_max>max</div>
|
||||
<button id="load_rst" disabled>RESET</button>
|
||||
</div>
|
||||
|
||||
<div id="level">(battery level unknown)</div>
|
||||
<div id="stateBattery">(charging state unknown)</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id=box class="emscripten_border" hidden=true>
|
||||
|
||||
<div id="info" class="trinfo"></div>
|
||||
|
||||
<iframe id="iframe" class="framed" name="iframe"
|
||||
width="470px" height="90%"
|
||||
allowtransparency="true"
|
||||
style="z-index: 10;"
|
||||
style="background: #FFFFFF;"
|
||||
frameborder="1"
|
||||
allowfullscreen="true"
|
||||
webkitallowfullscreen="true"
|
||||
msallowfullscreen="true"
|
||||
mozallowfullscreen="true"
|
||||
sandbox="allow-same-origin allow-top-navigation allow-scripts allow-pointer-lock"
|
||||
allow="autoplay; fullscreen *; geolocation; microphone; camera; midi; monetization; xr-spatial-tracking; gamepad; gyroscope; accelerometer; xr; cross-origin-isolated"
|
||||
src="{{cookiecutter.cdn}}empty.html"
|
||||
scrolling="yes">
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div id="dlg" hidden>
|
||||
<input type="file" id="dlg_multifile" multiple accept="image/*">
|
||||
<label for="dlg_multifile">Select files</label>
|
||||
</div>
|
||||
|
||||
<div id="pyconsole">
|
||||
<div id="terminal" tabIndex=1 align="left"></div>
|
||||
</div>
|
||||
|
||||
<script type="application/javascript">
|
||||
|
||||
// Entfernt alle beforeunload-Warnungen
|
||||
window.onbeforeunload = null;
|
||||
|
||||
globalThis.__canvas_resized = (self, ecw, ech) => {
|
||||
console.warn("TODO: panda3d canvas monitor", self, ecw, ech)
|
||||
}
|
||||
|
||||
|
||||
async function custom_onload(debug_hidden) {
|
||||
// this is called before anythinh python is loaded
|
||||
// make your js customization here
|
||||
console.log(__FILE__, "custom_onload")
|
||||
|
||||
pyconsole.hidden = debug_hidden
|
||||
system.hidden = debug_hidden
|
||||
transfer.hidden = debug_hidden
|
||||
info.hidden = debug_hidden
|
||||
box.hidden = debug_hidden
|
||||
}
|
||||
|
||||
function custom_prerun(){
|
||||
// no python main and no (MEMFS + VFS) yet.
|
||||
console.log(__FILE__, "custom_prerun")
|
||||
|
||||
}
|
||||
|
||||
function custom_postrun(){
|
||||
// python main and no VFS filesystem yet.
|
||||
console.log(__FILE__, "custom_postrun")
|
||||
|
||||
}
|
||||
|
||||
function debug() {
|
||||
// allow to gain access to dev tools from js console
|
||||
// but only on desktop. difficult to reach when in iframe
|
||||
python.config.debug = true
|
||||
custom_onload(false)
|
||||
Module.PyRun_SimpleString("shell.uptime()")
|
||||
window_resize()
|
||||
}
|
||||
|
||||
function info_inline(data){
|
||||
document.getElementById("info").innerHTML = data
|
||||
}
|
||||
|
||||
function info_online(url) {
|
||||
// display info about current APK
|
||||
fetch( url /*, options */)
|
||||
.then((response) => response.text())
|
||||
.then((html) => {
|
||||
info_inline(html);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.warn(error);
|
||||
});
|
||||
}
|
||||
|
||||
function frame_online(url) {
|
||||
window.frames["iframe"].location = url;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user