From cbb82ed63574a63727907245e37119d877b6d093 Mon Sep 17 00:00:00 2001 From: fewieden Date: Sat, 1 Oct 2016 00:38:14 +0200 Subject: [PATCH] replace system output with MagicMirror splash screen on boot --- CHANGELOG.md | 1 + installers/raspberry.sh | 28 +++++++++++++++++ splashscreen/MagicMirror.plymouth | 8 +++++ splashscreen/MagicMirror.script | 50 ++++++++++++++++++++++++++++++ splashscreen/splash.png | Bin 0 -> 19621 bytes 5 files changed, 87 insertions(+) create mode 100644 splashscreen/MagicMirror.plymouth create mode 100644 splashscreen/MagicMirror.script create mode 100644 splashscreen/splash.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f40dec2..25447243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Finnish translation. - Method to overwrite the module's header. [See documentation.](https://github.com/MichMich/MagicMirror/tree/develop/modules#getheader) - Option to limit access to certain IP addresses based on the value of `ipWhitelist` in the `config.js`, default is access from localhost only (Issue [#456](https://github.com/MichMich/MagicMirror/issues/456)) +- Add Splash screen on boot. ### Updated - Modified translations for Frysk. diff --git a/installers/raspberry.sh b/installers/raspberry.sh index ce37e86f..4c42dcde 100644 --- a/installers/raspberry.sh +++ b/installers/raspberry.sh @@ -113,6 +113,34 @@ else exit; fi +# Check if plymouth is installed (default with PIXEL desktop environment), then install custom splashscreen. +echo -e "\e[96mCheck plymouth installation ...\e[0m" +if command_exists plymouth; then + THEME_DIR="/usr/share/plymouth/themes" + echo -e "\e[90mSplashscreen: Checking themes directory.\e[0m" + if [ -d $THEME_DIR ]; then + echo -e "\e[90mSplashscreen: Create theme directory if not exists.\e[0m" + if [ ! -d $THEME_DIR/MagicMirror ]; then + sudo mkdir $THEME_DIR/MagicMirror + fi + + if sudo cp ~/MagicMirror/splashscreen/splash.png $THEME_DIR/MagicMirror/splash.png && sudo cp ~/MagicMirror/splashscreen/MagicMirror.plymouth $THEME_DIR/MagicMirror/MagicMirror.plymouth && sudo cp ~/MagicMirror/splashscreen/MagicMirror.script $THEME_DIR/MagicMirror/MagicMirror.script; then + echo -e "\e[90mSplashscreen: Theme copied successfully.\e[0m" + if sudo plymouth-set-default-theme -R MagicMirror; then + echo -e "\e[92mSplashscreen: Changed theme to MagicMirror successfully.\e[0m" + else + echo -e "\e[91mSplashscreen: Couldn't change theme to MagicMirror!\e[0m" + fi + else + echo -e "\e[91mSplashscreen: Copying theme failed!\e[0m" + fi + else + echo -e "\e[91mSplashscreen: Themes folder doesn't exist!\e[0m" + fi +else + echo -e "\e[93mplymouth is not installed.\e[0m"; +fi + echo " " echo -e "\e[92mWe're ready! Run \e[1m\e[97mDISPLAY=:0 npm start\e[0m\e[92m from the ~/MagicMirror directory to start your MagicMirror.\e[0m" echo " " diff --git a/splashscreen/MagicMirror.plymouth b/splashscreen/MagicMirror.plymouth new file mode 100644 index 00000000..b6887bf5 --- /dev/null +++ b/splashscreen/MagicMirror.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=MagicMirror +Description=Mirror Splash +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/MagicMirror +ScriptFile=/usr/share/plymouth/themes/MagicMirror/MagicMirror.script diff --git a/splashscreen/MagicMirror.script b/splashscreen/MagicMirror.script new file mode 100644 index 00000000..d7e7b860 --- /dev/null +++ b/splashscreen/MagicMirror.script @@ -0,0 +1,50 @@ +screen_width = Window.GetWidth(); +screen_height = Window.GetHeight(); + +theme_image = Image("splash.png"); +image_width = theme_image.GetWidth(); +image_height = theme_image.GetHeight(); + +scale_x = image_width / screen_width; +scale_y = image_height / screen_height; + +flag = 1; + +if (scale_x > 1 || scale_y > 1) +{ + if (scale_x > scale_y) + { + resized_image = theme_image.Scale (screen_width, image_height / scale_x); + image_x = 0; + image_y = (screen_height - ((image_height * screen_width) / image_width)) / 2; + } + else + { + resized_image = theme_image.Scale (image_width / scale_y, screen_height); + image_x = (screen_width - ((image_width * screen_height) / image_height)) / 2; + image_y = 0; + } +} +else +{ + resized_image = theme_image.Scale (image_width, image_height); + image_x = (screen_width - image_width) / 2; + image_y = (screen_height - image_height) / 2; +} + +if (Plymouth.GetMode() != "shutdown") +{ + sprite = Sprite (resized_image); + sprite.SetPosition (image_x, image_y, -100); +} + +message_sprite = Sprite(); +message_sprite.SetPosition(screen_width * 0.1, screen_height * 0.9, 10000); + +fun message_callback (text) { + my_image = Image.Text(text, 1, 1, 1); + message_sprite.SetImage(my_image); + sprite.SetImage (resized_image); +} + +Plymouth.SetUpdateStatusFunction(message_callback); diff --git a/splashscreen/splash.png b/splashscreen/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f76b0cff5617be2df50daddabc4e9385d38a2ade GIT binary patch literal 19621 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 literal 0 HcmV?d00001