v0.3 theme: match onyx exactly — solid black wallpaper, Linux Konsole scheme, Breeze_Light cursor
Onyx uses Plasma's org.kde.color plugin for solid #000000 (no SVG/image), default Konsole 'Linux' palette, Breeze_Light cursor, IAX kwin buttons. Removed wallpaper SVG (not used). Added plasma-desktop.conf snippet + kdedefaults override for new users.
This commit is contained in:
parent
084582e0e5
commit
d2649fb335
18 changed files with 968 additions and 0 deletions
60
assets/kde/breezerc
Normal file
60
assets/kde/breezerc
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# veilor-os — Breeze window decoration override
|
||||
# Tighter borders, solid black title bar, minimal buttons, smallest border.
|
||||
# Merged into /etc/xdg/breezerc (system default) by 30-apply-v03-theme.sh.
|
||||
|
||||
[Common]
|
||||
# Tighter outline; subtle separator only when active.
|
||||
OutlineCloseButton=false
|
||||
ShadowSize=ShadowSmall
|
||||
ShadowStrength=128
|
||||
ShadowColor=0,0,0
|
||||
|
||||
[Windeco]
|
||||
# Border thickness: smallest available (= "None" leaves only resize edge,
|
||||
# "NoSides" keeps top/bottom only). We pick "None" for the tightest look,
|
||||
# matching the black-on-black aesthetic.
|
||||
BorderSize=None
|
||||
ButtonSize=ButtonSmall
|
||||
CloseButton=true
|
||||
DrawBackgroundGradient=false
|
||||
DrawBorderOnMaximizedWindows=false
|
||||
DrawSizeGrip=false
|
||||
DrawTitleBarSeparator=false
|
||||
ExceptionType=0
|
||||
HideTitleBar=false
|
||||
OpaqueTitleBar=true
|
||||
TitleAlignment=AlignCenter
|
||||
UseBackgroundGradient=false
|
||||
UseTitleBarColor=true
|
||||
|
||||
# Buttons: minimal — close / max / min only, no shade/help/keep-above.
|
||||
ButtonsOnLeft=M
|
||||
ButtonsOnRight=IAX
|
||||
|
||||
[Style]
|
||||
# Disable per-app blur, transparency, and gradient effects.
|
||||
MenuOpacity=100
|
||||
WindowDragMode=1
|
||||
ScrollBarAddLineButtons=0
|
||||
ScrollBarSubLineButtons=0
|
||||
SidePanelDrawFrame=false
|
||||
SliderDrawTickMarks=false
|
||||
TabBarDrawCenteredTabs=true
|
||||
ToolBarDrawItemSeparator=false
|
||||
DockWidgetDrawFrame=false
|
||||
ProgressBarAnimated=false
|
||||
AnimationsEnabled=false
|
||||
StackedWidgetDrawFrame=false
|
||||
|
||||
# ── Active / inactive title bar colors (override Breeze defaults) ──
|
||||
# kdeglobals [WM] section is the canonical source; these mirror it here
|
||||
# so apps that only read breezerc see consistent values.
|
||||
[Windeco][Active]
|
||||
TitleBarColor=0,0,0
|
||||
TitleBarTextColor=216,216,216
|
||||
TitleBarBorderColor=104,107,111
|
||||
|
||||
[Windeco][Inactive]
|
||||
TitleBarColor=15,17,18
|
||||
TitleBarTextColor=161,169,177
|
||||
TitleBarBorderColor=42,46,50
|
||||
9
assets/kde/plasma-desktop.conf
Normal file
9
assets/kde/plasma-desktop.conf
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# veilor-os default desktop config — solid black wallpaper (matches onyx).
|
||||
# Plasma uses `wallpaperplugin=org.kde.color` (not org.kde.image) — pure
|
||||
# black solid color rendering, no SVG asset needed.
|
||||
# Applied via 30-apply-v03-theme.sh into ~/.config/plasma-org.kde.plasma.desktop-appletsrc
|
||||
# default for new users.
|
||||
|
||||
[Containments][Wallpaper]
|
||||
wallpaperplugin=org.kde.color
|
||||
Color=0,0,0
|
||||
|
|
@ -16,3 +16,14 @@ Theme=breeze-dark
|
|||
LookAndFeelPackage=org.kde.breezedark.desktop
|
||||
SingleClick=false
|
||||
contrast=4
|
||||
widgetStyle=Breeze
|
||||
|
||||
[Mouse]
|
||||
cursorTheme=Breeze_Light
|
||||
cursorSize=24
|
||||
|
||||
[KDecoration]
|
||||
theme=Breeze
|
||||
ButtonsOnLeft=
|
||||
ButtonsOnRight=IAX
|
||||
BorderSize=None
|
||||
|
|
|
|||
104
assets/konsole/veilor.colorscheme
Normal file
104
assets/konsole/veilor.colorscheme
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
[General]
|
||||
Anchor=0.5,0.5
|
||||
Blur=false
|
||||
ColorRandomization=false
|
||||
Description=Veilor
|
||||
FillStyle=Tile
|
||||
Opacity=1
|
||||
Wallpaper=
|
||||
WallpaperFlipType=NoFlip
|
||||
WallpaperOpacity=1
|
||||
|
||||
[Background]
|
||||
Color=0,0,0
|
||||
|
||||
[BackgroundFaint]
|
||||
Color=0,0,0
|
||||
|
||||
[BackgroundIntense]
|
||||
Color=15,17,18
|
||||
|
||||
[Foreground]
|
||||
Color=216,216,216
|
||||
|
||||
[ForegroundFaint]
|
||||
Color=161,169,177
|
||||
|
||||
[ForegroundIntense]
|
||||
Color=236,236,236
|
||||
|
||||
# ── Standard ANSI palette (muted, desaturated) ──
|
||||
# Veilor aesthetic: no neon. Reds tone-shifted toward bordeaux, greens
|
||||
# toward sage, blues toward slate. Greys lifted to remain readable.
|
||||
|
||||
[Color0]
|
||||
Color=27,27,27
|
||||
|
||||
[Color0Faint]
|
||||
Color=20,20,20
|
||||
|
||||
[Color0Intense]
|
||||
Color=58,58,58
|
||||
|
||||
[Color1]
|
||||
Color=176,55,69
|
||||
|
||||
[Color1Faint]
|
||||
Color=130,40,52
|
||||
|
||||
[Color1Intense]
|
||||
Color=205,87,99
|
||||
|
||||
[Color2]
|
||||
Color=102,138,90
|
||||
|
||||
[Color2Faint]
|
||||
Color=78,107,68
|
||||
|
||||
[Color2Intense]
|
||||
Color=141,176,128
|
||||
|
||||
[Color3]
|
||||
Color=185,158,98
|
||||
|
||||
[Color3Faint]
|
||||
Color=140,118,72
|
||||
|
||||
[Color3Intense]
|
||||
Color=216,193,134
|
||||
|
||||
[Color4]
|
||||
Color=92,116,143
|
||||
|
||||
[Color4Faint]
|
||||
Color=68,87,107
|
||||
|
||||
[Color4Intense]
|
||||
Color=131,154,182
|
||||
|
||||
[Color5]
|
||||
Color=141,113,150
|
||||
|
||||
[Color5Faint]
|
||||
Color=104,84,112
|
||||
|
||||
[Color5Intense]
|
||||
Color=176,148,186
|
||||
|
||||
[Color6]
|
||||
Color=99,144,148
|
||||
|
||||
[Color6Faint]
|
||||
Color=72,107,110
|
||||
|
||||
[Color6Intense]
|
||||
Color=139,180,184
|
||||
|
||||
[Color7]
|
||||
Color=200,200,200
|
||||
|
||||
[Color7Faint]
|
||||
Color=161,169,177
|
||||
|
||||
[Color7Intense]
|
||||
Color=236,236,236
|
||||
55
assets/konsole/veilor.profile
Normal file
55
assets/konsole/veilor.profile
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
[General]
|
||||
Name=Veilor
|
||||
Parent=FALLBACK/
|
||||
Command=/bin/bash
|
||||
Directory=
|
||||
Icon=utilities-terminal
|
||||
LocalTabTitleFormat=%w
|
||||
RemoteTabTitleFormat=(%u) %h
|
||||
ShowTerminalSizeHint=false
|
||||
StartInCurrentSessionDir=true
|
||||
TerminalCenter=false
|
||||
TerminalMargin=4
|
||||
|
||||
[Appearance]
|
||||
ColorScheme=Linux
|
||||
Font=Fira Code,11,-1,5,400,0,0,0,0,0,0,0,0,0,0,1
|
||||
LineSpacing=1
|
||||
UseFontLineCharacters=true
|
||||
|
||||
[Cursor Options]
|
||||
CursorShape=0
|
||||
UseCustomCursorColor=true
|
||||
CustomCursorColor=104,107,111
|
||||
CustomCursorTextColor=216,216,216
|
||||
|
||||
[Scrolling]
|
||||
HistoryMode=2
|
||||
HistorySize=10000
|
||||
ScrollBarPosition=2
|
||||
HighlightScrolledLines=false
|
||||
|
||||
[Terminal Features]
|
||||
BellMode=3
|
||||
BlinkingCursorEnabled=false
|
||||
BlinkingTextEnabled=false
|
||||
FlowControlEnabled=false
|
||||
UrlHintsModifiers=67108864
|
||||
ReverseUrlHints=false
|
||||
VerticalLine=false
|
||||
|
||||
[Interaction Options]
|
||||
AutoCopySelectedText=false
|
||||
CopyTextAsHTML=false
|
||||
TrimLeadingSpacesInSelectedText=false
|
||||
TrimTrailingSpacesInSelectedText=true
|
||||
UnderlineFilesEnabled=true
|
||||
UnderlineLinksEnabled=true
|
||||
OpenLinksByDirectClickEnabled=false
|
||||
WordCharacters=:@-./_~?&=%+#
|
||||
|
||||
[Encoding Options]
|
||||
DefaultEncoding=UTF-8
|
||||
|
||||
[Keyboard]
|
||||
KeyBindings=default
|
||||
8
assets/plymouth/veilor/veilor.plymouth
Normal file
8
assets/plymouth/veilor/veilor.plymouth
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[Plymouth Theme]
|
||||
Name=veilor
|
||||
Description=veilor-os boot splash — black background, centered wordmark, slow pulse dot
|
||||
ModuleName=script
|
||||
|
||||
[script]
|
||||
ImageDir=/usr/share/plymouth/themes/veilor
|
||||
ScriptFile=/usr/share/plymouth/themes/veilor/veilor.script
|
||||
114
assets/plymouth/veilor/veilor.script
Normal file
114
assets/plymouth/veilor/veilor.script
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
// veilor-os Plymouth boot splash
|
||||
// minimal: pure black background, centered "veilor" wordmark, single
|
||||
// slowly-pulsing dot underneath. no fedora f, no spinning bar.
|
||||
//
|
||||
// Plymouth script reference: https://www.freedesktop.org/wiki/Software/Plymouth/Scripts/
|
||||
|
||||
// ── Background: pure black ──────────────────────────────────────────────
|
||||
Window.SetBackgroundTopColor (0.0, 0.0, 0.0);
|
||||
Window.SetBackgroundBottomColor(0.0, 0.0, 0.0);
|
||||
|
||||
screen_w = Window.GetWidth();
|
||||
screen_h = Window.GetHeight();
|
||||
|
||||
// ── Wordmark: render "veilor" as text via Plymouth's image API ──────────
|
||||
// Image() with a string renders the system font. Color is white (216/255).
|
||||
wordmark.image = Image.Text("veilor", 0.847, 0.847, 0.847, 1.0, "Sans 28");
|
||||
wordmark.sprite = Sprite(wordmark.image);
|
||||
wordmark.sprite.SetX((screen_w - wordmark.image.GetWidth()) / 2);
|
||||
wordmark.sprite.SetY((screen_h - wordmark.image.GetHeight()) / 2 - 12);
|
||||
wordmark.sprite.SetOpacity(0.92);
|
||||
|
||||
// ── Pulse dot: single small white circle, opacity oscillates slowly ─────
|
||||
// Build a 12x12 circle bitmap programmatically (no external assets needed).
|
||||
dot_size = 12;
|
||||
dot.image = Image("dot.png");
|
||||
if (!dot.image) {
|
||||
// Plymouth can't draw arbitrary shapes from script; if dot.png is
|
||||
// missing, fall back to a small text bullet which the system font
|
||||
// will render as a centered glyph. Keeps the theme self-contained.
|
||||
dot.image = Image.Text("●", 0.847, 0.847, 0.847, 1.0, "Sans 18");
|
||||
}
|
||||
dot.sprite = Sprite(dot.image);
|
||||
dot.sprite.SetX((screen_w - dot.image.GetWidth()) / 2);
|
||||
dot.sprite.SetY((screen_h - dot.image.GetHeight()) / 2 + wordmark.image.GetHeight() / 2 + 18);
|
||||
|
||||
// ── Animation: slow opacity pulse on the dot ────────────────────────────
|
||||
// Frame counter advances on every refresh tick (~50 Hz).
|
||||
pulse_phase = 0;
|
||||
fun refresh_callback() {
|
||||
pulse_phase++;
|
||||
// 240-tick cycle ≈ 4.8 s. sin-like via fractional triangle wave.
|
||||
cycle = pulse_phase % 240;
|
||||
half = 120;
|
||||
if (cycle < half)
|
||||
ratio = cycle / half;
|
||||
else
|
||||
ratio = (240 - cycle) / half;
|
||||
// map 0..1 to opacity 0.25..0.95
|
||||
opacity = 0.25 + ratio * 0.70;
|
||||
dot.sprite.SetOpacity(opacity);
|
||||
}
|
||||
Plymouth.SetRefreshFunction(refresh_callback);
|
||||
|
||||
// ── Progress bar from message_handler ───────────────────────────────────
|
||||
// Plymouth sends progress messages during boot; we silently consume them
|
||||
// without drawing a bar (to keep the splash clean). Override as needed.
|
||||
fun message_callback(text) {
|
||||
// intentionally silent — keep splash uncluttered. Reserved for future
|
||||
// status-line overlay if requested.
|
||||
}
|
||||
Plymouth.SetMessageFunction(message_callback);
|
||||
|
||||
// ── Boot phase callbacks (no-op) ────────────────────────────────────────
|
||||
fun boot_progress_callback(duration, progress) {
|
||||
// no progress bar by design — splash is intentionally static
|
||||
}
|
||||
Plymouth.SetBootProgressFunction(boot_progress_callback);
|
||||
|
||||
// ── Password prompt (LUKS unlock) ───────────────────────────────────────
|
||||
// Required: when LUKS is unlocked at boot, plymouth shows a prompt.
|
||||
// We render a minimal centered prompt under the dot.
|
||||
prompt.label_image = NULL;
|
||||
prompt.entry_image = NULL;
|
||||
|
||||
fun display_password_callback(prompt_text, bullets) {
|
||||
if (prompt.label_image)
|
||||
prompt.label_image = NULL;
|
||||
if (prompt.entry_image)
|
||||
prompt.entry_image = NULL;
|
||||
|
||||
label_text = prompt_text;
|
||||
if (label_text == "") label_text = "passphrase";
|
||||
|
||||
prompt.label_image = Image.Text(label_text, 0.63, 0.63, 0.63, 1.0, "Sans 12");
|
||||
prompt.label_sprite = Sprite(prompt.label_image);
|
||||
prompt.label_sprite.SetX((screen_w - prompt.label_image.GetWidth()) / 2);
|
||||
prompt.label_sprite.SetY(screen_h * 0.65);
|
||||
|
||||
bullet_text = "";
|
||||
i = 0;
|
||||
while (i < bullets) {
|
||||
bullet_text += "•";
|
||||
i++;
|
||||
}
|
||||
if (bullet_text == "") bullet_text = " ";
|
||||
prompt.entry_image = Image.Text(bullet_text, 0.847, 0.847, 0.847, 1.0, "Sans 18");
|
||||
prompt.entry_sprite = Sprite(prompt.entry_image);
|
||||
prompt.entry_sprite.SetX((screen_w - prompt.entry_image.GetWidth()) / 2);
|
||||
prompt.entry_sprite.SetY(screen_h * 0.65 + 24);
|
||||
}
|
||||
Plymouth.SetDisplayPasswordFunction(display_password_callback);
|
||||
|
||||
fun display_normal_callback() {
|
||||
if (prompt.label_image) { prompt.label_image = NULL; prompt.label_sprite = NULL; }
|
||||
if (prompt.entry_image) { prompt.entry_image = NULL; prompt.entry_sprite = NULL; }
|
||||
}
|
||||
Plymouth.SetDisplayNormalFunction(display_normal_callback);
|
||||
|
||||
// ── Quit ────────────────────────────────────────────────────────────────
|
||||
fun quit_callback() {
|
||||
wordmark.sprite.SetOpacity(0);
|
||||
dot.sprite.SetOpacity(0);
|
||||
}
|
||||
Plymouth.SetQuitFunction(quit_callback);
|
||||
155
assets/sddm/veilor-black/Main.qml
Normal file
155
assets/sddm/veilor-black/Main.qml
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
// veilor-os SDDM login theme — "veilor-black"
|
||||
// Minimal black-on-black login screen. Single password field, admin
|
||||
// pre-filled. Fira Code throughout. Grey accent (#686B6F) on focus.
|
||||
//
|
||||
// SDDM QML reference: https://github.com/sddm/sddm/wiki/Themes
|
||||
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Controls 2.15
|
||||
import QtQuick.Layouts 1.15
|
||||
import SddmComponents 2.0
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
width: 1920
|
||||
height: 1080
|
||||
color: "#000000"
|
||||
|
||||
// Fixed user — admin only (matches kickstart user creation)
|
||||
property string fixedUser: "admin"
|
||||
|
||||
// Palette (mirrors veilor-black.colors)
|
||||
readonly property color colBg: "#000000"
|
||||
readonly property color colFg: "#d8d8d8" // 216,216,216
|
||||
readonly property color colAccent: "#686b6f" // 104,107,111
|
||||
readonly property color colMuted: "#3a3a3a"
|
||||
readonly property color colError: "#b03745"
|
||||
|
||||
TextConstants { id: textConstants }
|
||||
|
||||
Connections {
|
||||
target: sddm
|
||||
function onLoginSucceeded() {
|
||||
errorLabel.text = ""
|
||||
}
|
||||
function onLoginFailed() {
|
||||
errorLabel.text = textConstants.loginFailed
|
||||
passwordField.text = ""
|
||||
passwordField.focus = true
|
||||
}
|
||||
}
|
||||
|
||||
// ── Wordmark ─────────────────────────────────────────────────────────
|
||||
Text {
|
||||
id: wordmark
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -120
|
||||
text: "veilor"
|
||||
color: colFg
|
||||
opacity: 0.85
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 32
|
||||
font.weight: Font.Light
|
||||
}
|
||||
|
||||
// ── Login form ───────────────────────────────────────────────────────
|
||||
Column {
|
||||
id: form
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.verticalCenterOffset: -10
|
||||
spacing: 12
|
||||
width: 320
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: root.fixedUser
|
||||
color: colAccent
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 13
|
||||
font.letterSpacing: 1
|
||||
}
|
||||
|
||||
// Password input — single rounded box, grey border on focus
|
||||
Rectangle {
|
||||
id: passwordBox
|
||||
width: parent.width
|
||||
height: 44
|
||||
radius: 4
|
||||
color: colBg
|
||||
border.width: 1
|
||||
border.color: passwordField.focus ? colAccent : colMuted
|
||||
|
||||
TextInput {
|
||||
id: passwordField
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 12
|
||||
anchors.rightMargin: 12
|
||||
verticalAlignment: TextInput.AlignVCenter
|
||||
color: colFg
|
||||
selectionColor: colAccent
|
||||
selectedTextColor: colFg
|
||||
echoMode: TextInput.Password
|
||||
passwordCharacter: "•"
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 14
|
||||
clip: true
|
||||
focus: true
|
||||
activeFocusOnTab: true
|
||||
|
||||
Keys.onPressed: function(event) {
|
||||
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
||||
sddm.login(root.fixedUser, passwordField.text, sessionCombo.currentIndex)
|
||||
event.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.fill: parent
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
text: "passphrase"
|
||||
color: colMuted
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 14
|
||||
visible: passwordField.text.length === 0 && !passwordField.focus
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: errorLabel
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: ""
|
||||
color: colError
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 11
|
||||
visible: text.length > 0
|
||||
}
|
||||
|
||||
// Hidden session selector — defaults to first (Plasma)
|
||||
ComboBox {
|
||||
id: sessionCombo
|
||||
visible: false
|
||||
model: sessionModel
|
||||
textRole: "name"
|
||||
currentIndex: sessionModel.lastIndex
|
||||
}
|
||||
}
|
||||
|
||||
// ── Footer ───────────────────────────────────────────────────────────
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: 24
|
||||
text: "veilor-os"
|
||||
color: colMuted
|
||||
font.family: "Fira Code"
|
||||
font.pixelSize: 10
|
||||
font.letterSpacing: 2
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
passwordField.forceActiveFocus()
|
||||
}
|
||||
}
|
||||
16
assets/sddm/veilor-black/metadata.desktop
Normal file
16
assets/sddm/veilor-black/metadata.desktop
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
[SddmGreeterTheme]
|
||||
Name=veilor-black
|
||||
Description=veilor-os login theme — black background, grey accent, single passphrase prompt
|
||||
Author=veilor-os
|
||||
Copyright=(c) veilor-os
|
||||
License=MIT
|
||||
Type=sddm-theme
|
||||
Version=0.3
|
||||
Website=https://github.com/veilor-org/veilor-os
|
||||
Screenshot=
|
||||
MainScript=Main.qml
|
||||
ConfigFile=theme.conf
|
||||
TranslationsDirectory=translations
|
||||
Email=
|
||||
Theme-Id=veilor-black
|
||||
Theme-API=2.0
|
||||
10
assets/sddm/veilor-black/theme.conf
Normal file
10
assets/sddm/veilor-black/theme.conf
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[General]
|
||||
# veilor-black SDDM theme — black background, grey accent, Fira Code
|
||||
background=
|
||||
type=color
|
||||
color=#000000
|
||||
fontFamily=Fira Code
|
||||
fontSize=12
|
||||
foreground=#d8d8d8
|
||||
accent=#686b6f
|
||||
muted=#3a3a3a
|
||||
205
scripts/30-apply-v03-theme.sh
Executable file
205
scripts/30-apply-v03-theme.sh
Executable file
|
|
@ -0,0 +1,205 @@
|
|||
#!/usr/bin/env bash
|
||||
# veilor-os — v0.3 theme polish: Plymouth, SDDM, Konsole, wallpaper, Breeze
|
||||
# Idempotent. Run as root during %post (chroot) or post-install.
|
||||
# Tools missing in the build chroot (e.g. plymouth-set-default-theme,
|
||||
# kwriteconfig*) are warned-and-skipped, not fatal.
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
|
||||
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||||
info() { echo -e "${YELLOW}[INFO]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
err() { echo -e "${RED}[ERR]${NC} $*"; }
|
||||
|
||||
[[ $EUID -eq 0 ]] || { err "Must run as root"; exit 1; }
|
||||
|
||||
REPO="${VEILOR_REPO:-/usr/share/veilor-os}"
|
||||
ASSETS="$REPO/assets"
|
||||
|
||||
if [[ ! -d $ASSETS ]]; then
|
||||
err "asset tree not found at $ASSETS — aborting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo " veilor-os :: 30-apply-v03-theme"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 1. Plymouth boot splash
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "Plymouth: installing veilor theme"
|
||||
PLY_SRC="$ASSETS/plymouth/veilor"
|
||||
PLY_DST="/usr/share/plymouth/themes/veilor"
|
||||
if [[ -d $PLY_SRC ]]; then
|
||||
install -d -m 0755 "$PLY_DST"
|
||||
cp -af "$PLY_SRC/." "$PLY_DST/"
|
||||
chmod 0644 "$PLY_DST/"*
|
||||
ok "plymouth files copied to $PLY_DST"
|
||||
|
||||
if command -v plymouth-set-default-theme &>/dev/null; then
|
||||
plymouth-set-default-theme -R veilor 2>/dev/null \
|
||||
&& ok "plymouth default theme = veilor (initramfs rebuilt)" \
|
||||
|| warn "plymouth-set-default-theme failed — set manually post-install"
|
||||
else
|
||||
warn "plymouth-set-default-theme not present (build chroot?) — skipping default-theme set"
|
||||
# Fall back: write theme name to plymouth config so dracut picks it up
|
||||
# next time initramfs is regenerated.
|
||||
if [[ -f /etc/plymouth/plymouthd.conf ]]; then
|
||||
sed -i 's/^Theme=.*/Theme=veilor/' /etc/plymouth/plymouthd.conf
|
||||
else
|
||||
install -d -m 0755 /etc/plymouth
|
||||
cat > /etc/plymouth/plymouthd.conf << 'EOF'
|
||||
[Daemon]
|
||||
Theme=veilor
|
||||
EOF
|
||||
fi
|
||||
ok "plymouth Theme= written to /etc/plymouth/plymouthd.conf"
|
||||
fi
|
||||
else
|
||||
warn "plymouth source dir missing at $PLY_SRC — skipping"
|
||||
fi
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 2. SDDM theme
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "SDDM: installing veilor-black theme"
|
||||
SDDM_SRC="$ASSETS/sddm/veilor-black"
|
||||
SDDM_DST="/usr/share/sddm/themes/veilor-black"
|
||||
if [[ -d $SDDM_SRC ]]; then
|
||||
install -d -m 0755 "$SDDM_DST"
|
||||
cp -af "$SDDM_SRC/." "$SDDM_DST/"
|
||||
chmod 0644 "$SDDM_DST/"*
|
||||
ok "sddm theme copied to $SDDM_DST"
|
||||
|
||||
install -d -m 0755 /etc/sddm.conf.d
|
||||
# Preserve other sddm.conf.d/*.conf entries; this file owns [Theme] only.
|
||||
cat > /etc/sddm.conf.d/veilor-theme.conf << 'EOF'
|
||||
# veilor-os v0.3 — set veilor-black SDDM theme as default (matches onyx)
|
||||
[Theme]
|
||||
Current=veilor-black
|
||||
CursorTheme=Breeze_Light
|
||||
Font=Fira Code
|
||||
EOF
|
||||
ok "sddm theme set in /etc/sddm.conf.d/veilor-theme.conf"
|
||||
else
|
||||
warn "sddm source dir missing at $SDDM_SRC — skipping"
|
||||
fi
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 3. Konsole profile + colorscheme
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "Konsole: installing Veilor profile + colorscheme"
|
||||
KONS_SRC="$ASSETS/konsole"
|
||||
if [[ -d $KONS_SRC ]]; then
|
||||
install -d -m 0755 /usr/share/konsole
|
||||
install -m 0644 "$KONS_SRC/veilor.profile" /usr/share/konsole/Veilor.profile
|
||||
install -m 0644 "$KONS_SRC/veilor.colorscheme" /usr/share/konsole/Veilor.colorscheme
|
||||
ok "konsole profile + colorscheme installed"
|
||||
|
||||
# Set as default in /etc/xdg/konsolerc (system-wide). Idempotent rewrite
|
||||
# of the [Desktop Entry] section's DefaultProfile key.
|
||||
install -d -m 0755 /etc/xdg
|
||||
if [[ -f /etc/xdg/konsolerc ]]; then
|
||||
# Remove any existing DefaultProfile= line, then re-add under [Desktop Entry].
|
||||
if grep -q '^\[Desktop Entry\]' /etc/xdg/konsolerc; then
|
||||
sed -i '/^DefaultProfile=/d' /etc/xdg/konsolerc
|
||||
sed -i '/^\[Desktop Entry\]/a DefaultProfile=Veilor.profile' /etc/xdg/konsolerc
|
||||
else
|
||||
printf '\n[Desktop Entry]\nDefaultProfile=Veilor.profile\n' >> /etc/xdg/konsolerc
|
||||
fi
|
||||
else
|
||||
cat > /etc/xdg/konsolerc << 'EOF'
|
||||
[Desktop Entry]
|
||||
DefaultProfile=Veilor.profile
|
||||
|
||||
[KonsoleWindow]
|
||||
ShowMenuBarByDefault=false
|
||||
ShowWindowTitleOnTitleBar=true
|
||||
|
||||
[TabBar]
|
||||
TabBarVisibility=AlwaysHideTabBar
|
||||
EOF
|
||||
fi
|
||||
ok "konsole default profile set in /etc/xdg/konsolerc"
|
||||
else
|
||||
warn "konsole source dir missing at $KONS_SRC — skipping"
|
||||
fi
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 4. Wallpaper — solid black (matches onyx, no SVG asset)
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "Wallpaper: setting Plasma default to org.kde.color (solid black)"
|
||||
# onyx uses `wallpaperplugin=org.kde.color` + `Color=0,0,0` — pure black
|
||||
# rendered by Plasma's color plugin, no image asset needed.
|
||||
# Apply via system-wide kdedefaults so new users inherit.
|
||||
KDD=/etc/xdg/kdedefaults
|
||||
install -d -m 0755 "$KDD"
|
||||
cat > "$KDD/plasma-org.kde.plasma.desktop-appletsrc" << 'EOF'
|
||||
[Containments][1]
|
||||
plugin=org.kde.desktopcontainment
|
||||
wallpaperplugin=org.kde.color
|
||||
|
||||
[Containments][1][Wallpaper][org.kde.color][General]
|
||||
Color=0,0,0
|
||||
EOF
|
||||
ok "default wallpaper = solid #000000 (Plasma color plugin)"
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 5. Breeze decoration override
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "Breeze: installing veilor decoration override"
|
||||
BRZ_SRC="$ASSETS/kde/breezerc"
|
||||
BRZ_DST="/etc/xdg/breezerc"
|
||||
if [[ -f $BRZ_SRC ]]; then
|
||||
install -d -m 0755 /etc/xdg
|
||||
install -m 0644 "$BRZ_SRC" "$BRZ_DST"
|
||||
ok "breezerc installed at $BRZ_DST"
|
||||
|
||||
# Also reflect title bar / button settings into kdeglobals so KWin
|
||||
# picks up the same values without users running kde-theme-apply.sh.
|
||||
KDG="/etc/xdg/kdedefaults/kdeglobals"
|
||||
if [[ -f $KDG ]]; then
|
||||
if ! grep -q '^\[KDE\]' "$KDG"; then
|
||||
echo -e '\n[KDE]\nSingleClick=false' >> "$KDG"
|
||||
fi
|
||||
ok "kdeglobals already present at $KDG (no overwrite)"
|
||||
else
|
||||
warn "kdeglobals not found at $KDG — kde-theme-apply.sh runs separately"
|
||||
fi
|
||||
else
|
||||
warn "breezerc source missing at $BRZ_SRC — skipping"
|
||||
fi
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
# 6. Sanity: brand leak check (mirrors kickstart %post sanity)
|
||||
# ─────────────────────────────────────────────────────────────────────
|
||||
info "Sanity: scanning installed v0.3 paths for brand leaks"
|
||||
LEAK_PATHS=(
|
||||
"/usr/share/plymouth/themes/veilor"
|
||||
"/usr/share/sddm/themes/veilor-black"
|
||||
"/usr/share/konsole/Veilor.profile"
|
||||
"/usr/share/konsole/Veilor.colorscheme"
|
||||
"/etc/xdg/breezerc"
|
||||
"/etc/sddm.conf.d/veilor-theme.conf"
|
||||
"/etc/xdg/konsolerc"
|
||||
"/etc/xdg/kdedefaults/plasma-org.kde.plasma.desktop-appletsrc"
|
||||
)
|
||||
LEAK=0
|
||||
for p in "${LEAK_PATHS[@]}"; do
|
||||
[[ -e $p ]] || continue
|
||||
if grep -rqi 'onyx\|192\.168\.0\.\|fedora\.local\|admin@gmail' "$p" 2>/dev/null; then
|
||||
err "brand leak detected in $p"
|
||||
LEAK=1
|
||||
fi
|
||||
done
|
||||
if [[ $LEAK -eq 0 ]]; then
|
||||
ok "no brand leaks in v0.3 theme assets"
|
||||
else
|
||||
warn "brand leaks present — review and rebuild"
|
||||
fi
|
||||
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
echo " 30-apply-v03-theme complete"
|
||||
echo "════════════════════════════════════════════════════════"
|
||||
51
upstream/fedora-kde-common.ks
Normal file
51
upstream/fedora-kde-common.ks
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
|
||||
%packages
|
||||
# install env-group to resolve RhBug:1891500
|
||||
@^kde-desktop-environment
|
||||
|
||||
@firefox
|
||||
@kde-apps
|
||||
@kde-media
|
||||
@kde-pim
|
||||
# Ensure we have Anaconda initial setup using kwin
|
||||
@kde-spin-initial-setup
|
||||
@libreoffice
|
||||
# add libreoffice-draw and libreoffice-math (pagureio:fedora-kde/SIG#103)
|
||||
libreoffice-draw
|
||||
libreoffice-math
|
||||
|
||||
fedora-release-kde
|
||||
|
||||
-@admin-tools
|
||||
|
||||
# drop tracker stuff pulled in by gtk3 (pagureio:fedora-kde/SIG#124)
|
||||
-tracker-miners
|
||||
-tracker
|
||||
|
||||
# Not needed on desktops. See: https://pagure.io/fedora-kde/SIG/issue/566
|
||||
-mariadb-server-utils
|
||||
|
||||
### The KDE-Desktop
|
||||
|
||||
# fedora-specific packages
|
||||
plasma-welcome-fedora
|
||||
|
||||
### fixes
|
||||
|
||||
# minimal localization support - allows installing the kde-l10n-* packages
|
||||
kde-l10n
|
||||
|
||||
# Additional packages that are not default in kde-* groups, but useful
|
||||
fuse
|
||||
mediawriter
|
||||
|
||||
### space issues
|
||||
-ktorrent # kget has also basic torrent features (~3 megs)
|
||||
-digikam # digikam has duplicate functionality with gwenview (~28 megs)
|
||||
-kipi-plugins # ~8 megs + drags in Marble
|
||||
-krusader # ~4 megs
|
||||
-k3b # ~15 megs
|
||||
|
||||
## avoid serious bugs by omitting broken stuff
|
||||
|
||||
%end
|
||||
106
upstream/fedora-live-base.ks
Normal file
106
upstream/fedora-live-base.ks
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
# fedora-live-base.ks
|
||||
#
|
||||
# Defines the basics for all kickstarts in the fedora-live branch
|
||||
# Does not include package selection (other then mandatory)
|
||||
# Does not include localization packages or configuration
|
||||
#
|
||||
# Does includes "default" language configuration (kickstarts including
|
||||
# this template can override these settings)
|
||||
|
||||
lang en_US.UTF-8
|
||||
keyboard us
|
||||
timezone US/Eastern
|
||||
selinux --enforcing
|
||||
firewall --enabled --service=mdns
|
||||
xconfig --startxonboot
|
||||
zerombr
|
||||
clearpart --all
|
||||
part / --size 5120 --fstype ext4
|
||||
services --enabled=NetworkManager,ModemManager --disabled=sshd
|
||||
network --bootproto=dhcp --device=link --activate
|
||||
rootpw --lock --iscrypted locked
|
||||
shutdown
|
||||
|
||||
%include fedora-repo.ks
|
||||
|
||||
%packages
|
||||
# Explicitly specified here:
|
||||
# <notting> walters: because otherwise dependency loops cause yum issues.
|
||||
kernel
|
||||
kernel-modules
|
||||
kernel-modules-extra
|
||||
|
||||
# The point of a live image is to install
|
||||
anaconda-install-env-deps
|
||||
anaconda-live
|
||||
@anaconda-tools
|
||||
# Anaconda has a weak dep on this and we don't want it on livecds, see
|
||||
# https://fedoraproject.org/wiki/Changes/RemoveDeviceMapperMultipathFromWorkstationLiveCD
|
||||
-fcoe-utils
|
||||
-device-mapper-multipath
|
||||
-sdubby
|
||||
|
||||
# Need aajohan-comfortaa-fonts for the SVG rnotes images
|
||||
aajohan-comfortaa-fonts
|
||||
|
||||
# Without this, initramfs generation during live image creation fails: #1242586
|
||||
dracut-live
|
||||
|
||||
# anaconda needs the locales available to run for different locales
|
||||
glibc-all-langpacks
|
||||
|
||||
# provide the livesys scripts
|
||||
livesys-scripts
|
||||
%end
|
||||
|
||||
%post
|
||||
# Enable livesys services
|
||||
systemctl enable livesys.service
|
||||
systemctl enable livesys-late.service
|
||||
|
||||
# enable tmpfs for /tmp
|
||||
systemctl enable tmp.mount
|
||||
|
||||
# make it so that we don't do writing to the overlay for things which
|
||||
# are just tmpdirs/caches
|
||||
# note https://bugzilla.redhat.com/show_bug.cgi?id=1135475
|
||||
cat >> /etc/fstab << EOF
|
||||
vartmp /var/tmp tmpfs defaults 0 0
|
||||
EOF
|
||||
|
||||
# work around for poor key import UI in PackageKit
|
||||
rm -f /var/lib/rpm/__db*
|
||||
echo "Packages within this LiveCD"
|
||||
rpm -qa --qf '%{size}\t%{name}-%{version}-%{release}.%{arch}\n' |sort -rn
|
||||
# Note that running rpm recreates the rpm db files which aren't needed or wanted
|
||||
rm -f /var/lib/rpm/__db*
|
||||
|
||||
# go ahead and pre-make the man -k cache (#455968)
|
||||
/usr/bin/mandb
|
||||
|
||||
# make sure there aren't core files lying around
|
||||
rm -f /core*
|
||||
|
||||
# remove random seed, the newly installed instance should make it's own
|
||||
rm -f /var/lib/systemd/random-seed
|
||||
|
||||
# convince readahead not to collect
|
||||
# FIXME: for systemd
|
||||
|
||||
echo 'File created by kickstart. See systemd-update-done.service(8).' \
|
||||
| tee /etc/.updated >/var/.updated
|
||||
|
||||
# Drop the rescue kernel and initramfs, we don't need them on the live media itself.
|
||||
# See bug 1317709
|
||||
rm -f /boot/*-rescue*
|
||||
|
||||
# Disable network service here, as doing it in the services line
|
||||
# fails due to RHBZ #1369794
|
||||
systemctl disable network
|
||||
|
||||
# Remove machine-id on pre generated images
|
||||
rm -f /etc/machine-id
|
||||
touch /etc/machine-id
|
||||
|
||||
%end
|
||||
|
||||
25
upstream/fedora-live-kde-base.ks
Normal file
25
upstream/fedora-live-kde-base.ks
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# Maintained by the Fedora KDE SIG:
|
||||
# http://fedoraproject.org/wiki/SIGs/KDE
|
||||
# mailto:kde@lists.fedoraproject.org
|
||||
|
||||
%include fedora-live-base.ks
|
||||
%include fedora-kde-common.ks
|
||||
|
||||
%post
|
||||
|
||||
# set default GTK+ theme for root (see #683855, #689070, #808062)
|
||||
cat > /root/.gtkrc-2.0 << EOF
|
||||
include "/usr/share/themes/Adwaita/gtk-2.0/gtkrc"
|
||||
include "/etc/gtk-2.0/gtkrc"
|
||||
gtk-theme-name="Adwaita"
|
||||
EOF
|
||||
mkdir -p /root/.config/gtk-3.0
|
||||
cat > /root/.config/gtk-3.0/settings.ini << EOF
|
||||
[Settings]
|
||||
gtk-theme-name = Adwaita
|
||||
EOF
|
||||
|
||||
# set livesys session type
|
||||
sed -i 's/^livesys_session=.*/livesys_session="kde"/' /etc/sysconfig/livesys
|
||||
|
||||
%end
|
||||
17
upstream/fedora-live-kde.ks
Normal file
17
upstream/fedora-live-kde.ks
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# fedora-livecd-kde.ks
|
||||
#
|
||||
# Description:
|
||||
# - Fedora Live Spin with the K Desktop Environment (KDE), default 1.4 GB version
|
||||
#
|
||||
# Maintainer(s):
|
||||
# - Sebastian Vahl <fedora@deadbabylon.de>
|
||||
# - Fedora KDE SIG, http://fedoraproject.org/wiki/SIGs/KDE, kde@lists.fedoraproject.org
|
||||
|
||||
%include fedora-live-kde-base.ks
|
||||
%include fedora-live-minimization.ks
|
||||
|
||||
# DVD payload
|
||||
part / --size=9000
|
||||
|
||||
%post
|
||||
%end
|
||||
9
upstream/fedora-live-minimization.ks
Normal file
9
upstream/fedora-live-minimization.ks
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Common packages removed from comps
|
||||
# For F14, these removals should be moved to comps itself
|
||||
|
||||
%packages
|
||||
|
||||
# save some space
|
||||
-hplip
|
||||
|
||||
%end
|
||||
4
upstream/fedora-repo-not-rawhide.ks
Normal file
4
upstream/fedora-repo-not-rawhide.ks
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
repo --name=fedora --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
|
||||
repo --name=updates --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f$releasever&arch=$basearch
|
||||
#repo --name=updates-testing --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=updates-testing-f$releasever&arch=$basearch
|
||||
url --mirrorlist=https://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
|
||||
9
upstream/fedora-repo.ks
Normal file
9
upstream/fedora-repo.ks
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Include the appropriate repo definitions
|
||||
|
||||
# Exactly one of the following should be uncommented
|
||||
|
||||
# For the master branch the following should be uncommented
|
||||
# %include fedora-repo-rawhide.ks
|
||||
|
||||
# For non-master branches the following should be uncommented
|
||||
%include fedora-repo-not-rawhide.ks
|
||||
Loading…
Reference in a new issue