mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-15 18:13:40 +03:00
* Plugin callsigns, filechangehandler thread bug fix, plugin file perms - Plugins are now assigned a callsign (a random string), which they use for all internal identification, like resource fetching and method calls. This is to ensure that plugins only access their own resources and methods. - Made FileChangeHandler send off events to a queue, that is then consumed by the Loader, instead of calling import_plugin on its own, since that caused weird issues with the event loop and the thread watchdog is using. - Plugins are now owned by root and have read-only permissions. This is handled automatically. * Improved general look and feel of plugin tab * Make all plugin entries have the same padding between them * Make "No plugins installed" text look the same as "No new notifications" Co-authored-by: WerWolv <werwolv98@gmail.com>
77 lines
3.9 KiB
HTML
77 lines
3.9 KiB
HTML
<link rel="stylesheet" href="/static/styles.css">
|
|
<script>
|
|
const tile_iframes = [];
|
|
window.addEventListener("message", function (evt) {
|
|
tile_iframes.forEach(iframe => {
|
|
iframe.contentWindow.postMessage(evt.data, "http://127.0.0.1:1337");
|
|
});
|
|
}, false);
|
|
|
|
function loadPlugin(callsign, name) {
|
|
this.parent.postMessage("PLUGIN_LOADER__"+name, "https://steamloopback.host");
|
|
location.href = `/plugins/load_main/${callsign}`;
|
|
}
|
|
</script>
|
|
|
|
{% if not plugins|length %}
|
|
<div class="quickaccessmenu_TabGroupPanel_1QO7b Panel Focusable">
|
|
<div class="quickaccesscontrols_EmptyNotifications_3ZjbM" style="padding-top:7px;">
|
|
No plugins installed
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="quickaccessmenu_TabGroupPanel_1QO7b Panel Focusable">
|
|
{% for plugin in plugins %}
|
|
{% if plugin.tile_view_html|length %}
|
|
<div class="quickaccesscontrols_PanelSectionRow_26R5w">
|
|
<div onclick="loadPlugin('{{ plugin.callsign }}', '{{ plugin.name }}')"
|
|
class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable"
|
|
style="--indent-level:0; margin: 0px; padding: 0px; padding-top: 8px;">
|
|
<iframe id="tile_view_iframe_{{ plugin.callsign }}"
|
|
scrolling="no" marginwidth="0" marginheight="0"
|
|
hspace="0" vspace="0" frameborder="0"
|
|
style="border-radius: 2px;"
|
|
src="/plugins/load_tile/{{ plugin.callsign }}">
|
|
</iframe>
|
|
<script>
|
|
(function() {
|
|
let iframe = document.getElementById("tile_view_iframe_{{ plugin.callsign }}");
|
|
tile_iframes.push(document.getElementById("tile_view_iframe_{{ plugin.callsign }}"));
|
|
|
|
iframe.onload = function() {
|
|
let html = iframe.contentWindow.document.children[0];
|
|
let last_height = 0;
|
|
|
|
setInterval(function() {
|
|
let height = iframe.contentWindow.document.children[0].scrollHeight;
|
|
if (height != last_height) {
|
|
iframe.height = height + "px";
|
|
last_height = height;
|
|
}
|
|
}, 100);
|
|
|
|
iframe.contentWindow.document.body.onclick = function () {
|
|
loadPlugin('{{ plugin.callsign }}', '{{ plugin.name }}');
|
|
};
|
|
}
|
|
})();
|
|
</script>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="quickaccesscontrols_PanelSectionRow_26R5w">
|
|
<div onclick="loadPlugin('{{ plugin.callsign }}', '{{ plugin.name }}')"
|
|
class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable"
|
|
style="--indent-level:0; margin: 0px; padding: 0px; padding-top: 8px;">
|
|
<div class="basicdialog_FieldChildren_279n8">
|
|
<button type="button" tabindex="0"
|
|
class="DialogButton _DialogLayout Secondary basicdialog_Button_1Ievp Focusable">{{ plugin.name }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|