#!/bin/bash # kiosk-manager.sh — konfiguracja X11 + lewy ekran: Chromium # Plik docelowy: /home/kiosk/kiosk-manager.sh # Jawnie ustawiamy HOME — serwis może startować jako root (xinit bez User=kiosk), # a LibreOffice szuka profilu w $HOME/.config/libreoffice/ (nie w /home/kiosk/). # Wszystkie procesy potomne (soffice, chromium) dziedziczą tę wartość. export HOME=/home/kiosk KIOSK_HOST="diluals31" KIOSK_URL="http://diluals31/terminal/ift/5/DE/index" WAITING_PAGE="file:///home/kiosk/waiting.html" OUTPUT_LEFT="DP-1" OUTPUT_RIGHT="HDMI-1" RES_W=1920 RES_H=1080 # ─── Niewidoczny kursor ────────────────────────────────────────────────────── # Tworzymy motyw XCursor (1×1 px, ARGB 0x00000000) i eksportujemy XCURSOR_THEME # zanim uruchomią się Chromium i LibreOffice — dziedziczą środowisko procesu. # Brak myszy w kiosku nie usuwa kursora X11; bez tego wskaźnik jest widoczny # w środku między ekranami (domyślna pozycja X11 = centrum wirtualnego desktopa). _BLANK_DIR="/home/kiosk/.icons/blank/cursors" mkdir -p "$_BLANK_DIR" # printf pisze binarnie bezpośrednio do pliku — nie przez zmienną (bash $() ucina null-byte'y) for _n in left_ptr default pointer crosshair text watch wait move size_all fleur; do printf '\x58\x63\x75\x72\x10\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x1c\x00\x00\x00\x24\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00' > "$_BLANK_DIR/$_n" done printf '[Icon Theme]\nName=blank\n' > /home/kiosk/.icons/blank/index.theme export XCURSOR_THEME=blank export XCURSOR_SIZE=1 # Dual-screen rozszerzony: lewy ekran primary, prawy po prawej # --auto wykrywa tryb automatycznie (bezpieczniejsze niż --mode 1920x1080) xrandr --output "$OUTPUT_LEFT" --auto --primary --pos 0x0 xrandr --output "$OUTPUT_RIGHT" --auto --right-of "$OUTPUT_LEFT" # Rozszerz wirtualny framebuffer 200 px poniżej ekranów — kursor trafi w ten obszar # i nie będzie widoczny na żadnym fizycznym monitorze (bez potrzeby dodatkowych pakietów) xrandr --fb "$((RES_W * 2))x$((RES_H + 200))" echo "[kiosk-manager] Konfiguracja xrandr:" xrandr | grep -E "connected|[0-9]+x[0-9]+\+" # Czarne tło na obu ekranach xsetroot -solid black # Wyłącz wygaszacz ekranu i DPMS (kiosk działa non-stop) xset s off xset -dpms xset s noblank # Przesuń kursor poniżej fizycznych ekranów — w obszar framebuffera bez outputu # Kursor istnieje w X11, ale nie jest wyświetlany na żadnym monitorze xdotool mousemove "$RES_W" "$((RES_H + 100))" # Uruchom lekki WM — wymagany do per-screen fullscreen przez wmctrl openbox --sm-disable & sleep 0.5 # ─── Start aplikacji ───────────────────────────────────────────────────────── # Konfiguracja LO (wyłączenie konsoli prezentera) jest zarządzana przez # presentation-manager.sh → start_lo() via -env:UserInstallation=/tmp/lo-kiosk-profile # Uruchom menedżera prezentacji w tle (prawy ekran) /home/kiosk/presentation-manager.sh & # Watchdog sesji: ukrywa okna konsoli LibreOffice przez cały czas trwania sesji X. # Uruchomiony tu — nie czeka na SMB, działa od startu X niezależnie od timing'u LO. ( while sleep 0.4; do for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do _wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \ | awk '/Position:/{split($2,a,","); print a[1]+0}') if [ "${_wx:-0}" -lt 1920 ]; then wmctrl -i -r "$_wid" -b remove,above 2>/dev/null wmctrl -i -r "$_wid" -b add,below 2>/dev/null xdotool windowmove --sync "$_wid" 4000 0 2>/dev/null echo "[kiosk-manager/watchdog] Konsola LO ukryta (WID=$_wid, x=${_wx:-?})" fi done done ) & CHROMIUM_OPTS=( --no-first-run --noerrdialogs --disable-infobars --disable-gpu-suspend --force-device-scale-factor=1 --user-data-dir=/home/kiosk/.cache/chromium --disable-features=AutofillServerCommunication,AutofillKeyValueService,Translate,MediaRouter --disable-save-password-bubble --disable-sync --disable-extensions --disable-background-networking --disable-notifications --disable-component-update --password-store=basic --disable-pinch --window-position=0,0 --window-size=${RES_W},${RES_H} ) # Strona oczekiwania — lewy ekran # Bez --kiosk: na X11 --kiosk rozciąga okno na cały wirtualny desktop (oba ekrany) chromium --app="$WAITING_PAGE" "${CHROMIUM_OPTS[@]}" & CHROMIUM_PID=$! # Czekaj na okno i zastosuj fullscreen (synchronicznie) for _i in $(seq 1 40); do sleep 0.5 WID=$(xdotool search --pid "$CHROMIUM_PID" --onlyvisible 2>/dev/null | head -1) if [ -n "$WID" ]; then wmctrl -i -r "$WID" -b add,fullscreen wmctrl -i -r "$WID" -b add,above break fi done sleep 2 # Minimalny czas wyświetlania strony oczekiwania # Czekaj na dostępność serwera kiosku while ! ping -c 1 -W 1 "$KIOSK_HOST" > /dev/null 2>&1; do sleep 1 done # Czekaj na zamontowanie SMB (sygnał od presentation-manager.sh). # waiting.html zostaje do czasu gdy oba ekrany są gotowe do startu. while [ ! -f /tmp/kiosk-smb-ready ]; do sleep 1 done sleep 5 # Zamknij ekran oczekiwania i uruchom właściwy kiosk kill "$CHROMIUM_PID" wait "$CHROMIUM_PID" 2>/dev/null rm -f /tmp/kiosk-chromium-restart launch_chromium() { rm -f /tmp/kiosk-chromium-restart chromium --app="$KIOSK_URL" "${CHROMIUM_OPTS[@]}" & CHROMIUM_PID=$! echo "[kiosk-manager] Chromium uruchomiony (PID=$CHROMIUM_PID)" ( for _i in $(seq 1 30); do sleep 1 WID=$(xdotool search --pid "$CHROMIUM_PID" --onlyvisible 2>/dev/null | head -1) if [ -n "$WID" ]; then wmctrl -i -r "$WID" -b add,fullscreen wmctrl -i -r "$WID" -b add,above echo "[kiosk-manager] Chromium na lewym ekranie (próba $_i)" break fi done ) & } launch_chromium # Pętla: reaguje na sygnał restartu od presentation-manager.sh # (zmiana pliku prezentacji) lub na awarię Chromium while true; do sleep 1 if [ -f /tmp/kiosk-chromium-restart ]; then echo "[kiosk-manager] Sygnał restart Chromium — restartuje" kill "$CHROMIUM_PID" 2>/dev/null wait "$CHROMIUM_PID" 2>/dev/null launch_chromium elif ! kill -0 "${CHROMIUM_PID:-0}" 2>/dev/null; then echo "[kiosk-manager] Chromium zakończył się — restartuje" launch_chromium fi done