Skip to content

Commit 46887c6

Browse files
committed
fix: sync WebVNC desktop theme
1 parent 2a1b86f commit 46887c6

15 files changed

Lines changed: 912 additions & 106 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Fixed
66

77
- Fixed Linux desktop theme setup so WebVNC sessions install and prefer native Arc-Dark/other dark XFCE themes instead of custom-painting panel and window chrome.
8+
- Fixed Linux WebVNC desktop sessions so they follow the portal light/dark toggle and system theme changes after the remote desktop has already connected.
89
- Fixed run failure summaries and timing JSON to classify likely blocked stages, redact known HTML auth challenge bodies from failure excerpts, and reject unsupported Blacksmith environment forwarding before warmup.
910
- Fixed desktop browser launches so Linux WebVNC browser sessions inherit the dark desktop theme, advertise dark color-scheme preference to web apps, and repair older managed browser wrappers before launch.
1011

internal/cli/bootstrap.go

Lines changed: 117 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -636,32 +636,70 @@ func cloudInitOptionalWriteFiles(cfg Config) string {
636636
content: |
637637
#!/bin/sh
638638
set -eu
639+
requested_mode="${1:-${CRABBOX_DESKTOP_THEME:-}}"
639640
user="${CRABBOX_DESKTOP_USER:-crabbox}"
640641
home_dir="$(getent passwd "$user" | cut -d: -f6)"
641642
if [ -z "$home_dir" ]; then
642643
home_dir="/home/$user"
643644
fi
644645
config_dir="$home_dir/.config"
645-
gtk_theme=Adwaita-dark
646-
for candidate in Arc-Dark Greybird-dark Adwaita-dark Greybird; do
646+
mode="$requested_mode"
647+
if [ -z "$mode" ] && [ -f "$config_dir/crabbox/desktop-theme" ]; then
648+
mode="$(cat "$config_dir/crabbox/desktop-theme" 2>/dev/null || true)"
649+
fi
650+
case "$mode" in
651+
light|dark) ;;
652+
*) mode=dark ;;
653+
esac
654+
if [ "$mode" = "light" ]; then
655+
gtk_theme=Adwaita
656+
gtk_prefer_dark=false
657+
gtk_prefer_dark_ini=0
658+
gsettings_scheme=prefer-light
659+
root_color="#f4f6f8"
660+
terminal_fg="#1f2937"
661+
terminal_bg="#f8fafc"
662+
terminal_cursor="#111827"
663+
panel_rgba="0.94 0.95 0.97 1"
664+
panel_css_bg="#eef2f7"
665+
panel_css_fg="#111827"
666+
gtk_candidates="Arc Greybird Adwaita"
667+
xfwm_candidates="Arc Greybird Daloa Default"
668+
else
669+
gtk_theme=Adwaita-dark
670+
gtk_prefer_dark=true
671+
gtk_prefer_dark_ini=1
672+
gsettings_scheme=prefer-dark
673+
root_color="#20242b"
674+
terminal_fg="#e5e7eb"
675+
terminal_bg="#111827"
676+
terminal_cursor="#f3f4f6"
677+
panel_rgba="0.12 0.13 0.15 1"
678+
panel_css_bg="#20242b"
679+
panel_css_fg="#e5e7eb"
680+
gtk_candidates="Arc-Dark Greybird-dark Adwaita-dark Greybird"
681+
xfwm_candidates="Arc-Dark Greybird-dark Daloa Default"
682+
fi
683+
for candidate in $gtk_candidates; do
647684
if [ -d "/usr/share/themes/$candidate/gtk-3.0" ]; then
648685
gtk_theme="$candidate"
649686
break
650687
fi
651688
done
652689
xfwm_theme=Default
653-
for candidate in Arc-Dark Greybird-dark Daloa Default; do
690+
for candidate in $xfwm_candidates; do
654691
if [ -d "/usr/share/themes/$candidate/xfwm4" ]; then
655692
xfwm_theme="$candidate"
656693
break
657694
fi
658695
done
659696
if [ "$(id -u)" -eq 0 ]; then
660-
install -d -m 0700 -o "$user" "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0"
697+
install -d -m 0700 -o "$user" "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0" "$config_dir/crabbox"
661698
else
662-
mkdir -p "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0"
663-
chmod 0700 "$config_dir" "$config_dir/xfce4" "$config_dir/xfce4/xfconf" "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0"
699+
mkdir -p "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0" "$config_dir/crabbox"
700+
chmod 0700 "$config_dir" "$config_dir/xfce4" "$config_dir/xfce4/xfconf" "$config_dir/xfce4/xfconf/xfce-perchannel-xml" "$config_dir/xfce4/terminal" "$config_dir/gtk-3.0" "$config_dir/crabbox"
664701
fi
702+
printf '%s\n' "$mode" > "$config_dir/crabbox/desktop-theme"
665703
cat > "$config_dir/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml" <<XML
666704
<?xml version="1.0" encoding="UTF-8"?>
667705
<channel name="xsettings" version="1.0">
@@ -670,7 +708,7 @@ func cloudInitOptionalWriteFiles(cfg Config) string {
670708
<property name="IconThemeName" type="string" value="Adwaita"/>
671709
</property>
672710
<property name="Gtk" type="empty">
673-
<property name="ApplicationPreferDarkTheme" type="bool" value="true"/>
711+
<property name="ApplicationPreferDarkTheme" type="bool" value="$gtk_prefer_dark"/>
674712
</property>
675713
</channel>
676714
XML
@@ -684,38 +722,99 @@ func cloudInitOptionalWriteFiles(cfg Config) string {
684722
</channel>
685723
XML
686724
fi
687-
cat > "$config_dir/xfce4/terminal/terminalrc" <<'EOF'
725+
cat > "$config_dir/xfce4/terminal/terminalrc" <<EOF
688726
[Configuration]
689-
ColorForeground=#e5e7eb
690-
ColorBackground=#111827
691-
ColorCursor=#f3f4f6
727+
ColorForeground=$terminal_fg
728+
ColorBackground=$terminal_bg
729+
ColorCursor=$terminal_cursor
692730
MiscBell=FALSE
693731
EOF
694732
cat > "$config_dir/gtk-3.0/settings.ini" <<EOF
695733
[Settings]
696734
gtk-theme-name=$gtk_theme
697735
gtk-icon-theme-name=Adwaita
698-
gtk-application-prefer-dark-theme=1
736+
gtk-application-prefer-dark-theme=$gtk_prefer_dark_ini
699737
EOF
700738
cat > "$home_dir/.gtkrc-2.0" <<EOF
701739
gtk-theme-name="$gtk_theme"
702740
gtk-icon-theme-name="Adwaita"
703-
gtk-application-prefer-dark-theme=1
741+
gtk-application-prefer-dark-theme=$gtk_prefer_dark_ini
704742
EOF
743+
css_file="$config_dir/gtk-3.0/gtk.css"
744+
css_tmp="$(mktemp)"
745+
if [ -f "$css_file" ]; then
746+
sed '/^[/][*] crabbox desktop theme start [*][/]$/,/^[/][*] crabbox desktop theme end [*][/]$/d' "$css_file" > "$css_tmp" || true
747+
fi
748+
cat >> "$css_tmp" <<EOF
749+
/* crabbox desktop theme start */
750+
.xfce4-panel { background: $panel_css_bg; background-color: $panel_css_bg; color: $panel_css_fg; }
751+
.xfce4-panel * { color: $panel_css_fg; text-shadow: none; -gtk-icon-shadow: none; }
752+
.xfce4-panel button,
753+
.xfce4-panel button.flat,
754+
.xfce4-panel button:hover,
755+
.xfce4-panel button:active,
756+
.xfce4-panel button:checked,
757+
.xfce4-panel button:focus,
758+
.xfce4-panel button:backdrop,
759+
.xfce4-panel .tasklist button,
760+
.xfce4-panel .tasklist button:hover,
761+
.xfce4-panel .tasklist button:active,
762+
.xfce4-panel .tasklist button:checked,
763+
.xfce4-panel .tasklist button:checked:hover,
764+
.xfce4-panel .tasklist button:focus,
765+
.xfce4-panel .tasklist button:backdrop,
766+
.xfce4-panel .tasklist .toggle,
767+
.xfce4-panel .tasklist .toggle:hover,
768+
.xfce4-panel .tasklist .toggle:checked,
769+
.xfce4-panel .tasklist .toggle:checked:hover,
770+
.xfce4-panel .tasklist button:checked,
771+
.xfce4-panel .tasklist button:active {
772+
background: $panel_css_bg;
773+
background-image: none;
774+
background-color: $panel_css_bg;
775+
border-image: none;
776+
border-color: $panel_css_fg;
777+
box-shadow: none;
778+
color: $panel_css_fg;
779+
outline-color: transparent;
780+
text-shadow: none;
781+
-gtk-icon-shadow: none;
782+
}
783+
.xfce4-panel .tasklist button label,
784+
.xfce4-panel .tasklist .toggle label {
785+
color: $panel_css_fg;
786+
text-shadow: none;
787+
}
788+
/* crabbox desktop theme end */
789+
EOF
790+
mv "$css_tmp" "$css_file"
705791
if [ "$(id -u)" -eq 0 ]; then
706792
chown -R "$user" "$config_dir" "$home_dir/.gtkrc-2.0"
707793
fi
708794
if [ -n "${DISPLAY:-}" ] && command -v xfconf-query >/dev/null 2>&1; then
709795
xfconf-query -c xsettings -p /Net/ThemeName -n -t string -s "$gtk_theme" >/dev/null 2>&1 || true
710796
xfconf-query -c xsettings -p /Net/IconThemeName -n -t string -s Adwaita >/dev/null 2>&1 || true
711-
xfconf-query -c xsettings -p /Gtk/ApplicationPreferDarkTheme -n -t bool -s true >/dev/null 2>&1 || true
797+
xfconf-query -c xsettings -p /Gtk/ApplicationPreferDarkTheme -n -t bool -s "$gtk_prefer_dark" >/dev/null 2>&1 || true
712798
xfconf-query -c xfwm4 -p /general/theme -n -t string -s "$xfwm_theme" >/dev/null 2>&1 || true
713-
xfconf-query -c xfce4-panel -p /panels/dark-mode -n -t bool -s true >/dev/null 2>&1 || true
714-
pkill -USR1 -x xfce4-panel >/dev/null 2>&1 || true
715-
xfwm4 --replace >/tmp/crabbox-xfwm4-replace.log 2>&1 &
799+
xfconf-query -c xfce4-panel -p /panels/dark-mode -n -t bool -s "$gtk_prefer_dark" >/dev/null 2>&1 || true
800+
set -- $panel_rgba
801+
for panel_id in panel-1 panel-2; do
802+
xfconf-query -c xfce4-panel -p "/panels/$panel_id/background-style" -n -t int -s 1 >/dev/null 2>&1 || true
803+
xfconf-query -c xfce4-panel -p "/panels/$panel_id/background-rgba" -n -a -t double -s "$1" -t double -s "$2" -t double -s "$3" -t double -s "$4" >/dev/null 2>&1 || true
804+
done
805+
if [ "$(id -un)" = "$user" ]; then
806+
pkill -TERM -x xfce4-panel >/dev/null 2>&1 || true
807+
(sleep 0.4; xfce4-panel >"/tmp/crabbox-xfce4-panel-$user.log" 2>&1 &) >/dev/null 2>&1 &
808+
else
809+
pkill -USR1 -x xfce4-panel >/dev/null 2>&1 || true
810+
fi
811+
xfwm4 --replace >"/tmp/crabbox-xfwm4-replace-$user.log" 2>&1 &
812+
fi
813+
if [ -n "${DISPLAY:-}" ] && command -v xsetroot >/dev/null 2>&1; then
814+
xsetroot -solid "$root_color" || true
716815
fi
717816
if command -v gsettings >/dev/null 2>&1; then
718-
gsettings set org.gnome.desktop.interface color-scheme prefer-dark >/dev/null 2>&1 || true
817+
gsettings set org.gnome.desktop.interface color-scheme "$gsettings_scheme" >/dev/null 2>&1 || true
719818
gsettings set org.gnome.desktop.interface gtk-theme "$gtk_theme" >/dev/null 2>&1 || true
720819
fi
721820
- path: /etc/systemd/system/crabbox-desktop.service
@@ -741,9 +840,6 @@ func cloudInitOptionalWriteFiles(cfg Config) string {
741840
set -eu
742841
export DISPLAY="${DISPLAY:-:99}"
743842
CRABBOX_DESKTOP_USER="$(id -un)" /usr/local/bin/crabbox-configure-desktop-theme || true
744-
if command -v xsetroot >/dev/null 2>&1; then
745-
xsetroot -solid '#20242b' || true
746-
fi
747843
if command -v xfce4-terminal >/dev/null 2>&1 && ! pgrep -u "$(id -u)" -f 'xfce4-terminal.*Crabbox Desktop' >/dev/null 2>&1; then
748844
xfce4-terminal --title='Crabbox Desktop' --geometry=110x32+48+48 &
749845
elif command -v xterm >/dev/null 2>&1 && ! pgrep -u "$(id -u)" -f 'xterm -title Crabbox Desktop' >/dev/null 2>&1; then

internal/cli/bootstrap_test.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,25 +96,31 @@ func TestCloudInitDesktopProfile(t *testing.T) {
9696
"ExecStart=/usr/bin/startxfce4",
9797
"systemctl is-active --quiet crabbox-desktop.service",
9898
"systemctl is-active --quiet crabbox-desktop-session.service",
99+
`requested_mode="${1:-${CRABBOX_DESKTOP_THEME:-}}"`,
100+
`"$config_dir/crabbox/desktop-theme"`,
99101
"gtk_theme=Adwaita-dark",
100-
"for candidate in Arc-Dark Greybird-dark Adwaita-dark Greybird",
102+
`gtk_candidates="Arc-Dark Greybird-dark Adwaita-dark Greybird"`,
103+
`gtk_candidates="Arc Greybird Adwaita"`,
101104
"xfwm_theme=Default",
102-
"for candidate in Arc-Dark Greybird-dark Daloa Default",
105+
`xfwm_candidates="Arc-Dark Greybird-dark Daloa Default"`,
106+
`xfwm_candidates="Arc Greybird Daloa Default"`,
103107
"ThemeName\" type=\"string\" value=\"$gtk_theme",
104108
"$config_dir/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml",
105-
`if [ ! -s "$config_dir/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml" ]; then`,
106109
"theme\" type=\"string\" value=\"$xfwm_theme",
107-
"gtk-application-prefer-dark-theme=1",
110+
"gtk-application-prefer-dark-theme=$gtk_prefer_dark_ini",
108111
"mkdir -p \"$config_dir/xfce4/xfconf/xfce-perchannel-xml\"",
109112
"xfconf-query -c xsettings -p /Gtk/ApplicationPreferDarkTheme",
110113
"xfconf-query -c xfwm4 -p /general/theme",
111114
"xfconf-query -c xfce4-panel -p /panels/dark-mode",
115+
"/panels/$panel_id/background-rgba",
116+
"crabbox desktop theme start",
117+
"crabbox-xfce4-panel-$user.log",
112118
"pkill -USR1 -x xfce4-panel",
113119
"xfwm4 --replace",
114-
"gsettings set org.gnome.desktop.interface color-scheme prefer-dark",
120+
`xsetroot -solid "$root_color"`,
121+
`gsettings set org.gnome.desktop.interface color-scheme "$gsettings_scheme"`,
115122
"CRABBOX_DESKTOP_USER=crabbox /usr/local/bin/crabbox-configure-desktop-theme",
116123
"CRABBOX_DESKTOP_USER=\"$(id -un)\" /usr/local/bin/crabbox-configure-desktop-theme",
117-
"xsetroot -solid '#20242b'",
118124
"xfce4-terminal --title='Crabbox Desktop'",
119125
"xterm -title 'Crabbox Desktop'",
120126
"(umask 077 && openssl rand -base64 18 > /var/lib/crabbox/vnc.password)",

internal/cli/desktop.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,12 +726,13 @@ fi
726726
browser_wrapper=` + shellQuote(strings.TrimSpace(browser)) + `
727727
if [ "$browser_wrapper" = "/usr/local/bin/crabbox-browser" ] && [ -f "$browser_wrapper" ] && {
728728
! grep -q -- "--force-dark-mode" "$browser_wrapper" 2>/dev/null ||
729+
! grep -q -- "desktop-theme" "$browser_wrapper" 2>/dev/null ||
729730
! grep -q -- "--user-data-dir" "$browser_wrapper" 2>/dev/null
730731
}; then
731732
browser_path="$(sed -n 's/^exec "\([^"]*\)".*/\1/p' "$browser_wrapper" | head -1)"
732733
if [ -n "$browser_path" ] && "$browser_path" --version 2>/dev/null | grep -Eiq 'chrome|chromium'; then
733734
tmp="$(mktemp)"
734-
printf '%s\n' '#!/bin/sh' 'profile="${CRABBOX_BROWSER_PROFILE:-$HOME/.cache/crabbox/browser-profile}"' 'umask 077' 'mkdir -p "$profile"' 'chmod 700 "$profile"' "exec \"$browser_path\" --no-first-run --no-default-browser-check --disable-default-apps --force-dark-mode --enable-features=WebUIDarkMode --blink-settings=preferredColorScheme=2 --user-data-dir=\"\$profile\" --window-size=1500,900 --window-position=80,80 \"\$@\"" > "$tmp"
735+
printf '%s\n' '#!/bin/sh' 'profile="${CRABBOX_BROWSER_PROFILE:-$HOME/.cache/crabbox/browser-profile}"' 'theme="$(cat "${CRABBOX_DESKTOP_THEME_FILE:-$HOME/.config/crabbox/desktop-theme}" 2>/dev/null || printf dark)"' 'umask 077' 'mkdir -p "$profile"' 'chmod 700 "$profile"' 'if [ "$theme" = light ]; then' " exec \"$browser_path\" --no-first-run --no-default-browser-check --disable-default-apps --blink-settings=preferredColorScheme=1 --user-data-dir=\"\$profile\" --window-size=1500,900 --window-position=80,80 \"\$@\"" 'fi' "exec \"$browser_path\" --no-first-run --no-default-browser-check --disable-default-apps --force-dark-mode --enable-features=WebUIDarkMode --blink-settings=preferredColorScheme=2 --user-data-dir=\"\$profile\" --window-size=1500,900 --window-position=80,80 \"\$@\"" > "$tmp"
735736
chmod 0755 "$tmp"
736737
sudo install -m 0755 "$tmp" "$browser_wrapper" >/dev/null 2>&1 || install -m 0755 "$tmp" "$browser_wrapper" >/dev/null 2>&1 || true
737738
rm -f "$tmp"

internal/cli/desktop_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ func TestDesktopBrowserDarkModeCommandPatchesManagedChromiumWrapper(t *testing.T
3737
"/usr/local/bin/crabbox-configure-desktop-theme",
3838
`[ "$browser_wrapper" = "/usr/local/bin/crabbox-browser" ]`,
3939
"grep -q -- \"--force-dark-mode\"",
40+
"grep -q -- \"desktop-theme\"",
4041
"grep -q -- \"--user-data-dir\"",
42+
`theme="$(cat "${CRABBOX_DESKTOP_THEME_FILE:-$HOME/.config/crabbox/desktop-theme}"`,
4143
"umask 077",
4244
`chmod 700 "$profile"`,
45+
"--blink-settings=preferredColorScheme=1",
4346
"--force-dark-mode --enable-features=WebUIDarkMode --blink-settings=preferredColorScheme=2",
4447
`--user-data-dir=\"\$profile\"`,
4548
"sudo install -m 0755",

0 commit comments

Comments
 (0)