#!/bin/bash # ============================================================================== # GNOME Setup Script (04d-gnome.sh) - Fixed D-Bus & Extensions & Verify & DMCheck # ============================================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PARENT_DIR="$(dirname "$SCRIPT_DIR")" # 检查 utils 脚本 if [ -f "$SCRIPT_DIR/00-utils.sh" ]; then source "$SCRIPT_DIR/00-utils.sh" else echo "Error: 00-utils.sh not found." exit 1 fi log "Initializing installation..." check_root # 初始化 Verify 列表 VERIFY_LIST="/tmp/shorin_install_verify.list" rm -f "$VERIFY_LIST" # ============================================================================== # Identify User & DM Check # ============================================================================== detect_target_user TARGET_UID=$(id -u "$TARGET_USER") info_kv "Target User" "$TARGET_USER" info_kv "Home Dir" "$HOME_DIR" # 调用 Utils 函数进行冲突检测 (会自动设置 $SKIP_DM 变量) check_dm_conflict # ================================== # temp sudo without passwd # ================================== SUDO_TEMP_FILE="/etc/sudoers.d/99_shorin_installer_temp" echo "$TARGET_USER ALL=(ALL) NOPASSWD: ALL" >"$SUDO_TEMP_FILE" chmod 440 "$SUDO_TEMP_FILE" log "Temp sudo file created..." cleanup_sudo() { if [ -f "$SUDO_TEMP_FILE" ]; then rm -f "$SUDO_TEMP_FILE" log "Security: Temporary sudo privileges revoked." fi } trap cleanup_sudo EXIT INT TERM #================================================= # Step 1: Install base pkgs #================================================= section "Step 1" "Install base pkgs" log "Installing GNOME and base tools..." GNOME_BASE_PKGS="gnome-desktop gnome-backgrounds gnome-tweaks gdm ghostty celluloid loupe gnome-control-center bazaar flatpak file-roller nautilus-python firefox nm-connection-editor pacman-contrib dnsmasq ttf-jetbrains-mono-nerd" echo "$GNOME_BASE_PKGS" >> "$VERIFY_LIST" if exe as_user yay -S --noconfirm --needed --answerdiff=None --answerclean=None $GNOME_BASE_PKGS; then GNOME_FM_PKGS="ffmpegthumbnailer gvfs-smb nautilus-open-any-terminal file-roller gnome-keyring gst-plugins-base gst-plugins-good gst-libav nautilus" echo "$GNOME_FM_PKGS" >> "$VERIFY_LIST" exe pacman -S --noconfirm --needed $GNOME_FM_PKGS log "Packages installed successfully." else log "Installation failed." return 1 fi # Enable Display Manager (GDM) if [ "$SKIP_DM" = true ]; then log "Display Manager setup skipped (Conflict found or user opted out)." else log "Enabling GDM..." exe systemctl enable gdm.service success "GDM enabled." fi #================================================= # Step 2: Set default terminal (修复:加入 D-Bus) #================================================= section "Step 2" "Set default terminal" log "Setting GNOME default terminal to Ghostty..." # 使用 sudo -u 切换用户,并启动临时 dbus-launch 以确保 gsettings 生效 sudo -u "$TARGET_USER" bash < "$ACCOUNT_FILE" < Starting temporary D-Bus session for shortcuts..." eval \$(dbus-launch --sh-syntax) trap "kill \$DBUS_SESSION_BUS_PID" EXIT fi # ============================================= echo " ➜ Applying shortcuts for user: $(whoami)..." # 1. 窗口管理 SCHEMA="org.gnome.desktop.wm.keybindings" gsettings set \$SCHEMA close "['q']" gsettings set \$SCHEMA show-desktop "['h']" gsettings set \$SCHEMA toggle-fullscreen "['f']" gsettings set \$SCHEMA toggle-maximized "['f']" gsettings set \$SCHEMA maximize "[]" gsettings set \$SCHEMA minimize "[]" gsettings set \$SCHEMA unmaximize "[]" gsettings set \$SCHEMA switch-to-workspace-left "['q']" gsettings set \$SCHEMA switch-to-workspace-right "['e']" gsettings set \$SCHEMA move-to-workspace-left "['q']" gsettings set \$SCHEMA move-to-workspace-right "['e']" gsettings set \$SCHEMA switch-applications "['Tab']" gsettings set \$SCHEMA switch-applications-backward "['Tab']" gsettings set \$SCHEMA switch-group "['grave']" gsettings set \$SCHEMA switch-group-backward "['grave']" gsettings set \$SCHEMA switch-input-source "[]" gsettings set \$SCHEMA switch-input-source-backward "[]" # 2. Shell 全局 SCHEMA="org.gnome.shell.keybindings" gsettings set \$SCHEMA screenshot "['a']" gsettings set \$SCHEMA screenshot-window "['a']" gsettings set \$SCHEMA show-screenshot-ui "['a']" gsettings set \$SCHEMA toggle-application-view "['g']" gsettings set \$SCHEMA toggle-quick-settings "['s']" gsettings set \$SCHEMA toggle-message-tray "[]" # 3. 自定义快捷键 SCHEMA="org.gnome.settings-daemon.plugins.media-keys" gsettings set \$SCHEMA magnifier "['0']" gsettings set \$SCHEMA screenreader "[]" add_custom() { local index="\$1" local name="\$2" local cmd="\$3" local bind="\$4" local path="/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom\$index/" local key_schema="org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:\$path" gsettings set "\$key_schema" name "\$name" gsettings set "\$key_schema" command "\$cmd" gsettings set "\$key_schema" binding "\$bind" echo "\$path" } # 重置列表以避免冲突 gsettings set \$SCHEMA custom-keybindings "[]" P0=\$(add_custom 0 "openbrowser" "firefox" "b") P1=\$(add_custom 1 "openterminal" "ghostty" "t") P2=\$(add_custom 2 "missioncenter" "missioncenter" "grave") P3=\$(add_custom 3 "opennautilus" "nautilus" "e") P4=\$(add_custom 4 "editscreenshot" "gradia --screenshot" "s") P5=\$(add_custom 5 "gnome-control-center" "gnome-control-center" "s") CUSTOM_LIST="['\$P0', '\$P1', '\$P2', '\$P3', '\$P4', '\$P5']" gsettings set \$SCHEMA custom-keybindings "\$CUSTOM_LIST" echo " ➜ Shortcuts synced successfully." EOF #================================================= # Step 5: Extensions #================================================= section "Step 5" "Install Extensions" log "Installing Extensions CLI..." EXT_CLI_PKGS="gnome-extensions-cli ttf-jetbrains-maple-mono-nf-xx-xx" echo "$EXT_CLI_PKGS" >> "$VERIFY_LIST" sudo -u $TARGET_USER yay -S --noconfirm --needed --answerdiff=None --answerclean=None $EXT_CLI_PKGS EXTENSION_LIST=( "arch-update@RaphaelRochet" "aztaskbar@aztaskbar.gitlab.com" "blur-my-shell@aunetx" "caffeine@patapon.info" "clipboard-indicator@tudmotu.com" "color-picker@tuberry" "desktop-cube@schneegans.github.com" "fuzzy-application-search@mkhl.codeberg.page" "lockkeys@vaina.lt" "middleclickclose@paolo.tranquilli.gmail.com" "steal-my-focus-window@steal-my-focus-window" "tilingshell@ferrarodomenico.com" "user-theme@gnome-shell-extensions.gcampax.github.com" "kimpanel@kde.org" "rounded-window-corners@fxgn" "appindicatorsupport@rgcjonas.gmail.com" ) log "Downloading extensions..." sudo -u $TARGET_USER gnome-extensions-cli install "${EXTENSION_LIST[@]}" 2>/dev/null section "Step 5.2" "Enable GNOME Extensions" # 【核心修复】:为启用扩展添加 D-Bus 支持 sudo -u "$TARGET_USER" bash < Extension \$uuid already enabled." else echo " -> Enabling extension: \$uuid" if [ "\$current_list" = "@as []" ]; then gsettings set org.gnome.shell enabled-extensions "['\$uuid']" else new_list="\${current_list%]}, '\$uuid']" gsettings set org.gnome.shell enabled-extensions "\$new_list" fi fi } # 数组遍历,更整洁 declare -a ext_array=( "user-theme@gnome-shell-extensions.gcampax.github.com" "arch-update@RaphaelRochet" "aztaskbar@aztaskbar.gitlab.com" "blur-my-shell@aunetx" "caffeine@patapon.info" "clipboard-indicator@tudmotu.com" "color-picker@tuberry" "desktop-cube@schneegans.github.com" "fuzzy-application-search@mkhl.codeberg.page" "lockkeys@vaina.lt" "middleclickclose@paolo.tranquilli.gmail.com" "steal-my-focus-window@steal-my-focus-window" "tilingshell@ferrarodomenico.com" "kimpanel@kde.org" "rounded-window-corners@fxgn" "appindicatorsupport@rgcjonas.gmail.com" ) for ext in "\${ext_array[@]}"; do enable_extension "\$ext" done EOF # 编译扩展 Schema log "Compiling extension schemas..." chown -R $TARGET_USER:$TARGET_USER $HOME_DIR/.local/share/gnome-shell/extensions sudo -u "$TARGET_USER" bash <> "$VERIFY_LIST" exe sudo -u $TARGET_USER yay -S --noconfirm --needed --answerdiff=None --answerclean=None $FF_GNOME_PKGS POL_DIR="/etc/firefox/policies" exe mkdir -p "$POL_DIR" echo '{ "policies": { "Extensions": { "Install": [ "https://addons.mozilla.org/firefox/downloads/latest/gnome-shell-integration/latest.xpi" ] } } }' > "$POL_DIR/policies.json" exe chmod 755 "$POL_DIR" && exe chmod 644 "$POL_DIR/policies.json" log "Firefox policies updated." #================================================= # Nautilus Fix & Input Method #================================================= configure_nautilus_user section "Step 6" "Input method" log "Configure input method environment..." if ! grep -q "fcitx" "/etc/environment" 2>/dev/null; then cat << EOT >> /etc/environment XIM="fcitx" GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx XDG_CURRENT_DESKTOP=GNOME EOT fi #================================================= # Dotfiles #================================================= section "Dotfiles" "Deploying dotfiles" GNOME_DOTFILES_DIR=$PARENT_DIR/gnome-dotfiles log "Ensuring .config exists..." sudo -u $TARGET_USER mkdir -p $HOME_DIR/.config log "Copying dotfiles..." if [ -d "$GNOME_DOTFILES_DIR" ]; then cp -rf "$GNOME_DOTFILES_DIR/." "$HOME_DIR/" else warn "Dotfiles directory not found: $GNOME_DOTFILES_DIR" fi as_user mkdir -p "$HOME_DIR/Templates" as_user touch "$HOME_DIR/Templates/new" # 修复:确保 new.sh 是用户所有,且内容正确 sudo -u "$TARGET_USER" bash -c "echo '#!/usr/bin/env bash' > $HOME_DIR/Templates/new.sh" sudo -u "$TARGET_USER" chmod +x "$HOME_DIR/Templates/new.sh" log "Fixing permissions..." chown -R $TARGET_USER: $HOME_DIR/.config chown -R $TARGET_USER: $HOME_DIR/.local if command -v flatpak &>/dev/null; then sudo -u "$TARGET_USER" flatpak override --user --filesystem=xdg-config/fontconfig fi log "Installing shell tools..." SHELL_TOOLS_PKGS="thefuck starship eza fish zoxide jq timg imagemagick shorin-contrib-git bat" echo "$SHELL_TOOLS_PKGS" >> "$VERIFY_LIST" exe as_user paru -S --noconfirm --needed $SHELL_TOOLS_PKGS as_user shorin link # === 隐藏多余的 Desktop 图标 === section "Config" "Hiding useless .desktop files" log "Hiding useless .desktop files" run_hide_desktop_file log "Installation Complete! Please reboot." cleanup_sudo