From 0f41d582ef82a6165257f1e754624ef10e8e651d Mon Sep 17 00:00:00 2001 From: Sunderland93 Date: Thu, 15 Jun 2023 14:46:31 +0400 Subject: [PATCH] Add Plymouth theme --- .gitignore | 1 + debian/control | 27 +- debian/plymouth-theme-tileos.install | 1 + debian/plymouth-theme-tileos.postinst | 18 + debian/plymouth-theme-tileos.postrm | 61 + .../plymouth/themes/tileos/background.png | Bin 0 -> 4196 bytes usr/share/plymouth/themes/tileos/logo.png | Bin 0 -> 11524 bytes .../plymouth/themes/tileos/password_dot.png | Bin 0 -> 2929 bytes .../plymouth/themes/tileos/password_dot16.png | Bin 0 -> 1075 bytes .../plymouth/themes/tileos/password_field.png | Bin 0 -> 17401 bytes .../themes/tileos/password_field16.png | Bin 0 -> 230 bytes .../plymouth/themes/tileos/progress_bar.png | Bin 0 -> 4211 bytes .../plymouth/themes/tileos/progress_box.png | Bin 0 -> 4212 bytes .../plymouth/themes/tileos/tileos.plymouth | 8 + .../plymouth/themes/tileos/tileos.script | 1022 +++++++++++++++++ 15 files changed, 1135 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 debian/plymouth-theme-tileos.install create mode 100755 debian/plymouth-theme-tileos.postinst create mode 100755 debian/plymouth-theme-tileos.postrm create mode 100755 usr/share/plymouth/themes/tileos/background.png create mode 100644 usr/share/plymouth/themes/tileos/logo.png create mode 100755 usr/share/plymouth/themes/tileos/password_dot.png create mode 100755 usr/share/plymouth/themes/tileos/password_dot16.png create mode 100755 usr/share/plymouth/themes/tileos/password_field.png create mode 100755 usr/share/plymouth/themes/tileos/password_field16.png create mode 100755 usr/share/plymouth/themes/tileos/progress_bar.png create mode 100755 usr/share/plymouth/themes/tileos/progress_box.png create mode 100755 usr/share/plymouth/themes/tileos/tileos.plymouth create mode 100755 usr/share/plymouth/themes/tileos/tileos.script diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bbe760d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +debian/files diff --git a/debian/control b/debian/control index e2d1f1d..b44dd4c 100644 --- a/debian/control +++ b/debian/control @@ -7,8 +7,25 @@ Standards-Version: 4.5.1 Homepage: https://github.com/Tile-OS/tileos-artwork Rules-Requires-Root: no +Package: plymouth-theme-tileos +Architecture: all +Depends: ${misc:Depends}, + plymouth, + plymouth-label, + plymouth-themes +Provides: plymouth-themes +Description: boot animation, logger and I/O multiplexer - TileOS theme + Plymouth provides a boot-time I/O multiplexing framework - the most obvious + use for which is to provide an attractive graphical animation in place of + the text messages that normally get shown during boot. (The messages are + instead redirected to a logfile for later viewing.) However, in event-driven + boot systems Plymouth can also usefully handle user interaction such as + password prompts for encrypted file systems. + . + This package provides the default TileOS theme. + Package: tileos-theme-catppuccin -Architecture: any +Architecture: all Depends: ${misc:Depends}, catppuccin-gtk-theme, catppuccin-kvantum-theme, @@ -16,13 +33,17 @@ Depends: ${misc:Depends}, qt5-style-kvantum, Conflicts: tileos-sway-artwork Description: Catppuccin theme for TileOS + This package provides default look-and-feel for GTK and QT applications + on TileOS. Package: tileos-grub-theme -Architecture: any +Architecture: all Depends: ${misc:Depends} Description: default GRUB theme for TileOS + This package provides default theme for GRUB 2 bootloader. Package: tileos-wallpapers -Architecture: any +Architecture: all Depends: ${misc:Depends} Description: TileOS wallpapers + A set of default wallpapers for TileOS. diff --git a/debian/plymouth-theme-tileos.install b/debian/plymouth-theme-tileos.install new file mode 100644 index 0000000..896b154 --- /dev/null +++ b/debian/plymouth-theme-tileos.install @@ -0,0 +1 @@ +usr/share/plymouth /usr/share/ diff --git a/debian/plymouth-theme-tileos.postinst b/debian/plymouth-theme-tileos.postinst new file mode 100755 index 0000000..70bf86d --- /dev/null +++ b/debian/plymouth-theme-tileos.postinst @@ -0,0 +1,18 @@ +#!/bin/sh -e + +case "$1" in + configure) + if which plymouth-set-default-theme >/dev/null 2>&1 + then + plymouth-set-default-theme tileos + fi + + if which update-initramfs >/dev/null 2>&1 + then + update-initramfs -u + fi + ;; +esac + +#DEBHELPER# +exit 0 diff --git a/debian/plymouth-theme-tileos.postrm b/debian/plymouth-theme-tileos.postrm new file mode 100755 index 0000000..c65e598 --- /dev/null +++ b/debian/plymouth-theme-tileos.postrm @@ -0,0 +1,61 @@ +#!/bin/sh -e +# This script can be called in the following ways: +# +# After the package was removed: +# remove +# +# After the package was purged: +# purge +# +# After the package was upgraded: +# upgrade +# if that fails: +# failed-upgrade +# +# +# After all of the packages files have been replaced: +# disappear +# +# +# If preinst fails during install: +# abort-install +# +# If preinst fails during upgrade of removed package: +# abort-install +# +# If preinst fails during upgrade: +# abort-upgrade + + +case "$1" in + remove) + + if which plymouth-set-default-theme >/dev/null 2>&1 + then + plymouth-set-default-theme emerald + fi + + if which update-initramfs >/dev/null 2>&1 + then + update-initramfs -u + fi + + ;; + + purge) + ;; + + upgrade|failed-upgrade|disappear) + ;; + + abort-install|abort-upgrade) + ;; + + *) + echo "$0 called with unknown argument \`$1'" 1>&2 + exit 1 + ;; +esac + +#DEBHELPER# +exit 0 diff --git a/usr/share/plymouth/themes/tileos/background.png b/usr/share/plymouth/themes/tileos/background.png new file mode 100755 index 0000000000000000000000000000000000000000..084506d8afff8793217140f73ec0fa4edd54b45e GIT binary patch literal 4196 zcmeHLYitx%6dowFwX}_(yoAa)NC9**^SI}p z^PO|Pd+y2HT~%5#CoAK+340)B5fd=4|N^x^Q{60bM`A3GaE^YwBzj>c3)lp+At zm&5=H5|W4@i7%q1RoNYA=EeOp8=70%@>hHA%sriY>!r-*O)rjXu510MuzmRnqVZhI zVxel!D?2|*zqzulNqD9#E%lB2e>}<%%wHM9H#qAzxEe2aDzn!$MW;X4b?$=|__f;Q zW%Sucw!G&r%y!%)w^5^ZWc|=JZr9@nFN|9HP3_6IHg&v~rDU%-=HA+TDrb^+tduda zz2?_pUu=E6vL!vUX8Y(D*3ZmZzHdaz1;@s*=SDhH7wq2ir*sd@ZKdS#lm<6Juu~w zd1>Rrcjqh|S@d(t&O;vt4)|{GT2x*=`kNhf1t*R#{c?Ls*KbtCzSYjPHBYW7$!(6v zzVvt3k6J$A{TbXC`nLsT#XGcR$2)c%d1uD{v$OvA?)!OXb5oWLuWLQ^pl@4A{&wk9 z>mRE+BA)Vx_ph3s`8N8?)Fa@jubks^e*bmv%WDGrM?bV`B{%8g=w5r~6VBO_%R-Ny z{cFKfV?U{CJ)}O7cV_pZ343Zkp1W|PtLesZFQ<cR$mYTMw{RdZk&{6Q? zd7rxbG%~g4;l}NUJFz*1m+i5-o8atc1Lvj-gC-nXM_ZTQgX z7vFm9U>fSV`+51k2Rw_n`H$9Kf95Co%;~S_eV0}s2Mg4F*BqlNVc{htSYY#m#SE`R zEv%q$z>5RwXVk)f{4fCmN;!u)G%Rnxm*NE5fp_(4P09y>uds-wW$U~ z62l8LUX^0Hq{yg&$#P1)?#3`UkM_hDjRk|f@Uqs;0_1~8urb1FA&F>|=x?Fvz6J== z9ne2oXd$>yiE^MR^(qg14M5hX_JD@gVLOJQ6rLoTHrrZlmoy&I&Y#lO$=UoDSgPt+swp0a?>onFj_G1h+^KM|9GxU?)l3 z##B+W5O=5&tV%Z0KPm%CfKaT1qHQ8A;C2Ua;5LrW!(CP< zk8^pnLlhhoCvvnIjleUr6*bDj<&>gq7!WZzY)%-2GexBVH%3{=K1peW)kSFF#)>7m zKG8Q3lA@qOXAL&3cBkE8cQ`4McH~)Y{j4j2s=-P$Fs-D8PG(~)3j>pZ#Ii=6LI4vM z=E8VX!0L(`Qj~}rGeSZQ%iifA+)e_kvtCvQ5R{~7hO{$QTZp0<+QE?I&7=+9`}7q- z5|{j&wy}B8{N$4RB@OytVv3SGsshv{N6BGCGPe?nnwx@Q`D6+j+W-X9FT_et@ztyx z2C#c{murt)`iD{gc9IfBk;h5iY1V@S=UgI%1D+(2|q5%oB$f}$|w5po5~ z)8q=BVJ_6nf!gtEV5|Zp3@7dQm4p%92@^)o=*c*rxPp^>Q=wmzfp$q5Y+kSz61~l^ zn=_;B{ExrxwfG-BKd?ntOZd=^+H`*84J^%m! literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/logo.png b/usr/share/plymouth/themes/tileos/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3939eb17718c3b64d898a934175e6e23dd12b936 GIT binary patch literal 11524 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 literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/password_dot.png b/usr/share/plymouth/themes/tileos/password_dot.png new file mode 100755 index 0000000000000000000000000000000000000000..f1103d1087f2d160c4b2f673592ef656999b4c27 GIT binary patch literal 2929 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 literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/password_field.png b/usr/share/plymouth/themes/tileos/password_field.png new file mode 100755 index 0000000000000000000000000000000000000000..46e899df8c674599082d3733842b287d5498693c GIT binary patch literal 17401 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 CIQt*~ literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/password_field16.png b/usr/share/plymouth/themes/tileos/password_field16.png new file mode 100755 index 0000000000000000000000000000000000000000..2617fc93ee361c89ea02dd2454a9f06fa9abdc83 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0y~yVB`g|^;npJ5}D^2Q9H6k|z{UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kH zeO=ifv+#3@$Z1VqvKS~7;OXKR5^?zL4MV{L1_I2E;*1F%Gyi-({^XRznu>1%Z&qB9 zxMW}TD`Tr{?G8yp_wUk=RtOwFeh?WHHZI;&*FHsF?b-B6m!kJ{UYMzRzQrDBHiM_D KpUXO@geCx-U`%=d literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/progress_bar.png b/usr/share/plymouth/themes/tileos/progress_bar.png new file mode 100755 index 0000000000000000000000000000000000000000..6a34aae21e79112c73d9f77ef15b9d33ee2de83f GIT binary patch literal 4211 zcmeHKYj6`)6kcp?YXOI%KzXkVBBGmpC7Wbz2qg(^u&E^t2!aDQyEp05BpY_OOi#nwBfiU7{Cu^$`dnwp;~%fuVXHhja+_k`v~ynb z*^Ywa?%8eY0^28rTzN&q+gI^hMrp0;%Dpc)U#Gu#=n^Pxx#Hj}mp}IPqucX-7=CBf zuzfLXOFOT7W{-ERMG4Ad~{*D_jjKr`ZYh{n8!te2PCxp^y zSh>+v+B9oI^U}qy5%Y_$Tj$8$US8WmYvPSLJV@>ZL-8ubW`^;Z|{Aqssw5(e%TG4RwF5j;5qTTYz zhF{k=#XP}v2iIRU>@ED4DM#VvZyaMLo;&-|OB?+M3+`UOHavcR{3CwYLykEU=7sKS z|6|eSQ6DdEXjLDwwSBO(@Wbl;*Drb2xn}CW*MnSJQ@@RyUtS;;X~pTs&lKYM-rRkOYw z`{v=BF3g?y@b6Q1e|nfGne`{1TygC1ao4wMZeji5D?REqEO7gi*sd)t_7kfb7jKQW zo_=A+{YP?f&&|&yR^8!QwyX5>>Pc;95^bly;SOB54Ljmi4_x*oy8v}wT1FkVFi<9l zO56e@B@8X;coMZ9h84NfNg!539S_5(oNy6sJKrI2S#l9K+5&VS>48;pX}t<7>&ru8 zeYNP62=~nVqO^br;!p>8Ivz`CLfS=`yaIYQ%oKr}5WU((EDTiO9z}(?)nc{Kq%SSk zvc$}MyhxQILeM*>ivo>YM3t^51&T_gQkE2FQPe2KIGs+4W+|2>5rWj}5;{ne32ll& zk>T({O;qKiE-MM#-~?f%Mt2ben#a52izfqt9{PmVr2^7}N`oZDSZFF9r}}zmx~~?I zbOrQ}9$E-(R4NEHrA8H@uNEfsDSas4n7Zht%aruUP$JGiJ@LBFf}M zO}cj?B*$T;4h%IJ-oe{>2g5P6jbS;i7qkGX8tO!Ylc6nKCL5zH0!ju63yeNR1f~bd zMewK)=!zOrl$eV!Lc$Htp6LMEP7=_87w8a?(kv&?yuesPEGt-9fnlzptpeQ#uSjyF z?%&YH=D~|HB`=jVw0@mw%Iv60xFR#k3}dpnm2lkL6ao-4DQKV;N@kphD>EflfkYId z)1#|hyY2Env;yn2MQl8S3dS-v(rV`*2}IFOvQ|C}M4L^DfJ`^_uxm<0PXQGcN0E+5 zE7YE*R`_(YP*?YlB~=BDDj>l~nkWA*7}b?9WtkO^Ve02|8of(A6#TW`VPu9DA#}#7!Y`{y9VVNkOBh&4|dmoCRcv%=M+q! zx1bdISh9Y2s1=VvluP_S37~#1L#oI*XoDH>C}sFu$+d K`{L|nYyJYX@!>=O literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/progress_box.png b/usr/share/plymouth/themes/tileos/progress_box.png new file mode 100755 index 0000000000000000000000000000000000000000..697671f5116a660941209eb316259b6e02abc777 GIT binary patch literal 4212 zcmeHKYj6`)6kY^ctW*Sq7NxQ-SU}nAW_O!p*Mv}#Kq5^oZ9tGB?Bga~npbzXZCXWn zh@~ozjtY)b6@2nToI0b9N{e6t2LX{*sE7!TfHEr8I#?L+ad*>}c67$+jQ(q8lHEP$ zJKsI$yXT(C))wT?PEWff4MC7}pVwUouS?)}@URs4dl6}^f|q^OfdyJ2Ux~(*SWpfF zRI7>u6eQ#zf+W6-6r4zJMu%VRyg6%-6QS3)PAas1e<|m*+xNLEQw?S9Ygq2QyOA3< zbkcqJ_NUKm%wBhJw12b(%N|#Twr~CB`Ip)iMpMx1s7&M z^>bUzT>GA;i5*h<%VTHd740G$E^iM!ckG9ZP58;Js%u1XO{d(^IOpQ|?ZHae7~%n*7Vutw``#Y9zRk$;>@Y~8+VPMA6e*2v^+^6$e=Z{%T?fWxwhP;tqaRgicPMT-iP0QBI&&o4Ja7OkP7LOm=wrcf+ zC+4MQgcfHN56%5~@SdZ4eMda^TwPLFGVmCbogir)(Knzx{f!q0V=BWKHcF;no9@gO=gX*k+BN8(7!z z`@+p*K3!CQRCy++egBfoPf8EWDSn+@HEC?au#wkEfw?osjeY6uWv@KzZGHHoX6KKW zJj(tvcdo1xZyU31<9O$#30E&1o0jMQz_)eCXP1Q&6T}(ujFQj8SFU{V?yZw&oF4aH z%l&`cllAQ7NlnLEu-P;Iw8YC!ww!UCR#G#oTkdcvuOR+Mwjzx$9$(9xf^ zzrUe16?H9sHM(N8YiXnRcFNRB$N_8lK$s4O|K`*QrGKkfo0vbS0RMb-HMvAR@b zCCoWJ&7R;OK?G<#nuvs>Dwl9z1}_Kibu)pX21F}$U<>>Os4J!blrb?T689wJ3JRN^ zhT0V=$Q8P0by2`42UenKagHD=D=STvv?->92s6vF1W6GTg+m0cRz)>Ffk)MeIz^Jh z4OCH)`W80yS2yh`>_;qT0mX6q48zA1_zJMmds5fG~(as0vp#_gQkb&tK3Jp-T{w zBXJ`NirojP$-!%4^~p{580GX%1cvwU_Ca^oZh#@m@8{exv0P8j=XPNF`kWLKWr;Ix zEmo3Y88(R1q(#6PAm!jJYqjDc#ge?05d=|WdQthJs>Vk}pi@C|lMH!S3nkeElEH0s zP=pjV78iJ0#BDa(0%$;58D8i`ajzo7uH?hLv(l*~NClB}jsPg!Op6T8h^z(YZHxtH zMVew6iI*teW>85YH!G$@c(|Q%gbx8C9t{}|U2rb9z~{gy6M4;25azWY3~*q1ax z31613WW4nne9=k~=FD~@naDUKyJTwhbZEIg?p>%N$PJ_Q?;zy4`b=m{)qH+W>USwO zj+!zd^n05Znr`vAa|5;m;?o-gR}PbDDMQG0DZ5KfZ-Blbi9y9HRyNc?6yo#byWgC- Gbk$!DUf@6g literal 0 HcmV?d00001 diff --git a/usr/share/plymouth/themes/tileos/tileos.plymouth b/usr/share/plymouth/themes/tileos/tileos.plymouth new file mode 100755 index 0000000..e68e01a --- /dev/null +++ b/usr/share/plymouth/themes/tileos/tileos.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=TileOS - simple plymouth theme based on SimpleFuture +Description=A theme featuring a simple debian logo and progress bar inspired by FuturePrototype and SimpleFuture. +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/tileos +ScriptFile=/usr/share/plymouth/themes/tileos/tileos.script diff --git a/usr/share/plymouth/themes/tileos/tileos.script b/usr/share/plymouth/themes/tileos/tileos.script new file mode 100755 index 0000000..9b99238 --- /dev/null +++ b/usr/share/plymouth/themes/tileos/tileos.script @@ -0,0 +1,1022 @@ +# futureprototype.script - boot splash using script plugin +# +# Copyright (C) 2009 Canonical Ltd. +# Copyright © 2010-2016 Aurélien Couderc +# Copyright © 2014-2016 Juliette Taka +# +# 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 +# + + +#------------------------------- 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.7; # 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.5; +LOGO_SIZE_PCT = 0.18; # Debian swirl image size in % of smallest screen dimension +PROGRESS_POS_PCT.y = 0.65; +PROGRESS_HEIGHT_PCT = 0.005; + +#------------------------------- 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; + +progress_height = small_dimension * PROGRESS_HEIGHT_PCT; +progress_pos.y = window_max.height * PROGRESS_POS_PCT.y - progress_height/2; + +#------------------------------- Background ---------------------------------------- +bg_image = Image("background.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); + + +#------------------------------- 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); + + +#------------------------------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; +} + +#----------------------------------------------------------------------------- + +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); + +} + +#----------------------------------------- Progress Callback -------------------------------- +if (Plymouth.GetMode () == "boot") +{ + progress = Image("progress_box.png"); + progress_scale_factor = progress_height / progress.GetHeight(); + progress = progress.Scale(progress.GetWidth() * progress_scale_factor, progress.GetHeight() * progress_scale_factor); + + progress_sprite = Sprite(progress); + progress_sprite.SetPosition(window_max.width / 2 - progress.GetWidth() / 2, progress_pos.y, 0); + + + progress_bar = Image("progress_bar.png"); + progress_bar = progress_bar.Scale(progress_bar.GetWidth() * progress_scale_factor, progress_bar.GetHeight() * progress_scale_factor); + + progress_bar_sprite = Sprite(); + progress_bar_sprite.SetPosition(window_max.width / 2 - progress_bar.GetWidth() / 2, progress_pos.y, 1); +} + +fun progress_callback (duration, progress) +{ + if (Plymouth.GetMode () == "boot") + { + if (progress_bar.image.GetWidth () != Math.Int (progress_bar.original_image.GetWidth () * progress)) + { + progress = progress_bar.Scale(progress_bar.GetWidth() * progress, progress_bar.GetHeight()); + progress_bar_sprite.SetImage(progress); + } + } + + animate_progress_indicator(duration, progress); +} + + +#-----------------------------------------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 (progress_callback); + +# 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); + +#-----------------------------------------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);