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:
Haitao Pan 2026-06-10 11:45:21 +08:00
parent 46b8227c26
commit 9ecacca0f7
12 changed files with 258 additions and 0 deletions

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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

View 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

View File

@ -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

View 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
View 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."