From e43094fa37362b475c8039b03739586b05db6004 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20COUDERC?= Date: Tue, 29 Jan 2019 00:14:42 +0100 Subject: [PATCH] Add futurePrototype theme as Debian buster's default --- Makefile | 25 +- debian/postinst | 81 +- debian/prerm | 15 +- futureprototype-theme/gnome-wp-list.xml | 12 + futureprototype-theme/grub/Makefile | 24 + futureprototype-theme/grub/grub-16x9.svg | 219 ++++ futureprototype-theme/grub/grub-4x3.svg | 218 ++++ futureprototype-theme/grub/grub_background.sh | 3 + .../login/background-withlogo.svg | 331 +++++ futureprototype-theme/login/background.svg | 158 +++ futureprototype-theme/plymouth/debian.png | Bin 0 -> 5319 bytes .../plymouth/futureprototype.plymouth | 8 + .../plymouth/futureprototype.script | 1064 +++++++++++++++++ futureprototype-theme/plymouth/logo.png | Bin 0 -> 20919 bytes .../plymouth/logo_circle.png | Bin 0 -> 3776 bytes .../plymouth/password_dot.png | Bin 0 -> 2936 bytes .../plymouth/password_dot16.png | Bin 0 -> 1075 bytes .../plymouth/password_field.png | Bin 0 -> 17401 bytes .../plymouth/password_field16.png | Bin 0 -> 230 bytes .../plymouth/plymouth_background_future.png | Bin 0 -> 65481 bytes .../sources/plymouth/debian.svg | 127 ++ .../sources/plymouth/logo.svg | 141 +++ .../sources/plymouth/plymouth_background.svg | 160 +++ .../wallpaper/contents/images/1280x1024.svg | 274 +++++ .../wallpaper/contents/images/1600x1200.svg | 274 +++++ .../wallpaper/contents/images/1920x1080.svg | 274 +++++ .../wallpaper/contents/images/1920x1200.svg | 274 +++++ .../wallpaper/contents/images/2560x1080.svg | 272 +++++ .../wallpaper/contents/images/4096x2160.svg | 270 +++++ .../wallpaper/gnome-background.xml | 14 + .../wallpaper/metadata.desktop | 6 + 31 files changed, 4208 insertions(+), 36 deletions(-) create mode 100644 futureprototype-theme/gnome-wp-list.xml create mode 100644 futureprototype-theme/grub/Makefile create mode 100644 futureprototype-theme/grub/grub-16x9.svg create mode 100644 futureprototype-theme/grub/grub-4x3.svg create mode 100644 futureprototype-theme/grub/grub_background.sh create mode 100644 futureprototype-theme/login/background-withlogo.svg create mode 100644 futureprototype-theme/login/background.svg create mode 100644 futureprototype-theme/plymouth/debian.png create mode 100644 futureprototype-theme/plymouth/futureprototype.plymouth create mode 100644 futureprototype-theme/plymouth/futureprototype.script create mode 100644 futureprototype-theme/plymouth/logo.png create mode 100644 futureprototype-theme/plymouth/logo_circle.png create mode 100644 futureprototype-theme/plymouth/password_dot.png create mode 100644 futureprototype-theme/plymouth/password_dot16.png create mode 100644 futureprototype-theme/plymouth/password_field.png create mode 100644 futureprototype-theme/plymouth/password_field16.png create mode 100644 futureprototype-theme/plymouth/plymouth_background_future.png create mode 100644 futureprototype-theme/sources/plymouth/debian.svg create mode 100644 futureprototype-theme/sources/plymouth/logo.svg create mode 100644 futureprototype-theme/sources/plymouth/plymouth_background.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/1280x1024.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/1600x1200.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/1920x1080.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/1920x1200.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/2560x1080.svg create mode 100644 futureprototype-theme/wallpaper/contents/images/4096x2160.svg create mode 100644 futureprototype-theme/wallpaper/gnome-background.xml create mode 100644 futureprototype-theme/wallpaper/metadata.desktop diff --git a/Makefile b/Makefile index d1dc82d..5e09103 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -GRUB_THEMES=softwaves-theme/grub lines-theme/grub joy-theme/grub spacefun-theme/grub +GRUB_THEMES=futureprototype-theme/grub softwaves-theme/grub lines-theme/grub joy-theme/grub spacefun-theme/grub DEFAULT_BACKGROUND=desktop-background PIXMAPS=$(wildcard pixmaps/*.png) @@ -185,4 +185,27 @@ install-local: install -d $(DESTDIR)/usr/share/wallpapers cd $(DESTDIR)/usr/share/wallpapers && ln -s /usr/share/desktop-base/softwaves-theme/lockscreen SoftWavesLockScreen + # futurePrototype theme (Buster’s default) + ### Plymouth theme + install -d $(DESTDIR)/usr/share/plymouth/themes/futureprototype + $(INSTALL_DATA) $(wildcard futureprototype-theme/plymouth/*) $(DESTDIR)/usr/share/plymouth/themes/futureprototype + install -d $(DESTDIR)/usr/share/desktop-base/futureprototype-theme + cd $(DESTDIR)/usr/share/desktop-base/futureprototype-theme && ln -s /usr/share/plymouth/themes/futureprototype plymouth + ### Login background + install -d $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/login + $(INSTALL_DATA) $(wildcard futureprototype-theme/login/*) $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/login + + ### Wallpapers + install -d $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images + $(INSTALL_DATA) futureprototype-theme/wallpaper/metadata.desktop $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/wallpaper + $(INSTALL_DATA) futureprototype-theme/wallpaper/gnome-background.xml $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/wallpaper + $(INSTALL_DATA) $(wildcard futureprototype-theme/wallpaper/contents/images/*) $(DESTDIR)/usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/ + $(INSTALL_DATA) futureprototype-theme/gnome-wp-list.xml $(DESTDIR)/usr/share/gnome-background-properties/debian-futureprototype.xml + # Wallpaper symlink for KDE + install -d $(DESTDIR)/usr/share/wallpapers + cd $(DESTDIR)/usr/share/wallpapers && ln -s /usr/share/desktop-base/futureprototype-theme/wallpaper FuturePrototype + + ### Lockscreen + cd $(DESTDIR)/usr/share/desktop-base/futureprototype-theme && ln -s /usr/share/desktop-base/futureprototype-theme/wallpaper lockscreen + include Makefile.inc diff --git a/debian/postinst b/debian/postinst index 4b2b4d3..1341cd2 100644 --- a/debian/postinst +++ b/debian/postinst @@ -24,11 +24,12 @@ if [ "$1" = "configure" ] || [ "$1" = "abort-upgrade" ] || [ "$1" = "abort-remov desktop-theme \ /usr/share/desktop-base/$theme-theme $priority done << EOF -softwaves 50 +futureprototype 50 +softwaves 40 lines 40 -joy 30 -joy-inksplat 30 -spacefun 30 +joy 40 +joy-inksplat 40 +spacefun 40 EOF # Use active theme as highest priority for background @@ -45,20 +46,26 @@ EOF desktop-background \ /usr/share/desktop-base/$theme-theme/wallpaper/contents/images/$filename $priority done << EOF -softwaves 1024x768.svg 65 -softwaves 1280x720.svg 65 -softwaves 1280x800.svg 65 -softwaves 1280x1024.svg 65 -softwaves 1600x1200.svg 65 -softwaves 1920x1080.svg 65 -softwaves 1920x1200.svg 65 -softwaves 2560x1440.svg 65 -softwaves 2560x1600.svg 65 -lines 1280x1024.svg 60 -lines 1600x1200.svg 60 -lines 1920x1080.svg 60 -lines 1920x1200.svg 60 -lines 2560x1080.svg 60 +futureprototype 1280x1024.svg 65 +futureprototype 1600x1200.svg 65 +futureprototype 1920x1080.svg 65 +futureprototype 1920x1200.svg 65 +futureprototype 2560x1080.svg 65 +futureprototype 4096x2160.svg 65 +softwaves 1024x768.svg 50 +softwaves 1280x720.svg 50 +softwaves 1280x800.svg 50 +softwaves 1280x1024.svg 50 +softwaves 1600x1200.svg 50 +softwaves 1920x1080.svg 50 +softwaves 1920x1200.svg 50 +softwaves 2560x1440.svg 50 +softwaves 2560x1600.svg 50 +lines 1280x1024.svg 50 +lines 1600x1200.svg 50 +lines 1920x1080.svg 50 +lines 1920x1200.svg 50 +lines 2560x1080.svg 50 joy 1280x720.svg 50 joy 1280x1024.svg 50 joy 1600x1200.svg 50 @@ -91,11 +98,12 @@ EOF desktop-background.xml \ /usr/share/desktop-base/$theme-theme/wallpaper/gnome-background.xml $priority done << EOF -softwaves 40 +futureprototype 40 +softwaves 30 lines 30 -joy 20 -joy-inksplat 20 -spacefun 20 +joy 30 +joy-inksplat 30 +spacefun 30 EOF # Set up an alternative for the XML version of the lock screen @@ -114,10 +122,11 @@ EOF desktop-lockscreen.xml \ /usr/share/desktop-base/$theme-theme/lockscreen/gnome-background.xml $priority done << EOF -softwaves 40 +futureprototype 40 +softwaves 30 lines 30 -joy 20 -spacefun 20 +joy 30 +spacefun 30 EOF # Set up an alternative for the wallpaper for Plasma 5/KDE @@ -135,11 +144,12 @@ EOF desktop-plasma5-wallpaper \ /usr/share/desktop-base/$theme-theme/wallpaper $priority done << EOF -softwaves 40 +futureprototype 40 +softwaves 30 lines 30 -joy 20 -joy-inksplat 20 -spacefun 20 +joy 30 +joy-inksplat 30 +spacefun 30 EOF # Login theme @@ -155,11 +165,12 @@ EOF desktop-login-background \ /usr/share/desktop-base/$theme-theme/login/$background $priority done << EOF -softwaves background.svg 40 +futureprototype background.svg 40 +softwaves background.svg 30 lines background.svg 30 lines background-nologo.svg 30 -joy background.svg 20 -spacefun background.svg 20 +joy background.svg 30 +spacefun background.svg 30 EOF # Set up an alternative for the GRUB background/colors config @@ -202,8 +213,10 @@ EOF desktop-grub.sh \ /usr/share/desktop-base/$theme-theme/grub/grub_background.sh done << EOF -softwaves 4x3 40 -softwaves 16x9 40 +futureprototype 4x3 40 +futureprototype 16x9 40 +softwaves 4x3 30 +softwaves 16x9 30 lines 4x3 30 lines 16x9 30 joy 4x3 30 diff --git a/debian/prerm b/debian/prerm index 321c38c..2488e92 100644 --- a/debian/prerm +++ b/debian/prerm @@ -11,6 +11,12 @@ if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ]; then desktop-background \ /usr/share/desktop-base/$theme-theme/wallpaper/contents/images/$filename done << EOF +futureprototype 1280x1024.svg +futureprototype 1600x1200.svg +futureprototype 1920x1080.svg +futureprototype 1920x1200.svg +futureprototype 2560x1080.svg +futureprototype 4096x2160.svg softwaves 1024x768.svg softwaves 1280x720.svg softwaves 1280x800.svg @@ -50,6 +56,7 @@ EOF desktop-background.xml \ /usr/share/desktop-base/$theme-theme/wallpaper/gnome-background.xml done << EOF +futureprototype softwaves lines joy @@ -68,6 +75,7 @@ EOF desktop-lockscreen.xml \ /usr/share/desktop-base/$theme-theme/lockscreen/gnome-background.xml done << EOF +futureprototype softwaves lines joy @@ -85,6 +93,7 @@ EOF desktop-plasma5-wallpaper \ /usr/share/desktop-base/$theme-theme/wallpaper done << EOF +futureprototype softwaves lines joy @@ -104,6 +113,7 @@ EOF desktop-login-background \ /usr/share/desktop-base/$theme-theme/login/$background done << EOF +futureprototype background.svg softwaves background.svg lines background.svg lines background-nologo.svg @@ -121,6 +131,8 @@ EOF desktop-grub \ /usr/share/desktop-base/$theme-theme/grub/grub-$ratio.png done << EOF +futureprototype 4x3 +futureprototype 16x9 softwaves 4x3 softwaves 16x9 lines 4x3 @@ -156,6 +168,7 @@ EOF desktop-theme \ /usr/share/desktop-base/$theme-theme done << EOF +softwaves lines joy joy-inksplat @@ -164,6 +177,6 @@ EOF ## *Lastly* remove *highest priority* alternative update-alternatives --remove \ desktop-theme \ - /usr/share/desktop-base/softwaves-theme + /usr/share/desktop-base/futureprototype-theme fi diff --git a/futureprototype-theme/gnome-wp-list.xml b/futureprototype-theme/gnome-wp-list.xml new file mode 100644 index 0000000..41d5739 --- /dev/null +++ b/futureprototype-theme/gnome-wp-list.xml @@ -0,0 +1,12 @@ + + + + + + futurePrototype + /usr/share/desktop-base/futureprototype-theme/wallpaper/gnome-background.xml + zoom + #ffffff + #000000 + + diff --git a/futureprototype-theme/grub/Makefile b/futureprototype-theme/grub/Makefile new file mode 100644 index 0000000..6e01e18 --- /dev/null +++ b/futureprototype-theme/grub/Makefile @@ -0,0 +1,24 @@ +dir = usr/share/desktop-base/futureprototype-theme/grub + +.PHONY: build clean install + +files = \ + grub-4x3.png \ + grub-16x9.png + +build: $(files) + +clean: + rm -f grub-4x3.png grub-16x9.png + +install: + install -d $(DESTDIR)/$(dir) + $(INSTALL_DATA) $(wildcard *.png *.sh) $(DESTDIR)/$(dir) + +grub-4x3.png: grub-4x3.svg + rsvg-convert $< > $@ + +grub-16x9.png: grub-16x9.svg + rsvg-convert $< > $@ + +include ../../Makefile.inc diff --git a/futureprototype-theme/grub/grub-16x9.svg b/futureprototype-theme/grub/grub-16x9.svg new file mode 100644 index 0000000..d32b4ee --- /dev/null +++ b/futureprototype-theme/grub/grub-16x9.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/grub/grub-4x3.svg b/futureprototype-theme/grub/grub-4x3.svg new file mode 100644 index 0000000..e97ad84 --- /dev/null +++ b/futureprototype-theme/grub/grub-4x3.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/grub/grub_background.sh b/futureprototype-theme/grub/grub_background.sh new file mode 100644 index 0000000..c7ba469 --- /dev/null +++ b/futureprototype-theme/grub/grub_background.sh @@ -0,0 +1,3 @@ +WALLPAPER=/usr/share/images/desktop-base/desktop-grub.png +COLOR_NORMAL=white/black +COLOR_HIGHLIGHT=black/white diff --git a/futureprototype-theme/login/background-withlogo.svg b/futureprototype-theme/login/background-withlogo.svg new file mode 100644 index 0000000..491ac74 --- /dev/null +++ b/futureprototype-theme/login/background-withlogo.svg @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/login/background.svg b/futureprototype-theme/login/background.svg new file mode 100644 index 0000000..33f4adb --- /dev/null +++ b/futureprototype-theme/login/background.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/plymouth/debian.png b/futureprototype-theme/plymouth/debian.png new file mode 100644 index 0000000000000000000000000000000000000000..2e651f8e84c5c99d49c02d557edefa2395986e0c GIT binary patch literal 5319 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 D)WTqt literal 0 HcmV?d00001 diff --git a/futureprototype-theme/plymouth/futureprototype.plymouth b/futureprototype-theme/plymouth/futureprototype.plymouth new file mode 100644 index 0000000..905ad20 --- /dev/null +++ b/futureprototype-theme/plymouth/futureprototype.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=Default theme for Debian 10.0 Buster +Description=A theme that features a white debian 10 logo in a white spinning circle +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/futureprototype +ScriptFile=/usr/share/plymouth/themes/futureprototype/futureprototype.script diff --git a/futureprototype-theme/plymouth/futureprototype.script b/futureprototype-theme/plymouth/futureprototype.script new file mode 100644 index 0000000..085f0d0 --- /dev/null +++ b/futureprototype-theme/plymouth/futureprototype.script @@ -0,0 +1,1064 @@ +# futureprototype.script - boot splash using script plugin +# +# Copyright (C) 2009 Canonical Ltd. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# Written by: Alberto Milone +# +# Based on the example provided with the "script plugin" written by: +# Charlie Brej +# +# Soft Waves theme scripting by Juliette Taka BELIN and Aurélien COUDERC +# futureprototype by Alex Makas based on Soft Waves, only graphics modification really + + +#------------------------------- Constants ----------------------------------------- +NB_ROTATION_STEPS = 70; +NB_REFRESHS_BETWEEN_ANIMS = 3; + +# Initial position of the center of the logo in % of background +DEBIAN_POS_PCT.y = 0.65; # Debian image position in % of screen height +DEBIAN_HEIGHT_PCT = 0.07; # Debian image height in % of smallest screen dimension +LOGO_CENTER_PCT.x = 0.5; # Debian swirl image position in % of screen height & width +LOGO_CENTER_PCT.y = 0.442; +LOGO_SIZE_PCT = 0.18; # Debian swirl image size in % of smallest screen dimension + +#------------------------------- Globals ------------------------------------------- +# are we currently prompting for a password? +prompt_active = 0; + +# Globals to share progress time / percent with intersted functions +progress_time = 0; +progress_pct = 0; + +# Variables for glow rotation animation +anim_start_time = NULL; +anim_status = "stopped"; +refresh_iter = 0; +anim_iter = 0; + +#-----------------------------Text-image functions---------------------------- + +# Set the text colour in (rgb / 256) +text_colour.red = 1.0; +text_colour.green = 1.0; +text_colour.blue = 1.0; + +# Tinted text #988592 +tinted_text_colour.red = 1.0; +tinted_text_colour.green = 1.0; +tinted_text_colour.blue = 1.0; + +# Action Text - #ffffff - RGB 255 255 255 +action_text_colour.red = 1.0; +action_text_colour.green = 1.0; +action_text_colour.blue = 1.0; + +# Orange - #ff4012 - RGB 255 64 18 +debugsprite = Sprite(); +debugsprite_bottom = Sprite(); +debugsprite_bottom.SetPosition(0, (Window.GetHeight (0) - 20), 1); +debugsprite_medium = Sprite(); +debugsprite_medium.SetPosition(0, (Window.GetHeight (0) - 100), 1); + +# General purpose function to create text +fun WriteText (text, colour) { + image = Image.Text (text, colour.red, colour.green, colour.blue); + return image; +} + +fun ImageFromText (text) { + image = WriteText (text, text_colour); + return image; +} + +fun ImageFromTintedText (text) { + image = WriteText (text, tinted_text_colour); + return image; +} + +fun ImageFromActionText (text) { + image = WriteText (text, action_text_colour); + return image; +} + +fun Debug(text) { + debugsprite.SetImage(ImageFromText (text)); +} + +fun DebugBottom(text) { + debugsprite_bottom.SetImage(ImageFromText (text)); +} + +fun DebugMedium(text) { + debugsprite_medium.SetImage(ImageFromText (text)); +} + +#Debug("Window.GetHeight(0) = " + Window.GetHeight(0)); +fun TextYOffset() { + local.y; + local.text_height; + local.min_height; + + # Put the 1st line below the logo + some spacing + y = debian_sprite.GetY() + debian.GetHeight(); + #Debug("y = " + y); + + text_height = first_line_height * 7.5; + min_height = Window.GetHeight(); + #Debug("text_height=" + text_height + "; min_height=" + min_height); + + if (y + text_height > min_height) + y = min_height - text_height; + + return y; +} + + +#----------------------------- Screen/window setup --------------------------- +# Compute screen/image ratio and scale the background accordingly +window_max.width = Window.GetX() * 2 + Window.GetWidth(); +window_max.height = Window.GetY() * 2 + Window.GetHeight(); +screen_ratio = window_max.width / window_max.height; +small_dimension = Math.Min(window_max.width, window_max.height); +#Debug("Window.GetX():" + Window.GetX() + ", Window.GetY():" + Window.GetY()); +#Debug("Window is [" + window_max.width + ";" + window_max.height + "], ratio=" + screen_ratio); + +debian_height = small_dimension * DEBIAN_HEIGHT_PCT; +debian_pos.y = window_max.height * DEBIAN_POS_PCT.y - debian_height/2; +logo_size = small_dimension * LOGO_SIZE_PCT; +logo_center.x = window_max.width * LOGO_CENTER_PCT.x; +logo_center.y = window_max.height * LOGO_CENTER_PCT.y; +#Debug("Logo center at [" + logo_center.x + ";" + logo_center.y + "], size=" + logo_size + "px"); + +logo_pos.x = logo_center.x - logo_size/2; +logo_pos.y = logo_center.y - logo_size/2; + +#------------------------------- Background ---------------------------------------- +bg_image = Image("plymouth_background_future.png"); +bg_image_ratio = bg_image.GetWidth() / bg_image.GetHeight(); +if (screen_ratio > bg_image_ratio) + bg_scale_factor = window_max.width / bg_image.GetWidth(); +else + bg_scale_factor = window_max.height / bg_image.GetHeight(); +scaled_bg_image = bg_image.Scale(bg_image.GetWidth() * bg_scale_factor, + bg_image.GetHeight() * bg_scale_factor); + +# Display background +bg_sprite = Sprite(scaled_bg_image); +bg_sprite.SetPosition(Window.GetX() + Window.GetWidth() / 2 - scaled_bg_image.GetWidth() / 2, + Window.GetY() + Window.GetHeight() / 2 - scaled_bg_image.GetHeight() / 2, + -1000); + +#------------------------------- Debian ---------------------------------------------- +debian = Image("debian.png"); +# Target same height as logo +debian_scale_factor = debian_height / debian.GetHeight(); +debian = debian.Scale(debian.GetWidth() * debian_scale_factor, + debian.GetHeight() * debian_scale_factor); +debian_sprite = Sprite(debian); +debian_sprite.SetPosition(window_max.width / 2 - debian.GetWidth() / 2, + debian_pos.y, + -90); + +#------------------------------- Logo ---------------------------------------------- +logo = Image("logo.png"); +logo_scale_factor = logo_size / logo.GetWidth(); +logo = logo.Scale(logo.GetWidth() * logo_scale_factor, + logo.GetHeight() * logo_scale_factor); +logo_to_top_edge = Window.GetHeight() * 0.3; +logo_sprite = Sprite(logo); +logo_sprite.SetPosition(logo_pos.x, logo_pos.y, -50); + + +logo_glow = Image("logo_circle.png"); +logo_glow_scale_factor = logo_size / logo_glow.GetWidth(); +logo_glow[0] = logo_glow.Scale(logo_glow.GetWidth() * logo_glow_scale_factor, + logo_glow.GetHeight() * logo_glow_scale_factor); +logo_glow_sprite = Sprite(); +logo_glow_sprite.SetPosition(logo_pos.x, logo_pos.y, -60); +logo_glow_sprite.SetImage(logo_glow[0]); + + + +#------------------------------String functions------------------------------- + +# This is the equivalent for strstr() +fun StringString(string, substring) { + start = 0; + while (String(string).CharAt (start)) { + walk = 0; + while (String(substring).CharAt (walk) == String(string).CharAt (start + walk) ) { + walk++; + if (!String(substring).CharAt (walk)) return start; + } + start++; + } + + return NULL; +} + +fun StringLength (string) { + index = 0; + while (String(string).CharAt(index)) index++; + return index; +} + +fun StringCopy (source, beginning, end) { + local.destination = ""; + for (index = beginning; ( ( (end == NULL) || (index <= end) ) && (String(source).CharAt(index)) ); index++) { + local.destination += String(source).CharAt(index); + } + + return local.destination; +} + +fun StringReplace (source, pattern, replacement) { + local.found = StringString(source, pattern); + if (local.found == NULL) + return source; + + local.new_string = StringCopy (source, 0, local.found - 1) + + replacement + + StringCopy (source, local.found + StringLength(pattern), NULL); + + return local.new_string; +} + +# it makes sense to use it only for +# numbers up to 100 +fun StringToInteger (str) { + int = -1; + for (i=0; i<=100; i++) { + if (i+"" == str) { + int = i; + break; + } + } + return int; +} + +#----------------------------------------------------------------------------- +# Top background colour +# #489291 --> 0.282, 0.572, 0.569 +# New background colour +# #0a3649 --> 0.039, 0.212, 0.286 +# +Window.SetBackgroundTopColor (0.282, 0.572, 0.569); # Nice colour on top of the screen fading to +Window.SetBackgroundBottomColor (0.039, 0.212, 0.286); # an equally nice colour on the bottom + +bits_per_pixel = Window.GetBitsPerPixel (); +# TODO need to handle 16 colors ? +#if (bits_per_pixel == 4) { +# logo_filename = "debian_logo16.png"; +# progress_dot_off_filename = "progress_dot_off16.png"; +# progress_dot_on_filename = "progress_dot_on16.png"; +# password_dot_filename = "password_dot.png"; +# password_field_filename = "password_field16.png"; +#} else { +# logo_filename = "debian_logo.png"; +# progress_dot_off_filename = "progress_dot_off.png"; +# progress_dot_on_filename = "progress_dot_on.png"; + password_dot_filename = "password_dot.png"; + password_field_filename = "password_field.png"; +#} + +message_notification[0].image = ImageFromTintedText (""); +message_notification[1].image = ImageFromTintedText (""); +fsck_notification.image = ImageFromActionText (""); + +status = "normal"; + +# use a fixed string with ascending and descending stems to calibrate the +# bounding box for the first message, so the messages below don't move up +# and down according to *their* height. +first_line_height = ImageFromTintedText ("AfpqtM").GetHeight(); + +# if the user has a 640x480 or 800x600 display, we can't quite fit everything +# (including passphrase prompts) with the target spacing, so scoot the text up +# a bit if needed. +top_of_the_text = TextYOffset(); + + +#-------------------------------Progress Indicator----------------------------- +# Implement in boot progress callback +fun animate_progress_indicator (time, progress) { + progress_time = time; + progress_pct = progress; + + #Debug ("mode = " + Plymouth.GetMode() + ", progress_time = " + progress_time + ", progress_pct = " + progress_pct); + +} + + +#-----------------------------------------Label utility functions--------------------- + +# label should be either a string or NULL +# Images for n lines will be created and returned as items of the +# message_label array +# +fun get_message_label (label, is_fake, is_action_line) { + #Debug("Get Label position"); + local.message_label; + + if (is_fake) + # Create a fake label so as to get the y coordinate of + # a standard-length label. + local.message_image = ImageFromTintedText ("This is a fake message"); + else + local.message_image = (is_action_line) && ImageFromActionText (label) || ImageFromTintedText (label); + + message_label.width = message_image.GetWidth (); + message_label.height = message_image.GetHeight (); + + # Center the line horizontally + message_label.x = Window.GetX () + Window.GetWidth () / 2 - message_label.width / 2; + + message_label.y = top_of_the_text; + + # Put the 2nd line below the fsck line + if (is_action_line) { + local.fsck_label.y = message_label.y + (first_line_height + first_line_height / 2); + message_label.y = local.fsck_label.y + (first_line_height * 1.5); + } + + #Debug("action label x = " + message_label.x + " y = " + message_label.y ); + +# message_debug = "msg_x = " + message_label.x + " msg_y = " + message_label.y + +# "msg_width = " + message_label.width + " msg_height = " + +# message_label.height + " message = " + label; +# Debug(message_debug); + + return message_label; + +} + +# Create an fsck label and/or get its position +fun get_fsck_label (label, is_fake) { + # Debug("Get Label position"); + local.fsck_label = global.progress_label; + + if (is_fake) + fsck_label.image = ImageFromTintedText ("This is a fake message"); + else + fsck_label.image = ImageFromTintedText (label); + + fsck_label.width = fsck_label.image.GetWidth (); + fsck_label.height = fsck_label.image.GetHeight (); + + # Centre the label horizontally + fsck_label.x = Window.GetX () + Window.GetWidth () / 2 - fsck_label.width / 2; + + local.first_label = get_message_label (label, 1, 0); + + # Place the label below the 1st message line + fsck_label.y = local.first_label.y + local.first_label.height + (local.first_label.height / 2); + +# message_debug = "msg_x = " + fsck_label.x + " msg_y = " + fsck_label.y + +# "msg_width = " + fsck_label.width + " msg_height = " + +# fsck_label.height + " message = " + label; +# Debug(message_debug); + + return fsck_label; +} + +#-----------------------------------------Message stuff -------------------------------- +# + +# Set up a message label +# +# NOTE: this is called when doing something like 'plymouth message "hello world"' +# +fun setup_message (message_text, x, y, z, index) { + #DebugMedium("Message setup: " + message_text); + global.message_notification[index].image = (index) && ImageFromActionText (message_text) || ImageFromTintedText (message_text); + + # Set up the text message, if any + message_notification[index].x = x; + message_notification[index].y = y; + message_notification[index].z = z; + + message_notification[index].sprite = Sprite (); + message_notification[index].sprite.SetImage (message_notification[index].image); + message_notification[index].sprite.SetX (message_notification[index].x); + message_notification[index].sprite.SetY (message_notification[index].y); + message_notification[index].sprite.SetZ (message_notification[index].z); + +} + +fun show_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(1); +} + +fun hide_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(0); +} + + + + +# the callback function is called when new message should be displayed. +# First arg is message to display. +fun message_callback (message) +{ + # Debug("Message callback"); + is_fake = 0; + if (!message || (message == "")) is_fake = 1; + + local.substring = "keys:"; + + # Look for the "keys:" prefix + local.keys = StringString(message, local.substring); + + local.is_action_line = (keys != NULL); + #Debug("keys " + local.keys + " substring length = " + StringLength(local.substring)); + + # Get the message without the "keys:" prefix + if (keys != NULL) + message = StringCopy (message, keys + StringLength(local.substring), NULL); + + # Get the message without the "fsckd-cancel-msg" prefix as we don't support i18n + substring = "fsckd-cancel-msg:"; + keys = StringString(message, substring); + if (keys != NULL) + message = StringCopy(message, keys + StringLength(substring), NULL); + + local.label.is_fake = is_fake; + label = get_message_label(message, is_fake, is_action_line); + label.z = 10000; + + setup_message (message, label.x, label.y, label.z, is_action_line); + if (prompt_active && local.is_action_line) + hide_message (is_action_line); + else + show_message (is_action_line); + +} + + +#-----------------------------------------Display Password stuff ----------------------- +# + +fun password_dialogue_setup (message_label) { + #Debug("Password dialog setup"); + + local.entry; + local.bullet_image; + + bullet_image = Image (password_dot_filename); + entry.image = Image (password_field_filename); + + # Hide the normal labels + prompt_active = 1; + if (message_notification[1].sprite) hide_message (1); + + # Set the prompt label + label = get_message_label(message_label, 0, 1); + label.z = 10000; + + setup_message (message_label, label.x, label.y, label.z, 2); + show_message (2); + + # Set up the text entry which contains the bullets + entry.sprite = Sprite (); + entry.sprite.SetImage (entry.image); + + # Centre the box horizontally + entry.x = Window.GetX () + Window.GetWidth () / 2 - entry.image.GetWidth () / 2; + + # Put the entry below the second label. + entry.y = message_notification[2].y + label.height * 1.5; + + #DebugMedium("entry x = " + entry.x + ", y = " + entry.y); + entry.z = 10000; + entry.sprite.SetX (entry.x); + entry.sprite.SetY (entry.y); + entry.sprite.SetZ (entry.z); + + global.password_dialogue = local; +} + +fun password_dialogue_opacity (opacity) { + #Debug("Setting password dialog opacity to " + opacity); + global.password_dialogue.opacity = opacity; + local = global.password_dialogue; + + # You can make the box translucent with a float + # entry.sprite.SetOpacity (0.3); + entry.sprite.SetOpacity (opacity); + label.sprite.SetOpacity (opacity); + + if (bullets) { + for (index = 0; bullets[index]; index++) { + bullets[index].sprite.SetOpacity (opacity); + } + } +} + + +# The callback function is called when the display should display a password dialogue. +# First arg is prompt string, the second is the number of bullets. +fun display_password_callback (prompt, bullets) { + #Debug("Password dialog setup"); + + global.status = "password"; + if (!global.password_dialogue) password_dialogue_setup(prompt); + password_dialogue_opacity (1); + bullet_width = password_dialogue.bullet_image.GetWidth(); + bullet_y = password_dialogue.entry.y + + password_dialogue.entry.image.GetHeight () / 2 - + password_dialogue.bullet_image.GetHeight () / 2; + margin = bullet_width; + spaces = Math.Int( (password_dialogue.entry.image.GetWidth () - (margin * 2)) / (bullet_width / 2 ) ); + #DebugMedium ("spaces = " + spaces + ", bullets = " + bullets); + bullets_area.width = margin + spaces * (bullet_width / 2); + bullets_area.x = Window.GetX () + Window.GetWidth () / 2 - bullets_area.width / 2; + #DebugBottom ("pwd_entry (x,y) = " + password_dialogue.entry.x + "," + password_dialogue.entry.y + # + "), bullets_area.x = " + bullets_area.x + ", bullets_area.width = " + bullets_area.width); + if (bullets > spaces) + bullets = spaces; + for (index = 0; password_dialogue.bullets[index] || index < bullets; index++){ + if (!password_dialogue.bullets[index]) { + password_dialogue.bullets[index].sprite = Sprite (); + password_dialogue.bullets[index].sprite.SetImage (password_dialogue.bullet_image); + password_dialogue.bullets[index].x = bullets_area.x + # password_dialogue.entry.x + margin + + index * bullet_width / 2; + password_dialogue.bullets[index].sprite.SetX (password_dialogue.bullets[index].x); + password_dialogue.bullets[index].y = bullet_y; + password_dialogue.bullets[index].sprite.SetY (password_dialogue.bullets[index].y); + password_dialogue.bullets[index].z = password_dialogue.entry.z + 1; + password_dialogue.bullets[index].sprite.SetZ (password_dialogue.bullets[index].z); + } + + password_dialogue.bullets[index].sprite.SetOpacity (0); + + if (index < bullets) { + password_dialogue.bullets[index].sprite.SetOpacity (1); + } + } +} + +Plymouth.SetDisplayPasswordFunction (display_password_callback); + +Plymouth.SetMessageFunction (message_callback); + +Plymouth.SetBootProgressFunction (animate_progress_indicator); + +# Plymouth.SetBootProgressFunction: the callback function is called with two numbers, the progress (between 0 and 1) and the time spent booting so far +# Plymouth.SetRootMountedFunction: the callback function is called when a new root is mounted +# Plymouth.SetKeyboardInputFunction: the callback function is called with a string containing a new character entered on the keyboard + +#----------------------------------------- FSCK Counter -------------------------------- + +# Initialise the counter +fun init_fsck_count () { + # The number of fsck checks in this cycle + global.counter.total = 0; + # The number of fsck checks already performed + the current one + global.counter.current = 1; + # The previous fsck + global.counter.last = 0; +} + +# Increase the total counter +fun increase_fsck_count () { + global.counter.total++; +} + +fun increase_current_fsck_count () { + global.counter.last = global.counter.current++; +} + +# Clear the counter +fun clear_fsck_count () { + global.counter = NULL; + init_fsck_count (); +} + +#----------------------------------------- Progress Label ------------------------------ + + +# Change the opacity level of a progress label +# +# opacity = 1 -> show +# opacity = 0 -> hide +# opacity = 0.3 (or any other float) -> translucent +# +fun set_progress_label_opacity (opacity) { + # the label + progress_label.sprite.SetOpacity (opacity); + + # Make the slot available again when hiding the bar + # So that another bar can take its place + if (opacity == 0) { + progress_label.is_available = 1; + progress_label.device = ""; + } +} + +# Set up a new Progress Bar +# +# TODO: Make it possible to reuse (rather than recreate) a bar +# if .is_available = 1. Ideally this would just reset the +# label, the associated +# device and the image size of the sprite. + +fun init_progress_label (device, status_string) { + # Make the slot unavailable + global.progress_label.is_available = 0; + progress_label.progress = 0; + progress_label.device = device; + progress_label.status_string = status_string; +} + +# See if the progress label is keeping track of the fsck +# of "device" +# +fun device_has_progress_label (device) { + #DebugBottom ("label device = " + progress_label.device + " checking device " + device); + return (progress_label.device == device); +} + +# Update the Progress bar which corresponds to index +# +fun update_progress_label (progress) { + # If progress is NULL then we just refresh the label. + # This happens when only counter.total has changed. + if (progress != NULL) { + progress_label.progress = progress; + + #Debug("device " + progress_label.device + " progress " + progress); + + # If progress >= 100% hide the label and make it available again + if (progress >= 100) { + set_progress_label_opacity (0); + + # See if we any other fsck check is complete + # and, if so, hide the progress bars and the labels + on_fsck_completed (); + + return 0; + } + } + # Update progress label here + # + # FIXME: the queue logic from this theme should really be moved into mountall + # instead of using string replacement to deal with localised strings. + label = StringReplace (progress_label.status_string[0], "%1$d", global.counter.current); + label = StringReplace (label, "%2$d", global.counter.total); + label = StringReplace (label, "%3$d", progress_label.progress); + label = StringReplace (label, "%%", "%"); + + progress_label = get_fsck_label (label, 0); + #progress_label.progress = progress; + + progress_label.sprite = Sprite (progress_label.image); + + # Set up the bar + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + + set_progress_label_opacity (1); + +} + +# Refresh the label so as to update counters +fun refresh_progress_label () { + update_progress_label (NULL); +} + +#----------------------------------------- FSCK Queue ---------------------------------- + +# Initialise the fsck queue +fun init_queue () { + global.fsck_queue[0].device; + global.fsck_queue[0].progress; + global.fsck_queue.counter = 0; + global.fsck_queue.biggest_item = 0; +} + +fun clear_queue () { + global.fsck_queue = NULL; + init_queue (); +} + +# Return either the device index in the queue or -1 +fun queue_look_up_by_device (device) { + for (i=0; i <= fsck_queue.biggest_item; i++) { + if ((fsck_queue[i]) && (fsck_queue[i].device == device)) + return i; + } + return -1; +} + +# Keep track of an fsck process in the queue +fun add_fsck_to_queue (device, progress) { + # Look for an empty slot in the queue + for (i=0; global.fsck_queue[i].device; i++) { + continue; + } + local.index = i; + + # Set device and progress + global.fsck_queue[local.index].device = device; + global.fsck_queue[local.index].progress = progress; + + # Increase the queue counter + global.fsck_queue.counter++; + + # Update the max index of the array for iterations + if (local.index > global.fsck_queue.biggest_item) + global.fsck_queue.biggest_item = local.index; + + #DebugMedium ("Adding " + device + " at " + local.index); +} + +fun is_queue_empty () { + return (fsck_queue.counter == 0); +} + +fun is_progress_label_available () { + return (progress_label.is_available == 1); +} + + +# This should cover the case in which the fsck checks in +# the queue are completed before the ones showed in the +# progress label +fun on_queued_fsck_completed () { + if (!is_queue_empty ()) + return; + + # Hide the extra label, if any + #if (progress_bar.extra_label.sprite) + # progress_bar.extra_label.sprite.SetOpacity(0); +} + +fun remove_fsck_from_queue (index) { + # Free memory which was previously allocated for + # device and progress + global.fsck_queue[index].device = NULL; + global.fsck_queue[index].progress = NULL; + + # Decrease the queue counter + global.fsck_queue.counter--; + + # See if there are other processes in the queue + # if not, clear the extra_label + on_queued_fsck_completed (); +} + +fun on_fsck_completed () { + # We have moved on to tracking the next fsck + increase_current_fsck_count (); + + if (!is_progress_label_available ()) + return; + + if (!is_queue_empty ()) + return; + + # Hide the progress label + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + + # Clear the queue + clear_queue (); + + # Clear the fsck counter + clear_fsck_count (); +} + +# Update an fsck process that we keep track of in the queue +fun update_progress_in_queue (index, device, progress) { + # If the fsck is complete, remove it from the queue + if (progress >= 100) { + remove_fsck_from_queue (index); + on_queued_fsck_completed (); + return; + } + + global.fsck_queue[index].device = device; + global.fsck_queue[index].progress = progress; + +} + +# TODO: Move it to some function +# Create an empty queue +#init_queue (); + + +#----------------------------------------- FSCK Functions ------------------------------ + + +# Either add a new bar for fsck checks or update an existing bar +# +# NOTE: no more than "progress_bar.max_number" bars are allowed +# +fun fsck_check (device, progress, status_string) { + + # The 1st time this will take place + if (!global.progress_label) { + # Increase the fsck counter + increase_fsck_count (); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + return; + } + + + if (device_has_progress_label (device)) { + # Update the progress of the existing label + update_progress_label (progress); + } + else { + # See if there's already a slot in the queue for the device + local.queue_device_index = queue_look_up_by_device(device); + + # See if the progress_label is available + if (progress_label.is_available) { + +# local.my_string = "available index " + local.available_index + " progress_bar counter is " + progress_bar.counter; +# Debug(local.my_string); + + + # If the fsck check for the device was in the queue, then + # remove it from the queue + if (local.queue_device_index >= 0) { + remove_fsck_from_queue (index); + } + else { + # Increase the fsck counter + increase_fsck_count (); + } + +# local.my_string += local.message; + #Debug("setting new label for device " + device + " progress " + progress); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + } + # If the progress_label is not available + else { + + # If the fsck check for the device is already in the queue + # just update its progress in the queue + if (local.queue_device_index >= 0) { + #DebugMedium("Updating queue at " + local.queue_device_index + " for device " + device); + update_progress_in_queue (local.queue_device_index, device, progress); + } + # Otherwise add the check to the queue + else { + #DebugMedium("Adding device " + device + " to queue at " + local.queue_device_index); + add_fsck_to_queue (device, progress); + + # Increase the fsck counter + increase_fsck_count (); + + refresh_progress_label (); + } + + } + } + +# if (!is_queue_empty ()) { +# DebugBottom("Extra label for "+ device); + #} +# else { +# DebugBottom("No extra label for " + device + ". 1st Device in the queue "+ fsck_queue[0].device + " counter = " + global.fsck_queue.counter); +# } +} + + +#-----------------------------------------Update Status stuff -------------------------- +# +# The update_status_callback is what we can use to pass plymouth whatever we want so +# as to make use of features which are available only in this program (as opposed to +# being available for any theme for the script plugin). +# +# Example: +# +# Thanks to the current implementation, some scripts can call "plymouth --update=fsck:sda1:40" +# and this program will know that 1) we're performing and fsck check, 2) we're checking sda1, +# 3) the program should set the label progress to 40% +# +# Other features can be easily added by parsing the string that we pass plymouth with "--update" +# +fun update_status_callback (status) { +# Debug(status); + if (!status) return; + + string_it = 0; + update_strings[string_it] = ""; + + for (i=0; (String(status).CharAt(i) != ""); i++) { + local.temp_char = String(status).CharAt(i); + if (temp_char != ":") + update_strings[string_it] += temp_char; + else + update_strings[++string_it] = ""; + } + +# my_string = update_strings[0] + " " + update_strings[1] + " " + update_strings[2]; +# Debug(my_string); + # Let's assume that we're dealing with these strings fsck:sda1:40 + if ((string_it >= 2) && (update_strings[0] == "fsck")) { + + device = update_strings[1]; + progress = update_strings[2]; + status_string[0] = update_strings[3]; # "Checking disk %1$d of %2$d (%3$d %% complete)" + if (!status_string[0]) + status_string[0] = "Checking disk %1$d of %2$d (%3$d %% complete)"; + + if ((device != "") && (progress != "")) { + progress = StringToInteger (progress); + + # Make sure that the fsck_queue is initialised + if (!global.fsck_queue) + init_queue (); + + # Make sure that the fsck counter is initialised + if (!global.counter) + init_fsck_count (); + +# if (!global.progress_bar.extra_label.sprite) +# create_extra_fsck_label (); + + # Keep track of the fsck check + fsck_check (device, progress, status_string); + } + + } + + # systemd-fsckd pass fsckd::: + if (update_strings[0] == "fsckd") { + number_devices = StringToInteger(update_strings[1]); + + if (number_devices > 0) { + label = update_strings[3]; + + progress_label = get_fsck_label (label, 0); + progress_label.sprite = Sprite (progress_label.image); + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + progress_label.sprite.SetOpacity (1); + } else { + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + } + } + +} +Plymouth.SetUpdateStatusFunction (update_status_callback); + +#-----------------------------------------Display Question stuff ----------------------- +# +# TODO: Implement this if needed +# +# The callback function is called when the display should display a question dialogue. +# First arg is prompt string, the second is the entry contents. +#fun display_question_callback (prompt_string, entry_contents) +#{ +# time++; +#} +# +#Plymouth.SetDisplayQuestionFunction (display_question_callback); + +fun rotate_img(source_img, current_step, nb_steps) { + angle = Math.Sin(current_step / nb_steps * Math.Pi / 2) * 2 * Math.Pi; + #debug_sin = Math.Sin(current_step / nb_steps * Math.Pi / 2); + #DebugMedium("Sin = " + debug_sin); + rotated_img = source_img.Rotate(angle); + return rotated_img; +} + +fun update_glow_anim () { + if (global.anim_start_time != global.progress_time && global.anim_status != "running") { + global.anim_start_time = global.progress_time; + global.anim_iter = 0; + global.anim_status = "running"; + } + + if (global.anim_status == "running") { + iter_img = global.logo_glow[global.anim_iter]; + if (iter_img == NULL) { + # Generate rotated image for the glow around the logo on demand. + #DebugMedium("Generating rotated image for index " + global.anim_iter); + iter_img = rotate_img(logo_glow[0], global.anim_iter, NB_ROTATION_STEPS); + global.logo_glow[global.anim_iter] = iter_img; + } + global.logo_glow_sprite.SetImage(iter_img); + global.anim_iter++; + + if (global.anim_iter >= NB_ROTATION_STEPS) { + global.anim_status = "stopped"; + } + } +} + +#-----------------------------------------Refresh stuff -------------------------------- +# +# Calling Plymouth.SetRefreshFunction with a function will set that function to be +# called up to 50 times every second, e.g. +# +# NOTE: if a refresh function is not set, Plymouth doesn't seem to be able to update +# the screen correctly +# +fun refresh_callback () +{ + global.refresh_iter++; + if (global.refresh_iter == NB_REFRESHS_BETWEEN_ANIMS) { + global.refresh_iter = 0; + update_glow_anim(); + } + #DebugBottom ("refresh_iter=" + refresh_iter + "; anim_status=" + anim_status + "; anim_start_time=" + anim_start_time + "; anim_iter=" + anim_iter); +} +Plymouth.SetRefreshFunction (refresh_callback); + + +#-----------------------------------------Display Normal stuff ----------------------- +# +# The callback function is called when the display should return to normal +fun display_normal_callback () +{ + global.status = "normal"; + if (global.password_dialogue) { + password_dialogue_opacity (0); + global.password_dialogue = NULL; + if (message_notification[2].sprite) hide_message(2); + prompt_active = 0; + } + + if (message_notification[1].sprite) { + show_message (1); + } + +} + +Plymouth.SetDisplayNormalFunction (display_normal_callback); + + +#----------------------------------------- Quit -------------------------------- + +fun quit_callback () +{ +} + +Plymouth.SetQuitFunction(quit_callback); diff --git a/futureprototype-theme/plymouth/logo.png b/futureprototype-theme/plymouth/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..de145d5041bd70417a8bc55e66810d6c3a720163 GIT binary patch literal 20919 zcma%j1y>wP+wCAhfj@Xp9SXbAWL>mnkpiU53hBbbH* zzau(IX}N$vs6Fp5sAPIn0^m(Nu(&2z#lalxX5?%Ja&vQIva+{vF)?y9V{&k|$T;J} z2Z2aI(qh7@?wKd6Zn~=dOYj%#nR-0oV05S|!Ecf%#zn!-zM=sm+_VOX>paZ$aviW@2F5W=?42?5% zi~LzTOKI}V)QiLAx&fu|fm2B8Ua5<^gw=8B8$mOVmjUBM4$Mm<@k{3f$%YRI0zwF; z^E21_{7Z1SbBrYx8llA>>I2UO^izF`iPxQNu^Nwv2uSU9mn_A8;6GR!`u%#P){d?Z zOuNNeFS#^_SpPhjr^#T|Qek4k7^3q=iiwdq2(YtcE zoi~q;W16`Bq#$*f{=&Z;AW6J^EnOkFZLS5_)w6us_E}mY+$!Cqi-_N$;^SxeCh8Pv z#FK`6a2+(dnv&Fd6Hw1IT(W!6iks*OH3=FxG(?}O2$L?P8-gXNVOc9OprMpO#vPLy zhiMFQtlNA)*~mW2wR2N&vnn3?hd<;6D~jQ<8mF|bjq%7-_J3jVCGs~cFgY?(@Haui zf~aTI@5$eYq=gG3=74D#%9Pz6{? ztd(Xn5mh`ogBLl_m$+jO>Yx(L_uB?}0R95$-)rj4Ox>YOzvxUDra&Vpx#t;rpF8w^ z8k%+qt6PZS38zr|S72&dhlb%iN?qrhU45e{bCwVkPebBu1Z5s#a`3~QStn_;F`3soP-65%Xv!pT zu0rD%jFQ)!T7&HxKUM?N=w%?-blxH&q|?VFaQki`M^zqTW9%c`eFLHKb=mdSdL>}? zH#D0%X&0B5-9J&$f;J^U+6CKW=F(_mujs!FJZacj<$-I!z%{{?BJOf?$d0e1FjTZe zC{;AH(U*~x{cq9z%0MLXf`vd$V4&A>RNv^1Z^v`Ab$sLHwaPgyL8owxwD}= zwrvA0$;F^JtGBM?V0{!2Dy`=fG~ zM&rc+WHGubwbLVQstSDy56;xNFK0|jLAMgj@Y^NnLXFOLWyLVY-;E3Mt-yp#EZEMo z^=z}O)}ST{HCQ(mvuy|&FLk42_8HPe7=)aI zLtSU}%oTqB`7`JYuobEMDms>z<5RUIH!J!gz%DcbF4F$}0eOWDVPOsT)Zkq>ddh5J z7f>7?(rnUO9;7Ym z$@GhaM<5$TGu|K~l+)1;+2@rY@9t+ zb@Sz0H|I}E5!2{pk%Lqf&(jT~-v)K;*^Pq2`Bur591AAn4IeR_fl-dzgsmYn3cyL{S<$|hPX@qGx9*RHCS-X>?K@87>S z1G9jUfxsc;RCffhe|ttSOnJY8sq^ojpAFQ6@(<+-he|WCn7%j?(Q)^ahl@O@0wTbD z$g+kuPSbuiT8z>bz$mlHKs3;aKXWFr))T8jqS0L()16*M{ujsK^VGo?C0Lu=6*&X2 zDagPgr6C!N1!wJ_hf@*d>hTbTM`u4Vv%Io_ynx3K4ma-Z*zD$rUQ+66 z7ZU@ow1QG#Cg_Ne$a-k-S$aGkK4>HZ&!^0T%bpwjh8C}U85dA>FLcg>=QE-Ewm5|lt^ACRZ!~2=waq_%X0pkum8F&!{)<04X?U?OT zTPwsK2KI4s5DeDKN*H&kLoNiekA}8saR!d(3BVs43fH$WeZ|1fQK0PaJg6e!fw%<6 zSm<3ckv3|H6-wU=$gNsGV0Do|?Qnrtr3P_WQlZF7!8^yiw^?!dv z%sAM^(N@>aoTgylACPdK)DOQFC@0n?*>09X)C8Or~;Vy$ljJ(l(<-uVSl1ur>Vi{ zhqVEhHeVC45|dHIK4QmTgvI_mEts@M16`;Au_wHjyYw^5R!0T9MKbE|<`G{MK_Jr7 zTh50c*4)V9;eoC zvbs3HUKCC_p^JEeLTMb{CNihCGAU%jj2UY5y3v4Ol16Gd1=8GsLKF$7n}xBpl^C+F zk$W_6{5{Ql$Dt#f|3dt}Ooh7$2Yz^*Oq~jcLeWMki0y7(r@R|{a_>*dkAY-2b6}vt z^U)-2H9^5$Zbh|kk%Xmt0g((lDClw#Z!qE*cueFPnefyOi}KcZ&Qb{IJ>((6A~zTaTNVDu|A7$0bn zA;1FfXoS}*gR6u#Q>K|T& zd$J=2n(qMls|Hw9`VvJ5A|hgXz6H1$kLCNJX1GU9^;BMY`AgooZCN?XH!zE~j*hZ- z)2CVXx{u+%&_Rr|-o4Z$&$#nfEE^Z!DmJXbkr`r$-m)F~w!x}Sp zm&H`6rMiacHbTOajqP110}{n(JiORvtX|ER?fJP`3VwPV-!_4ZD=>@+^6YFK zO=X#cv=z6E%<$yQO7zK!_f8Itgq8=TtzDV2ijH5eub__uVx(eDZ_26Fg4+d4`FWz> zQd)eqdHR$vSfUP5keu$!mE|r3FvDHeJ{DJ1E_;Qvh+@`mQiQ4J1>f5j?dQyY7$_+6 zf9t2ZW_$4hULK7n{6WYFH==L8KATg`IJhRo#bup?TWkw8f>^93VHDPKUqHW_3bB`6 zPdZb6Uk|po>dngj>-of`^Iv?^BX2?XK{y@OYxsiJ*{Pj6H)tg}HiV{sNG9qJmWktW zObx50kpI*s_|Kol4^OD(M#J^rzEGZv>iGmskzssr`~{sEW?o2@LQ6DUp!)NIB5&Il zZh;SoV?&NEr!m3Y^Tzrsb&fxr)OiT=Ya5RLYr04GeevOSEj(+tbwjTLKQ~7w^?Z<# zbfTT5d~UbiwN>IlHTDdGgWcHkU}N28{4N)F%m(0d)ObyDW?pH8CNP)<;`$Z zuQ_c8{=sU*{2Dg#&j6<6fkM217RS)^d0Rq~hA46i)ogDgEZOhZpGLf(M|i`NVua{$ z?|GCoHWzZ(&diT>bmvOusP+ao(Njj~6f9%wii+~ynulDV)_71VW&6+MX7f4|0~h#zQ00x zL^TWoqNbFCp`Rav*Ea1)IzEz(&G4c}esF1jTp!?L1A@xYHdN8VCMsC?_~}WgQDFIv zjtwA&IshTb&qcHv?XinxsU1_Y0QH$L~~62*b~y1H#SX}n0q)b}_)O%*5U;(~N_rI>fI zW2HJflUMTi{5Cr?lY3a1SbpbPKVd!I?)SH@F0`nbenr=-yL|hrwv}_RMBLTYvq?eee4CPD{p&CrSSoR{P2+t_ zA7yj=aIq@!OTjdtF=m~z^|W9#!8eQovl1FLXFLaHH@U1&LH~YYeO_$@f7$0EcDJRa zE4BU<6`&gp<7QS^re!q5DxZ0gihwcsQxXK5;i@~O7aM!$em+ah;+)1qr(v|47 zAgX@HS|G}bV1nFDA%f0ngGtpN8x#{$H)uj5pcfc|#ut}R?VK1V&(jrW{#z^^Swp z2=*1i%FAP<`vtVT;oKN}u|FrzQW2$s1247S>k@g6%s+6@{y;i31x*$bCW7NC0!9-G_BFWIp&ldkG{nOv@N8jVHU$TclfGrxVo7Pug^wgv{G zIz(0+l9Fy&QqBK)QpE6;&i9kWf=$V#)cwQlZJ))kzETA!n1PTe#b*PROnpHr3cGS?=lns1L3jAz7Btcs z)$RDR!~J#m9A+;J{p_Jt$;3=obWu_G%{Jb>e7&OXvzMO=7h38vC0_JDpi$#Zb0iAR-3H6%E78Hgh5gtPw-@5(_RI z-PjNR$&WH}=_>^%Ou5i7mUjG1a2ep$56{g1z;8~4&rXHO%>M!c+$h7eg>iZMV!_2h zrB2@L@Fp5%Oh#Xi^j?Tc8iFx-ISk@6jI5Hnzj1c%(I9CLe0_OLH*INpgnPd0cYUrh z!*Pzq*4#nXX8=N9%hS;|0?OA>;Ty$v-H14iXVZi#DT{?>JlfJX#wQwQG#2xbTK!S& z=4lY&E^!n%t}gkrfbTtbba;~Au6)t7(QIYLb&*@m!&ra4hu?8mMaSH!cg|2MX1N%|=X zxKWY|`XW|aoZmqasF2Q>BQFVza~z-IVY(iZ=dHtUq;$7 z#&{c$R^{@Pvu|bQ3zn5!i*@wL5B>V{rKo*_2asssAM$!uU)@{ywU+~e#r{TGBPt28 zl6-Fo#h#yzVVN((DHr`QvVXS;IfrHi<3o$W=qoaOW6DepZasl=X0yhOdBgNlORK-y z)Zp!cUf^NNLaQGgHWVkPjl`9T=|PA|lf}4)!K;xc)lRy9RS<&BvO=oy_WQ|`o7?yl zZI}fp%xq0E83cmtc<+DJmJzPMwxEWH7nu>1QUh@ofp1k0gM2$>R9^vg!us1ntDs6f zt5lKgExsL)FJc+quFQB5dOtA0X6-7~@!Cg-GE*PA4IkYS>LgBGtd1Z5=kZ1H>eZ`B zW9=1LU@aS$lSibU)&8d-(lG}W*_&9Et;v6}tbI7p5QUVs-2*UW;U9WdsM+u&XMAY0 zjl*->mC4}njXAME=JWhT2K&C+tUp@?2x;V{rD@x%Jl{2;v;p|mRxt> zlv_ng%UuJ54TJ}UakqFC#id9#{X|E5`Qo*IeY0MCT&bEfAT*SU?|J9g($X@?E}E61 z8=al%d;P0)5$^o;gEN>xwrfB7&v~_qb3l1HN<|KvR`sjGr|d2iw`X_*-yEp|47mf- zOT3nwy`t*a%MJbpA@ms!zxC&t6)FhbAFNEXQ@&aeMyK1rwpUnPovAfGpgn^x_E1`epkE?D@$1nPx4AM^7gHnD2<@h-Bi&Fh= zEg2ciAxjE0*M34fQu4RWu(&u9)KKB?chbn)CnvDfl3`5Dw{5u@HBTui>U@tk84yY* zlZHpKDW0UCK_nUu|CPTzT&kEIXMjULgv2y6$qf-x%0uKNYrG1?kcpxLyHp1FylbZ| zTKHBSM`5?;O^%NVobJ12|N7vps{WC9F9LSI>M0QO`X-s4`-E?%N&E+Hh^>|7iJm?q z{IIZ~Nx|}qnb>DzF~Q|p*woB&BlyqQ z($Gh?iY!v;^&ZFX%<-}*Ku@uc3N>L+@*2LW>v`V=^X9V~$!iuG5(aK;TmKo_N5$|s zJ`A>=Lw;`aDEji2CGg}qD_(c`w$Osr83f(D%8U_Vq~s13`A>CKT0=YF@{g*FFdk*W zZr1D1(kM2d_v|2G7WgQP{`S;b^#||%ZU1xnVg}+Ew}9p=OiFvZm@03ULfA5nVAS26 z>%#KlmZ1ddSW1%7U}6*$h`sK1p_>1*eMPG>*>p9=A?&o`2hu?Up+n5JY{j6FR10(` zks$buu<>=4CLdWF0%FMdcfz5OcosVHhF19MzxP7e5^*fgJ~{g1%wBKT$0WCd!8Dsjktwd+{8nvCGMQL1@t9qbCg4Teg3iZkZ}&Vu4n-gJl|m z|3}Nxa3GCS^~SO{y)3^yVd~TuN#kO$7TlDrFf|XTB>33I5`cyZ~RO81RC z+pe^HkB*in;malxa;>z6nSD0r^Z^m~`fDxfdgZg;R(SXypSNL8HU4dg-ox!g-lVwD?dLX33GC+>^!iK&FUs6MWPLK8smTRgha-*0r%u zt;dcH^tW4se(N9TOW*ujQ=9hD$5OJ{JfVfZ{Mt{L5k0)~>-_8F5`@=X^Bq?7cNJh? zVsS)NO{)=ID()Lq1(tSpiDY!wrWQ6Z@bF#>nmXM;mh-IO%!vHu$sd+c$`%?zpgugY zwDj?MPdDoCL}ziupXR?`dbkZ89N?+py*}lnoch{1QzF~9`GooU-Kn~oxiuZ$F%b!O z{64!A{%vAs7D7;w!_=fFDoR1@arEQcx4V(bv#~J+Tx{Y%42)b{d>-^{VtYpyr%*e1 zx8@WL)lGL{jM!ZqGTwVG*HeMwrPQB(wre5F4zX;IhxUfEwJK6#!SXf7&D3QFg8J>v zCu~x)aWbu~FM896r->l&aWx`hz1dO!FxUy3wJXUcZ^L)cKB~fT?DA&#P1I--?`Ph3 zVB)-TjZ`09%;m%&6P<8s_#Z%SoH+lQ8+A3W?QLxO*MhVbn)p%tY!^d-n84kQ4b+3u zJG(ib^jOAM>o|42?wgcKHqQ+#=hW3L?eZP`hYVRk0*4A{tBR0l@yP)CX)M^>?t%{{ zb7vYaO?cA$#R9RZMFeMUj8H(+MQgE zEt?&l##$xRq;4JET8lZx@3OpDogwJI&!kho@)`d-ICGsSPp$9H+k)vJTQ5letwJ=* zetCV{7cS-GMwQ8}6M8T3s9y3{wLCSEg1G4%`}uAgK8@F_y4ZAmVJ2F|LMA@d4|7rS z8i?ATWQOS`)+(A0xHWJr81&sKILaPzIjKijj=(iDuIIxnC954!uQ>MrRDvNIRDckH zTVw!9gV^sb+mBu}`dg;2X6TauP!S0y^fAX5y_<)VLk)r!hRX&)x08UewAJ&U4t0QDa~p9ROKEbJKVSXa+W3af$IFH!*S@9slrS-6FUBDWk^$QALv4acy;jU6(#VWy>sLqU2M z?p9?Wp8R=#(gP1yS={ii6hGnxZRjX6easCkjuL=1%G!M_`B$|F*e(J0YuaG6)0PE8;Z0ia>+MR2 z$u-lUz65~wky*{_e>q)30xWd}crQVf zu8n{fLlYC9N!f$dr>`tOuH0oHAB|ePxaSW(^c@q60;+=lrv+d&DZGVte9*EbZ!S5) zH`V(N?KU=I6MaO_%SrNtN}NK@pyuS}(iw@SfAVb+2dEWH##>{K9ei+Y{MMAe3w!;eU51|OwsdtdBL1ACWfRz}b5+A^_W!H$oT?X~MyTv8!yIpH7mT2@dOGiF5- z9wdnzA@BIDzI76@UEGEj4wG<&eCt$d(N8(h+3|08@PV?#?d>d@O~FT5_V;qG7oOQz z37%IaJzeMGOmf|D&F-yl&+ZRZb7BL4+{v!LBA@%-pk({r*xxvReLOEyj*ZBShljuI zCphI`2 zB{`qh%Q!N=LWOFB=TXA(u{;*{BaYvC?Cu3(@>DE7haVXOjng}-x1!ra^xttT(CgIJ z)e$^<+m6rxIPQjF->w@OP%Tf*;(Xj1fvnhoff6r-U^zvqzq1o{yDz*lLq!t|*REGx zKE3h*a@%RgIofz~9VhUH$lP)lU!oB1Jf{48?m^znIa)(Y&E(>`9>9zF8SAG7D8XFv>@0j~C z+_)l^Ke;jaS_^^fJ{Sstm&&?jX@Ewi#tO9Z_>IQcA?NnuMmJTZm(Jz?kons8_ogw-@w6wZf!bjuJzBB-+oN}+IHuP} z0+4IrNkdxBXW6_-%Px>`A znpaDbNySWL9GeZbwZ_Y1{9naIo4OYWZC7M<;5>~=p{urg&s*P~k7vJ%PA>gzTmD9`Df)74I4;}P2{gtORR5j$eMoor5+hUOs2)3mQ7>ZtzO*kr}tH#wNtS+89ChgC44ilSD;y04>#Gc z6s`b~6B4Yl3%>!n%}@8sN&NJNTKE-=j+HgMqK3z9g zj0%aV`~2+PY8D<2hMzuuim;>b4ITe58H9dVV6hwNDR8ct%NIbiac=VVcJsn~%vd28 zJQMwMQ!(c&lvn*r@L$x(VvG<(&q;&!Xemfb&H;y*^X_N0JWO3_t&r%+v^k)$W`11% zaf<@+nMMuCVH&*VaqzEg{Qe4dgh{n(*5rm))%r%97-o z8mv5K4?n=qInyl(%u~TU+ig$lBFQd>(lc}(>5 zEr;WufZH&q&f$HXd5pO^l}^SzrmjaEz3@V)x}BJnLdUhwoskpJgM#Pl0wpGm81|zaL)dB||caQSQ$_n1&4VFx!IG`eb$a z#87TL`RV9NlTq`R&sx}DtH*oJ)W7p;Xjp*!V`5@3%pg?Kq($vU7Sxdg!Wl zIpBcLw(`iVl>pbj)4@Kqwc}}l=QvOMca3133V=btzDmfJ-oOud^4@=iEVj4vn-jJ@ zM~dbVi!}esWT4wbBDCM?B6FUyM$t)Rtnnw}$tEUxJ0KDyJ9D;oxj0p9&;50gwDaQW ziQ9&sQT>FTo}t6AXVzXYg`}&hfPIf0#_HDb)w)U(njQx0wbA+dP4;-#<6*o`e_Yvh z%y|sw*>1F{y!wU!z#cDZ)+=?<+S}H!RlEkjv$m411Fnl~z+S730^9jlCN$+Q{Cea3 z?(w+VEW1P&@#!D$7JlTm+mgb;>Lu44pHkTLmUNLK` z{%8eAjU<}@FnV8JKjrmHiAb=KHIbi|~Z9n`l{umuKJZNkIxtUU@>^b>UA52Na zyF5(aSzkZpDlGZ|?xwfW&o->wZeE9N{dHY~>qp_Iu&*wE_^O9kshFsvo^D4ir6n1W z_1fVXwkOmiBV^EF7ZzpOeI_y0)MtOSu;oWfhMTlZE7CoqTyJ~7_XF53fjBoqjL z^lg3>kpy4tTy`ds^+91NFsMziG&q+t2FMV0P&hfYKO9>O&~XWg2$^IQ_C_Z3H2Uz3 zgu2Fg65u5zy@33x3mHkn=j##U5}O@Hzn@BpIL@T0Y|F*qiFf;1qO9j*5|)Dm9VF|} zt@vNbs9>t*iK#9}RYOg0TKuM-fEx`3{Hu?Tl6TWimj!fw7EeiUk9=2ec5Oj$C1xmb zSXJ;MKPV~L&9_4)R>Y*R1Gm{RF)6H>{#&5;x+;|(f5q?*NME7(iPU1;-d;)+n(p9J zZxA?agw0!fN*Pg<`M5qQ*uXP{pg9o!p3~^d)K7ql0CkGz zrbGh6BxyXq@sjN8#}=2B#WONZ@f*8TFR**3ZQ*P~s@LuYLgIrobvduX40)UH~F^clpXxpX&JumS<*XD^yst*$j zK*Js#7ULv3NQaq2jwWXfHrlnOc1asOsCk}S4E&i}_(%8AA%8E>fm$(YuAZYOmLw)` ztET$J%{ba!G8hhp<={cF?YXgge05dV@kX`h^ zt(zG@k*gHuF1y2EBbqiutt@26HV1LmdJ*xMcp`Gx2RBS}GTfl8yqI%VVN$MN`@13@ zk0I<^)45 z#N^YW5p$xR>_m2^?KehRQxnaS1t0CY?-b7WvjpAf2#HSR3F9AOA-AjtjX=9-D=l+; zG46TqEJ9hn4ulzg=fMBLX^(w4Ra66K&HKTJ z{KhlZ2OiC>$u^(uTK3%QBa^eVJ%om$1}nG;kj>3eRcn+?amk(9rDD zX}5x3dxP*I$Q|4;gaL@-=-DVNR^t&l-R3c#HlCTc8p}<6(ON6xaUZz@Gum&9UE}fB z5!9%F#wMm;4F*Wr?BV0^|TtlyC)oR!Z2#P?iMAn|WymG859;SbObQdn2 z-FQ)KI|lP^$G8+3Neu{T^$GgaBgYB6P*IIFVU4%cBHPT_iR-^g1BLK5FqaOSbKkW? zUbx1G``gaaalw_t96tbFQJv3h?<^@VC!+OYGQfXVWYi_Ure~l4LDkTb^`9I?yq=vN zzph?pB?Q?78RqGUq9##Pc8>}WEF_xr8+Ff_mOcK!+WYa>oEZT++v`Ms1w6l9og7+G z>d^5h&->SR8WpsUrh@mVFOIq?3b*|-pL0^HTB~2#?#TU+%)(MTq1S01#KzrV<~$+5 z`1wyc+lgTRK|GP)4^BzOa=U}sVZD3HJ?(Esp&x66oBOtrcvL;6ke#No5Sb4OwYZz-3ip# zWCO^hR;~bX@vZ|<=j6`vL|1R+t4zepcT7HX*nm7Gt z=EZZlfr_YuH!EQk%R6pC)IT3c7Dw)~h~wb-W!xp;XuyBo4Q zqiv|c4=3=$eq8PQ`i2n02Q;ei*tB#YjmSW($<0I2K({e_jSY`s$?X(&20YpBJ4}Ea z0QWtg>eo`OPD}*%zIotTygpJo(gH-V_iJa=#q}+R+Cl;nF=04~pdU=Wr0xSH-#(!O z(-UTnU(I8e#fPt-tSE-C#P&?%Q`3-Yf9I2n7s-h6ug}JN)oo>Nhs+Cz7z!DTq+>?` zA_@TX?4utSaG(6DW~KGv%mWgl@W$QBzk0bV$qeW+22^w1hJQgp;nc4x0Ch9~Qq&F? z(2jBI`|MvwMdnR@kKNt!bmG=h?V1OYkeUK^76;_NIH1}x>PuBl%_{8yoGDfkd-Wrb z`=pjL0vIxB-Eo%yUy8v2xbd=Hk zXtKEq=)IU2%zj7!6xyH-3101bwkDkLe@>y5^T(EKK>CHpxP z%Gmsu%}kKER?7|#dUppU|4X`NKjo}o9`v3xoT&y zw}damdp(PDV<}=10r{f0#9^(s|@bO--O-CrZb;ZB+809^wwwqVo@ z|CL^_!i@C#u=Gq6U$^}vL{|KAQr+S0KX|Bxh{(tRbHiVPp^~Al51IKv{ISIJJpj8e zkDlxe=HdVDO44=O&|?HZfR?tlB1>!Fma7%f0Ul@M82M2Iz=*b{DFNKJyH79?kRE{^ zAD&zna`N-}3+0L9paNb8coM=M;gsQVD7TNcqB-@wKTQ{bTc7rF05q=y;1nb-t(?wX z!o|5#f8JbwXGIaC^afpAqGiE%{3XB+KRF>fK^BldI^K@xx%C?&jDJ2Nz>iPV0Re2i zDp0BdEGB>obsjVG1&%IHPYC{E_I`5D`*raN%tKUfs~D6YMAQ|Ad{#RS72umjB8VcO ze+I~2Y#kRP&zu1ooe@Y^F*wA%0Hz4n02DqD%U(tIhf&4J1sX+K%RFafNtq~T0i0Ce?eY@l!UK3Jze7Uk61@LB=b914q%E%y(2kOg-?Mmb69NL6Fi4g^7K!-`k ziqfMt3=4`CNqhVLx0g#pKVqu-qq|4bj|W>IT=vDp_RRfWr3#nxeNM1V1?mtq{#Uvb zfqV26pDX^eRuf|A=ckQbPC;R>X4H0vrHDYRqKmPqen2WUY1NJ&0|%hQ9XGUCjukDK z84U%-fab__e=omI-kVbTT{aO(6oxmi@NS|LhhVsM>1Rd2sUTa+v+pqFlC?Bw>|-wn zMphHR46UJEyhYea?p*K5zIE=D_WyX$)zRUl8f%;0$g|li0g8rfzb%0iUU%HY%Gkj2 z81`%rkHwIC9Hv&U%@`b#-r~(I1>%OfI*R)RL{s8H(bouLRdx0Jl0s}XwYrJpTSsTG ze`_n_$>}MJyAUWe7+K8n0_5)H>P;4r%eB7%vH19Ue|Voo%s|0E)rv=JBk*}z2n=X_ zBXc_OlA5Q&bj^LAzwtesHzRwx4wjM_+o3Hq_2YIEHS~}%fYG6!AAiNgQ3I<+#4vB*!H-X*KL(FtvTd5s-g$lUe6msIX0`J77-tgtI>@*?^*Y>M5?Q ztgZW=Ay#nwHYO%P>u*i9-BUzEBf@~1mL&w`cb=!H$|OVej%9c)BUBt1$BkN zc2-t44KV_GyuVgDblJXEcx^8pS)FRi(r6SHsep-!6SZLGT!>0=RM*!Rz2D|f#h>n5 zmqJ`{_`rNWR=b^)h)?U+Wi%)YfO8D+yF!-(n|8MU z18`_%0SH2{4LAXMT!SR8NHk3kbS_L#*A3q|cRL0fe)@-lxi2%CH->DnMn7=fguwgaR+ z(L}Katlj8*Tz`kPuU9*{B^C6c5?oJ3zh4Oey>F5ogRvHuQqs?ADj{25K(Hh=V%fiO`n3aE1|J%1Ti`$Vi!{|*Q0J~pgXE5{hK0Xy@X+GXLe|yf) zD{jqVe76QMP4qxGxI93v2EeG(hxKC>ne>%n0Ju#!I4bFB&h!;^A0K>5N|w55>mzY= zq-C6emweHkzrAK?_{Lty7%$08EorNBAJRE^P*bU~**)%?#7%cwU0>Y=Fb&)F8T-1$ zi3Z>!27T`rlM_Mk?`c=Iimn1IbvhyxPO zdoat(!w15Hl7^y&2$mJg#_UZJdtT~XOx7kdsGqa1mh$Ssb`c5Af!)?&-e@yud|SzU zzs}qf8W1zuP)lqV0!lg{aDY1c$_F7Q$7(>FD{}+~gQMA8Rm`ufC)qgi+cNGh(aZ@? z^i7s99{|mY*iD)d96vn*bfGTRhjMk8K3wagqscj{qn9}Gjm&L;WGVwxT+6O!ANC2W zwk5ac2rNvNb}ldOz+vj8;^JyQ;-2qCXCeal4YV^U&fvb_a(9z_{nDwutfK+HG4!D+ zLfXUgpYit5u7q0ePA0&#z-8+^LJiTEn1+veTh`%66LNe?H16L50v#aA3DK|Y2hvWw zUmos>w)W}y;lGCeLdOp0TY=WW-3($*>e zVB5cg@?tya`O7#tOr4Bwf&uC2Jc#*U9iV)DSop|cySqeL01o5@+I!P*-Klc{KpO#u zU&&xSJhKJbcDWIN^HC=r`Qy=LfwM7o3mOly;gto~IH;yyWgsOrPBtK>egYRx2^oSTbHnNy$P{FYY?VW4y;CmE}W zwzCFzSwx#D{}H%dtma3F;|If+l|{cQMqMgXubMg4a5^TGEHE;5|USa=7wgb~N}_^ZCxcmI{+EB&U+ z80}{1Oo>6muY!Wv;(Dw+iH$0Y^}Ytd^6r*@e=sE_5Lofg^}EjJbh!KKnmZ1DMc}K= z<ZH620?(2lc*fYXHy4dGH*qfOZZ&<=0yx}&;{P$W zc;>#nto>w7Lv)qTfy)1S8I5)kEAQh6zg^w@A8#>)`9Hkt=xF#tfEXNY&Fd+Ko7X2M zLx@4vW4Wq32K7Y>g3Q<0?1TQm@Mc{wY4`TjaVjzIOC2mF7dZH%0jn+BCT1N~#5C38 z3!2xR1^z6@UjqX*gDZI{#k}oD`~4+*>gSQ9WJ$dL)>nPQy#=%{6DRFRfco&}x@egJ zQCV|sbEa-}tR^9|WYWbpA&-PSF1jpVV*CmKFfXpy&_wcc3y4ILy13R!#RaDb^FJ*} zNI#NQd%Pu{N3T_}eFLKd@N_Z1LVA%>jy`vVKs3^ z-Rhp4is2&Z<>^aqGL!LN5Cz{4k`gXZiW`Utka*t(DRX|!Vq}zbVS5pv79*2}M=i5S z%A**hGhrS3qGdvUMJu2dNTTsV*0c(wUZd|Pnt0^o!Qc?tT3>S6{zl8vIwn_9rUqjoisk46gm9is)xpT%>)`^r5nr8Vt20 zJYF7f{|yUT-b9W~7k)}_whr$8>q_5n04P#E_2lJ+0_jc2hYzwyW3~M*vXY5(k!^t% z*<+G%M&0A0W$H;=Xt8NjY6DnUFzXm9v)^O5ZOyQM!6M#_gy3^YrBk z0MXXn0GV3v2kCwRZm`nRSo zo|aAo0b~jG+?HK+ohzCl0!~b&cszxD0bL|DIgq!yd{&#VX3tA;&CDd67#@Ubo-7yLA? zL0oEDCLpPGseDG0Cm*I}@G!>U<3CvVK!&-k-71k1%q%;)JhgT55h&OPLC?DfIZ~BP zg{Vd2Nygt#xPq1!mX=7rxs%R0tQdhQ6+{LKAh9{~|*+Ed_NuT!32PYf&WO+a*H(ksiEQ8t*nxi^5 z!G7R#%64bXE&^R)-?NBBz9^Mj*()ZMx-4S)YA+2@jWzB(Nky~(Q2NDyN@ae1#o7i3 zP&8KZzg>hRAl28JC8BS$+{LIC{Krdv-1>v~MMM#i@P3dRE?(cxj^8;htK(*HyAzkK zI3_U>22iI$?-O#&%>kNhT9>3?P2zw{FW^v&?Cz1lT(E(9lFHF8$=5_EFjD7^$6z-GU8EZIS+lv*^T-h>R zNlZ{H(VjkM?}h_h@PF4_q+S(C{F|JY^(0U;gZ!xR{qzoul2`Ul)Yeb;$Mi=TP-MaL zM`hm<)ca1t%YgM!QueL|PQdj5(~!)@+sZVNyz&)`!-E63@Sx=oI5eTHrt*oy+piLm z;UOC*L1lWS^TYhnCv4uJ3C9-rU#p)?Fb>}v!`HW#=q;7db?|50ji_aZToc@2++TY1 zmMK4tNf#|3Af@k_D%+zgWjt z3v-#R<3ju~Q$!LF--{?6o?||3Kk$*_65*jU(KPp2O+a+z`rr*5Z^6LB4hDqr7@RKT zKtBdBb>D=42N!2#Up@^-y2NEz^Qkzbm~XOPO5#d}NAy#EJ=kA=vzN>PfiMW)|1SW1 z4x<+o@!6Kl7fud#lh@O@NKZt$@DDth@zqp>{(~~3>9#0u%(@dUT0_2=)AS5HLA+;v z*hOREyomM=7E$x5&lz)f(s6xUYoUmV{DzOgX!2408laDI{7mtZmwzyykJpO+%WxA> zZJyYGf*hP$Y#KUHtC$8CFI}$9C9nVVR7$Magy~qUfxlUU%Dn|uu-z_*5zEVu0&T?C zE)n?d`TmR2=vKZ}7V8D{FXsZmeSK7T6ko*5xV$XKD^Ly#iRX5JMWTwvOV?5^%0Xjs zqwJ%evH^N!k_@-bf(9(0ApQ0)E47Fhi2mZfo3x)k=OnX=h^SJG17}B-jf`>!<8tW} zF5VCFHmv_=&C)~9Di9C9PY48>ys9cZ6Nyj)U7^vrIk;)6-d_OLPDgK}q_6y;HM>IY zOG+f;QjJXz1E=;6@%Ugg5LO>5|9AayEZmJ;Rb(+@ys)?}DSH9qK9n#(nJ#RHYl1to zP6FuFF91#3gfrgb}iGQmAk68z2M@$Mp&CD6db1 zuXCRIXV^Fd!`_}>JzQPUWim4M|Ew_slq0Od!NF~VB>fqB3Jw!j1`LY+_n zhm@`+4sR9!c|`hFV2~k8izq?} z*|J29ZEP|2Wvo$TiHCJcKNv?E9J_%zIDoAMl=E?{n_;I-l#luIu~# z@<{W_Nwj@Pkh*lR6$8M)Y#STt`|+Q>8#A*B$5)HnAw#=M6{ZdfN;XuOXYg<)rvv6B zg}y9B3WVHU`|X2xas;j)rVH^i|*laPmGk`-P1DjPmZ^V4G_T1kZ8=EyH z;C=@>Xcq|7iEYpbM$z47zG;4vDaqS@Ccg*IO^_zrLS%jH;488cDmU0WsvE0_9XYyQmv+SlZl+xGa^ zZ1g!sJtranzc3eYHOS_&p>f#q{X5es<*|)-@+VILIWl7JD)3$3Sf##bvzyA& z=BybcyyMAWn!jCUNOWb`;|89$7wR(soirwtag!sA^03Ls3BqII;Xwq*>H9_isCSm~ zfqP)XM?rvZ0zR{e{xd$)d#rzo|K43*KS!=OytFu-6WDhdHalU6evLKHW3Hq zTpJEeR#3iY*7Qf^2K${9-3D>R{B&IPg&?hee-#%s-}9TPi$C(1qvYJDZyVe2~HYG9i}P)T`5 zo(n@=vBaih7^T#;g&ez&$eQCm)5_pnn12kXI;7;vYZHy`Nvu&-ygizAU?o_SH%IE% zw?06%Jo_Kpx(+bJE)`*!r=9COh$MD?j-`L7{2^W(;F~f#dM8j{R{Akmnc)&vp7QO> zpAp|CMcE<>$XXRboW(KTeYMeG%%lH}nfvP(LKe=IaZfP%TBLWggr>50-oM`0IvrWT za42i z_mkw~%AcsS$6;G3tu2gHb&;_czogp1BIB$z1no0fD?UnU#EFMUsiBe|@j_aMUVWc) zs~h`Mwf4mpRPy?AtZ|#9Sz~PhgU$<+hH>eU;xqz~B5nm% zZ#LQ}-GVEz#`m13+O@6MV%~5MbOA>>ocUd~_}yJdMsZq4uM4MjUapF#T(;XZ3IV}z zD{lJE2gy*5VLfx&dHNF>jwcPf73O2@zMwU`dB4|Gs@#)Ceg@0Hl99Dq^LjHS&d@c> zcr?>Fl**_h(hgSLkELbFNVWHP7yK)8Zb)?@XqT3hTk3K=tRXGsAr_9XzOV}&=_~S| z&~M`(5jxlrh%+_Nai!$2dl#h}5==>7m}sKNes1=3bDc&oDRDA5*hG^!<*@=BOBKU>Fy^1*wdivQ@Jw-lFs%A5Jvof8LdiGxh0|?U-iUxs`Bjyi7)wH7`Khx}Tn7q09 zJMZaKzuiz0{+G$VafMTuaNEZ~?~aJ0Mq$Z~TznLXWl@Iq>$v}!C{&+=5i0CeU+i5w z{e9^F(kKqa0VgS5`JP+L)+n9X^MR^rq2@#J!pZJao$b}UI*WCCRNN?wJ!HWT(nAiG1<(2Zn~x|%2l49{JEN*iuljg+U_Tw=T-84(41UblIq9Y z-4P5of-v&aI`a+!39Dml(|osHFnO~vohj4GS}IsP)Pu~xtaf=@t;=YOf21{)m`=s! z&)G$d{M8d0Ca7^MLKf`fJ>eGVqlXy&?z0K6?JAR7`<-k`CC8glpRWY&o0RK`zGVKk z&XY6J_N-AaDQH`Vgqu?#t2FA z2sbt7Hsz?Aa?r^2%A`g#>ux0-jl8N)89=}V-Ka>}thR`l9}h^zD(^{Ea=fa1rm`pl zedDna|0r&dv$FfO*kjp@mrSM~Q+gTjP(cn$;=%!K!>XS}Sc@R9`sR z@m^|^duQ)E2`k+7g`AA)nbpQq6CPgcoKTIjXyP~r|3vlYkaA||J8i*l!0T2eSLG4p zSVttL-K66kXG5naQS<1{Uxr>89WtwRz?rALy3OpAx|@-K(RPkCJUaQty`i@YdciSe z3#V!&tXd$jSI-;>oi|X#*b(LW7_)`z&@(V@MoKPgYpmWIT;d9=+z&ruEaN^O8td!) zRjKfdj(Oz8rjQhx&ieV+9Q?+(6QQF#FnSAWjr}6WnSaJ!Rtu&^Zxo(Rxdx2d&agg^ z@79F6_UczYIdP|2KPduD%VbF~o__vi!kc{bSJh0XEyhc20a*n7-tM((Pnh0Vl$@1N zz-OI#$(^OJRJ?z)hkC5+?5xJf`eL1iy|q@vGAlT23xf#Rh&Q*oCJ{N9ze(M#0Syx+ z3l*Gix+(e;rggBAlq)7YGdG$intQPfw%qU;K9TW8pZHQVJ(HGN?`0Mol4Wh20?pdG zgCbV$;?2i$ZC)pIL)i|5*h?GL31|hU1d{5U7s^vTwvrJ(lW`?>=6SbJ76vpg7_kI7 zHim6~b3^7R@#$K`MQu4A9IR1(8xrRapPei$Rhiax-YAd=y%aj~&k|~Xv$ItWq4+9j z!Ev&yy|FBgUZzr*$Mo&5nW+4skNogYeIv@URi>6Rk+TdCWl3;P#>3K+%NI}NIXq@u z)nn=7qU=f*k(H(I_4#S`Z$M}lLfn)#iMmxOl&E^p(S|GWDBVU8oh$zqLN30MtM9mD zC9a*g!tcW$v9Db%x>g?=EYFR0BE%(tc?$V%Vaf-rN4fE#EG;6#n)g#@HOI$gtMd)8 z0b+(r#t*!AvivRt>Co2vxB)eM$};cB8?3$`}osuSYiGWZwTSd#A1dyx^=N|eY!_9cF<;_wRd^K&H%hPaxtBh^jDx7~zvVpW0DFz&eG~cZiEiJ5t zTiaOWnSmsvy+GcSBSjNS{0&~*O|yGjh<_MwNL?J(Qg;7*q?eJOmn z#QQbR9xw=sG6gCZS_8A4OVkRgX zRd<_eD9=+uJdX_u#LX9?X=%*w8$V>6cq;JzA)~wC_RZPTzZnHgwDtbabARd+MS@E; V-snKDs}85{|m$1opS&H literal 0 HcmV?d00001 diff --git a/futureprototype-theme/plymouth/logo_circle.png b/futureprototype-theme/plymouth/logo_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8905213cc6ec5c92126051d99df5548149452d GIT binary patch literal 3776 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 Lp3aqr1F!rS3jr~t literal 0 HcmV?d00001 diff --git a/futureprototype-theme/plymouth/password_dot.png b/futureprototype-theme/plymouth/password_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..80d16f41d7ece0b5fa122f5d848abb6d3a67c34e GIT binary patch literal 2936 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 literal 0 HcmV?d00001 diff --git a/futureprototype-theme/plymouth/password_field.png b/futureprototype-theme/plymouth/password_field.png new file mode 100644 index 0000000000000000000000000000000000000000..46e899df8c674599082d3733842b287d5498693c GIT binary patch literal 17401 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 CIQt*~ literal 0 HcmV?d00001 diff --git a/futureprototype-theme/plymouth/password_field16.png b/futureprototype-theme/plymouth/password_field16.png new file mode 100644 index 0000000000000000000000000000000000000000..962c5578d5f755452868116dab32fd08026b77e6 GIT binary patch literal 230 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

IcW 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 literal 0 HcmV?d00001 diff --git a/futureprototype-theme/sources/plymouth/debian.svg b/futureprototype-theme/sources/plymouth/debian.svg new file mode 100644 index 0000000..1ae7b82 --- /dev/null +++ b/futureprototype-theme/sources/plymouth/debian.svg @@ -0,0 +1,127 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/sources/plymouth/logo.svg b/futureprototype-theme/sources/plymouth/logo.svg new file mode 100644 index 0000000..2106450 --- /dev/null +++ b/futureprototype-theme/sources/plymouth/logo.svg @@ -0,0 +1,141 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/futureprototype-theme/sources/plymouth/plymouth_background.svg b/futureprototype-theme/sources/plymouth/plymouth_background.svg new file mode 100644 index 0000000..fc37ea5 --- /dev/null +++ b/futureprototype-theme/sources/plymouth/plymouth_background.svg @@ -0,0 +1,160 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/futureprototype-theme/wallpaper/contents/images/1280x1024.svg b/futureprototype-theme/wallpaper/contents/images/1280x1024.svg new file mode 100644 index 0000000..7b9a540 --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/1280x1024.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/contents/images/1600x1200.svg b/futureprototype-theme/wallpaper/contents/images/1600x1200.svg new file mode 100644 index 0000000..768ad2c --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/1600x1200.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/contents/images/1920x1080.svg b/futureprototype-theme/wallpaper/contents/images/1920x1080.svg new file mode 100644 index 0000000..cc6f220 --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/1920x1080.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/contents/images/1920x1200.svg b/futureprototype-theme/wallpaper/contents/images/1920x1200.svg new file mode 100644 index 0000000..c40ec05 --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/1920x1200.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/contents/images/2560x1080.svg b/futureprototype-theme/wallpaper/contents/images/2560x1080.svg new file mode 100644 index 0000000..53a879a --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/2560x1080.svg @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/contents/images/4096x2160.svg b/futureprototype-theme/wallpaper/contents/images/4096x2160.svg new file mode 100644 index 0000000..94b983e --- /dev/null +++ b/futureprototype-theme/wallpaper/contents/images/4096x2160.svg @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/futureprototype-theme/wallpaper/gnome-background.xml b/futureprototype-theme/wallpaper/gnome-background.xml new file mode 100644 index 0000000..6c55b29 --- /dev/null +++ b/futureprototype-theme/wallpaper/gnome-background.xml @@ -0,0 +1,14 @@ + + + 8640000.0 + + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/1280x1024.svg + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/1600x1200.svg + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/1920x1080.svg + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/1920x1200.svg + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/2560x1080.svg + /usr/share/desktop-base/futureprototype-theme/wallpaper/contents/images/4096x2160.svg + + + + diff --git a/futureprototype-theme/wallpaper/metadata.desktop b/futureprototype-theme/wallpaper/metadata.desktop new file mode 100644 index 0000000..23f4eb7 --- /dev/null +++ b/futureprototype-theme/wallpaper/metadata.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name=futurePrototype +X-KDE-PluginInfo-Name=futurePrototype +X-KDE-PluginInfo-Author=Alex Makas +X-KDE-PluginInfo-Email=radicalmonday@gmail.com +X-KDE-PluginInfo-License=GPLv2+