diff --git a/Plymouth-Theme/kali/kali-logo-container.png b/Plymouth-Theme/kali/kali-logo-container.png new file mode 100644 index 00000000..236629d6 Binary files /dev/null and b/Plymouth-Theme/kali/kali-logo-container.png differ diff --git a/Plymouth-Theme/kali/kali-logo-fade.png b/Plymouth-Theme/kali/kali-logo-fade.png new file mode 100644 index 00000000..4cebc9d9 Binary files /dev/null and b/Plymouth-Theme/kali/kali-logo-fade.png differ diff --git a/Plymouth-Theme/kali/kali-logo.png b/Plymouth-Theme/kali/kali-logo.png new file mode 100644 index 00000000..890e0e0f Binary files /dev/null and b/Plymouth-Theme/kali/kali-logo.png differ diff --git a/Plymouth-Theme/kali/kali.plymouth b/Plymouth-Theme/kali/kali.plymouth new file mode 100644 index 00000000..71819a46 --- /dev/null +++ b/Plymouth-Theme/kali/kali.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=Kali +Description=Kali plymouth theme +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/kali +ScriptFile=/usr/share/plymouth/themes/kali/kali.script diff --git a/Plymouth-Theme/kali/kali.script b/Plymouth-Theme/kali/kali.script new file mode 100644 index 00000000..cd28da0f --- /dev/null +++ b/Plymouth-Theme/kali/kali.script @@ -0,0 +1,158 @@ +LOGO_RIGHT_OFFSET_RATIO = -0.13; +LOGO_TOP_OFFSET_RATIO = -0.07; + +MAX_PASSWORD_LENGTH = 16; + +X_CENTER = Window.GetWidth() / 2; +Y_CENTER = Window.GetHeight() / 2; + +status = "normal"; + +Window.SetBackgroundTopColor(0, 0, 0); +Window.SetBackgroundBottomColor(0, 0, 0); + +/* Images */ +container.image = Image("kali-logo-container.png"); +logo.image = Image("kali-logo.png"); +outline.image = Image("outline.png"); +fade.image = Image("kali-logo-fade.png"); +passwordDot.image = Image("password-dot.png"); + +// Kali logo can't be aligned by its natural center but by the circle center +// formed inside its body curve. This can be easily calculated by the offset +// ratio defined before. +logo.rightOffset = logo.image.GetWidth() * LOGO_RIGHT_OFFSET_RATIO; +logo.topOffset = logo.image.GetHeight() * LOGO_TOP_OFFSET_RATIO; + +fun centerKaliLogo (image, zIndex) { + sprite = Sprite(image); + sprite.SetX(X_CENTER - image.GetWidth() / 2 + logo.rightOffset); + sprite.SetY(Y_CENTER - image.GetHeight() / 2 + logo.topOffset); + sprite.SetZ(zIndex); + sprite.SetOpacity(0); + return sprite; +} + +/* Kali logo sprites */ +logo.sprite = centerKaliLogo(logo.image, 4); +fade.sprite = centerKaliLogo(fade.image, 3); +container.sprite = centerKaliLogo(container.image, 2); +outline.sprite = centerKaliLogo(outline.image, 1); + +fun showKaliLogo () { + logo.sprite.SetOpacity(1); + fade.sprite.SetOpacity(0.5); +} + +/* -------------------------------- Message -------------------------------- */ +fun displayMessageCallback (text) { + prompt.image = Image.Text(text, 1, 1, 1); + prompt.sprite = Sprite(prompt.image); + prompt.sprite.SetPosition( + X_CENTER - prompt.image.GetWidth() / 2, + container.sprite.GetY() + container.image.GetHeight() + 50, + 10000 + ); + global.prompt = prompt; +} + +Plymouth.SetMessageFunction(displayMessageCallback); + +/* ---------------------------- Password Dialog ---------------------------- */ +fun passwordDialogSetup () { + passwordField.image = Image("password-field.png"); + passwordField.sprite = Sprite(passwordField.image); + passwordField.y = container.sprite.GetY() + container.image.GetHeight(); + passwordField.x = X_CENTER - passwordField.image.GetWidth() / 2; + passwordField.z = 5; + passwordField.sprite.SetX(passwordField.x); + passwordField.sprite.SetY(passwordField.y); + passwordField.sprite.SetZ(passwordField.z); + global.passwordField = passwordField; + showKaliLogo(); +} + +fun setPasswordDialogOpacity (opacity) { + passwordField.sprite.SetOpacity(opacity); + + for (i = 0; passwordField.bullets[i]; i++) + passwordField.bullets[i].sprite.SetOpacity(opacity); +} + +fun passwordDialogCallback (prompt, bullets) { + global.status = "password"; + + if (!global.passwordField) + passwordDialogSetup(); + else + setPasswordDialogOpacity(1); + + displayMessageCallback(prompt); + + bulletWidth = passwordDot.image.GetWidth(); + + for (i = 0; + passwordField.bullets[i] || i < bullets && i < MAX_PASSWORD_LENGTH; + i++) { + if (!passwordField.bullets[i]) { + passwordField.bullets[i].sprite = Sprite(passwordDot.image); + passwordField.bullets[i].sprite.SetX(passwordField.x + + (i + 1) * bulletWidth); + passwordField.bullets[i].sprite.SetY(passwordField.y); + passwordField.bullets[i].sprite.SetZ(passwordField.z); + } + + if (i < bullets) + passwordField.bullets[i].sprite.SetOpacity(1); + else + passwordField.bullets[i].sprite.SetOpacity(0); + } +} + +Plymouth.SetDisplayPasswordFunction(passwordDialogCallback); + +fun displayNormalLogoCallback () { + global.status = "normal"; + if (global.passwordField) + setPasswordDialogOpacity(0); + prompt.SetOpacity(0); + showKaliLogo(); +} + +Plymouth.SetDisplayNormalFunction(displayNormalLogoCallback); +Plymouth.SetQuitFunction(displayNormalLogoCallback); + + +if (Plymouth.GetMode() == "boot") { + outline.movementRange = + container.image.GetHeight() - outline.image.GetHeight(); + outline.initialPosition = container.sprite.GetY() + outline.movementRange; + outline.sprite.SetY(outline.initialPosition); + + container.sprite.SetOpacity(1); + outline.sprite.SetOpacity(1); + + fun bootProgressCallback (duration, progress) { + if (global.status != "normal") return; + if (progress < 0.1) + logo.sprite.SetOpacity(progress / 0.1); + else if (progress < 0.9) { + relativeProgress = (progress - 0.1) / 0.8; + outline.sprite.SetY(outline.initialPosition + - outline.movementRange * relativeProgress); + if (progress > 0.8 && progress < 0.85) { + relativeProgress = (progress - 0.8) / 0.05; + fade.sprite.SetOpacity(relativeProgress); + } else if (progress > 0.85) { + relativeProgress = (progress - 0.85) / 0.05; + fade.sprite.SetOpacity(1 - relativeProgress); + } + } else { + opacity = (1 - progress) / 0.1; + logo.sprite.SetOpacity(opacity); + } + } + + Plymouth.SetBootProgressFunction(bootProgressCallback); +} + diff --git a/Plymouth-Theme/kali/outline.png b/Plymouth-Theme/kali/outline.png new file mode 100644 index 00000000..60ca07e6 Binary files /dev/null and b/Plymouth-Theme/kali/outline.png differ diff --git a/Plymouth-Theme/kali/password-dot.png b/Plymouth-Theme/kali/password-dot.png new file mode 100644 index 00000000..3622c677 Binary files /dev/null and b/Plymouth-Theme/kali/password-dot.png differ diff --git a/Plymouth-Theme/kali/password-field.png b/Plymouth-Theme/kali/password-field.png new file mode 100644 index 00000000..42fed8e5 Binary files /dev/null and b/Plymouth-Theme/kali/password-field.png differ diff --git a/debian/kali-theme-common.install b/debian/kali-theme-common.install index c144452e..d361ef9b 100644 --- a/debian/kali-theme-common.install +++ b/debian/kali-theme-common.install @@ -3,6 +3,7 @@ Color-Schemes/* usr/share/ Icon-Theme/* usr/share/icons/ Window-Theme/* usr/share/themes/ Grub-Theme/* boot/grub/themes/ +Plymouth-Theme/* usr/share/plymouth/themes usr/share/desktop-base/ usr/share/icons/ usr/share/plymouth/