diff --git a/Readme.md b/Readme.md index 06a1f6e..29e7fc3 100644 --- a/Readme.md +++ b/Readme.md @@ -249,7 +249,7 @@ The kiosk machine still needs a working internet connection (ethernet, or WiFi c - **1-finger swipe** (dual mode) - Navigate within page (arrow keys) - **On-screen keyboard** - Auto-shows on text fields or click keyboard icon - **Navigation menu** - Click key icon (top-left) to access site list and gesture cheat sheet -- **Back/forward buttons** (optional, off by default) - two half-transparent ◀ ▶ buttons at the top middle of the screen, for kiosks with no keyboard or mouse side buttons. They appear on a tap, click or mouse movement and fade after a few seconds. Turn on in Core Settings → Display & Interaction, or the Web UI. +- **Back/forward buttons** (optional, off by default) - two half-transparent ◀ ▶ buttons at the top middle of the screen, for kiosks with no keyboard or mouse side buttons. They appear on a tap, click or mouse movement and fade after a few seconds. Turn on in Core Settings → Display & Interaction, or the Web UI, where you can also set how solid they look (opacity 10–100%, default 50). ### On-Screen Keyboard - **HTML-based keyboard** with full QWERTY layout diff --git a/kiosk-app/main.js b/kiosk-app/main.js index ed2e8ae..c565a22 100644 --- a/kiosk-app/main.js +++ b/kiosk-app/main.js @@ -61,6 +61,7 @@ let enablePauseButton=true; let enableKeyboardButton=true; let enableNavButton=true; let enableHistoryButtons=false; +let historyButtonsOpacity=50; let enablePasswordProtection=false; let lockoutPassword=""; let lockoutTimeout=0; @@ -104,6 +105,10 @@ function loadConfig(){ enableKeyboardButton=(config.enableKeyboardButton!==false); enableNavButton=(config.enableNavButton!==false); enableHistoryButtons=(config.enableHistoryButtons===true); + { + const pct=Number(config.historyButtonsOpacity); + historyButtonsOpacity=(Number.isInteger(pct)&&pct>=10&&pct<=100)?pct:50; + } enablePasswordProtection=(config.enablePasswordProtection===true); lockoutPassword=config.lockoutPassword||""; lockoutTimeout=(config.lockoutTimeout||0)*60000; // Convert minutes to ms @@ -124,7 +129,7 @@ function loadConfig(){ console.log('[CONFIG] Navigation:',allowNavigation); console.log('[CONFIG] Pause button:',enablePauseButton); console.log('[CONFIG] Keyboard button:',enableKeyboardButton); - console.log('[CONFIG] Back/forward buttons:',enableHistoryButtons); + console.log('[CONFIG] Back/forward buttons:',enableHistoryButtons,'opacity',historyButtonsOpacity+'%'); console.log('[CONFIG] Password protection:',enablePasswordProtection); console.log('[CONFIG] Lockout timeout:',lockoutTimeout/60000,'minutes'); if(lockoutAtTime)console.log('[CONFIG] Lock at time:',lockoutAtTime); @@ -1640,7 +1645,7 @@ async function createWindow(){ console.log('[MAIN] Page loaded - sending keyboard-button-enabled: '+enableKeyboardButton); view.webContents.send('nav-button-enabled',enableNavButton); - view.webContents.send('history-buttons-enabled',enableHistoryButtons); + view.webContents.send('history-buttons-config',{enabled:enableHistoryButtons,opacity:historyButtonsOpacity}); console.log('[MAIN] Page loaded - sending nav-button-enabled: '+enableNavButton); console.log('[MAIN] Page loaded - resending pause-button-visibility: '+shouldShow+' for '+t.url); diff --git a/kiosk-app/preload.js b/kiosk-app/preload.js index 7377d9e..c405bfb 100644 --- a/kiosk-app/preload.js +++ b/kiosk-app/preload.js @@ -120,11 +120,16 @@ ipcRenderer.on('keyboard-button-enabled',(event,enabled)=>{ let historyButtonsEnabled=false; let historyBar=null; let historyBarHideTimer=null; -ipcRenderer.on('history-buttons-enabled',(event,enabled)=>{ - historyButtonsEnabled=enabled===true; - console.log('[HISTORY-BTN] Back/forward buttons enabled: '+historyButtonsEnabled); - if(historyBar&&!historyButtonsEnabled){ - historyBar.style.display='none'; +let historyOpacity=0.5; // 0.1 - 1.0, from the "opacity" setting (percent) +const historyHoverOpacity=()=>Math.min(1,historyOpacity+0.4); +ipcRenderer.on('history-buttons-config',(event,cfg)=>{ + historyButtonsEnabled=!!(cfg&&cfg.enabled===true); + const pct=Number(cfg&&cfg.opacity); + historyOpacity=(pct>=10&&pct<=100)?pct/100:0.5; + console.log('[HISTORY-BTN] Back/forward buttons enabled: '+historyButtonsEnabled+', opacity '+historyOpacity); + if(historyBar){ + historyBar.style.opacity=String(historyOpacity); + if(!historyButtonsEnabled)historyBar.style.display='none'; } }); @@ -275,7 +280,7 @@ window.addEventListener('DOMContentLoaded',()=>{ historyBar.id='electron-history-bar'; historyBar.style.cssText=` position:fixed;top:12px;left:50%;transform:translateX(-50%); - display:none;gap:14px;z-index:999999;opacity:0.5; + display:none;gap:14px;z-index:999999;opacity:${historyOpacity}; transition:opacity 0.15s;user-select:none; `; const makeButton=(label,direction,path)=>{ @@ -299,8 +304,8 @@ window.addEventListener('DOMContentLoaded',()=>{ makeButton('Back','back','M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z'), makeButton('Forward','forward','M8.59 16.59L10 18l6-6-6-6-1.41 1.41L13.17 12z') ); - historyBar.addEventListener('mouseenter',()=>{historyBar.style.opacity='0.9';}); - historyBar.addEventListener('mouseleave',()=>{historyBar.style.opacity='0.5';}); + historyBar.addEventListener('mouseenter',()=>{historyBar.style.opacity=String(historyHoverOpacity());}); + historyBar.addEventListener('mouseleave',()=>{historyBar.style.opacity=String(historyOpacity);}); document.body.appendChild(historyBar); } diff --git a/lib/config.sh b/lib/config.sh index ff99912..5b10b04 100644 --- a/lib/config.sh +++ b/lib/config.sh @@ -80,6 +80,7 @@ ENABLE_PAUSE_BUTTON="true" ENABLE_KEYBOARD_BUTTON="true" ENABLE_NAV_BUTTON="true" ENABLE_HISTORY_BUTTONS="false" +HISTORY_BUTTONS_OPACITY=50 ENABLE_PASSWORD_PROTECTION="false" LOCKOUT_PASSWORD="" LOCKOUT_TIMEOUT=0 @@ -217,6 +218,9 @@ load_existing_config() { history_btn=$(sudo -u "$KIOSK_USER" jq -r '.enableHistoryButtons // false' "$CONFIG_PATH" 2>/dev/null) [[ "$history_btn" == "true" ]] && ENABLE_HISTORY_BUTTONS="true" || ENABLE_HISTORY_BUTTONS="false" + HISTORY_BUTTONS_OPACITY=$(sudo -u "$KIOSK_USER" jq -r '.historyButtonsOpacity // 50' "$CONFIG_PATH" 2>/dev/null || echo "50") + [[ "$HISTORY_BUTTONS_OPACITY" =~ ^[0-9]+$ ]] && (( HISTORY_BUTTONS_OPACITY >= 10 && HISTORY_BUTTONS_OPACITY <= 100 )) || HISTORY_BUTTONS_OPACITY=50 + password_enabled=$(sudo -u "$KIOSK_USER" jq -r '.enablePasswordProtection // false' "$CONFIG_PATH" 2>/dev/null) [[ "$password_enabled" == "true" ]] && ENABLE_PASSWORD_PROTECTION="true" || ENABLE_PASSWORD_PROTECTION="false" @@ -309,6 +313,7 @@ save_config() { --argjson enableKeyboardButton "$keyboard_btn_json" \ --argjson enableNavButton "$nav_btn_json" \ --argjson enableHistoryButtons "$history_btn_json" \ + --argjson historyButtonsOpacity "${HISTORY_BUTTONS_OPACITY:-50}" \ --argjson enablePasswordProtection "$password_json" \ --arg lockoutPassword "${LOCKOUT_PASSWORD:-}" \ --argjson lockoutTimeout "${LOCKOUT_TIMEOUT:-0}" \ @@ -322,7 +327,7 @@ save_config() { --arg autheliaURL "${AUTHELIA_URL:-}" \ --arg autheliaUsername "${AUTHELIA_USERNAME:-}" \ --arg autheliaEncryptedPassword "${AUTHELIA_ENCRYPTED_PASSWORD:-}" \ - '. + {autoswitch:$autoswitch,enableTouch:$enableTouch,dualSwipe:$dualSwipe,swipeMode:$swipeMode,allowNavigation:$allowNavigation,homeTabIndex:$homeTabIndex,inactivityTimeout:$inactivityTimeout,enablePauseButton:$enablePauseButton,enableKeyboardButton:$enableKeyboardButton,enableNavButton:$enableNavButton,enableHistoryButtons:$enableHistoryButtons,enablePasswordProtection:$enablePasswordProtection,lockoutPassword:$lockoutPassword,lockoutTimeout:$lockoutTimeout,lockoutAtTime:$lockoutAtTime,lockoutActiveStart:$lockoutActiveStart,lockoutActiveEnd:$lockoutActiveEnd,requirePasswordOnBoot:$requirePasswordOnBoot,lockoutCodeType:$lockoutCodeType,bootPassword:$bootPassword,bootCodeType:$bootCodeType,autheliaURL:$autheliaURL,autheliaUsername:$autheliaUsername,autheliaEncryptedPassword:$autheliaEncryptedPassword,tabs:[]}' > "$tmp" + '. + {autoswitch:$autoswitch,enableTouch:$enableTouch,dualSwipe:$dualSwipe,swipeMode:$swipeMode,allowNavigation:$allowNavigation,homeTabIndex:$homeTabIndex,inactivityTimeout:$inactivityTimeout,enablePauseButton:$enablePauseButton,enableKeyboardButton:$enableKeyboardButton,enableNavButton:$enableNavButton,enableHistoryButtons:$enableHistoryButtons,historyButtonsOpacity:$historyButtonsOpacity,enablePasswordProtection:$enablePasswordProtection,lockoutPassword:$lockoutPassword,lockoutTimeout:$lockoutTimeout,lockoutAtTime:$lockoutAtTime,lockoutActiveStart:$lockoutActiveStart,lockoutActiveEnd:$lockoutActiveEnd,requirePasswordOnBoot:$requirePasswordOnBoot,lockoutCodeType:$lockoutCodeType,bootPassword:$bootPassword,bootCodeType:$bootCodeType,autheliaURL:$autheliaURL,autheliaUsername:$autheliaUsername,autheliaEncryptedPassword:$autheliaEncryptedPassword,tabs:[]}' > "$tmp" if [[ ${#URLS[@]} -gt 0 ]]; then for idx in "${!URLS[@]}"; do diff --git a/menus/advanced_upgrade.sh b/menus/advanced_upgrade.sh index 96502fa..3cbc4eb 100644 --- a/menus/advanced_upgrade.sh +++ b/menus/advanced_upgrade.sh @@ -121,6 +121,18 @@ action_upgrade() { provision_configure_display provision_configure_firewall provision_configure_power_management + + # The Web UI runs from its own copy (/opt/kiosk-webui), not from + # this checkout - refresh it too, or new settings never show up + # there. Port, service and sudo rules are left as they are. + if [[ -f "$SYSTEMD_DIR/kiosk-webui.service" ]]; then + log_info "Refreshing the Web UI..." + if webui_install_app_files; then + sudo systemctl restart kiosk-webui || log_warning "Web UI copied but did not restart - run: sudo systemctl restart kiosk-webui" + else + log_warning "Couldn't refresh the Web UI - the Web UI keeps its old version" + fi + fi log_success "Setup refreshed" echo diff --git a/menus/display.sh b/menus/display.sh index 2fafb79..f2e6496 100644 --- a/menus/display.sh +++ b/menus/display.sh @@ -20,7 +20,7 @@ display_status() { echo "Pause button: $(onoff "$ENABLE_PAUSE_BUTTON")" echo "Keyboard button: $(onoff "$ENABLE_KEYBOARD_BUTTON")" echo "Navigation button: $(onoff "$ENABLE_NAV_BUTTON")" - echo "Back/forward btns: $(onoff "$ENABLE_HISTORY_BUTTONS")" + echo "Back/forward btns: $(onoff "$ENABLE_HISTORY_BUTTONS") (opacity ${HISTORY_BUTTONS_OPACITY}%)" } display_menu_builder() { @@ -31,6 +31,7 @@ display_menu_builder() { "Toggle on-screen keyboard button (currently: $(onoff "$ENABLE_KEYBOARD_BUTTON"))" "Toggle navigation/help button (currently: $(onoff "$ENABLE_NAV_BUTTON"))" "Toggle on-screen back/forward buttons (currently: $(onoff "$ENABLE_HISTORY_BUTTONS"))" + "Back/forward button opacity (currently: ${HISTORY_BUTTONS_OPACITY}%)" ) MENU_HANDLERS=( action_set_touch_mode @@ -39,6 +40,7 @@ display_menu_builder() { action_toggle_keyboard_button action_toggle_nav_button action_toggle_history_buttons + action_set_history_opacity ) } @@ -149,3 +151,16 @@ action_toggle_history_buttons() { fi save_config } + +# How see-through the back/forward buttons are: 100 = solid, 10 = faint. +# They get a little more solid while the mouse is over them. +action_set_history_opacity() { + echo + echo "How solid the on-screen back/forward buttons look (10 = faint, 100 = solid)." + HISTORY_BUTTONS_OPACITY=$(ask_integer "Opacity percent" "$HISTORY_BUTTONS_OPACITY" 10 100) + save_config + log_success "Back/forward button opacity: ${HISTORY_BUTTONS_OPACITY}%" + if [[ "$ENABLE_HISTORY_BUTTONS" != "true" ]]; then + log_info "The buttons are off - turn them on with the entry above." + fi +} diff --git a/webui/lib/config.js b/webui/lib/config.js index 0f6046d..ace9c7a 100644 --- a/webui/lib/config.js +++ b/webui/lib/config.js @@ -41,6 +41,7 @@ const SCALAR_DEFAULTS = { enableKeyboardButton: true, enableNavButton: true, enableHistoryButtons: false, + historyButtonsOpacity: 50, enablePasswordProtection: false, lockoutTimeout: 0, lockoutAtTime: '', diff --git a/webui/public/app.js b/webui/public/app.js index 05180fb..77cca32 100644 --- a/webui/public/app.js +++ b/webui/public/app.js @@ -174,6 +174,7 @@ displayForm.addEventListener('submit', async (e) => { enableKeyboardButton: fd.get('enableKeyboardButton') === 'on', enableNavButton: fd.get('enableNavButton') === 'on', enableHistoryButtons: fd.get('enableHistoryButtons') === 'on', + historyButtonsOpacity: parseInt(fd.get('historyButtonsOpacity'), 10), homeTabIndex: parseInt(fd.get('homeTabIndex'), 10), inactivityTimeoutMinutes: parseInt(fd.get('inactivityTimeoutMinutes'), 10), }; @@ -284,6 +285,7 @@ function populateAll(config) { displayForm.elements.enableKeyboardButton.checked = !!config.enableKeyboardButton; displayForm.elements.enableNavButton.checked = !!config.enableNavButton; displayForm.elements.enableHistoryButtons.checked = !!config.enableHistoryButtons; + displayForm.elements.historyButtonsOpacity.value = config.historyButtonsOpacity; updateHomeTabOptions(config.tabs); homeTabSelect.value = String(config.homeTabIndex); displayForm.elements.inactivityTimeoutMinutes.value = Math.round(config.inactivityTimeout / 60); diff --git a/webui/public/index.html b/webui/public/index.html index 5e1e846..9b49176 100644 --- a/webui/public/index.html +++ b/webui/public/index.html @@ -105,6 +105,10 @@ +