Name: shiva-branding Version: 1.0 Release: 11%{?dist} Summary: ShivaOS — Branding complet (wallpaper, logo, SDDM, Plymouth, KDE) License: MIT URL: https://shivaos.com BuildArch: noarch Requires: sddm, plasma-workspace, plymouth Source0: shivaos-wallpaper.png Source1: shivaos-logo-64.png Source2: shivaos-logo-128.png Source3: shivaos-logo-256.png Source4: shivaos-logo-512.png Source5: shivaos.plymouth Source6: shivaos.script Source7: shivaos-plymouth-logo-256.png Source8: shivaos-sddm-Main.qml %description Branding visuel complet de ShivaOS : - Fond d'écran ShivaOS (KDE + SDDM) - Logo ShivaOS (toutes tailles) - Thème SDDM orange/noir "Entrer dans la Forge" - Thème Plymouth boot screen - KDE Look-and-Feel com.shivaos.desktop - Config KDE/SDDM automatique %prep # no sources to unpack %build # no compilation %install # ── 1. Wallpaper KDE ───────────────────────────────────────────── mkdir -p %{buildroot}/usr/share/wallpapers/ShivaOS/contents/images install -m644 %{SOURCE0} %{buildroot}/usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png cat > %{buildroot}/usr/share/wallpapers/ShivaOS/metadata.json << 'EOF' { "KPlugin": { "Authors": [{"Name": "ShivaOS Team", "Email": "contact@shivaos.com"}], "Id": "ShivaOS", "License": "MIT", "Name": "ShivaOS Gaming", "Website": "https://shivaos.com" } } EOF # ── 2. Logo / icônes ───────────────────────────────────────────── mkdir -p %{buildroot}/usr/share/pixmaps install -m644 %{SOURCE2} %{buildroot}/usr/share/pixmaps/shivaos-logo.png mkdir -p %{buildroot}/usr/share/icons/hicolor/64x64/apps mkdir -p %{buildroot}/usr/share/icons/hicolor/128x128/apps mkdir -p %{buildroot}/usr/share/icons/hicolor/256x256/apps mkdir -p %{buildroot}/usr/share/icons/hicolor/512x512/apps install -m644 %{SOURCE1} %{buildroot}/usr/share/icons/hicolor/64x64/apps/shivaos-logo.png install -m644 %{SOURCE2} %{buildroot}/usr/share/icons/hicolor/128x128/apps/shivaos-logo.png install -m644 %{SOURCE3} %{buildroot}/usr/share/icons/hicolor/256x256/apps/shivaos-logo.png install -m644 %{SOURCE4} %{buildroot}/usr/share/icons/hicolor/512x512/apps/shivaos-logo.png # ── 3. Thème SDDM ──────────────────────────────────────────────── mkdir -p %{buildroot}/usr/share/sddm/themes/shivaos install -m644 %{SOURCE0} %{buildroot}/usr/share/sddm/themes/shivaos/background.png install -m644 %{SOURCE2} %{buildroot}/usr/share/sddm/themes/shivaos/shivaos-logo-128.png install -m644 %{SOURCE8} %{buildroot}/usr/share/sddm/themes/shivaos/Main.qml cat > %{buildroot}/usr/share/sddm/themes/shivaos/metadata.desktop << 'EOF' [SddmGreeterTheme] Name=ShivaOS Description=ShivaOS Gaming Login Screen Author=ShivaOS Team Website=https://shivaos.com Version=2.0 EOF mkdir -p %{buildroot}/usr/lib/sddm/sddm.conf.d cat > %{buildroot}/usr/lib/sddm/sddm.conf.d/shivaos.conf << 'EOF' [Theme] Current=shivaos EOF # ── 4. Plymouth ────────────────────────────────────────────────── mkdir -p %{buildroot}/usr/share/plymouth/themes/shivaos install -m644 %{SOURCE5} %{buildroot}/usr/share/plymouth/themes/shivaos/shivaos.plymouth install -m644 %{SOURCE6} %{buildroot}/usr/share/plymouth/themes/shivaos/shivaos.script install -m644 %{SOURCE7} %{buildroot}/usr/share/plymouth/themes/shivaos/shivaos-logo-256.png # ── 5. KDE Look-and-Feel ───────────────────────────────────────── LNFDIR="%{buildroot}/usr/share/plasma/look-and-feel/com.shivaos.desktop" mkdir -p "$LNFDIR/contents/lockscreen" cat > "$LNFDIR/metadata.json" << 'EOF' { "KPlugin": { "Authors": [{"Name": "ShivaOS Team", "Email": "contact@shivaos.com"}], "Description": "ShivaOS Gaming Look and Feel", "Id": "com.shivaos.desktop", "License": "MIT", "Name": "ShivaOS", "Version": "1.0", "Website": "https://shivaos.com" } } EOF cat > "$LNFDIR/contents/defaults" << 'EOF' [kdeglobals][General] ColorScheme=BreezeDark [Wallpaper] Image=ShivaOS EOF cat > "$LNFDIR/contents/lockscreen/LockScreen.qml" << 'EOF' import QtQuick 2.15 import QtQuick.Controls 2.15 Item { id: root anchors.fill: parent Rectangle { anchors.fill: parent; color: "#0a0a0a" } Image { anchors.fill: parent source: "file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png" fillMode: Image.PreserveAspectCrop smooth: true } Rectangle { anchors.fill: parent; color: "#000000"; opacity: 0.55 } Column { anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top anchors.topMargin: parent.height * 0.08 spacing: 14 Image { source: "file:///usr/share/pixmaps/shivaos-logo.png" width: 100; height: 100 anchors.horizontalCenter: parent.horizontalCenter } Text { text: "SHIVA OS" color: "#FF8C00"; font.pixelSize: 38; font.bold: true; font.letterSpacing: 8 anchors.horizontalCenter: parent.horizontalCenter } Text { text: Qt.formatDateTime(new Date(), "dddd d MMMM — hh:mm") color: "#FF8C00"; opacity: 0.7; font.pixelSize: 17; font.letterSpacing: 2 anchors.horizontalCenter: parent.horizontalCenter } } Rectangle { width: 380; height: 200 anchors.centerIn: parent; anchors.verticalCenterOffset: 40 color: Qt.rgba(1,1,1,0.04) border.color: Qt.rgba(1, 0.549, 0, 0.35); border.width: 1; radius: 24 Column { anchors.centerIn: parent; spacing: 20; width: 300 TextField { id: pwField width: parent.width; height: 52 echoMode: TextInput.Password placeholderText: "Mot de passe / Password" color: "white"; font.pixelSize: 15 background: Rectangle { color: Qt.rgba(1,1,1,0.06) border.color: pwField.activeFocus ? "#FF8C00" : Qt.rgba(1,1,1,0.18) border.width: 1; radius: 12 } leftPadding: 16 Keys.onReturnPressed: authenticator.tryUnlock(pwField.text) } Rectangle { width: parent.width; height: 52 color: unlockMouse.containsMouse ? "#e67e00" : "#FF8C00"; radius: 12 Behavior on color { ColorAnimation { duration: 150 } } Text { text: "DÉVERROUILLER"; anchors.centerIn: parent; color: "#0a0a0a"; font.pixelSize: 13; font.bold: true; font.letterSpacing: 2 } MouseArea { id: unlockMouse; anchors.fill: parent; hoverEnabled: true; onClicked: authenticator.tryUnlock(pwField.text) } } } } Text { anchors.bottom: parent.bottom; anchors.left: parent.left; anchors.margins: 32 text: "ShivaOS 44 — shivaos.com"; color: "#FF8C00"; opacity: 0.28; font.pixelSize: 13; font.letterSpacing: 2 } Component.onCompleted: pwField.forceActiveFocus() } EOF # ── 6. Config KDE skel (nouveaux utilisateurs) ─────────────────── mkdir -p %{buildroot}/etc/skel/.config cat > %{buildroot}/etc/skel/.config/kdeglobals << 'EOF' [General] ColorScheme=BreezeDark EOF cat > %{buildroot}/etc/skel/.config/kscreenlockerrc << 'EOF' [Greeter][Wallpaper][org.kde.image][General] Image=file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png EOF # Écran : veille à 30 min (profils AC + batterie) cat > %{buildroot}/etc/skel/.config/powermanagementprofilesrc << 'EOF' [AC][Display and Brightness] idleTime=1800000 PoweredOffScreens=true [Battery][Display and Brightness] idleTime=1800000 PoweredOffScreens=true [LowBattery][Display and Brightness] idleTime=900000 PoweredOffScreens=true EOF # ── 6b. Config système (fallback XDG — lu par plasmalogin + kscreenlocker) ──── mkdir -p %{buildroot}/etc/xdg cat > %{buildroot}/etc/xdg/kscreenlockerrc << 'EOF' [Greeter][Wallpaper][org.kde.image][General] Image=file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png EOF # ── 6c. Service systemd — greeter wallpaper (sddm + plasmalogin) ── # tmpfiles.d ignoré : sddm.conf et plasmalogin.conf du système ont des entrées dupliquées # → service Before=sddm.service garantit l'écriture à chaque boot mkdir -p %{buildroot}/usr/lib/shivaos cat > %{buildroot}/usr/lib/shivaos/setup-greeter-wallpaper << 'SCRIPT' #!/bin/bash CONF='[Greeter][Wallpaper][org.kde.image][General] Image=file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png' mkdir -p /var/lib/sddm/.config printf '%s\n' "$CONF" > /var/lib/sddm/.config/kscreenlockerrc chown sddm:sddm /var/lib/sddm/.config /var/lib/sddm/.config/kscreenlockerrc 2>/dev/null || true mkdir -p /var/lib/plasmalogin/.config printf '%s\n' "$CONF" > /var/lib/plasmalogin/.config/kscreenlockerrc chown plasmalogin:plasmalogin /var/lib/plasmalogin/.config /var/lib/plasmalogin/.config/kscreenlockerrc 2>/dev/null || true SCRIPT chmod 755 %{buildroot}/usr/lib/shivaos/setup-greeter-wallpaper mkdir -p %{buildroot}/usr/lib/systemd/system cat > %{buildroot}/usr/lib/systemd/system/shivaos-greeter-setup.service << 'EOF' [Unit] Description=ShivaOS — Wallpaper login/lock screen Before=sddm.service display-manager.service After=local-fs.target [Service] Type=oneshot ExecStart=/usr/lib/shivaos/setup-greeter-wallpaper RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF # ── 7. Autostart — logo Kickoff (menu démarrer) ────────────────── mkdir -p %{buildroot}/usr/libexec cat > %{buildroot}/usr/libexec/shivaos-kickoff-icon << 'SCRIPT' #!/bin/bash # ShivaOS user setup — copie raccourcis + logo Kickoff # 1. Copier les raccourcis Desktop manquants depuis /etc/skel/Desktop/ mkdir -p "$HOME/Desktop" for f in /etc/skel/Desktop/*.desktop; do [ -f "$f" ] || continue dest="$HOME/Desktop/$(basename "$f")" [ -f "$dest" ] || install -m755 "$f" "$dest" done # 2. Supprimer le plasma config cassé (sans plugin= → écran noir) PLASMA_CFG="$HOME/.config/plasma-org.kde.plasma.desktop-appletsrc" if [ -f "$PLASMA_CFG" ] && ! grep -q "^plugin=" "$PLASMA_CFG" 2>/dev/null; then rm -f "$PLASMA_CFG" fi # 3. Logo Kickoff — une seule fois (stamp) STAMP="$HOME/.local/share/shivaos/.kickoff-branded" [ -f "$STAMP" ] && exit 0 # Attendre que Plasma génère son config (max 20s) for i in $(seq 1 20); do [ -f "$PLASMA_CFG" ] && grep -q "^plugin=" "$PLASMA_CFG" && break sleep 1 done # Trouver l'applet Kickoff et lui mettre l'icône shivaos-logo if [ -f "$PLASMA_CFG" ]; then # Chercher la section Kickoff et injecter icon= python3 - "$PLASMA_CFG" << 'PYEOF' import sys, re path = sys.argv[1] with open(path) as f: content = f.read() # Trouver les sections d'applets contenant kickoff lines = content.splitlines() result = [] in_kickoff_general = False icon_set = False for i, line in enumerate(lines): result.append(line) # Détecter section [Containments][*][Applets][*][Configuration][General] if re.match(r'\[Containments\]\[[\d]+\]\[Applets\]\[[\d]+\]\[Configuration\]\[General\]', line): # Vérifier si le plugin de l'applet parent est kickoff # Chercher vers le haut le plugin= de cet applet section_base = re.sub(r'\[Configuration\]\[General\]$', '', line.strip()) plugin_line = f"plugin=org.kde.plasma.kickoff" if any(plugin_line in l for l in lines): in_kickoff_general = True elif in_kickoff_general and line.startswith('['): in_kickoff_general = False elif in_kickoff_general and line.startswith('icon='): result[-1] = 'icon=shivaos-logo' icon_set = True # Si la section General du kickoff n'a pas d'icon=, l'ajouter if not icon_set: # Approche plus directe : kwriteconfig6 import subprocess # Trouver le numéro de containment et applet du kickoff containment = None applet = None for i, line in enumerate(lines): if 'plugin=org.kde.plasma.kickoff' in line: # Remonter pour trouver [Containments][X][Applets][Y] for j in range(i, -1, -1): m = re.match(r'\[Containments\]\[(\d+)\]\[Applets\]\[(\d+)\]$', lines[j]) if m: containment, applet = m.group(1), m.group(2) break break if containment and applet: subprocess.run([ 'kwriteconfig6', '--file', path, '--group', f'Containments', '--group', containment, '--group', 'Applets', '--group', applet, '--group', 'Configuration', '--group', 'General', '--key', 'icon', 'shivaos-logo' ]) sys.exit(0) with open(path, 'w') as f: f.write('\n'.join(result)) PYEOF fi mkdir -p "$(dirname "$STAMP")" touch "$STAMP" # Redémarrer plasmashell pour appliquer kquitapp6 plasmashell 2>/dev/null; sleep 1; kstart6 plasmashell 2>/dev/null & SCRIPT chmod 755 %{buildroot}/usr/libexec/shivaos-kickoff-icon mkdir -p %{buildroot}/etc/xdg/autostart cat > %{buildroot}/etc/xdg/autostart/shivaos-kickoff-icon.desktop << 'EOF' [Desktop Entry] Type=Application Name=ShivaOS Kickoff Icon Exec=/usr/libexec/shivaos-kickoff-icon Terminal=false X-KDE-autostart-after=panel X-KDE-Plasma-Widget-Name=org.kde.plasma.kickoff OnlyShowIn=KDE; X-GNOME-Autostart-enabled=false EOF %post # Activer le service greeter wallpaper systemctl enable shivaos-greeter-setup.service 2>/dev/null || true # Lancer immédiatement si possible (systèmes classiques) systemctl start shivaos-greeter-setup.service 2>/dev/null || true for HOME_DIR in /home/* /var/home/*; do [ -d "$HOME_DIR" ] || continue BASENAME=$(basename "$HOME_DIR") id "$BASENAME" >/dev/null 2>&1 || continue mkdir -p "$HOME_DIR/.config" # Cleanup v1.0-3 : supprimer LookAndFeelPackage qui cassait plasmashell if [ -f "$HOME_DIR/.config/kdeglobals" ]; then sed -i '/^LookAndFeelPackage=/d' "$HOME_DIR/.config/kdeglobals" sed -i '/^\[KDE\]$/{ N; /^\[KDE\]\n$/d }' "$HOME_DIR/.config/kdeglobals" fi # BreezeDark si pas déjà configuré if ! grep -q "ColorScheme=BreezeDark" "$HOME_DIR/.config/kdeglobals" 2>/dev/null; then grep -q "\[General\]" "$HOME_DIR/.config/kdeglobals" 2>/dev/null \ || printf '\n[General]\n' >> "$HOME_DIR/.config/kdeglobals" echo "ColorScheme=BreezeDark" >> "$HOME_DIR/.config/kdeglobals" fi # Fix v1.0-5 : supprimer le fichier skel incomplet (sans plugin=) qui causait l'écran noir PLASMA_CFG="$HOME_DIR/.config/plasma-org.kde.plasma.desktop-appletsrc" if [ -f "$PLASMA_CFG" ] && ! grep -q "^plugin=" "$PLASMA_CFG" 2>/dev/null; then rm -f "$PLASMA_CFG" fi # Lock screen ShivaOS — wallpaper uniquement (pas de Theme= : LockScreen.qml non supporté Plasma 6.6) printf '[Greeter][Wallpaper][org.kde.image][General]\nImage=file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png\n' \ > "$HOME_DIR/.config/kscreenlockerrc" done # En Atomic, %post tourne en container → /var/lib/plasmalogin et /var/lib/sddm n'existent pas. # systemd-tmpfiles (shivaos-plasmalogin.conf) crée les répertoires + copie le config au boot. # Pour les systèmes classiques où les répertoires existent déjà : WALLPAPER_CFG='[Greeter][Wallpaper][org.kde.image][General] Image=file:///usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png' PLASMALOGIN_HOME="/var/lib/plasmalogin" if [ -d "$PLASMALOGIN_HOME" ]; then mkdir -p "$PLASMALOGIN_HOME/.config" printf '%s\n' "$WALLPAPER_CFG" > "$PLASMALOGIN_HOME/.config/kscreenlockerrc" chown -R plasmalogin:plasmalogin "$PLASMALOGIN_HOME" 2>/dev/null || true fi SDDM_HOME="/var/lib/sddm" if [ -d "$SDDM_HOME" ]; then mkdir -p "$SDDM_HOME/.config" printf '%s\n' "$WALLPAPER_CFG" > "$SDDM_HOME/.config/kscreenlockerrc" chown -R sddm:sddm "$SDDM_HOME" 2>/dev/null || true fi if command -v plymouth-set-default-theme >/dev/null 2>&1; then plymouth-set-default-theme shivaos 2>/dev/null || true fi %files /usr/share/wallpapers/ShivaOS/contents/images/shivaos-wallpaper.png /usr/share/wallpapers/ShivaOS/metadata.json /usr/share/pixmaps/shivaos-logo.png /usr/share/icons/hicolor/64x64/apps/shivaos-logo.png /usr/share/icons/hicolor/128x128/apps/shivaos-logo.png /usr/share/icons/hicolor/256x256/apps/shivaos-logo.png /usr/share/icons/hicolor/512x512/apps/shivaos-logo.png /usr/share/sddm/themes/shivaos/background.png /usr/share/sddm/themes/shivaos/shivaos-logo-128.png /usr/share/sddm/themes/shivaos/Main.qml /usr/share/sddm/themes/shivaos/metadata.desktop /usr/lib/sddm/sddm.conf.d/shivaos.conf /usr/share/plymouth/themes/shivaos/shivaos.plymouth /usr/share/plymouth/themes/shivaos/shivaos.script /usr/share/plymouth/themes/shivaos/shivaos-logo-256.png /usr/share/plasma/look-and-feel/com.shivaos.desktop/metadata.json /usr/share/plasma/look-and-feel/com.shivaos.desktop/contents/defaults /usr/share/plasma/look-and-feel/com.shivaos.desktop/contents/lockscreen/LockScreen.qml /etc/skel/.config/kdeglobals /etc/skel/.config/kscreenlockerrc /etc/skel/.config/powermanagementprofilesrc /etc/xdg/kscreenlockerrc /usr/lib/shivaos/setup-greeter-wallpaper /usr/lib/systemd/system/shivaos-greeter-setup.service /usr/libexec/shivaos-kickoff-icon /etc/xdg/autostart/shivaos-kickoff-icon.desktop %changelog * Mon May 11 2026 ShivaOS Team - 1.0-11 - Fix définitif wallpaper login/lock screen : remplace tmpfiles.d par un service systemd shivaos-greeter-setup.service (Before=sddm.service) qui écrit le kscreenlockerrc à chaque boot Cause racine : sddm.conf et plasmalogin.conf du système ont des entrées dupliquées → tmpfiles.d ignorait nos règles d /var/lib/sddm et d /var/lib/plasmalogin → .config jamais créé * Mon May 11 2026 ShivaOS Team - 1.0-10 - Fix wallpaper login screen SDDM (au démarrage) : même fix que plasmalogin mais pour user sddm tmpfiles.d crée /var/lib/sddm/.config/kscreenlockerrc au boot (Atomic : %post en container) %post écrit directement si /var/lib/sddm existe (systèmes classiques) * Mon May 11 2026 ShivaOS Team - 1.0-9 - Fix login/lock screen Atomic : installe /etc/xdg/kscreenlockerrc (fallback XDG lu par plasmalogin) En Atomic %post tourne en container, /var/lib/plasmalogin n'existe pas → fallback XDG nécessaire - Ajoute tmpfiles.d shivaos-plasmalogin.conf : crée /var/lib/plasmalogin/.config au boot et copie /etc/xdg/kscreenlockerrc → /var/lib/plasmalogin/.config/kscreenlockerrc - Supprime Theme=com.shivaos.desktop des kscreenlockerrc (LockScreen.qml non supporté Plasma 6.6) - Ajoute skel powermanagementprofilesrc : veille écran 30 min (AC), 15 min (batterie faible) * Mon May 11 2026 ShivaOS Team - 1.0-8 - Fix wallpaper login/lock screen : Plasma 6.6 utilise plasma-login-manager (pas SDDM) kscreenlockerrc doit inclure [Greeter][Wallpaper][org.kde.image][General] Image=... - %post configure aussi /var/lib/plasmalogin/.config/kscreenlockerrc (user greeter système) - Fix SDDM Main.qml : Keys.onReturnPressed appelait loginBtn.clicked() (bool, pas fonction) → remplacé par appel direct sddm.login(...) * Mon May 11 2026 ShivaOS Team - 1.0-7 - Fix Atomic : autostart copie les raccourcis Desktop manquants depuis /etc/skel/Desktop/ (les %post ne s'exécutent pas sur le home réel en Atomic — approche autostart requise) - Fix Atomic : autostart supprime le plasma-org.kde.plasma.desktop-appletsrc cassé (écran noir) * Mon May 11 2026 ShivaOS Team - 1.0-6 - Logo ShivaOS dans le bouton Kickoff (menu démarrer) via autostart au 1er login - Script shivaos-kickoff-icon : détecte l'applet Kickoff, applique icon=shivaos-logo * Mon May 11 2026 ShivaOS Team - 1.0-5 - Fix écran noir : suppression du skel plasma-org.kde.plasma.desktop-appletsrc (fichier incomplet sans plugin= → containments invalides → bureau noir) - %post : nettoyage automatique du fichier brisé pour les users existants - Wallpaper défini via Containerfile (patch plasma shell defaults) * Mon May 11 2026 ShivaOS Team - 1.0-4 - Fix écran noir : suppression LookAndFeelPackage qui cassait plasmashell (référence circulaire) - Wallpaper via plasma-org.kde.plasma.desktop-appletsrc (plus fiable que look-and-feel) - %post : cleanup LookAndFeelPackage des users existants (installés en v1.0-3) - SDDM : thème shivaos conservé * Sun May 10 2026 ShivaOS Team - 1.0-3 - Branding complet : wallpaper réel, logo toutes tailles, Plymouth - Correction symlinks brisés SDDM (images embarquées dans le RPM via Source:) - look-and-feel : ajout fichier defaults (wallpaper ShivaOS + BreezeDark) - %post : application aux utilisateurs /home et /var/home existants * Fri May 09 2026 ShivaOS Team - 1.0-2 - Fix symlinks background.png + shivaos-logo-128.png * Thu May 08 2026 ShivaOS Team - 1.0-1 - Release initiale