initial commit
This commit is contained in:
+157
@@ -0,0 +1,157 @@
|
||||
const path = require("path");
|
||||
const hardware = require("./hardware");
|
||||
const integration = require("./integration");
|
||||
const { app, nativeTheme, BaseWindow, WebContentsView } = require("electron");
|
||||
|
||||
global.WEBVIEW = global.WEBVIEW || {
|
||||
initialized: false,
|
||||
status: "offline",
|
||||
locked: false,
|
||||
};
|
||||
|
||||
/**
|
||||
* Initializes the webview with the provided arguments.
|
||||
*
|
||||
* @param {Object} args - The command-line arguments to customize the initialization process.
|
||||
* @returns {boolean} Returns true if the initialization was successful.
|
||||
*/
|
||||
const init = (args) => {
|
||||
if (!args.web_url) {
|
||||
console.error("Please provide the '--web-url' parameter.");
|
||||
return app.quit();
|
||||
}
|
||||
const url = new URL(args.web_url);
|
||||
const theme = args.web_theme ? args.web_theme : "dark";
|
||||
const zoom = args.web_zoom ? parseFloat(args.web_zoom) : 1.25;
|
||||
|
||||
// Init global root window
|
||||
WEBVIEW.window = new BaseWindow({
|
||||
icon: path.join(__dirname, "..", "img", "icon.png"),
|
||||
});
|
||||
WEBVIEW.window.setMenuBarVisibility(false);
|
||||
WEBVIEW.window.setFullScreen(true);
|
||||
nativeTheme.themeSource = theme;
|
||||
// WEBVIEW.window.minimize();
|
||||
|
||||
// Init global main webview
|
||||
WEBVIEW.view = new WebContentsView();
|
||||
WEBVIEW.window.contentView.addChildView(WEBVIEW.view);
|
||||
WEBVIEW.view.webContents.loadURL(url.toString());
|
||||
|
||||
// Register events
|
||||
windowEvents(WEBVIEW.window, zoom);
|
||||
viewEvents(WEBVIEW.view);
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Updates the shared webview properties.
|
||||
*/
|
||||
const update = () => {
|
||||
if (!WEBVIEW.initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Update window status
|
||||
if (WEBVIEW.window.isFullScreen()) {
|
||||
WEBVIEW.status = "Fullscreen";
|
||||
} else if (WEBVIEW.window.isMinimized()) {
|
||||
WEBVIEW.status = "Minimized";
|
||||
} else if (WEBVIEW.window.isMaximized()) {
|
||||
WEBVIEW.status = "Maximized";
|
||||
} else {
|
||||
WEBVIEW.status = "Framed";
|
||||
}
|
||||
|
||||
// Update integration sensor
|
||||
console.log("Update Kiosk Status:", WEBVIEW.status);
|
||||
integration.update();
|
||||
};
|
||||
|
||||
/**
|
||||
* Register window events and handler.
|
||||
*
|
||||
* @param {Object} window - The root window object.
|
||||
* @param {number} zoom - Zoom level used for the webview.
|
||||
*/
|
||||
const windowEvents = (window, zoom) => {
|
||||
// Handle window resize for webview bounds
|
||||
const resize = () => {
|
||||
const { width, height } = window.getBounds();
|
||||
WEBVIEW.view.setBounds({ x: 0, y: 0, width: width, height: height });
|
||||
WEBVIEW.view.webContents.setZoomFactor(zoom);
|
||||
};
|
||||
window.on("ready-to-show", resize);
|
||||
window.on("resize", resize);
|
||||
resize();
|
||||
|
||||
// Handle focus change for webview lock
|
||||
HARDWARE.display.notifiers.push(() => {
|
||||
WEBVIEW.locked = hardware.getDisplayStatus() === "OFF";
|
||||
if (WEBVIEW.locked) {
|
||||
window.blur();
|
||||
}
|
||||
/* This also works, but it doesn't allow to react for screen wake up.
|
||||
window.setIgnoreMouseEvents(getDisplayStatus() === "OFF");
|
||||
*/
|
||||
});
|
||||
window.on("focus", () => {
|
||||
if (WEBVIEW.locked) {
|
||||
hardware.setDisplayStatus("ON");
|
||||
window.blur();
|
||||
}
|
||||
WEBVIEW.locked = false;
|
||||
});
|
||||
|
||||
// Update window status
|
||||
window.on("minimize", update);
|
||||
window.on("restore", update);
|
||||
window.on("maximize", update);
|
||||
window.on("unmaximize", update);
|
||||
window.on("enter-full-screen", update);
|
||||
window.on("leave-full-screen", update);
|
||||
process.on("SIGINT", app.quit);
|
||||
app.on("before-quit", () => {
|
||||
WEBVIEW.status = "Terminated";
|
||||
integration.update();
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Register webview events and handler.
|
||||
*
|
||||
* @param {Object} view - The main webview object.
|
||||
*/
|
||||
const viewEvents = (view) => {
|
||||
// Enable webview touch emulation
|
||||
view.webContents.debugger.attach("1.1");
|
||||
view.webContents.debugger.sendCommand(
|
||||
"Emulation.setEmitTouchEventsForMouse",
|
||||
{
|
||||
enabled: true,
|
||||
configuration: "mobile",
|
||||
}
|
||||
);
|
||||
|
||||
// Disable webview hyperlinks
|
||||
view.webContents.setWindowOpenHandler(() => {
|
||||
return { action: "deny" };
|
||||
});
|
||||
|
||||
// Remove webview scrollbar
|
||||
view.webContents.on("dom-ready", () => {
|
||||
view.webContents.insertCSS("::-webkit-scrollbar { display: none; }");
|
||||
});
|
||||
|
||||
// Webview fully loaded
|
||||
view.webContents.on("did-finish-load", () => {
|
||||
WEBVIEW.initialized = true;
|
||||
update();
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
init,
|
||||
update,
|
||||
};
|
||||
Reference in New Issue
Block a user