feat: add xface-minimal config for Stage 2 display stack
- Add xface-minimal config with hidden panel, icons, notifications - Add start-chromium-minimal.sh for kiosk mode Chrome shell - Add switch-desktop-mode.sh to toggle xfce/minimal modes - Update xworkspace-desktop.yaml with minimal and display_stages config - Implement Display Stack Strategy Stage 2: minimal window manager + Chrome Shell only
This commit is contained in:
parent
46b8227c26
commit
9ecacca0f7
12
config/xface-minimal/desktop-icons.xml
Normal file
12
config/xface-minimal/desktop-icons.xml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfce4-desktop" version="1.0">
|
||||
<property name="desktop-icons" type="empty">
|
||||
<property name="icon-size" type="int" value="2"/>
|
||||
<property name="show-thumbnail" type="bool" value="false"/>
|
||||
<property name="show-trash" type="bool" value="false"/>
|
||||
<property name="show-filesystem" type="bool" value="false"/>
|
||||
<property name="show-removable" type="bool" value="false"/>
|
||||
<property name="single-click" type="bool" value="false"/>
|
||||
<property name="sort" type="string" value="name"/>
|
||||
</property>
|
||||
</channel>
|
||||
9
config/xface-minimal/keyboard-shortcuts.xml
Normal file
9
config/xface-minimal/keyboard-shortcuts.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfce4-keyboard-shortcuts" version="1.0">
|
||||
<property name="commands" type="empty">
|
||||
</property>
|
||||
<property name="default" type="empty">
|
||||
</property>
|
||||
<property name="xfwm4" type="empty">
|
||||
</property>
|
||||
</channel>
|
||||
6
config/xface-minimal/notifyd.xml
Normal file
6
config/xface-minimal/notifyd.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfce4-notifyd" version="1.0">
|
||||
<property name="general" type="empty">
|
||||
<property name="do-not-disturb" type="bool" value="true"/>
|
||||
</property>
|
||||
</channel>
|
||||
14
config/xface-minimal/panel.xml
Normal file
14
config/xface-minimal/panel.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfce4-panel" version="1.0">
|
||||
<property name="panels" type="array">
|
||||
<value type="int" value="1"/>
|
||||
</property>
|
||||
<property name="panel-1" type="empty">
|
||||
<property name="autohide-behavior" type="uint" value="1"/>
|
||||
<property name="enable-launcher" type="bool" value="false"/>
|
||||
<property name="length" type="uint" value="100"/>
|
||||
<property name="position" type="string" value="p=6;x=0;y=0"/>
|
||||
<property name="size" type="uint" value="1"/>
|
||||
<property name="visible" type="bool" value="false"/>
|
||||
</property>
|
||||
</channel>
|
||||
11
config/xface-minimal/session.xml
Normal file
11
config/xface-minimal/session.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfce4-session" version="1.0">
|
||||
<property name="general" type="empty">
|
||||
<property name="SaveOnExit" type="bool" value="false"/>
|
||||
<property name="StartXterms" type="bool" value="false"/>
|
||||
<property name="StartSpeech" type="bool" value="false"/>
|
||||
</property>
|
||||
<property name="general/Logout" type="empty">
|
||||
<property name="PromptLogout" type="bool" value="false"/>
|
||||
</property>
|
||||
</channel>
|
||||
15
config/xface-minimal/thunar.xml
Normal file
15
config/xface-minimal/thunar.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="thunar" version="1.0">
|
||||
<property name="general" type="empty">
|
||||
<property name="default-view" type="string" value="ThunarIconsView"/>
|
||||
<property name="last-view" type="string" value="ThunarIconsView"/>
|
||||
<property name="last-sort-column" type="uint" value="0"/>
|
||||
<property name="last-sort-reverse" type="bool" value="false"/>
|
||||
<property name="last-sort-folders-first" type="bool" value="true"/>
|
||||
</property>
|
||||
<property name="advanced" type="empty">
|
||||
<property name="show-hidden" type="bool" value="false"/>
|
||||
<property name="show-full-path" type="bool" value="false"/>
|
||||
<property name="max-name-length" type="uint" value="200"/>
|
||||
</property>
|
||||
</channel>
|
||||
25
config/xface-minimal/xfwm4.xml
Normal file
25
config/xface-minimal/xfwm4.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<channel name="xfwm4" version="1.0">
|
||||
<property name="general" type="empty">
|
||||
<property name="title_font" type="string" value="Sans Bold 9"/>
|
||||
<property name="click_to_focus" type="bool" value="true"/>
|
||||
<property name="focus_delay" type="int" value="0"/>
|
||||
<property name="easy_click" type="string" value=""/>
|
||||
<property name="raise_on_click" type="bool" value="true"/>
|
||||
<property name="raise_with_mouse_button" type="bool" value="true"/>
|
||||
<property name="focus_new" type="bool" value="true"/>
|
||||
<property name="cycle_minimized" type="bool" value="false"/>
|
||||
<property name="cycle_minimized_restack" type="bool" value="true"/>
|
||||
<property name="action_right_click" type="string" value="raise"/>
|
||||
<property name="action_middle_click" type="string" value="lower"/>
|
||||
<property name="action_scroll" type="string" value="none"/>
|
||||
<property name="snap_to_border" type="bool" value="true"/>
|
||||
<property name="snap_to_windows" type="bool" value="false"/>
|
||||
<property name="snap_width" type="int" value="10"/>
|
||||
<property name="snap_height" type="int" value="10"/>
|
||||
<property name="hide_skip_taskbar_windows" type="bool" value="false"/>
|
||||
<property name="workspace_count" type="int" value="1"/>
|
||||
<property name="minimum_workspace_width" type="int" value="0"/>
|
||||
<property name="minimum_workspace_height" type="int" value="0"/>
|
||||
</property>
|
||||
</channel>
|
||||
7
config/xface-minimal/xworkspace-shell.desktop
Normal file
7
config/xface-minimal/xworkspace-shell.desktop
Normal file
@ -0,0 +1,7 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=XWorkspace Shell
|
||||
Exec=/bin/bash -lc "${HOME}/xworkspace-console/scripts/start-chromium-minimal.sh http://127.0.0.1:17000"
|
||||
Terminal=false
|
||||
X-GNOME-Autostart-enabled=true
|
||||
X-XFCE-Session-Manager=false
|
||||
16
config/xface-minimal/xworkspace-shell.service
Normal file
16
config/xface-minimal/xworkspace-shell.service
Normal file
@ -0,0 +1,16 @@
|
||||
[Unit]
|
||||
Description=XWorkspace Chrome Shell
|
||||
After=graphical.target
|
||||
After=xworkspace-console.service
|
||||
PartOf=graphical-session.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
Environment=DISPLAY=:0
|
||||
Environment=XAUTHORITY=%h/.Xauthority
|
||||
ExecStart=/bin/bash -lc "${HOME}/xworkspace-console/scripts/start-chromium-minimal.sh http://127.0.0.1:17000"
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=graphical-session.target
|
||||
@ -75,3 +75,34 @@ ui:
|
||||
dock_autohide: true
|
||||
theme_family: gtk
|
||||
panel_style: xfce4
|
||||
|
||||
minimal:
|
||||
enabled: true
|
||||
description: "Stage 2: Minimal window manager + Chrome Shell only"
|
||||
window_manager: xfwm4
|
||||
hide_panels: true
|
||||
hide_desktop_icons: true
|
||||
disable_file_manager: true
|
||||
disable_notification_daemon: true
|
||||
autostart_only_shell: true
|
||||
config_dir: xface-minimal
|
||||
services:
|
||||
- xworkspace-console.service
|
||||
- xworkspace-shell.service
|
||||
shell_url: http://127.0.0.1:17000
|
||||
|
||||
display_stages:
|
||||
stage1:
|
||||
name: "XFCE with hidden components"
|
||||
description: "Use XFCE but hide traditional desktop components, only expose Chrome Shell"
|
||||
panel_visible: false
|
||||
desktop_icons_hidden: true
|
||||
stage2:
|
||||
name: "Minimal window manager"
|
||||
description: "Replace XFCE with minimal window manager, only Chrome/Chromium is visible shell"
|
||||
window_manager: xfwm4
|
||||
all_desktop_components_hidden: true
|
||||
stage3:
|
||||
name: "Wayland/Weston/Cage"
|
||||
description: "Move to Wayland/Weston/Cage mode, Chrome/Chromium is the only user-facing shell"
|
||||
display_server: wayland
|
||||
|
||||
57
scripts/start-chromium-minimal.sh
Executable file
57
scripts/start-chromium-minimal.sh
Executable file
@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
CONFIG_FILE="${ROOT_DIR}/config/xworkspace-desktop.yaml"
|
||||
|
||||
read_yaml() {
|
||||
python3 - "$CONFIG_FILE" "$1" <<'PY'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import yaml
|
||||
|
||||
config_path = Path(sys.argv[1])
|
||||
path = sys.argv[2].split(".")
|
||||
data = yaml.safe_load(config_path.read_text())
|
||||
value = data
|
||||
for part in path:
|
||||
value = value[part]
|
||||
print(value)
|
||||
PY
|
||||
}
|
||||
|
||||
DASHBOARD_URL="$(read_yaml desktop.dashboard_url)"
|
||||
BROWSER_BINARY="$(read_yaml desktop.browser_binary)"
|
||||
BROWSER_FALLBACK="$(read_yaml desktop.browser_fallback)"
|
||||
URL="${1:-${DASHBOARD_URL}}"
|
||||
|
||||
echo "Starting XWorkspace Chrome Shell (minimal mode)..."
|
||||
echo "URL: ${URL}"
|
||||
|
||||
if command -v "${BROWSER_BINARY}" >/dev/null 2>&1; then
|
||||
exec "${BROWSER_BINARY}" \
|
||||
--app="${URL}" \
|
||||
--user-data-dir="${HOME}/.config/xworkspace-chrome-minimal" \
|
||||
--profile-directory=Default \
|
||||
--no-first-run \
|
||||
--disable-session-crashed-bubble \
|
||||
--disable-sync \
|
||||
--disable-infobars \
|
||||
--disable-features=TranslateUI \
|
||||
--new-window \
|
||||
--kiosk \
|
||||
--start-maximized \
|
||||
--autoplay-policy=no-user-gesture-required
|
||||
fi
|
||||
|
||||
exec "${BROWSER_FALLBACK}" \
|
||||
--app="${URL}" \
|
||||
--user-data-dir="${HOME}/.config/xworkspace-chromium-minimal" \
|
||||
--no-first-run \
|
||||
--disable-session-crashed-bubble \
|
||||
--disable-sync \
|
||||
--disable-infobars \
|
||||
--new-window \
|
||||
--kiosk \
|
||||
--start-maximized \
|
||||
--autoplay-policy=no-user-gesture-required
|
||||
55
scripts/switch-desktop-mode.sh
Executable file
55
scripts/switch-desktop-mode.sh
Executable file
@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
CONFIG_FILE="${ROOT_DIR}/config/xworkspace-desktop.yaml"
|
||||
|
||||
MODE="${1:-xfce}"
|
||||
|
||||
case "${MODE}" in
|
||||
xfce)
|
||||
XFCE_DIR="${HOME}/.config/xfce4"
|
||||
DEST_DIR="${XFCE_DIR}"
|
||||
;;
|
||||
minimal|xface-minimal)
|
||||
XFCE_DIR="${ROOT_DIR}/config/xface-minimal"
|
||||
DEST_DIR="${HOME}/.config/xfce4"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown mode: ${MODE}" >&2
|
||||
echo "Usage: $0 [xfce|minimal]" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p "${DEST_DIR}"
|
||||
mkdir -p "${HOME}/.config/xfce4/panel"
|
||||
mkdir -p "${HOME}/.config/xfce4/xfconf/xfce-perchannel-xml"
|
||||
mkdir -p "${HOME}/.config/autostart"
|
||||
mkdir -p "${HOME}/.config/systemd/user"
|
||||
|
||||
echo "Setting up XWorkspace Desktop in ${MODE} mode..."
|
||||
|
||||
cp -R "${ROOT_DIR}/config/systemd/." "${HOME}/.config/systemd/user/"
|
||||
|
||||
if [[ -d "${XFCE_DIR}" ]]; then
|
||||
cp -R "${XFCE_DIR}/." "${DEST_DIR}/"
|
||||
fi
|
||||
|
||||
cp -R "${ROOT_DIR}/config/autostart/." "${HOME}/.config/autostart/"
|
||||
|
||||
python3 - "${HOME}/.config/autostart/xworkspace-console.desktop" <<'PY'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
desktop_file = Path(sys.argv[1])
|
||||
text = desktop_file.read_text()
|
||||
desktop_file.write_text(text.replace("http://127.0.0.1:17000", "http://127.0.0.1:17000"))
|
||||
PY
|
||||
|
||||
if command -v systemctl >/dev/null 2>&1; then
|
||||
systemctl --user daemon-reload || true
|
||||
fi
|
||||
|
||||
echo "XWorkspace Desktop ${MODE} mode configured."
|
||||
echo "To apply: logout and login, or run 'xfce4-session --replace' for immediate effect."
|
||||
Loading…
Reference in New Issue
Block a user