123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- /**************************************************************************
- *
- * Copyright (C) 2011 The Xubuntu Community
- * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
- *
- * Written by: Mad Nick <dr.madnick@gmail.com>
- *
- **************************************************************************/
- /*
- * Related to the screen */
-
- screen_width = Window.GetWidth();
- screen_height = Window.GetHeight();
- screen_x = Window.GetX();
- screen_y = Window.GetY();
- /**/
- /*
- * Images, check bits per pixel
- * and load images accordingly */
- background_image = Image("wallpaper.png");
- passw_dialog_input_image = Image("passw-dialog.png");
- bullet_image = Image("test.png");
- bpp = Window.GetBitsPerPixel();
- if (bpp == 4) {
- logotype_image = Image("logo_16bit.png");
- progress_meter_image = Image("progress-meter_16bit.png");
- progress_fade_image = Image("progress-fade_16bit.png");
- fsck_progress_meter_image = Image("progress-meter_16bit.png");
- fsck_progress_fade_image = Image("fsck-fade_16bit.png");
- }
- else {
- logotype_image = Image("logo.png");
- progress_meter_image = Image("progress-meter.png");
- progress_fade_image = Image("progress-fade.png");
- fsck_progress_meter_image = Image("progress-meter.png");
- fsck_progress_fade_image = Image("fsck-fade.png");
-
- }
- /**/
- /*
- * Sprites */
- ratio = screen_height / screen_width;
- background_ratio = background_image.GetHeight() / background_image.GetWidth();
- factor = 0;
- if (ratio > background_ratio) {
- factor = screen_height / background_image.GetHeight();
- }
- else {
-
- factor = screen_width / background_image.GetWidth();
-
- }
- scaled = background_image.Scale(background_image.GetWidth() * factor, background_image.GetHeight() * factor);
- background_sprite = Sprite(scaled);
- background_sprite.SetX(screen_x + screen_width / 2 - scaled.GetWidth() / 2);
- background_sprite.SetY(screen_y + screen_height / 2 - scaled.GetHeight() / 2);
- logotype_sprite = Sprite(logotype_image);
- fsck_progress_meter_sprite = Sprite(fsck_progress_meter_image);
- fsck_progress_fade_sprite = Sprite(fsck_progress_fade_image.Scale(1, fsck_progress_fade_image.GetHeight()));
- passw_dialog_input_sprite = Sprite(passw_dialog_input_image);
- passw_lbl_sprite = Sprite();
- msg_label_sprite = Sprite();
- /**/
- /*
- * Misc */
- counter = 0;
- fade_pos_x = (screen_width / 2) - (progress_meter_image.GetWidth() / 2);
- fade_dir = 0; /* 0 = right, 1 = left */
- fsck_running = 0;
- fsck_dev_array;
- fsck_dev_counter = 0;
- fsck_fade_in_counter = 0;
- fsck_done_fading = 0;
- stars_array;
- stars_n = 0;
- //full_msg = "";
- msgs_line = [NULL,NULL,NULL,NULL,NULL];
- /**/
- /*
- * Debug related */
-
- debug = 0;
- debug_sprite = Sprite();
- fun debugOutput(str) {
-
- /*
- * This will print to the top left corner */
- debug_sprite.SetImage(Image.Text(str));
-
- }
- /**/
- /*
- * Setup the graphics properties */
- logotype_sprite.SetPosition(screen_x + (screen_width / 2) - (logotype_image.GetWidth() / 2), screen_y + (screen_height / 2) - (logotype_image.GetHeight() / 2));
- fsck_progress_meter_sprite.SetPosition(screen_x + (screen_width / 2) - (progress_meter_image.GetWidth() / 2), screen_y + (screen_height / 2) + (logotype_image.GetHeight() / 2) + 25);
- fsck_progress_fade_sprite.SetPosition(screen_x + (screen_width / 2) - (progress_meter_image.GetWidth() / 2), screen_y + (screen_height / 2) + (logotype_image.GetHeight() / 2) + 25);
- fsck_progress_meter_sprite.SetOpacity(0);
- fsck_progress_fade_sprite.SetOpacity(0);
- passw_dialog_input_sprite.SetPosition(screen_x + (screen_width / 2) - (passw_dialog_input_image.GetWidth() / 2), screen_y + (screen_height / 2) + (logotype_image.GetHeight() / 2) + 70);
- passw_dialog_input_sprite.SetOpacity(0);
- passw_lbl_sprite.SetOpacity(0);
- spin = 0;
- /*
- * this function only goes up to 100
- * because thats all thats needed for
- * the progress meter bar */
- fun atoi(str) {
-
- int = -1;
-
- for (i = 0; i <= 100; i++) {
-
- if (i + "" == str) {
-
- int = i;
-
- break;
-
- }
-
- }
-
- return int;
- }
- /*
- * This handler will/can be invoked
- * 50 times per second.
- *
- * According to the previous author of the
- * splash script, without this callback
- * the screen is not updated correctly */
- spinner_sprite;
- spinner;
- fun refreshHandler() {
-
- if (spin < 3.14 * 2) {
-
- spin = spin + 0.1;
-
- }
- else {
-
- spin = 0;
-
- }
-
- /* if fsck is running or the password is prompted, hide the spinner */
- if (fsck_running == 1 || passw_dialog_input_sprite.GetOpacity() == 1) {
-
- spinner_sprite.SetOpacity(0);
-
- } else {
-
- spinner = Image("spinner.png");
- spinner = spinner.Rotate(spin);
- spinner_sprite = Sprite(spinner);
- spinner_sprite.SetPosition(screen_x + (screen_width / 2) - (spinner.GetWidth() / 2), screen_y + (screen_height / 2) - (spinner.GetHeight() / 2) + 80);
-
- }
-
- if (fade_dir == 0) {
-
- counter++;
-
- if (counter >= 200) {
-
- fade_dir = 1;
-
- }
-
- }
- else {
-
- counter--;
-
- if (counter <= 0) {
-
- fade_dir = 0;
-
- }
-
- }
-
- if ((fsck_running == 1) && (fsck_done_fading == 0)) {
-
-
- fsck_progress_meter_sprite.SetOpacity(fsck_fade_in_counter);
- fsck_progress_fade_sprite.SetOpacity(fsck_fade_in_counter);
-
- if (fsck_fade_in_counter < 1) {
-
- fsck_fade_in_counter+= 0.025;
-
- }
- else {
-
- fsck_done_fading = 1;
-
- }
-
- }
-
- }
- Plymouth.SetRefreshFunction (refreshHandler);
- /**/
- /*
- * This function will display the password related information
- * when being prompt with entering a password */
- fun showPasswordHandler(prompt, stars) {
-
- if (passw_dialog_input_sprite.GetOpacity() == 0 && passw_lbl_sprite.GetOpacity() == 0) {
-
- passw_dialog_input_sprite.SetOpacity(1);
- passw_lbl_sprite.SetOpacity(1);
-
- }
-
- tmp_prompt_image = Image.Text(prompt, 1, 1, 1);
- passw_lbl_sprite.SetImage(tmp_prompt_image);
- passw_lbl_sprite.SetPosition(screen_x + (screen_width / 2) - (tmp_prompt_image.GetWidth() / 2), screen_y + (screen_height / 2) + (logotype_image.GetHeight() / 2) + 50);
-
- for(i = 0; i < stars_n; i++) {
-
- stars_array[i] = NULL;
-
- }
-
- stars_n = 0;
- for(i = 0; (i < stars) && (i < 15); i++) {
-
- stars_array[i] = Sprite(bullet_image);
- stars_array[i].SetPosition(screen_x + (((screen_width / 2) - (passw_dialog_input_image.GetWidth() / 2)) + (18 * i)) + 2, screen_y + (screen_height / 2) + (logotype_image.GetHeight() / 2) + 75);
- stars_n++;
-
- }
-
- }
- Plymouth.SetDisplayPasswordFunction(showPasswordHandler);
- /**/
- fun displayNormalHandler() {
- /*
- * Hide the password dialog and the bullets */
-
- if (passw_dialog_input_sprite.GetOpacity() == 1) {
-
- passw_dialog_input_sprite.SetOpacity(0);
-
- }
-
- if (passw_lbl_sprite.GetOpacity() == 1) {
-
- passw_lbl_sprite.SetOpacity(0);
-
- }
-
- for(i = 0; i < stars_n; i++) {
-
- stars_array[i] = NULL;
-
- }
- }
- Plymouth.SetDisplayNormalFunction(displayNormalHandler);
- fun strlen(string) {
-
- i = 0;
-
- while (String(string).CharAt(i)) {
-
- i++;
-
- }
-
- return i;
- }
- /*
- * This function will display the most current message */
- fun messageHandler(msg) {
-
- if ((msg == "") || !msg) {
-
- return 0;
-
- }
-
- if (msg.SubString(0, 5) == "keys:") {
-
- msg = msg.SubString(5, strlen(msg));
-
- }
- # Get the message without the "fsckd-cancel-msg" prefix as we don't support i18n
- if (msg.SubString(0, 17) == "fsckd-cancel-msg:")
- msg = msg.SubString(17, strlen(msg));
-
- //full_msg += msg + " ";
- for(i = 4; i > 0; i--) {
- msgs_line[i] = msgs_line[i - 1];
-
- }
-
- msgs_line[0] = Sprite(Image.Text(msg, 1, 1, 1));
-
- dist = 1;
-
- for(i = 0; i < 5; i++) {
- if (msgs_line[i] != NULL) {
- msgs_line[i].SetPosition(screen_x + (screen_width / 2) - (msgs_line[i].GetImage().GetWidth() / 2), screen_y + (screen_height - msgs_line[i].GetImage().GetHeight()) - 20*dist);
- dist++;
- }
- }
- }
- Plymouth.SetMessageFunction(messageHandler);
- /**/
- /*
- * Handles the updates passed to the plymouth daemon
- * for example the FSCK data */
- fun statusHandler(status) {
-
- tmp_char;
- status_array[0] = "";
- elem_count = 0;
-
- for (i = 0; String(status).CharAt(i) != ""; i++) {
-
- tmp_char = String(status).CharAt(i);
-
- if (tmp_char != ":") {
-
- status_array[elem_count] += tmp_char;
-
- }
- else {
-
- elem_count++;
- status_array[elem_count] = "";
-
- }
-
- }
- if (status_array[0] == "fsck") {
-
- already_added = 0;
-
- if (fsck_running == 0) {
-
- /*
- * use the dedicated message handler for this
- * since there is no messages about fsck checks
- * currently... */
- messageHandler("Routine disk drive check.");
-
- fsck_running = 1;
-
- }
-
- for(i = 0; i < fsck_dev_counter; i++) {
-
- /*
- * check if the device already exist and update
- * the progress only in that case */
- if (fsck_dev_array[i][0] == status_array[1]) {
-
- fsck_dev_array[i][1] = status_array[2]; /* progress */
- already_added = 1;
-
- }
-
- }
- /*
- * if the device is not added, then add it */
- if (already_added == 0) {
-
- fsck_dev_array[fsck_dev_counter][0] = status_array[1]; /* device */
- fsck_dev_array[fsck_dev_counter][1] = status_array[2]; /* progress */
- fsck_dev_counter++;
-
- }
-
- /*
- * update the progress */
-
- total = 0;
-
- for(i = 0; i < fsck_dev_counter; i++) {
-
- total += atoi(fsck_dev_array[i][1]);
-
- }
- if (fsck_dev_counter > 0) {
-
- /*
- * display the total percentage */
- fsck_progress_fade_sprite.SetImage(fsck_progress_fade_image.Scale((fsck_progress_meter_image.GetWidth() / 100) * (total / fsck_dev_counter), fsck_progress_fade_image.GetHeight()));
-
- }
-
- /**/
-
- /*
- * if the total progress is at maximum,
- * make the progress meter go away,
- * we might want to fade this out... */
- if (total == (100 * fsck_dev_counter)) {
-
- fsck_progress_meter_sprite.SetOpacity(0);
- fsck_progress_fade_sprite.SetOpacity(0);
-
- }
-
- }
- # systemd-fsckd pass fsckd:<number_devices>:<progress>:<l10n_string>
- if (status_array[0] == "fsckd") {
- fsck_running = 1;
- # remove ",x" as we only care about integers
- progress_str = status_array[2];
- progress = atoi(progress_str.SubString(0, strlen(progress_str) - 2));
- fsck_progress_fade_sprite.SetImage(fsck_progress_fade_image.Scale((fsck_progress_meter_image.GetWidth() / 100) * progress, fsck_progress_fade_image.GetHeight()));
- /*
- * if the total progress is at maximum,
- * make the progress meter go away,
- * we might want to fade this out... */
- if (progress == 100) {
- fsck_progress_meter_sprite.SetOpacity(0);
- fsck_progress_fade_sprite.SetOpacity(0);
- }
- }
-
- }
- Plymouth.SetUpdateStatusFunction(statusHandler);
- /**/
|