Merge pull request #74 from ryanrhughes/add-boot-screen
Add graphical boot screen
210
bin/omarchy-generate-plymouth-theme
Executable file
@ -0,0 +1,210 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Omarchy Plymouth Theme Generator
|
||||||
|
# This script uses ImageMagick to recolor PNG assets from tokyo-night plymouth theme
|
||||||
|
# Usage: omarchy-generate-plymouth-theme --background=#24273a --foreground=#cad3f5 --progress-background=#343849 --progress-foreground=#cad3f5 --logo=#a6da95 --destination=catppuccin
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Check if ImageMagick is installed
|
||||||
|
if ! command -v magick &>/dev/null; then
|
||||||
|
echo "ImageMagick 7+ is required but not installed. Please install it first:"
|
||||||
|
echo "yay -S imagemagick"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Base directory
|
||||||
|
THEMES_DIR="$HOME/.local/share/omarchy/themes"
|
||||||
|
|
||||||
|
# Default values (tokyo-night colors)
|
||||||
|
BACKGROUND="#1a1b26"
|
||||||
|
FOREGROUND="#c0caf5"
|
||||||
|
PROGRESS_BACKGROUND="#343849"
|
||||||
|
PROGRESS_FOREGROUND="#7aa2f7"
|
||||||
|
LOGO="#7aa2f7"
|
||||||
|
DESTINATION=""
|
||||||
|
|
||||||
|
# Function to show usage
|
||||||
|
show_usage() {
|
||||||
|
echo "Usage: $0 --background=<hex> --foreground=<hex> --progress-background=<hex> --progress-foreground=<hex> --logo=<hex> --destination=<name>"
|
||||||
|
echo
|
||||||
|
echo "Parameters:"
|
||||||
|
echo " --background Background color (hex format, e.g., #24273a)"
|
||||||
|
echo " --foreground Foreground color (hex format, e.g., #cad3f5)"
|
||||||
|
echo " --progress-background Progress bar background color (hex format, e.g., #343849)"
|
||||||
|
echo " --progress-foreground Progress bar foreground color (hex format, e.g., #cad3f5)"
|
||||||
|
echo " --logo Logo color (hex format, e.g., #a6da95)"
|
||||||
|
echo " --destination Destination theme name (e.g., catppuccin)"
|
||||||
|
echo
|
||||||
|
echo "Example:"
|
||||||
|
echo " $0 --background=#24273a --foreground=#cad3f5 --progress-background=#343849 --progress-foreground=#cad3f5 --logo=#a6da95 --destination=catppuccin"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
for arg in "$@"; do
|
||||||
|
case $arg in
|
||||||
|
--background=*)
|
||||||
|
BACKGROUND="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--foreground=*)
|
||||||
|
FOREGROUND="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--progress-background=*)
|
||||||
|
PROGRESS_BACKGROUND="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--progress-foreground=*)
|
||||||
|
PROGRESS_FOREGROUND="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--logo=*)
|
||||||
|
LOGO="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--destination=*)
|
||||||
|
DESTINATION="${arg#*=}"
|
||||||
|
;;
|
||||||
|
--help | -h)
|
||||||
|
show_usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown parameter: $arg"
|
||||||
|
show_usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check if destination is provided
|
||||||
|
if [[ -z "$DESTINATION" ]]; then
|
||||||
|
echo "Error: --destination parameter is required"
|
||||||
|
show_usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Convert hex to RGB values for Plymouth script
|
||||||
|
hex_to_rgb() {
|
||||||
|
local hex="$1"
|
||||||
|
# Remove # if present
|
||||||
|
hex="${hex#\#}"
|
||||||
|
|
||||||
|
# Convert to decimal
|
||||||
|
local r=$((16#${hex:0:2}))
|
||||||
|
local g=$((16#${hex:2:2}))
|
||||||
|
local b=$((16#${hex:4:2}))
|
||||||
|
|
||||||
|
# Convert to 0-1 range with 3 decimal places
|
||||||
|
printf "%.3f\n" $(awk "BEGIN {print $r/255}")
|
||||||
|
printf "%.3f\n" $(awk "BEGIN {print $g/255}")
|
||||||
|
printf "%.3f\n" $(awk "BEGIN {print $b/255}")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert hex to Plymouth hex format (0xRRGGBB)
|
||||||
|
hex_to_plymouth() {
|
||||||
|
local hex="$1"
|
||||||
|
# Remove # if present and prepend 0x
|
||||||
|
hex="${hex#\#}"
|
||||||
|
echo "0x${hex}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to recolor an image
|
||||||
|
recolor_image() {
|
||||||
|
local input="$1"
|
||||||
|
local output="$2"
|
||||||
|
local color="$3"
|
||||||
|
local operation="$4"
|
||||||
|
|
||||||
|
case "$operation" in
|
||||||
|
"fill")
|
||||||
|
# Simple fill with color (for lock, bullet, progress_bar, progress_box, logo, throbber)
|
||||||
|
# Use -strip to remove EXIF data and avoid warnings
|
||||||
|
magick "$input" -strip -fill "$color" -colorize 100% "$output" 2>/dev/null
|
||||||
|
;;
|
||||||
|
"entry")
|
||||||
|
# Create semi-transparent black with colored border
|
||||||
|
# First get dimensions
|
||||||
|
dims=$(magick identify -format "%wx%h" "$input")
|
||||||
|
width=$(echo $dims | cut -d'x' -f1)
|
||||||
|
height=$(echo $dims | cut -d'x' -f2)
|
||||||
|
|
||||||
|
# Create new image with transparent background, semi-transparent black fill, and colored border
|
||||||
|
magick -size ${width}x${height} xc:transparent \
|
||||||
|
-fill "rgba(0,0,0,0.05)" -draw "rectangle 0,0 $((width - 1)),$((height - 1))" \
|
||||||
|
-fill none -stroke "$color" -strokewidth 2 -draw "rectangle 1,1 $((width - 2)),$((height - 2))" \
|
||||||
|
"$output"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Source and destination directories
|
||||||
|
SOURCE_DIR="${THEMES_DIR}/tokyo-night/plymouth"
|
||||||
|
DEST_DIR="${THEMES_DIR}/${DESTINATION}/plymouth"
|
||||||
|
|
||||||
|
# Check if source exists
|
||||||
|
if [[ ! -d "$SOURCE_DIR" ]]; then
|
||||||
|
echo "Error: Tokyo Night theme not found at $SOURCE_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Plymouth Asset Recoloring Script"
|
||||||
|
echo "================================"
|
||||||
|
echo
|
||||||
|
echo "Configuration:"
|
||||||
|
echo " Background: $BACKGROUND"
|
||||||
|
echo " Foreground: $FOREGROUND"
|
||||||
|
echo " Progress Background: $PROGRESS_BACKGROUND"
|
||||||
|
echo " Progress Foreground: $PROGRESS_FOREGROUND"
|
||||||
|
echo " Logo: $LOGO"
|
||||||
|
echo " Destination: $DESTINATION"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Create destination directory
|
||||||
|
echo "Creating destination directory: $DEST_DIR"
|
||||||
|
mkdir -p "$DEST_DIR"
|
||||||
|
|
||||||
|
# Copy all files from tokyo-night
|
||||||
|
echo "Copying files from tokyo-night theme..."
|
||||||
|
cp -r "$SOURCE_DIR"/* "$DEST_DIR/"
|
||||||
|
|
||||||
|
# Update omarchy.plymouth with background color
|
||||||
|
echo "Updating omarchy.plymouth..."
|
||||||
|
PLYMOUTH_BG=$(hex_to_plymouth "$BACKGROUND")
|
||||||
|
sed -i "s/ConsoleLogBackgroundColor=.*/ConsoleLogBackgroundColor=${PLYMOUTH_BG}/" "$DEST_DIR/omarchy.plymouth"
|
||||||
|
|
||||||
|
# Update omarchy.script with background color
|
||||||
|
echo "Updating omarchy.script..."
|
||||||
|
RGB=($(hex_to_rgb "$BACKGROUND"))
|
||||||
|
sed -i "s/Window.SetBackgroundTopColor(.*);/Window.SetBackgroundTopColor(${RGB[0]}, ${RGB[1]}, ${RGB[2]});/" "$DEST_DIR/omarchy.script"
|
||||||
|
sed -i "s/Window.SetBackgroundBottomColor(.*);/Window.SetBackgroundBottomColor(${RGB[0]}, ${RGB[1]}, ${RGB[2]});/" "$DEST_DIR/omarchy.script"
|
||||||
|
|
||||||
|
# Recolor assets
|
||||||
|
echo "Recoloring assets..."
|
||||||
|
|
||||||
|
# Recolor lock.png
|
||||||
|
echo " - Recoloring lock.png with $FOREGROUND"
|
||||||
|
recolor_image "$DEST_DIR/lock.png" "$DEST_DIR/lock.png" "$FOREGROUND" "fill"
|
||||||
|
|
||||||
|
# Recolor bullet.png
|
||||||
|
echo " - Recoloring bullet.png with $FOREGROUND"
|
||||||
|
recolor_image "$DEST_DIR/bullet.png" "$DEST_DIR/bullet.png" "$FOREGROUND" "fill"
|
||||||
|
|
||||||
|
# Recolor progress_bar.png
|
||||||
|
echo " - Recoloring progress_bar.png with $PROGRESS_FOREGROUND"
|
||||||
|
recolor_image "$DEST_DIR/progress_bar.png" "$DEST_DIR/progress_bar.png" "$PROGRESS_FOREGROUND" "fill"
|
||||||
|
|
||||||
|
# Recolor progress_box.png
|
||||||
|
echo " - Recoloring progress_box.png with $PROGRESS_BACKGROUND"
|
||||||
|
recolor_image "$DEST_DIR/progress_box.png" "$DEST_DIR/progress_box.png" "$PROGRESS_BACKGROUND" "fill"
|
||||||
|
|
||||||
|
# Recolor entry.png
|
||||||
|
echo " - Creating entry.png with 5% black and $FOREGROUND border"
|
||||||
|
recolor_image "$DEST_DIR/entry.png" "$DEST_DIR/entry.png" "$FOREGROUND" "entry"
|
||||||
|
|
||||||
|
# Recolor logo.png (using fill instead of tint)
|
||||||
|
echo " - Recoloring logo.png with $LOGO"
|
||||||
|
recolor_image "$DEST_DIR/logo.png" "$DEST_DIR/logo.png" "$LOGO" "fill"
|
||||||
|
|
||||||
|
# Recolor throbber frames
|
||||||
|
echo " - Recoloring throbber frames (1-30) with $FOREGROUND"
|
||||||
|
for i in {1..30}; do
|
||||||
|
frame_file=$(printf "throbber-%02d.png" $i)
|
||||||
|
recolor_image "$DEST_DIR/$frame_file" "$DEST_DIR/$frame_file" "$FOREGROUND" "fill" 2>/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "✓ Plymouth theme for $DESTINATION has been created successfully!"
|
28
bin/omarchy-plymouth-shutdown-sync
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
USER_HOME=$(find /home/* -maxdepth 0 | head -n1 | head -n1)
|
||||||
|
|
||||||
|
echo "Running plymouth sync check for user dir: $USER_HOME"
|
||||||
|
|
||||||
|
SYNC_FLAG="$USER_HOME/.config/omarchy/.plymouth-sync-needed"
|
||||||
|
CURRENT_THEME_LINK="$USER_HOME/.config/omarchy/current/theme"
|
||||||
|
|
||||||
|
if [[ -f "$SYNC_FLAG" && -L "$CURRENT_THEME_LINK" ]]; then
|
||||||
|
CURRENT_THEME=$(readlink "$CURRENT_THEME_LINK")
|
||||||
|
THEME_NAME=$(basename "$CURRENT_THEME")
|
||||||
|
PLYMOUTH_DIR="$CURRENT_THEME/plymouth"
|
||||||
|
|
||||||
|
if [[ -d "$PLYMOUTH_DIR" ]]; then
|
||||||
|
# Copy theme files to Plymouth
|
||||||
|
sudo cp -r "$CURRENT_THEME/plymouth/"* /usr/share/plymouth/themes/omarchy/
|
||||||
|
|
||||||
|
# Update Plymouth theme and rebuild
|
||||||
|
sudo plymouth-set-default-theme -R omarchy
|
||||||
|
|
||||||
|
echo "Plymouth theme was found in $PLYMOUTH_DIR. Theme synced to $THEME_NAME."
|
||||||
|
else
|
||||||
|
echo "No plymouth directory found in $CURRENT_THEME. Skipping copy and rebuild."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove sync flag
|
||||||
|
rm "$SYNC_FLAG"
|
||||||
|
fi
|
@ -35,6 +35,9 @@ ln -nsf "$NEW_THEME" "$HOME/.config/omarchy/current/theme"
|
|||||||
# Touch alacritty config to pickup the changed theme
|
# Touch alacritty config to pickup the changed theme
|
||||||
touch "$HOME/.config/alacritty/alacritty.toml"
|
touch "$HOME/.config/alacritty/alacritty.toml"
|
||||||
|
|
||||||
|
# Touch .plymouth-sync-needed to signal rebuild on shutdown / reboot
|
||||||
|
touch "$HOME/.config/omarchy/.plymouth-sync-needed"
|
||||||
|
|
||||||
# Restart for new theme
|
# Restart for new theme
|
||||||
pkill -SIGUSR2 waybar
|
pkill -SIGUSR2 waybar
|
||||||
makoctl reload
|
makoctl reload
|
||||||
|
84
install/plymouth.sh
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Install Plymouth package
|
||||||
|
echo "Installing Plymouth..."
|
||||||
|
yay -S --noconfirm --needed plymouth
|
||||||
|
|
||||||
|
# Skip if plymouth already exists for some reason
|
||||||
|
if ! grep -q "plymouth" /etc/mkinitcpio.conf; then
|
||||||
|
# Backup original mkinitcpio.conf just in case
|
||||||
|
backup_timestamp=$(date +"%Y%m%d%H%M%S")
|
||||||
|
sudo cp /etc/mkinitcpio.conf "/etc/mkinitcpio.conf.bak.${backup_timestamp}"
|
||||||
|
|
||||||
|
# Add plymouth to HOOKS array. Should be added:
|
||||||
|
# - After 'base' and 'udev' (or 'systemd' if using systemd hook)
|
||||||
|
# - Before 'encrypt' or 'sd-encrypt' if present
|
||||||
|
|
||||||
|
# Use sed to add plymouth in-place
|
||||||
|
if grep -q "systemd" /etc/mkinitcpio.conf; then
|
||||||
|
# Add after systemd
|
||||||
|
sudo sed -i '/^HOOKS=/s/systemd/systemd plymouth/' /etc/mkinitcpio.conf
|
||||||
|
elif grep -q "udev" /etc/mkinitcpio.conf; then
|
||||||
|
# Add after udev
|
||||||
|
sudo sed -i '/^HOOKS=/s/udev/udev plymouth/' /etc/mkinitcpio.conf
|
||||||
|
else
|
||||||
|
# Fallback: add after base
|
||||||
|
sudo sed -i '/^HOOKS=/s/base/base plymouth/' /etc/mkinitcpio.conf
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Regenerate initramfs
|
||||||
|
sudo mkinitcpio -P
|
||||||
|
|
||||||
|
# Add kernel parameters for Plymouth (systemd-boot only)
|
||||||
|
if [ -d "/boot/loader/entries" ]; then
|
||||||
|
echo "Detected systemd-boot"
|
||||||
|
|
||||||
|
for entry in /boot/loader/entries/*.conf; do
|
||||||
|
if [ -f "$entry" ]; then
|
||||||
|
# Skip fallback entries
|
||||||
|
if [[ "$(basename "$entry")" == *"fallback"* ]]; then
|
||||||
|
echo "Skipped: $(basename "$entry") (fallback entry)"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Skip if splash it already present for some reason
|
||||||
|
if ! grep -q "splash" "$entry"; then
|
||||||
|
sudo sed -i '/^options/ s/$/ splash quiet/' "$entry"
|
||||||
|
else
|
||||||
|
echo "Skipped: $(basename "$entry") (splash already present)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo "systemd-boot not detected. Please manually add these kernel parameters:"
|
||||||
|
echo " - splash (to see the graphical splash screen)"
|
||||||
|
echo " - quiet (for silent boot)"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Touch .plymouth-sync-needed to signal rebuild on shutdown / reboot
|
||||||
|
touch "$HOME/.config/omarchy/.plymouth-sync-needed"
|
||||||
|
|
||||||
|
# Create the systemd service
|
||||||
|
sudo tee /etc/systemd/system/omarchy-plymouth-shutdown.service >/dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Sync Plymouth Theme on Shutdown
|
||||||
|
DefaultDependencies=yes
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/bin/true
|
||||||
|
ExecStop=$HOME/.local/share/omarchy/bin/omarchy-plymouth-shutdown-sync
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Reload systemd and enable the service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable omarchy-plymouth-shutdown.service
|
||||||
|
sudo systemctl start omarchy-plymouth-shutdown.service
|
6
migrations/1751743990.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Run Plymouth installation script
|
||||||
|
echo "Install Plymouth splash screen"
|
||||||
|
bash "$HOME/.local/share/omarchy/install/plymouth.sh"
|
||||||
|
|
BIN
themes/catppuccin/plymouth/bullet.png
Normal file
After Width: | Height: | Size: 358 B |
BIN
themes/catppuccin/plymouth/entry.png
Normal file
After Width: | Height: | Size: 694 B |
BIN
themes/catppuccin/plymouth/lock.png
Normal file
After Width: | Height: | Size: 531 B |
BIN
themes/catppuccin/plymouth/logo.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
11
themes/catppuccin/plymouth/omarchy.plymouth
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Plymouth Theme]
|
||||||
|
Name=Omarchy
|
||||||
|
Description=Script example plugin.
|
||||||
|
ModuleName=script
|
||||||
|
|
||||||
|
[script]
|
||||||
|
ImageDir=/usr/share/plymouth/themes/omarchy
|
||||||
|
ScriptFile=/usr/share/plymouth/themes/omarchy/omarchy.script
|
||||||
|
ConsoleLogBackgroundColor=0x24273a
|
||||||
|
|
||||||
|
|
236
themes/catppuccin/plymouth/omarchy.script
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
# Omarchy Plymouth Theme Script
|
||||||
|
Window.SetBackgroundTopColor(0.141, 0.153, 0.227);
|
||||||
|
Window.SetBackgroundBottomColor(0.141, 0.153, 0.227);
|
||||||
|
|
||||||
|
logo.image = Image("logo.png");
|
||||||
|
logo.sprite = Sprite(logo.image);
|
||||||
|
logo.sprite.SetX (Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
|
||||||
|
logo.sprite.SetY (Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
|
||||||
|
fun refresh_callback ()
|
||||||
|
{
|
||||||
|
# Always animate spinner - it will be invisible when not needed
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_frame++;
|
||||||
|
frame_index = Math.Int(global.spinner_frame / 3) % global.spinner_frame_count;
|
||||||
|
global.spinner_sprite.SetImage(global.spinner_images[frame_index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetRefreshFunction (refresh_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Dialogue --------------------------------
|
||||||
|
|
||||||
|
status = "normal";
|
||||||
|
|
||||||
|
fun dialog_setup()
|
||||||
|
{
|
||||||
|
local.lock;
|
||||||
|
local.entry;
|
||||||
|
|
||||||
|
lock.image = Image("lock.png");
|
||||||
|
entry.image = Image("entry.png");
|
||||||
|
|
||||||
|
entry.sprite = Sprite(entry.image);
|
||||||
|
entry.x = Window.GetX() + Window.GetWidth()/2 - entry.image.GetWidth() / 2;
|
||||||
|
entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
|
||||||
|
entry.z = 10001;
|
||||||
|
entry.sprite.SetPosition(entry.x, entry.y, entry.z);
|
||||||
|
|
||||||
|
lock.sprite = Sprite(lock.image);
|
||||||
|
lock.x = entry.x - lock.image.GetWidth() - 10;
|
||||||
|
lock.y = logo.sprite.GetY() + logo.image.GetHeight() + 40 + entry.image.GetHeight()/2 - lock.image.GetHeight()/2;
|
||||||
|
lock.z = 10001;
|
||||||
|
lock.sprite.SetPosition(lock.x, lock.y, lock.z);
|
||||||
|
|
||||||
|
global.dialog.lock = lock;
|
||||||
|
global.dialog.entry = entry;
|
||||||
|
global.dialog.bullet_image = Image("bullet.png");
|
||||||
|
dialog_opacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dialog_opacity(opacity)
|
||||||
|
{
|
||||||
|
global.dialog.lock.sprite.SetOpacity (opacity);
|
||||||
|
global.dialog.entry.sprite.SetOpacity (opacity);
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(opacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_normal_callback ()
|
||||||
|
{
|
||||||
|
global.status = "normal";
|
||||||
|
if (global.dialog)
|
||||||
|
dialog_opacity (0);
|
||||||
|
spinner_show(); # Show spinner when no password dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_password_callback (prompt, bullets)
|
||||||
|
{
|
||||||
|
global.status = "password";
|
||||||
|
|
||||||
|
# Always hide spinner when showing password dialog
|
||||||
|
spinner_hide();
|
||||||
|
|
||||||
|
# Setup dialog if it doesn't exist
|
||||||
|
if (!global.dialog)
|
||||||
|
dialog_setup();
|
||||||
|
else
|
||||||
|
dialog_opacity(1);
|
||||||
|
|
||||||
|
# Clear all bullets first (user might hit backspace)
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create and show bullets for current password
|
||||||
|
for (index = 0; index < bullets; index++)
|
||||||
|
{
|
||||||
|
if (!global.dialog.bullet[index])
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite = Sprite(global.dialog.bullet_image);
|
||||||
|
global.dialog.bullet[index].x = global.dialog.entry.x + 10 + index * (global.dialog.bullet_image.GetWidth() + 5);
|
||||||
|
global.dialog.bullet[index].y = global.dialog.entry.y + global.dialog.entry.image.GetHeight() / 2 - global.dialog.bullet_image.GetHeight() / 2;
|
||||||
|
global.dialog.bullet[index].z = global.dialog.entry.z + 1;
|
||||||
|
global.dialog.bullet[index].sprite.SetPosition(global.dialog.bullet[index].x, global.dialog.bullet[index].y, global.dialog.bullet[index].z);
|
||||||
|
}
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayNormalFunction(display_normal_callback);
|
||||||
|
Plymouth.SetDisplayPasswordFunction(display_password_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Spinner --------------------------------
|
||||||
|
|
||||||
|
global.spinner_sprite = NULL;
|
||||||
|
global.spinner_frame = 0;
|
||||||
|
global.spinner_frame_count = 30;
|
||||||
|
global.spinner_visible = false;
|
||||||
|
global.spinner_images = [];
|
||||||
|
|
||||||
|
fun spinner_setup()
|
||||||
|
{
|
||||||
|
if (!global.spinner_sprite)
|
||||||
|
{
|
||||||
|
# Load all throbber frames
|
||||||
|
for (i = 1; i <= global.spinner_frame_count; i++)
|
||||||
|
{
|
||||||
|
if (i < 10)
|
||||||
|
filename = "throbber-000" + i + ".png";
|
||||||
|
else
|
||||||
|
filename = "throbber-00" + i + ".png";
|
||||||
|
global.spinner_images[i-1] = Image(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create spinner sprite
|
||||||
|
global.spinner_sprite = Sprite(global.spinner_images[0]);
|
||||||
|
global.spinner_x = Window.GetX() + Window.GetWidth() / 2 - global.spinner_images[0].GetWidth() / 2;
|
||||||
|
global.spinner_y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2 + logo.image.GetHeight() + 40;
|
||||||
|
global.spinner_sprite.SetPosition(global.spinner_x, global.spinner_y, 10002);
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_show()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(1);
|
||||||
|
global.spinner_visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_hide()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
global.spinner_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize spinner
|
||||||
|
spinner_setup();
|
||||||
|
#----------------------------------------- Progress Bar --------------------------------
|
||||||
|
|
||||||
|
progress_box.image = Image("progress_box.png");
|
||||||
|
progress_box.sprite = Sprite(progress_box.image);
|
||||||
|
|
||||||
|
progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
|
||||||
|
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
|
||||||
|
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
progress_bar.original_image = Image("progress_bar.png");
|
||||||
|
progress_bar.sprite = Sprite();
|
||||||
|
|
||||||
|
progress_bar.x = Window.GetX() + Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;
|
||||||
|
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5 - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
|
||||||
|
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
global.progress_visible = false;
|
||||||
|
fun progress_callback (duration, progress)
|
||||||
|
{
|
||||||
|
if (progress > 0.01 && Plymouth.GetMode() != "shutdown" && Plymouth.GetMode() != "reboot" && Plymouth.GetMode() != "suspend")
|
||||||
|
{
|
||||||
|
if (!global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(1);
|
||||||
|
progress_bar.sprite.SetOpacity(1);
|
||||||
|
global.progress_visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
|
||||||
|
{
|
||||||
|
progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth() * progress, progress_bar.original_image.GetHeight());
|
||||||
|
progress_bar.sprite.SetImage (progress_bar.image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Hide progress bar when progress is 0
|
||||||
|
if (global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
global.progress_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetBootProgressFunction(progress_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Quit --------------------------------
|
||||||
|
|
||||||
|
fun quit_callback ()
|
||||||
|
{
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetQuitFunction(quit_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Message --------------------------------
|
||||||
|
|
||||||
|
message_sprite = Sprite();
|
||||||
|
message_sprite.SetPosition(10, 10, 10000);
|
||||||
|
|
||||||
|
fun display_message_callback (text)
|
||||||
|
{
|
||||||
|
my_image = Image.Text(text, 1, 1, 1);
|
||||||
|
message_sprite.SetImage(my_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_message_callback (text)
|
||||||
|
{
|
||||||
|
message_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayMessageFunction (display_message_callback);
|
||||||
|
Plymouth.SetHideMessageFunction (hide_message_callback);
|
BIN
themes/catppuccin/plymouth/progress_bar.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
themes/catppuccin/plymouth/progress_box.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
themes/catppuccin/plymouth/throbber-01.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-02.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-03.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-04.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-05.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-06.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-07.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-08.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-09.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-10.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-11.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-12.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-13.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-14.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-15.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-16.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-17.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-18.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-19.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-20.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-21.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-22.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-23.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-24.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-25.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-26.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-27.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-28.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-29.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/catppuccin/plymouth/throbber-30.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/bullet.png
Normal file
After Width: | Height: | Size: 358 B |
BIN
themes/everforest/plymouth/entry.png
Normal file
After Width: | Height: | Size: 700 B |
BIN
themes/everforest/plymouth/lock.png
Normal file
After Width: | Height: | Size: 531 B |
BIN
themes/everforest/plymouth/logo.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
11
themes/everforest/plymouth/omarchy.plymouth
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Plymouth Theme]
|
||||||
|
Name=Omarchy
|
||||||
|
Description=Script example plugin.
|
||||||
|
ModuleName=script
|
||||||
|
|
||||||
|
[script]
|
||||||
|
ImageDir=/usr/share/plymouth/themes/omarchy
|
||||||
|
ScriptFile=/usr/share/plymouth/themes/omarchy/omarchy.script
|
||||||
|
ConsoleLogBackgroundColor=0x2d353b
|
||||||
|
|
||||||
|
|
237
themes/everforest/plymouth/omarchy.script
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
# Omarchy Plymouth Theme Script
|
||||||
|
|
||||||
|
Window.SetBackgroundTopColor(0.176, 0.208, 0.231);
|
||||||
|
Window.SetBackgroundBottomColor(0.176, 0.208, 0.231);
|
||||||
|
|
||||||
|
logo.image = Image("logo.png");
|
||||||
|
logo.sprite = Sprite(logo.image);
|
||||||
|
logo.sprite.SetX (Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
|
||||||
|
logo.sprite.SetY (Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
|
||||||
|
fun refresh_callback ()
|
||||||
|
{
|
||||||
|
# Always animate spinner - it will be invisible when not needed
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_frame++;
|
||||||
|
frame_index = Math.Int(global.spinner_frame / 3) % global.spinner_frame_count;
|
||||||
|
global.spinner_sprite.SetImage(global.spinner_images[frame_index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetRefreshFunction (refresh_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Dialogue --------------------------------
|
||||||
|
|
||||||
|
status = "normal";
|
||||||
|
|
||||||
|
fun dialog_setup()
|
||||||
|
{
|
||||||
|
local.lock;
|
||||||
|
local.entry;
|
||||||
|
|
||||||
|
lock.image = Image("lock.png");
|
||||||
|
entry.image = Image("entry.png");
|
||||||
|
|
||||||
|
entry.sprite = Sprite(entry.image);
|
||||||
|
entry.x = Window.GetX() + Window.GetWidth()/2 - entry.image.GetWidth() / 2;
|
||||||
|
entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
|
||||||
|
entry.z = 10001;
|
||||||
|
entry.sprite.SetPosition(entry.x, entry.y, entry.z);
|
||||||
|
|
||||||
|
lock.sprite = Sprite(lock.image);
|
||||||
|
lock.x = entry.x - lock.image.GetWidth() - 10;
|
||||||
|
lock.y = logo.sprite.GetY() + logo.image.GetHeight() + 40 + entry.image.GetHeight()/2 - lock.image.GetHeight()/2;
|
||||||
|
lock.z = 10001;
|
||||||
|
lock.sprite.SetPosition(lock.x, lock.y, lock.z);
|
||||||
|
|
||||||
|
global.dialog.lock = lock;
|
||||||
|
global.dialog.entry = entry;
|
||||||
|
global.dialog.bullet_image = Image("bullet.png");
|
||||||
|
dialog_opacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dialog_opacity(opacity)
|
||||||
|
{
|
||||||
|
global.dialog.lock.sprite.SetOpacity (opacity);
|
||||||
|
global.dialog.entry.sprite.SetOpacity (opacity);
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(opacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_normal_callback ()
|
||||||
|
{
|
||||||
|
global.status = "normal";
|
||||||
|
if (global.dialog)
|
||||||
|
dialog_opacity (0);
|
||||||
|
spinner_show(); # Show spinner when no password dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_password_callback (prompt, bullets)
|
||||||
|
{
|
||||||
|
global.status = "password";
|
||||||
|
|
||||||
|
# Always hide spinner when showing password dialog
|
||||||
|
spinner_hide();
|
||||||
|
|
||||||
|
# Setup dialog if it doesn't exist
|
||||||
|
if (!global.dialog)
|
||||||
|
dialog_setup();
|
||||||
|
else
|
||||||
|
dialog_opacity(1);
|
||||||
|
|
||||||
|
# Clear all bullets first (user might hit backspace)
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create and show bullets for current password
|
||||||
|
for (index = 0; index < bullets; index++)
|
||||||
|
{
|
||||||
|
if (!global.dialog.bullet[index])
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite = Sprite(global.dialog.bullet_image);
|
||||||
|
global.dialog.bullet[index].x = global.dialog.entry.x + 10 + index * (global.dialog.bullet_image.GetWidth() + 5);
|
||||||
|
global.dialog.bullet[index].y = global.dialog.entry.y + global.dialog.entry.image.GetHeight() / 2 - global.dialog.bullet_image.GetHeight() / 2;
|
||||||
|
global.dialog.bullet[index].z = global.dialog.entry.z + 1;
|
||||||
|
global.dialog.bullet[index].sprite.SetPosition(global.dialog.bullet[index].x, global.dialog.bullet[index].y, global.dialog.bullet[index].z);
|
||||||
|
}
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayNormalFunction(display_normal_callback);
|
||||||
|
Plymouth.SetDisplayPasswordFunction(display_password_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Spinner --------------------------------
|
||||||
|
|
||||||
|
global.spinner_sprite = NULL;
|
||||||
|
global.spinner_frame = 0;
|
||||||
|
global.spinner_frame_count = 30;
|
||||||
|
global.spinner_visible = false;
|
||||||
|
global.spinner_images = [];
|
||||||
|
|
||||||
|
fun spinner_setup()
|
||||||
|
{
|
||||||
|
if (!global.spinner_sprite)
|
||||||
|
{
|
||||||
|
# Load all throbber frames
|
||||||
|
for (i = 1; i <= global.spinner_frame_count; i++)
|
||||||
|
{
|
||||||
|
if (i < 10)
|
||||||
|
filename = "throbber-000" + i + ".png";
|
||||||
|
else
|
||||||
|
filename = "throbber-00" + i + ".png";
|
||||||
|
global.spinner_images[i-1] = Image(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create spinner sprite
|
||||||
|
global.spinner_sprite = Sprite(global.spinner_images[0]);
|
||||||
|
global.spinner_x = Window.GetX() + Window.GetWidth() / 2 - global.spinner_images[0].GetWidth() / 2;
|
||||||
|
global.spinner_y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2 + logo.image.GetHeight() + 40;
|
||||||
|
global.spinner_sprite.SetPosition(global.spinner_x, global.spinner_y, 10002);
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_show()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(1);
|
||||||
|
global.spinner_visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_hide()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
global.spinner_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize spinner
|
||||||
|
spinner_setup();
|
||||||
|
#----------------------------------------- Progress Bar --------------------------------
|
||||||
|
|
||||||
|
progress_box.image = Image("progress_box.png");
|
||||||
|
progress_box.sprite = Sprite(progress_box.image);
|
||||||
|
|
||||||
|
progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
|
||||||
|
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
|
||||||
|
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
progress_bar.original_image = Image("progress_bar.png");
|
||||||
|
progress_bar.sprite = Sprite();
|
||||||
|
|
||||||
|
progress_bar.x = Window.GetX() + Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;
|
||||||
|
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5 - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
|
||||||
|
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
global.progress_visible = false;
|
||||||
|
fun progress_callback (duration, progress)
|
||||||
|
{
|
||||||
|
if (progress > 0.01 && Plymouth.GetMode() != "shutdown" && Plymouth.GetMode() != "reboot" && Plymouth.GetMode() != "suspend")
|
||||||
|
{
|
||||||
|
if (!global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(1);
|
||||||
|
progress_bar.sprite.SetOpacity(1);
|
||||||
|
global.progress_visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
|
||||||
|
{
|
||||||
|
progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth() * progress, progress_bar.original_image.GetHeight());
|
||||||
|
progress_bar.sprite.SetImage (progress_bar.image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Hide progress bar when progress is 0
|
||||||
|
if (global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
global.progress_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetBootProgressFunction(progress_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Quit --------------------------------
|
||||||
|
|
||||||
|
fun quit_callback ()
|
||||||
|
{
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetQuitFunction(quit_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Message --------------------------------
|
||||||
|
|
||||||
|
message_sprite = Sprite();
|
||||||
|
message_sprite.SetPosition(10, 10, 10000);
|
||||||
|
|
||||||
|
fun display_message_callback (text)
|
||||||
|
{
|
||||||
|
my_image = Image.Text(text, 1, 1, 1);
|
||||||
|
message_sprite.SetImage(my_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_message_callback (text)
|
||||||
|
{
|
||||||
|
message_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayMessageFunction (display_message_callback);
|
||||||
|
Plymouth.SetHideMessageFunction (hide_message_callback);
|
BIN
themes/everforest/plymouth/progress_bar.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
themes/everforest/plymouth/progress_box.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
themes/everforest/plymouth/throbber-01.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-02.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-03.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-04.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-05.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-06.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-07.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-08.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-09.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-10.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-11.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-12.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-13.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-14.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-15.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-16.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-17.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-18.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-19.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-20.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-21.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-22.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-23.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-24.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-25.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-26.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-27.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-28.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-29.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/everforest/plymouth/throbber-30.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/bullet.png
Normal file
After Width: | Height: | Size: 358 B |
BIN
themes/gruvbox/plymouth/entry.png
Normal file
After Width: | Height: | Size: 687 B |
BIN
themes/gruvbox/plymouth/lock.png
Normal file
After Width: | Height: | Size: 531 B |
BIN
themes/gruvbox/plymouth/logo.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
11
themes/gruvbox/plymouth/omarchy.plymouth
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Plymouth Theme]
|
||||||
|
Name=Omarchy
|
||||||
|
Description=Script example plugin.
|
||||||
|
ModuleName=script
|
||||||
|
|
||||||
|
[script]
|
||||||
|
ImageDir=/usr/share/plymouth/themes/omarchy
|
||||||
|
ScriptFile=/usr/share/plymouth/themes/omarchy/omarchy.script
|
||||||
|
ConsoleLogBackgroundColor=0x282828
|
||||||
|
|
||||||
|
|
237
themes/gruvbox/plymouth/omarchy.script
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
# Omarchy Plymouth Theme Script
|
||||||
|
|
||||||
|
Window.SetBackgroundTopColor(0.157, 0.157, 0.157);
|
||||||
|
Window.SetBackgroundBottomColor(0.157, 0.157, 0.157);
|
||||||
|
|
||||||
|
logo.image = Image("logo.png");
|
||||||
|
logo.sprite = Sprite(logo.image);
|
||||||
|
logo.sprite.SetX (Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
|
||||||
|
logo.sprite.SetY (Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2);
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
|
||||||
|
fun refresh_callback ()
|
||||||
|
{
|
||||||
|
# Always animate spinner - it will be invisible when not needed
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_frame++;
|
||||||
|
frame_index = Math.Int(global.spinner_frame / 3) % global.spinner_frame_count;
|
||||||
|
global.spinner_sprite.SetImage(global.spinner_images[frame_index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetRefreshFunction (refresh_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Dialogue --------------------------------
|
||||||
|
|
||||||
|
status = "normal";
|
||||||
|
|
||||||
|
fun dialog_setup()
|
||||||
|
{
|
||||||
|
local.lock;
|
||||||
|
local.entry;
|
||||||
|
|
||||||
|
lock.image = Image("lock.png");
|
||||||
|
entry.image = Image("entry.png");
|
||||||
|
|
||||||
|
entry.sprite = Sprite(entry.image);
|
||||||
|
entry.x = Window.GetX() + Window.GetWidth()/2 - entry.image.GetWidth() / 2;
|
||||||
|
entry.y = logo.sprite.GetY() + logo.image.GetHeight() + 40;
|
||||||
|
entry.z = 10001;
|
||||||
|
entry.sprite.SetPosition(entry.x, entry.y, entry.z);
|
||||||
|
|
||||||
|
lock.sprite = Sprite(lock.image);
|
||||||
|
lock.x = entry.x - lock.image.GetWidth() - 10;
|
||||||
|
lock.y = logo.sprite.GetY() + logo.image.GetHeight() + 40 + entry.image.GetHeight()/2 - lock.image.GetHeight()/2;
|
||||||
|
lock.z = 10001;
|
||||||
|
lock.sprite.SetPosition(lock.x, lock.y, lock.z);
|
||||||
|
|
||||||
|
global.dialog.lock = lock;
|
||||||
|
global.dialog.entry = entry;
|
||||||
|
global.dialog.bullet_image = Image("bullet.png");
|
||||||
|
dialog_opacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dialog_opacity(opacity)
|
||||||
|
{
|
||||||
|
global.dialog.lock.sprite.SetOpacity (opacity);
|
||||||
|
global.dialog.entry.sprite.SetOpacity (opacity);
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(opacity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_normal_callback ()
|
||||||
|
{
|
||||||
|
global.status = "normal";
|
||||||
|
if (global.dialog)
|
||||||
|
dialog_opacity (0);
|
||||||
|
spinner_show(); # Show spinner when no password dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
fun display_password_callback (prompt, bullets)
|
||||||
|
{
|
||||||
|
global.status = "password";
|
||||||
|
|
||||||
|
# Always hide spinner when showing password dialog
|
||||||
|
spinner_hide();
|
||||||
|
|
||||||
|
# Setup dialog if it doesn't exist
|
||||||
|
if (!global.dialog)
|
||||||
|
dialog_setup();
|
||||||
|
else
|
||||||
|
dialog_opacity(1);
|
||||||
|
|
||||||
|
# Clear all bullets first (user might hit backspace)
|
||||||
|
for (index = 0; global.dialog.bullet[index]; index++)
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create and show bullets for current password
|
||||||
|
for (index = 0; index < bullets; index++)
|
||||||
|
{
|
||||||
|
if (!global.dialog.bullet[index])
|
||||||
|
{
|
||||||
|
global.dialog.bullet[index].sprite = Sprite(global.dialog.bullet_image);
|
||||||
|
global.dialog.bullet[index].x = global.dialog.entry.x + 10 + index * (global.dialog.bullet_image.GetWidth() + 5);
|
||||||
|
global.dialog.bullet[index].y = global.dialog.entry.y + global.dialog.entry.image.GetHeight() / 2 - global.dialog.bullet_image.GetHeight() / 2;
|
||||||
|
global.dialog.bullet[index].z = global.dialog.entry.z + 1;
|
||||||
|
global.dialog.bullet[index].sprite.SetPosition(global.dialog.bullet[index].x, global.dialog.bullet[index].y, global.dialog.bullet[index].z);
|
||||||
|
}
|
||||||
|
global.dialog.bullet[index].sprite.SetOpacity(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayNormalFunction(display_normal_callback);
|
||||||
|
Plymouth.SetDisplayPasswordFunction(display_password_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Spinner --------------------------------
|
||||||
|
|
||||||
|
global.spinner_sprite = NULL;
|
||||||
|
global.spinner_frame = 0;
|
||||||
|
global.spinner_frame_count = 30;
|
||||||
|
global.spinner_visible = false;
|
||||||
|
global.spinner_images = [];
|
||||||
|
|
||||||
|
fun spinner_setup()
|
||||||
|
{
|
||||||
|
if (!global.spinner_sprite)
|
||||||
|
{
|
||||||
|
# Load all throbber frames
|
||||||
|
for (i = 1; i <= global.spinner_frame_count; i++)
|
||||||
|
{
|
||||||
|
if (i < 10)
|
||||||
|
filename = "throbber-000" + i + ".png";
|
||||||
|
else
|
||||||
|
filename = "throbber-00" + i + ".png";
|
||||||
|
global.spinner_images[i-1] = Image(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create spinner sprite
|
||||||
|
global.spinner_sprite = Sprite(global.spinner_images[0]);
|
||||||
|
global.spinner_x = Window.GetX() + Window.GetWidth() / 2 - global.spinner_images[0].GetWidth() / 2;
|
||||||
|
global.spinner_y = Window.GetY() + Window.GetHeight() / 2 - logo.image.GetHeight() / 2 + logo.image.GetHeight() + 40;
|
||||||
|
global.spinner_sprite.SetPosition(global.spinner_x, global.spinner_y, 10002);
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_show()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(1);
|
||||||
|
global.spinner_visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun spinner_hide()
|
||||||
|
{
|
||||||
|
if (global.spinner_sprite)
|
||||||
|
{
|
||||||
|
global.spinner_sprite.SetOpacity(0);
|
||||||
|
global.spinner_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Initialize spinner
|
||||||
|
spinner_setup();
|
||||||
|
#----------------------------------------- Progress Bar --------------------------------
|
||||||
|
|
||||||
|
progress_box.image = Image("progress_box.png");
|
||||||
|
progress_box.sprite = Sprite(progress_box.image);
|
||||||
|
|
||||||
|
progress_box.x = Window.GetX() + Window.GetWidth() / 2 - progress_box.image.GetWidth() / 2;
|
||||||
|
progress_box.y = Window.GetY() + Window.GetHeight() * 0.75 - progress_box.image.GetHeight() / 2;
|
||||||
|
progress_box.sprite.SetPosition(progress_box.x, progress_box.y, 0);
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
progress_bar.original_image = Image("progress_bar.png");
|
||||||
|
progress_bar.sprite = Sprite();
|
||||||
|
|
||||||
|
progress_bar.x = Window.GetX() + Window.GetWidth() / 2 - progress_bar.original_image.GetWidth() / 2;
|
||||||
|
progress_bar.y = Window.GetY() + Window.GetHeight() / 2 * 1.5 - progress_box.image.GetHeight() / 2 + (progress_box.image.GetHeight() - progress_bar.original_image.GetHeight()) / 2;
|
||||||
|
progress_bar.sprite.SetPosition(progress_bar.x, progress_bar.y, 1);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
|
||||||
|
global.progress_visible = false;
|
||||||
|
fun progress_callback (duration, progress)
|
||||||
|
{
|
||||||
|
if (progress > 0.01 && Plymouth.GetMode() != "shutdown" && Plymouth.GetMode() != "reboot" && Plymouth.GetMode() != "suspend")
|
||||||
|
{
|
||||||
|
if (!global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(1);
|
||||||
|
progress_bar.sprite.SetOpacity(1);
|
||||||
|
global.progress_visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress))
|
||||||
|
{
|
||||||
|
progress_bar.image = progress_bar.original_image.Scale(progress_bar.original_image.GetWidth() * progress, progress_bar.original_image.GetHeight());
|
||||||
|
progress_bar.sprite.SetImage (progress_bar.image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Hide progress bar when progress is 0
|
||||||
|
if (global.progress_visible)
|
||||||
|
{
|
||||||
|
progress_box.sprite.SetOpacity(0);
|
||||||
|
progress_bar.sprite.SetOpacity(0);
|
||||||
|
global.progress_visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetBootProgressFunction(progress_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Quit --------------------------------
|
||||||
|
|
||||||
|
fun quit_callback ()
|
||||||
|
{
|
||||||
|
logo.sprite.SetOpacity (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetQuitFunction(quit_callback);
|
||||||
|
|
||||||
|
#----------------------------------------- Message --------------------------------
|
||||||
|
|
||||||
|
message_sprite = Sprite();
|
||||||
|
message_sprite.SetPosition(10, 10, 10000);
|
||||||
|
|
||||||
|
fun display_message_callback (text)
|
||||||
|
{
|
||||||
|
my_image = Image.Text(text, 1, 1, 1);
|
||||||
|
message_sprite.SetImage(my_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide_message_callback (text)
|
||||||
|
{
|
||||||
|
message_sprite.SetOpacity(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Plymouth.SetDisplayMessageFunction (display_message_callback);
|
||||||
|
Plymouth.SetHideMessageFunction (hide_message_callback);
|
BIN
themes/gruvbox/plymouth/progress_bar.png
Normal file
After Width: | Height: | Size: 314 B |
BIN
themes/gruvbox/plymouth/progress_box.png
Normal file
After Width: | Height: | Size: 335 B |
BIN
themes/gruvbox/plymouth/throbber-01.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-02.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-03.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-04.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-05.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-06.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-07.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-08.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-09.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-10.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/gruvbox/plymouth/throbber-11.png
Normal file
After Width: | Height: | Size: 1.2 KiB |