diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9368ce7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/plymouth-0.9.3.tar.xz diff --git a/.plymouth.metadata b/.plymouth.metadata new file mode 100644 index 0000000..7e29990 --- /dev/null +++ b/.plymouth.metadata @@ -0,0 +1 @@ +1a07c8bc7d3625e93c5c15b1b0943c0e3a054808 SOURCES/plymouth-0.9.3.tar.xz diff --git a/SOURCES/0001-device-manager-drop-superfluous-create_pixel_display.patch b/SOURCES/0001-device-manager-drop-superfluous-create_pixel_display.patch new file mode 100644 index 0000000..92ec6ce --- /dev/null +++ b/SOURCES/0001-device-manager-drop-superfluous-create_pixel_display.patch @@ -0,0 +1,32 @@ +From 6e9e95dc0fe89a3c52f50e44ff0096a6e65e46a6 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Wed, 20 Dec 2017 10:49:19 -0500 +Subject: [PATCH 1/6] device-manager: drop superfluous + create_pixel_displays_for_renderer call + +commit 29e27637694eefc962d53333c729e6cac1c66518 tried to move +create_pixel_displays_for_renderer down a couple of lines, but it +inadvertently copied it instead of moved it. + +This commit fixes that. + +https://bugs.freedesktop.org/show_bug.cgi?id=104353 +--- + src/libply-splash-core/ply-device-manager.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c +index cf56f4e..fbf4723 100644 +--- a/src/libply-splash-core/ply-device-manager.c ++++ b/src/libply-splash-core/ply-device-manager.c +@@ -713,7 +713,6 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + if (manager->keyboard_added_handler != NULL) + manager->keyboard_added_handler (manager->event_handler_data, keyboard); + +- create_pixel_displays_for_renderer (manager, renderer); + ply_hashtable_insert (manager->renderers, strdup (ply_renderer_get_device_name (renderer)), renderer); + create_pixel_displays_for_renderer (manager, renderer); + +-- +2.17.0 + diff --git a/SOURCES/0001-device-manager-fall-back-to-text-mode-if-graphical-d.patch b/SOURCES/0001-device-manager-fall-back-to-text-mode-if-graphical-d.patch new file mode 100644 index 0000000..84e3924 --- /dev/null +++ b/SOURCES/0001-device-manager-fall-back-to-text-mode-if-graphical-d.patch @@ -0,0 +1,113 @@ +From bdfcf889f8cda47190d98fa8a3e401a1db38074c Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 7 Nov 2017 13:49:30 -0500 +Subject: [PATCH] device-manager: fall back to text mode if graphical devices + fail + +Right now we assume if we find a /dev/dri/card0 that it will work. +That may not be true. The proprietary nvidia driver, for instance, +provides /dev/dri/card0 but disables modesetting by default. + +This commit makes sure we fall back to text mode if /dev/dri/card0 +is insufficient for our needs. + +https://bugs.freedesktop.org/show_bug.cgi?id=103612 +--- + src/libply-splash-core/ply-device-manager.c | 26 ++++++++++++--------- + 1 file changed, 15 insertions(+), 11 deletions(-) + +diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c +index b4c33d4..cf56f4e 100644 +--- a/src/libply-splash-core/ply-device-manager.c ++++ b/src/libply-splash-core/ply-device-manager.c +@@ -47,7 +47,7 @@ + static void create_devices_from_udev (ply_device_manager_t *manager); + #endif + +-static void create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, ++static bool create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + const char *device_path, + ply_terminal_t *terminal, + ply_renderer_type_t renderer_type); +@@ -212,11 +212,12 @@ fb_device_has_drm_device (ply_device_manager_t *manager, + return has_drm_device; + } + +-static void ++static bool + create_devices_for_udev_device (ply_device_manager_t *manager, + struct udev_device *device) + { + const char *device_path; ++ bool created = false; + + device_path = udev_device_get_devnode (device); + +@@ -245,12 +246,14 @@ create_devices_for_udev_device (ply_device_manager_t *manager, + terminal = manager->local_console_terminal; + } + +- create_devices_for_terminal_and_renderer_type (manager, +- device_path, +- terminal, +- renderer_type); ++ created = create_devices_for_terminal_and_renderer_type (manager, ++ device_path, ++ terminal, ++ renderer_type); + } + } ++ ++ return created; + } + + static void +@@ -310,8 +313,7 @@ create_devices_for_subsystem (ply_device_manager_t *manager, + node = udev_device_get_devnode (device); + if (node != NULL) { + ply_trace ("found node %s", node); +- found_device = true; +- create_devices_for_udev_device (manager, device); ++ found_device = create_devices_for_udev_device (manager, device); + } + } else { + ply_trace ("device doesn't have a devices tag"); +@@ -656,7 +658,7 @@ create_text_displays_for_terminal (ply_device_manager_t *manager, + manager->text_display_added_handler (manager->event_handler_data, display); + } + +-static void ++static bool + create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + const char *device_path, + ply_terminal_t *terminal, +@@ -670,7 +672,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + + if (renderer != NULL) { + ply_trace ("ignoring device %s since it's already managed", device_path); +- return; ++ return true; + } + + ply_trace ("creating devices for %s (renderer type: %u) (terminal: %s)", +@@ -686,7 +688,7 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + renderer = NULL; + + if (renderer_type != PLY_RENDERER_TYPE_AUTO) +- return; ++ return false; + } + + if (renderer != NULL) { +@@ -743,6 +745,8 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager, + ply_trace ("activating keyboards"); + ply_keyboard_watch_for_input (keyboard); + } ++ ++ return true; + } + + static void +-- +2.17.1 + diff --git a/SOURCES/0001-device-manager-skip-graphical-renderer-setup-when-de.patch b/SOURCES/0001-device-manager-skip-graphical-renderer-setup-when-de.patch new file mode 100644 index 0000000..0795c49 --- /dev/null +++ b/SOURCES/0001-device-manager-skip-graphical-renderer-setup-when-de.patch @@ -0,0 +1,117 @@ +From 014c2158898067176738ec36c9c90cc266a7e35b Mon Sep 17 00:00:00 2001 +From: Adam Williamson +Date: Wed, 6 Jun 2018 17:06:14 -0700 +Subject: [PATCH] device-manager: skip graphical renderer setup when details + forced + +If neither "rhgb" nor "splash" is on the kernel cmdline, then +plymouth forces the "details" splash. This splash is merely +a passthrough plugin, where it makes boot looks like plymouth +isn't even running. + +In this case, the code sets PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV. +The idea is to not bother waiting for udev events notifying +plymouth when graphics devices show up, since it doesn't need +to use the grpahics devices directly anyway. + +Unfortunately, it does still erroneously try to setup graphical +renderers in this case, including the /dev/fb renderer. + +Before commit e4f86e3c, these graphical renderers failed because +they were given the wrong device name, but since that fix, they're +suceeding. We definitely don't want the /dev/fb renderer to +load if we're ignoring udev on efi systems, since during very +early boot /dev/fb is backed by efifb, something we never want to +use. efifb is supposed to get replaced during the boot process +by other fb implementations like say radeondrmfb, virtiodrmfb or +bochsdrmfb, and some of those implementations can't handle the +transition if /dev/fb is open at switchover time. + +This commit adds a new flag to tell the device manager to +not bother trying to setup graphical renderers when details are +forced. + +http://bugzilla.redhat.com/1518464 +--- + src/libply-splash-core/ply-device-manager.c | 20 ++++++++++++++++---- + src/libply-splash-core/ply-device-manager.h | 3 ++- + src/main.c | 4 +++- + 3 files changed, 21 insertions(+), 6 deletions(-) + +diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c +index fbf4723..b637fb8 100644 +--- a/src/libply-splash-core/ply-device-manager.c ++++ b/src/libply-splash-core/ply-device-manager.c +@@ -786,6 +786,15 @@ create_devices_from_terminals (ply_device_manager_t *manager) + return false; + } + ++static void ++create_non_graphical_devices (ply_device_manager_t *manager) ++{ ++ create_devices_for_terminal_and_renderer_type (manager, ++ NULL, ++ manager->local_console_terminal, ++ PLY_RENDERER_TYPE_NONE); ++} ++ + #ifdef HAVE_UDEV + static void + create_devices_from_udev (ply_device_manager_t *manager) +@@ -801,10 +810,7 @@ create_devices_from_udev (ply_device_manager_t *manager) + return; + + ply_trace ("Creating non-graphical devices, since there's no suitable graphics hardware"); +- create_devices_for_terminal_and_renderer_type (manager, +- NULL, +- manager->local_console_terminal, +- PLY_RENDERER_TYPE_NONE); ++ create_non_graphical_devices (manager); + } + #endif + +@@ -845,6 +851,12 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager, + if (done_with_initial_devices_setup) + return; + ++ if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS)) { ++ ply_trace ("Creating non-graphical devices, since renderers are being explicitly skipped"); ++ create_non_graphical_devices (manager); ++ return; ++ } ++ + if ((manager->flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV)) { + ply_trace ("udev support disabled, creating fallback devices"); + create_fallback_devices (manager); +diff --git a/src/libply-splash-core/ply-device-manager.h b/src/libply-splash-core/ply-device-manager.h +index 058f6e8..ad05897 100644 +--- a/src/libply-splash-core/ply-device-manager.h ++++ b/src/libply-splash-core/ply-device-manager.h +@@ -31,7 +31,8 @@ typedef enum + { + PLY_DEVICE_MANAGER_FLAGS_NONE = 0, + PLY_DEVICE_MANAGER_FLAGS_IGNORE_SERIAL_CONSOLES = 1 << 0, +- PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV = 1 << 1 ++ PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV = 1 << 1, ++ PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS = 1 << 2 + } ply_device_manager_flags_t; + + typedef struct _ply_device_manager ply_device_manager_t; +diff --git a/src/main.c b/src/main.c +index f1e0fa7..841fe6b 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -2358,7 +2358,9 @@ main (int argc, + device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV; + + if (!plymouth_should_show_default_splash (&state)) { +- /* don't bother listening for udev events if we're forcing details */ ++ /* don't bother listening for udev events or setting up a graphical renderer ++ * if we're forcing details */ ++ device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS; + device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV; + + /* don't ever delay showing the detailed splash */ +-- +2.17.1 + diff --git a/SOURCES/0001-logger-Add-a-separator-between-different-boot-logs.patch b/SOURCES/0001-logger-Add-a-separator-between-different-boot-logs.patch new file mode 100644 index 0000000..8d890d1 --- /dev/null +++ b/SOURCES/0001-logger-Add-a-separator-between-different-boot-logs.patch @@ -0,0 +1,181 @@ +From 5fc9f555176bbbc354d651e6e31f618aea0b2b7d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 17 Jul 2018 09:46:12 +0200 +Subject: [PATCH] logger: Add a separator between different boot logs + +Since we concatenate boot logs one after the other in /var/log/boot.log +it is hard to tell where the logs from one boot end the next boot starts. + +This commit makes plymouth write out a separator including a time + date +of the date, when the log file gets opened to add new boot messages to it. + +Note ply_logger_open_file() is only called from ply_terminal_session_open_log() +which in turn is only used for /var/log/boot.log, so this only effects +/var/log/boot.log. + +Closes #29 + +Signed-off-by: Hans de Goede +--- + src/libply/ply-logger.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/src/libply/ply-logger.c b/src/libply/ply-logger.c +index 1b56ea8..3dbc3ca 100644 +--- a/src/libply/ply-logger.c ++++ b/src/libply/ply-logger.c +@@ -7,60 +7,61 @@ + * 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: Ray Strode + */ + #include "config.h" + #include "ply-logger.h" + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include ++#include + #include + + #include "ply-utils.h" + #include "ply-list.h" + + #ifndef PLY_LOGGER_OPEN_FLAGS + #define PLY_LOGGER_OPEN_FLAGS (O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_CLOEXEC) + #endif + + #ifndef PLY_LOGGER_MAX_INJECTION_SIZE + #define PLY_LOGGER_MAX_INJECTION_SIZE 4096 + #endif + + #ifndef PLY_LOGGER_MAX_BUFFER_CAPACITY + #define PLY_LOGGER_MAX_BUFFER_CAPACITY (8 * 4096) + #endif + + typedef struct + { + ply_logger_filter_handler_t handler; + void *user_data; + } ply_logger_filter_t; + + struct _ply_logger + { + int output_fd; + char *filename; + + char *buffer; + size_t buffer_size; +@@ -285,77 +286,89 @@ ply_logger_free_filters (ply_logger_t *logger) + free (filter); + node = next_node; + } + + ply_list_free (logger->filters); + } + + void + ply_logger_free (ply_logger_t *logger) + { + if (logger == NULL) + return; + + if (logger->output_fd >= 0) { + if (ply_logger_is_logging (logger)) + ply_logger_flush (logger); + close (logger->output_fd); + } + + ply_logger_free_filters (logger); + + free (logger->filename); + free (logger->buffer); + free (logger); + } + + bool + ply_logger_open_file (ply_logger_t *logger, + const char *filename) + { ++ char header[80]; ++ struct tm* tm; ++ time_t t; + int fd; + mode_t mode; + + assert (logger != NULL); + assert (filename != NULL); + + fd = open (filename, PLY_LOGGER_OPEN_FLAGS, 0600); + + if (fd < 0) + return false; + + ply_logger_set_output_fd (logger, fd); + + free (logger->filename); + + logger->filename = strdup (filename); + ++ time (&t); ++ tm = localtime (&t); ++ if (tm) { ++ /* This uses uname -v date format */ ++ strftime (header, sizeof(header), ++ "------------ %a %b %d %T %Z %Y ------------\n", tm); ++ ply_logger_write (logger, header, strlen(header), true); ++ } ++ + return true; + } + + void + ply_logger_close_file (ply_logger_t *logger) + { + assert (logger != NULL); + + if (logger->output_fd < 0) + return; + + close (logger->output_fd); + ply_logger_set_output_fd (logger, -1); + } + + void + ply_logger_set_output_fd (ply_logger_t *logger, + int fd) + { + assert (logger != NULL); + + logger->output_fd = fd; + } + + int + ply_logger_get_output_fd (ply_logger_t *logger) + { + assert (logger != NULL); + + return logger->output_fd; +-- +2.18.1 + diff --git a/SOURCES/0001-populate-initrd-drop-unused-local-variable.patch b/SOURCES/0001-populate-initrd-drop-unused-local-variable.patch new file mode 100644 index 0000000..d463294 --- /dev/null +++ b/SOURCES/0001-populate-initrd-drop-unused-local-variable.patch @@ -0,0 +1,83 @@ +From f31312257094b3336c38cc8bdce1ded9188d37c3 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:02:50 -0400 +Subject: [PATCH 1/6] populate-initrd: drop unused local variable + +the inst_library function declares a variable `_lib` +that's completely unused. + +This commit removes the declaration. +--- + scripts/plymouth-populate-initrd.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/plymouth-populate-initrd.in b/scripts/plymouth-populate-initrd.in +index e3326e9..5f3bb85 100755 +--- a/scripts/plymouth-populate-initrd.in ++++ b/scripts/plymouth-populate-initrd.in +@@ -141,61 +141,61 @@ inst_simple() { + + # find symlinks linked to given library file + # $1 = library file + # Function searches for symlinks by stripping version numbers appended to + # library filename, checks if it points to the same target and finally + # prints the list of symlinks to stdout. + # + # Example: + # rev_lib_symlinks libfoo.so.8.1 + # output: libfoo.so.8 libfoo.so + # (Only if libfoo.so.8 and libfoo.so exists on host system.) + rev_lib_symlinks() { + [[ ! $1 ]] && return 0 + + local fn="$1" orig="$(readlink -f "$1")" links='' + + [[ ${fn} =~ .*\.so\..* ]] || return 1 + + until [[ ${fn##*.} == so ]]; do + fn="${fn%.*}" + [[ -L ${fn} && $(readlink -f "${fn}") == ${orig} ]] && links+=" ${fn}" + done + + echo "${links}" + } + + # Same as above, but specialized to handle dynamic libraries. + # It handles making symlinks according to how the original library + # is referenced. + inst_library() { +- local _src="$1" _dest=${2:-$1} _lib _reallib _symlink ++ local _src="$1" _dest=${2:-$1} _reallib _symlink + strstr "$1" "/" || return 1 + [[ -e $initdir/$_dest ]] && return 0 + if [[ -L $_src ]]; then + # install checksum files also + if [[ -e "${_src%/*}/.${_src##*/}.hmac" ]]; then + inst "${_src%/*}/.${_src##*/}.hmac" "${_dest%/*}/.${_dest##*/}.hmac" + fi + _reallib=$(readlink -f "$_src") + inst_simple "$_reallib" "$_reallib" + inst_dir "${_dest%/*}" + [[ -d "${_dest%/*}" ]] && _dest=$(readlink -f "${_dest%/*}")/${_dest##*/} + ln -sfn $(convert_abs_rel "${_dest}" "${_reallib}") "${initdir}/${_dest}" + else + inst_simple "$_src" "$_dest" + fi + + # Create additional symlinks. See rev_symlinks description. + for _symlink in $(rev_lib_symlinks $_src) $(rev_lib_symlinks $_reallib); do + [[ ! -e $initdir/$_symlink ]] && { + ddebug "Creating extra symlink: $_symlink" + inst_symlink $_symlink + } + done + } + + # find a binary. If we were not passed the full path directly, + # search in the usual places to find the binary. + find_binary() { + if [[ -z ${1##/*} ]]; then + if [[ -x $1 ]] || { strstr "$1" ".so" && ldd $1 &>/dev/null; }; then +-- +2.17.1 + diff --git a/SOURCES/0002-boot-splash-fix-memory-leak-in-error-path.patch b/SOURCES/0002-boot-splash-fix-memory-leak-in-error-path.patch new file mode 100644 index 0000000..f745719 --- /dev/null +++ b/SOURCES/0002-boot-splash-fix-memory-leak-in-error-path.patch @@ -0,0 +1,86 @@ +From c9a698d7840fca23cbaa205262a094e4f8648bb3 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:04:47 -0400 +Subject: [PATCH 2/6] boot-splash: fix memory leak in error path + +If the splash key file fails to load, we don't free +the associated key file object. + +This commit fixes that. +--- + src/libply-splash-core/ply-boot-splash.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/libply-splash-core/ply-boot-splash.c b/src/libply-splash-core/ply-boot-splash.c +index 87a7a0c..54f8585 100644 +--- a/src/libply-splash-core/ply-boot-splash.c ++++ b/src/libply-splash-core/ply-boot-splash.c +@@ -181,62 +181,64 @@ void + ply_boot_splash_remove_text_display (ply_boot_splash_t *splash, + ply_text_display_t *display) + { + int number_of_columns, number_of_rows; + + if (splash->plugin_interface->remove_text_display == NULL) + return; + + number_of_columns = ply_text_display_get_number_of_columns (display); + number_of_rows = ply_text_display_get_number_of_rows (display); + + ply_trace ("removing %dx%d text display", number_of_columns, number_of_rows); + + splash->plugin_interface->remove_text_display (splash->plugin, display); + ply_list_remove_data (splash->text_displays, display); + } + + bool + ply_boot_splash_load (ply_boot_splash_t *splash) + { + ply_key_file_t *key_file; + char *module_name; + char *module_path; + + assert (splash != NULL); + + get_plugin_interface_function_t get_boot_splash_plugin_interface; + + key_file = ply_key_file_new (splash->theme_path); + +- if (!ply_key_file_load (key_file)) ++ if (!ply_key_file_load (key_file)) { ++ ply_key_file_free (key_file); + return false; ++ } + + module_name = ply_key_file_get_value (key_file, "Plymouth Theme", "ModuleName"); + + asprintf (&module_path, "%s%s.so", + splash->plugin_dir, module_name); + free (module_name); + + splash->module_handle = ply_open_module (module_path); + + free (module_path); + + if (splash->module_handle == NULL) { + ply_key_file_free (key_file); + return false; + } + + get_boot_splash_plugin_interface = (get_plugin_interface_function_t) + ply_module_look_up_function (splash->module_handle, + "ply_boot_splash_plugin_get_interface"); + + if (get_boot_splash_plugin_interface == NULL) { + ply_save_errno (); + ply_close_module (splash->module_handle); + splash->module_handle = NULL; + ply_key_file_free (key_file); + ply_restore_errno (); + return false; + } + + splash->plugin_interface = get_boot_splash_plugin_interface (); +-- +2.17.1 + diff --git a/SOURCES/0002-main-Do-not-update-the-display-on-backspace-when-the.patch b/SOURCES/0002-main-Do-not-update-the-display-on-backspace-when-the.patch new file mode 100644 index 0000000..d92621a --- /dev/null +++ b/SOURCES/0002-main-Do-not-update-the-display-on-backspace-when-the.patch @@ -0,0 +1,45 @@ +From da27e42316962be6f6b8ba2afb49760d9704d070 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Sun, 21 Jan 2018 14:07:39 +0100 +Subject: [PATCH 2/6] main: Do not update the display on backspace when there + is no input to remove + +On machines with a slow CPU (Atom) and a highres screen drawing the +diskcrypt dialog may take longer then the keyrepeat speed, this leads to +a long delay before showing keypresses when doing the following: + +1) Type long password +2) Realize it is wrong, press + hold backspace + the key-repeat will now generate backspace key presses faster then we + process them as main.c does an update_display for each press +3) Users releases backspace when we've processed input-length backspace + key-presses, but since we were drawing slower then key-presses were + coming in many more backspace keypresses are in the keyboard buffer +4) User types first character of the right password, this shows up up to + a couple of seconds later because first we are still processing all + the queued up backspace presses and doing a redraw for each. + +This commit fixes this by skipping the redraws in on_backspace when there +is no more input left in the input buffer. + +https://bugs.freedesktop.org/show_bug.cgi?id=104714 +--- + src/main.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/main.c b/src/main.c +index 08c7fe1..f1e0fa7 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -1570,6 +1570,8 @@ on_backspace (state_t *state) + + bytes = ply_buffer_get_bytes (state->entry_buffer); + size = ply_buffer_get_size (state->entry_buffer); ++ if (size == 0) ++ return; + + bytes_to_remove = MIN (size, PLY_UTF8_CHARACTER_SIZE_MAX); + while ((previous_character_size = ply_utf8_character_get_size (bytes + size - bytes_to_remove, bytes_to_remove)) < bytes_to_remove) { +-- +2.17.0 + diff --git a/SOURCES/0003-event-loop-fix-leak-in-error-path.patch b/SOURCES/0003-event-loop-fix-leak-in-error-path.patch new file mode 100644 index 0000000..da447b7 --- /dev/null +++ b/SOURCES/0003-event-loop-fix-leak-in-error-path.patch @@ -0,0 +1,86 @@ +From 9f335750af9e46d6597de0cea5b8a2f7db951dc1 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:07:01 -0400 +Subject: [PATCH 3/6] event-loop: fix leak in error path + +ply_event_loop_new fails to clean itself up if it's unable to +create a pipe for dispatching signals. + +This commit fixes that. +--- + src/libply/ply-event-loop.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/libply/ply-event-loop.c b/src/libply/ply-event-loop.c +index 9736dae..0e8ad7c 100644 +--- a/src/libply/ply-event-loop.c ++++ b/src/libply/ply-event-loop.c +@@ -469,62 +469,64 @@ ply_event_loop_remove_destination_by_fd_watch (ply_event_loop_t *loop, + source = destination->source; + assert (source != NULL); + + ply_list_remove_data (source->destinations, destination); + ply_event_source_drop_reference (source); + assert (ply_list_find_node (source->destinations, destination) == NULL); + ply_event_loop_update_source_event_mask (loop, source); + } + + ply_event_loop_t * + ply_event_loop_new (void) + { + ply_event_loop_t *loop; + + loop = calloc (1, sizeof(ply_event_loop_t)); + + loop->epoll_fd = epoll_create1 (EPOLL_CLOEXEC); + loop->wakeup_time = PLY_EVENT_LOOP_NO_TIMED_WAKEUP; + + assert (loop->epoll_fd >= 0); + + loop->should_exit = false; + loop->exit_code = 0; + + loop->sources = ply_list_new (); + loop->exit_closures = ply_list_new (); + loop->timeout_watches = ply_list_new (); + + loop->signal_dispatcher = ply_signal_dispatcher_new (); + +- if (loop->signal_dispatcher == NULL) ++ if (loop->signal_dispatcher == NULL) { ++ ply_event_loop_free (loop); + return NULL; ++ } + + ply_event_loop_watch_fd (loop, + ply_signal_dispatcher_receiver_fd, + PLY_EVENT_LOOP_FD_STATUS_HAS_DATA, + (ply_event_handler_t) + ply_signal_dispatcher_dispatch_signal, + (ply_event_handler_t) + ply_signal_dispatcher_reset_signal_sources, + loop->signal_dispatcher); + + return loop; + } + + ply_event_loop_t * + ply_event_loop_get_default (void) + { + static ply_event_loop_t *loop = NULL; + + if (loop == NULL) + loop = ply_event_loop_new (); + + return loop; + } + + static void + ply_event_loop_free_exit_closures (ply_event_loop_t *loop) + { + ply_list_node_t *node; + + node = ply_list_get_first_node (loop->exit_closures); +-- +2.17.1 + diff --git a/SOURCES/0003-pixel-buffer-Add-the-concept-of-device-rotation.patch b/SOURCES/0003-pixel-buffer-Add-the-concept-of-device-rotation.patch new file mode 100644 index 0000000..0317509 --- /dev/null +++ b/SOURCES/0003-pixel-buffer-Add-the-concept-of-device-rotation.patch @@ -0,0 +1,249 @@ +From 0e4e268844ea38075535eb5b233dda325da4481d Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Wed, 6 Dec 2017 17:37:12 +0100 +Subject: [PATCH 3/6] pixel-buffer: Add the concept of device rotation + +On some devices the LCD panel is mounted in the casing in such a way +that the up/top side of the panel does not match with the top side of +the device (e.g. it is mounted upside-down). + +This commit adds support to the ply-pixel-buffer code to create +buffers which take device rotation into account and which will rotate +the picture to compensate. + +https://bugs.freedesktop.org/show_bug.cgi?id=104714 +--- + src/libply-splash-core/ply-pixel-buffer.c | 109 ++++++++++++++++++++-- + src/libply-splash-core/ply-pixel-buffer.h | 9 ++ + 2 files changed, 110 insertions(+), 8 deletions(-) + +diff --git a/src/libply-splash-core/ply-pixel-buffer.c b/src/libply-splash-core/ply-pixel-buffer.c +index 52a3f86..a337407 100644 +--- a/src/libply-splash-core/ply-pixel-buffer.c ++++ b/src/libply-splash-core/ply-pixel-buffer.c +@@ -50,6 +50,7 @@ struct _ply_pixel_buffer + ply_region_t *updated_areas; /* in device pixels */ + uint32_t is_opaque : 1; + int device_scale; ++ int device_rotation; + }; + + static inline void ply_pixel_buffer_blend_value_at_pixel (ply_pixel_buffer_t *buffer, +@@ -153,6 +154,52 @@ make_pixel_value_translucent (uint32_t pixel_value, + return (alpha << 24) | (red << 16) | (green << 8) | blue; + } + ++static inline void ply_pixel_buffer_set_pixel (ply_pixel_buffer_t *buffer, ++ int x, ++ int y, ++ uint32_t pixel_value) ++{ ++ switch (buffer->device_rotation) { ++ case PLY_PIXEL_BUFFER_ROTATE_UPRIGHT: ++ buffer->bytes[y * buffer->area.width + x] = pixel_value; ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN: ++ x = (buffer->area.width - 1) - x; ++ y = (buffer->area.height - 1) - y; ++ buffer->bytes[y * buffer->area.width + x] = pixel_value; ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE: ++ y = (buffer->area.height - 1) - y; ++ buffer->bytes[x * buffer->area.height + y] = pixel_value; ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE: ++ x = (buffer->area.width - 1) - x; ++ buffer->bytes[x * buffer->area.height + y] = pixel_value; ++ break; ++ } ++} ++ ++static inline uint32_t ply_pixel_buffer_get_pixel (ply_pixel_buffer_t *buffer, ++ int x, ++ int y) ++{ ++ switch (buffer->device_rotation) { ++ case PLY_PIXEL_BUFFER_ROTATE_UPRIGHT: ++ return buffer->bytes[y * buffer->area.width + x]; ++ case PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN: ++ x = (buffer->area.width - 1) - x; ++ y = (buffer->area.height - 1) - y; ++ return buffer->bytes[y * buffer->area.width + x]; ++ case PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE: ++ y = (buffer->area.height - 1) - y; ++ return buffer->bytes[x * buffer->area.height + y]; ++ case PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE: ++ x = (buffer->area.width - 1) - x; ++ return buffer->bytes[x * buffer->area.height + y]; ++ } ++ return 0; ++} ++ + static inline void + ply_pixel_buffer_blend_value_at_pixel (ply_pixel_buffer_t *buffer, + int x, +@@ -162,12 +209,12 @@ ply_pixel_buffer_blend_value_at_pixel (ply_pixel_buffer_t *buffer, + uint32_t old_pixel_value; + + if ((pixel_value >> 24) != 0xff) { +- old_pixel_value = buffer->bytes[y * buffer->area.width + x]; ++ old_pixel_value = ply_pixel_buffer_get_pixel (buffer, x, y); + + pixel_value = blend_two_pixel_values (pixel_value, old_pixel_value); + } + +- buffer->bytes[y * buffer->area.width + x] = pixel_value; ++ ply_pixel_buffer_set_pixel (buffer, x, y, pixel_value); + } + + static void +@@ -222,6 +269,35 @@ ply_pixel_buffer_crop_area_to_clip_area (ply_pixel_buffer_t *buffer, + } + } + ++static void ply_pixel_buffer_add_updated_area (ply_pixel_buffer_t *buffer, ++ ply_rectangle_t *area) ++{ ++ ply_rectangle_t updated_area = *area; ++ ++ switch (buffer->device_rotation) { ++ case PLY_PIXEL_BUFFER_ROTATE_UPRIGHT: ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN: ++ updated_area.x = buffer->area.width - area->width - area->x; ++ updated_area.y = buffer->area.height - area->height - area->y; ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE: ++ updated_area.x = buffer->area.height - area->height - area->y; ++ updated_area.y = area->x; ++ updated_area.height = area->width; ++ updated_area.width = area->height; ++ break; ++ case PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE: ++ updated_area.x = area->y; ++ updated_area.y = buffer->area.width - area->width - area->x; ++ updated_area.height = area->width; ++ updated_area.width = area->height; ++ break; ++ } ++ ++ ply_region_add_rectangle (buffer->updated_areas, &updated_area); ++} ++ + static void + ply_pixel_buffer_fill_area_with_pixel_value (ply_pixel_buffer_t *buffer, + ply_rectangle_t *fill_area, +@@ -251,7 +327,7 @@ ply_pixel_buffer_fill_area_with_pixel_value (ply_pixel_buffer_t *buffer, + } + } + +- ply_region_add_rectangle (buffer->updated_areas, &cropped_area); ++ ply_pixel_buffer_add_updated_area (buffer, &cropped_area); + } + + void +@@ -281,9 +357,24 @@ ply_pixel_buffer_pop_clip_area (ply_pixel_buffer_t *buffer) + ply_pixel_buffer_t * + ply_pixel_buffer_new (unsigned long width, + unsigned long height) ++{ ++ return ply_pixel_buffer_new_with_device_rotation ( ++ width, height, PLY_PIXEL_BUFFER_ROTATE_UPRIGHT); ++} ++ ++ply_pixel_buffer_t * ++ply_pixel_buffer_new_with_device_rotation (unsigned long width, ++ unsigned long height, ++ int device_rotation) + { + ply_pixel_buffer_t *buffer; + ++ if (device_rotation >= PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE) { ++ unsigned long tmp = width; ++ width = height; ++ height = tmp; ++ } ++ + buffer = calloc (1, sizeof(ply_pixel_buffer_t)); + + buffer->updated_areas = ply_region_new (); +@@ -292,6 +383,7 @@ ply_pixel_buffer_new (unsigned long width, + buffer->area.height = height; + buffer->logical_area = buffer->area; + buffer->device_scale = 1; ++ buffer->device_rotation = device_rotation; + + buffer->clip_areas = ply_list_new (); + ply_pixel_buffer_push_clip_area (buffer, &buffer->area); +@@ -447,7 +539,7 @@ ply_pixel_buffer_fill_with_gradient (ply_pixel_buffer_t *buffer, + + for (y = buffer->area.y; y < buffer->area.y + buffer->area.height; y++) { + if (cropped_area.y <= y && y < cropped_area.y + cropped_area.height) { +- if (cropped_area.width < UNROLLED_PIXEL_COUNT) { ++ if (cropped_area.width < UNROLLED_PIXEL_COUNT || buffer->device_rotation) { + for (x = cropped_area.x; x < cropped_area.x + cropped_area.width; x++) { + pixel = 0xff000000; + RANDOMIZE (noise); +@@ -457,7 +549,7 @@ ply_pixel_buffer_fill_with_gradient (ply_pixel_buffer_t *buffer, + RANDOMIZE (noise); + pixel |= (((blue + noise) & COLOR_MASK) >> BLUE_SHIFT); + +- buffer->bytes[y * buffer->area.width + x] = pixel; ++ ply_pixel_buffer_set_pixel (buffer, x, y, pixel); + } + } else { + uint32_t shaded_set[UNROLLED_PIXEL_COUNT]; +@@ -485,7 +577,7 @@ ply_pixel_buffer_fill_with_gradient (ply_pixel_buffer_t *buffer, + blue += blue_step; + } + +- ply_region_add_rectangle (buffer->updated_areas, &cropped_area); ++ ply_pixel_buffer_add_updated_area (buffer, &cropped_area); + } + + void +@@ -671,7 +763,7 @@ ply_pixel_buffer_fill_with_argb32_data_at_opacity_with_clip_and_scale (ply_pixel + } + } + +- ply_region_add_rectangle (buffer->updated_areas, &cropped_area); ++ ply_pixel_buffer_add_updated_area (buffer, &cropped_area); + } + + void +@@ -756,7 +848,8 @@ ply_pixel_buffer_fill_with_buffer_at_opacity_with_clip (ply_pixel_buffer_t *canv + + /* Fast path to memcpy if we need no blending or scaling */ + if (opacity == 1.0 && ply_pixel_buffer_is_opaque (source) && +- canvas->device_scale == source->device_scale) { ++ canvas->device_scale == source->device_scale && ++ canvas->device_rotation == PLY_PIXEL_BUFFER_ROTATE_UPRIGHT) { + ply_rectangle_t cropped_area; + + cropped_area.x = x_offset; +diff --git a/src/libply-splash-core/ply-pixel-buffer.h b/src/libply-splash-core/ply-pixel-buffer.h +index 595e9bd..7736dd3 100644 +--- a/src/libply-splash-core/ply-pixel-buffer.h ++++ b/src/libply-splash-core/ply-pixel-buffer.h +@@ -37,9 +37,18 @@ typedef struct _ply_pixel_buffer ply_pixel_buffer_t; + | ((uint8_t) (CLAMP (g * 255.0, 0.0, 255.0)) << 8) \ + | ((uint8_t) (CLAMP (b * 255.0, 0.0, 255.0)))) + ++#define PLY_PIXEL_BUFFER_ROTATE_UPRIGHT 0 ++#define PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN 1 ++#define PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE 2 ++#define PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE 3 ++ + #ifndef PLY_HIDE_FUNCTION_DECLARATIONS + ply_pixel_buffer_t *ply_pixel_buffer_new (unsigned long width, + unsigned long height); ++ply_pixel_buffer_t * ++ply_pixel_buffer_new_with_device_rotation (unsigned long width, ++ unsigned long height, ++ int device_rotation); + void ply_pixel_buffer_free (ply_pixel_buffer_t *buffer); + void ply_pixel_buffer_get_size (ply_pixel_buffer_t *buffer, + ply_rectangle_t *size); +-- +2.17.0 + diff --git a/SOURCES/0004-drm-Check-for-panel-orientation-connector-property.patch b/SOURCES/0004-drm-Check-for-panel-orientation-connector-property.patch new file mode 100644 index 0000000..f953c8b --- /dev/null +++ b/SOURCES/0004-drm-Check-for-panel-orientation-connector-property.patch @@ -0,0 +1,102 @@ +From a6f25b727698a2382e332ab566ed39ee30f8efdc Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Tue, 12 Dec 2017 19:47:26 +0100 +Subject: [PATCH 4/6] drm: Check for "panel orientation" connector property + +On some devices the LCD panel is mounted in the casing in such a way +that the up/top side of the panel does not match with the top side of +the device (e.g. it is mounted upside-down). + +Kernel 4.16 introduces a new "panel-orientation" property on the drm +connector which allows modesetting applications / code to check for +such LCD panels. + +This commit adds support for this new property and passes this to the +pixel_buffer code using the new ply_pixel_buffer_new_with_device_rotation +method, so that the pixel_buffer code will automatically rotate the +image to correct for the panel orientation. + +https://bugs.freedesktop.org/show_bug.cgi?id=104714 +--- + src/plugins/renderers/drm/plugin.c | 51 +++++++++++++++++++++++++++++- + 1 file changed, 50 insertions(+), 1 deletion(-) + +diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c +index b93e8e4..f495854 100644 +--- a/src/plugins/renderers/drm/plugin.c ++++ b/src/plugins/renderers/drm/plugin.c +@@ -367,6 +367,53 @@ destroy_output_buffer (ply_renderer_backend_t *backend, + ply_renderer_buffer_free (backend, buffer); + } + ++static int ++connector_orientation_prop_to_rotation (drmModePropertyPtr prop, ++ int orientation) ++{ ++ const char *name = prop->enums[orientation].name; ++ ++ if (strcmp (name, "Upside Down") == 0) ++ return PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN; ++ ++ if (strcmp (name, "Left Side Up") == 0) { ++ /* Left side up, rotate counter clockwise to correct */ ++ return PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE; ++ } ++ ++ if (strcmp (name, "Right Side Up") == 0) { ++ /* Left side up, rotate clockwise to correct */ ++ return PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE; ++ } ++ ++ return PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; ++} ++ ++static int ++ply_renderer_connector_get_rotation (ply_renderer_backend_t *backend, ++ drmModeConnector *connector) ++{ ++ drmModePropertyPtr prop; ++ int i, rotation; ++ ++ for (i = 0; i < connector->count_props; i++) { ++ prop = drmModeGetProperty (backend->device_fd, connector->props[i]); ++ if (!prop) ++ continue; ++ ++ if ((prop->flags & DRM_MODE_PROP_ENUM) && ++ strcmp (prop->name, "panel orientation") == 0) { ++ rotation = connector_orientation_prop_to_rotation (prop, connector->prop_values[i]); ++ drmModeFreeProperty (prop); ++ return rotation; ++ } ++ ++ drmModeFreeProperty (prop); ++ } ++ ++ return PLY_PIXEL_BUFFER_ROTATE_UPRIGHT; ++} ++ + static bool + ply_renderer_head_add_connector (ply_renderer_head_t *head, + drmModeConnector *connector, +@@ -402,6 +449,7 @@ ply_renderer_head_new (ply_renderer_backend_t *backend, + { + ply_renderer_head_t *head; + drmModeModeInfo *mode; ++ int rotation; + + head = calloc (1, sizeof(ply_renderer_head_t)); + +@@ -425,7 +473,8 @@ ply_renderer_head_new (ply_renderer_backend_t *backend, + ply_renderer_head_add_connector (head, connector, connector_mode_index); + assert (ply_array_get_size (head->connector_ids) > 0); + +- head->pixel_buffer = ply_pixel_buffer_new (head->area.width, head->area.height); ++ rotation = ply_renderer_connector_get_rotation (backend, connector); ++ head->pixel_buffer = ply_pixel_buffer_new_with_device_rotation (head->area.width, head->area.height, rotation); + ply_pixel_buffer_set_device_scale (head->pixel_buffer, + ply_get_device_scale (head->area.width, + head->area.height, +-- +2.17.0 + diff --git a/SOURCES/0004-key-file-ply_key_file_get_value-returns-duplicated-m.patch b/SOURCES/0004-key-file-ply_key_file_get_value-returns-duplicated-m.patch new file mode 100644 index 0000000..b3fafcd --- /dev/null +++ b/SOURCES/0004-key-file-ply_key_file_get_value-returns-duplicated-m.patch @@ -0,0 +1,216 @@ +From b8d406161ee95ad4fa1a478d262993090404608f Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:13:58 -0400 +Subject: [PATCH 4/6] key-file: ply_key_file_get_value returns duplicated + memory, don't leak + +For some reason I made the same api misdesign with ply_key_file_t +that I made when writing GKeyFile...it returns duplicated memory for +no good reason. + +This commit sprinkles frees around. +--- + src/main.c | 13 +++++++++---- + src/plugins/splash/two-step/plugin.c | 2 ++ + 2 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/src/main.c b/src/main.c +index 841fe6b..e44de7b 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -268,116 +268,121 @@ on_system_update (state_t *state, + } + + static void + show_messages (state_t *state) + { + if (state->boot_splash == NULL) { + ply_trace ("not displaying messages, since no boot splash"); + return; + } + + ply_list_node_t *node = ply_list_get_first_node (state->messages); + while (node != NULL) { + ply_list_node_t *next_node; + char *message = ply_list_node_get_data (node); + + ply_trace ("displaying messages"); + + ply_boot_splash_display_message (state->boot_splash, message); + next_node = ply_list_get_next_node (state->messages, node); + node = next_node; + } + } + + static bool + load_settings (state_t *state, + const char *path, + char **theme_path) + { + ply_key_file_t *key_file = NULL; + bool settings_loaded = false; +- const char *scale_string; +- const char *splash_string; ++ char *scale_string = NULL; ++ char *splash_string = NULL; + + ply_trace ("Trying to load %s", path); + key_file = ply_key_file_new (path); + + if (!ply_key_file_load (key_file)) + goto out; + + splash_string = ply_key_file_get_value (key_file, "Daemon", "Theme"); + + if (splash_string == NULL) + goto out; + + asprintf (theme_path, + PLYMOUTH_RUNTIME_THEME_PATH "%s/%s.plymouth", + splash_string, splash_string); + ply_trace ("Checking if %s exists", *theme_path); + if (!ply_file_exists (*theme_path)) { + ply_trace ("%s not found, fallbacking to " PLYMOUTH_THEME_PATH, + *theme_path); + asprintf (theme_path, + PLYMOUTH_THEME_PATH "%s/%s.plymouth", + splash_string, splash_string); + } + + if (isnan (state->splash_delay)) { +- const char *delay_string; ++ char *delay_string; + + delay_string = ply_key_file_get_value (key_file, "Daemon", "ShowDelay"); + + if (delay_string != NULL) { + state->splash_delay = atof (delay_string); + ply_trace ("Splash delay is set to %lf", state->splash_delay); ++ free (delay_string); + } + } + + if (isnan (state->device_timeout)) { +- const char *timeout_string; ++ char *timeout_string; + + timeout_string = ply_key_file_get_value (key_file, "Daemon", "DeviceTimeout"); + + if (timeout_string != NULL) { + state->device_timeout = atof (timeout_string); + ply_trace ("Device timeout is set to %lf", state->device_timeout); ++ ++ free (timeout_string); + } + } + + scale_string = ply_key_file_get_value (key_file, "Daemon", "DeviceScale"); + + if (scale_string != NULL) { + ply_set_device_scale (strtoul (scale_string, NULL, 0)); ++ free (scale_string); + } + + settings_loaded = true; + out: ++ free (splash_string); + ply_key_file_free (key_file); + + return settings_loaded; + } + + static void + show_detailed_splash (state_t *state) + { + ply_boot_splash_t *splash; + + if (state->boot_splash != NULL) + return; + + ply_trace ("Showing detailed splash screen"); + splash = show_theme (state, NULL); + + if (splash == NULL) { + ply_trace ("Could not start detailed splash screen, this could be a problem."); + return; + } + + state->boot_splash = splash; + + show_messages (state); + update_display (state); + } + + static const char * + command_line_get_string_after_prefix (const char *command_line, + const char *prefix) +diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c +index 070741d..52986d2 100644 +--- a/src/plugins/splash/two-step/plugin.c ++++ b/src/plugins/splash/two-step/plugin.c +@@ -631,60 +631,62 @@ create_plugin (ply_key_file_t *key_file) + + if (color != NULL) + plugin->background_start_color = strtol (color, NULL, 0); + else + plugin->background_start_color = PLYMOUTH_BACKGROUND_START_COLOR; + + free (color); + + color = ply_key_file_get_value (key_file, "two-step", "BackgroundEndColor"); + + if (color != NULL) + plugin->background_end_color = strtol (color, NULL, 0); + else + plugin->background_end_color = PLYMOUTH_BACKGROUND_END_COLOR; + + free (color); + + progress_function = ply_key_file_get_value (key_file, "two-step", "ProgressFunction"); + + if (progress_function != NULL) { + if (strcmp (progress_function, "wwoods") == 0) { + ply_trace ("Using wwoods progress function"); + plugin->progress_function = PROGRESS_FUNCTION_TYPE_WWOODS; + } else if (strcmp (progress_function, "linear") == 0) { + ply_trace ("Using linear progress function"); + plugin->progress_function = PROGRESS_FUNCTION_TYPE_LINEAR; + } else { + ply_trace ("unknown progress function %s, defaulting to linear", progress_function); + plugin->progress_function = PROGRESS_FUNCTION_TYPE_LINEAR; + } ++ ++ free (progress_function); + } + + plugin->views = ply_list_new (); + + return plugin; + } + + static void + free_views (ply_boot_splash_plugin_t *plugin) + { + ply_list_node_t *node; + + ply_trace ("freeing views"); + + node = ply_list_get_first_node (plugin->views); + + while (node != NULL) { + ply_list_node_t *next_node; + view_t *view; + + view = ply_list_node_get_data (node); + next_node = ply_list_get_next_node (plugin->views, node); + + view_free (view); + ply_list_remove_node (plugin->views, node); + + node = next_node; + } + + ply_list_free (plugin->views); +-- +2.17.1 + diff --git a/SOURCES/0005-drm-Reset-primary-plane-rotation-to-DRM_MODE_ROTATE_.patch b/SOURCES/0005-drm-Reset-primary-plane-rotation-to-DRM_MODE_ROTATE_.patch new file mode 100644 index 0000000..0602bad --- /dev/null +++ b/SOURCES/0005-drm-Reset-primary-plane-rotation-to-DRM_MODE_ROTATE_.patch @@ -0,0 +1,148 @@ +From d769f1194c934ed4ff7ce6bfc502ba485d461c12 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Sat, 20 Jan 2018 12:20:29 +0100 +Subject: [PATCH 5/6] drm: Reset primary plane rotation to DRM_MODE_ROTATE_0 + +On devices where the (LCD) panel is mounted upside-down in the case +the kernel's drm_fb_helper code may have set up rotation on the primary +plane to make the text-console (and other fbdev using apps) show the right +way up. + +We inherit this rotation from the text-mode and since we do our own rotation +where necessary we end up rotating twice and showing the boot-splash +upside-down again. + +Dealing with hardware rotation may require using a specific framebuffer +tiling which we do not support, so we should just disable the hardware +rotation and keep using our own software rotation. + +This commit adds code to find the primary plane and its rotation property +and if it is not DRM_MODE_ROTATE_0 then sets it to DRM_MODE_ROTATE_0. fixing +the double rotation issue. + +https://bugs.freedesktop.org/show_bug.cgi?id=104714 +--- + src/plugins/renderers/drm/plugin.c | 86 ++++++++++++++++++++++++++++++ + 1 file changed, 86 insertions(+) + +diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c +index f495854..fb79aa6 100644 +--- a/src/plugins/renderers/drm/plugin.c ++++ b/src/plugins/renderers/drm/plugin.c +@@ -43,6 +43,7 @@ + #include + + #include ++#include + #include + #include + +@@ -62,6 +63,11 @@ + + #define BYTES_PER_PIXEL (4) + ++/* For builds with libdrm < 2.4.89 */ ++#ifndef DRM_MODE_ROTATE_0 ++#define DRM_MODE_ROTATE_0 (1<<0) ++#endif ++ + struct _ply_renderer_head + { + ply_renderer_backend_t *backend; +@@ -499,6 +505,85 @@ ply_renderer_head_free (ply_renderer_head_t *head) + free (head); + } + ++static void ++ply_renderer_head_clear_plane_rotation (ply_renderer_backend_t *backend, ++ ply_renderer_head_t *head) ++{ ++ drmModeObjectPropertiesPtr plane_props; ++ drmModePlaneResPtr plane_resources; ++ drmModePropertyPtr prop; ++ drmModePlanePtr plane; ++ uint64_t rotation; ++ uint32_t i, j; ++ int rotation_prop_id = -1; ++ int primary_id = -1; ++ int err; ++ ++ err = drmSetClientCap (backend->device_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); ++ if (err) ++ return; ++ ++ plane_resources = drmModeGetPlaneResources (backend->device_fd); ++ if (!plane_resources) ++ return; ++ ++ for (i = 0; i < plane_resources->count_planes; i++) { ++ plane = drmModeGetPlane (backend->device_fd, ++ plane_resources->planes[i]); ++ if (!plane) ++ continue; ++ ++ if (plane->crtc_id != head->controller_id) { ++ drmModeFreePlane (plane); ++ continue; ++ } ++ ++ plane_props = drmModeObjectGetProperties (backend->device_fd, ++ plane->plane_id, ++ DRM_MODE_OBJECT_PLANE); ++ ++ for (j = 0; plane_props && (j < plane_props->count_props); j++) { ++ prop = drmModeGetProperty (backend->device_fd, ++ plane_props->props[j]); ++ if (!prop) ++ continue; ++ ++ if (strcmp (prop->name, "type") == 0 && ++ plane_props->prop_values[j] == DRM_PLANE_TYPE_PRIMARY) { ++ primary_id = plane->plane_id; ++ } ++ ++ if (strcmp (prop->name, "rotation") == 0) { ++ rotation_prop_id = plane_props->props[j]; ++ rotation = plane_props->prop_values[j]; ++ } ++ ++ drmModeFreeProperty (prop); ++ } ++ ++ drmModeFreeObjectProperties (plane_props); ++ drmModeFreePlane (plane); ++ ++ if (primary_id != -1) ++ break; ++ ++ /* Not primary -> clear any found rotation property */ ++ rotation_prop_id = -1; ++ } ++ ++ if (primary_id != -1 && rotation_prop_id != -1 && rotation != DRM_MODE_ROTATE_0) { ++ err = drmModeObjectSetProperty (backend->device_fd, ++ primary_id, ++ DRM_MODE_OBJECT_PLANE, ++ rotation_prop_id, ++ DRM_MODE_ROTATE_0); ++ ply_trace ("Cleared rotation on primary plane %d result %d", ++ primary_id, err); ++ } ++ ++ drmModeFreePlaneResources (plane_resources); ++} ++ + static bool + ply_renderer_head_set_scan_out_buffer (ply_renderer_backend_t *backend, + ply_renderer_head_t *head, +@@ -525,6 +610,7 @@ ply_renderer_head_set_scan_out_buffer (ply_renderer_backend_t *backend, + return false; + } + ++ ply_renderer_head_clear_plane_rotation (backend, head); + return true; + } + +-- +2.17.0 + diff --git a/SOURCES/0005-script-fix-various-memory-leaks.patch b/SOURCES/0005-script-fix-various-memory-leaks.patch new file mode 100644 index 0000000..4a6a59a --- /dev/null +++ b/SOURCES/0005-script-fix-various-memory-leaks.patch @@ -0,0 +1,556 @@ +From 6980c2cdf003f5963695809b3a278ff53ad51832 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:44:10 -0400 +Subject: [PATCH 5/6] script: fix various memory leaks + +coverity found a few leaks. + +this commit mops them up. +--- + src/plugins/splash/script/script-lib-image.c | 5 +- + src/plugins/splash/script/script-lib-sprite.c | 4 +- + src/plugins/splash/script/script-parse.c | 61 +++++++++++++++++-- + 3 files changed, 62 insertions(+), 8 deletions(-) + +diff --git a/src/plugins/splash/script/script-lib-image.c b/src/plugins/splash/script/script-lib-image.c +index a202702..748e6d1 100644 +--- a/src/plugins/splash/script/script-lib-image.c ++++ b/src/plugins/splash/script/script-lib-image.c +@@ -173,61 +173,64 @@ static script_return_t image_text (script_state_t *state, + script_obj_unref (alpha_obj); + + font_obj = script_obj_hash_peek_element (state->local, "font"); + + if (script_obj_is_string (font_obj)) + font = script_obj_as_string (font_obj); + else + font = NULL; + + script_obj_unref (font_obj); + + align_obj = script_obj_hash_peek_element (state->local, "align"); + + if (script_obj_is_string (align_obj)) { + char *align_str = script_obj_as_string (align_obj); + + if (!strcmp ("left", align_str)) + align = PLY_LABEL_ALIGN_LEFT; + else if (!strcmp ("center", align_str)) + align = PLY_LABEL_ALIGN_CENTER; + else if (!strcmp ("right", align_str)) + align = PLY_LABEL_ALIGN_RIGHT; + else + ply_error ("Unrecognized Image.Text alignment string '%s'. " + "Expecting 'left', 'center', or 'right'\n", + align_str); + free (align_str); + } + script_obj_unref (align_obj); + +- if (!text) return script_return_obj_null (); ++ if (!text) { ++ free (font); ++ return script_return_obj_null (); ++ } + + label = ply_label_new (); + ply_label_set_text (label, text); + if (font) + ply_label_set_font (label, font); + ply_label_set_alignment (label, align); + ply_label_set_color (label, red, green, blue, alpha); + ply_label_show (label, NULL, 0, 0); + + width = ply_label_get_width (label); + height = ply_label_get_height (label); + + image = ply_pixel_buffer_new (width, height); + ply_label_draw_area (label, image, 0, 0, width, height); + + free (text); + free (font); + ply_label_free (label); + + return script_return_obj (script_obj_new_native (image, data->class)); + } + + script_lib_image_data_t *script_lib_image_setup (script_state_t *state, + char *image_dir) + { + script_lib_image_data_t *data = malloc (sizeof(script_lib_image_data_t)); + + data->class = script_obj_native_class_new (image_free, "image", data); + data->image_dir = strdup (image_dir); + +diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c +index c49297d..b119f05 100644 +--- a/src/plugins/splash/script/script-lib-sprite.c ++++ b/src/plugins/splash/script/script-lib-sprite.c +@@ -714,66 +714,68 @@ region_add_area (ply_region_t *region, + ply_region_add_rectangle (region, &rectangle); + } + + void script_lib_sprite_pixel_display_removed (script_lib_sprite_data_t *data, ply_pixel_display_t *pixel_display) + { + ply_list_node_t *node; + ply_list_node_t *next_node; + script_lib_display_t* display; + + if (!data) + return; + + node = ply_list_get_first_node (data->displays); + while (node) + { + next_node = ply_list_get_next_node (data->displays, node); + display = ply_list_node_get_data (node); + + if (display->pixel_display == pixel_display) + { + ply_list_remove_node (data->displays, node); + } + node = next_node; + } + } + + void + script_lib_sprite_refresh (script_lib_sprite_data_t *data) + { + ply_list_node_t *node; +- ply_region_t *region = ply_region_new (); ++ ply_region_t *region; + ply_list_t *rectable_list; + + if (!data) + return; + ++ region = ply_region_new (); ++ + ply_list_sort_stable (data->sprite_list, &sprite_compare_z); + + node = ply_list_get_first_node (data->sprite_list); + + + if (data->full_refresh) { + for (node = ply_list_get_first_node (data->displays); + node; + node = ply_list_get_next_node (data->displays, node)) { + script_lib_display_t *display = ply_list_node_get_data (node); + region_add_area (region, + display->x, + display->y, + ply_pixel_display_get_width (display->pixel_display), + ply_pixel_display_get_height (display->pixel_display)); + } + + data->full_refresh = false; + } + + while (node) { + sprite_t *sprite = ply_list_node_get_data (node); + ply_list_node_t *next_node = ply_list_get_next_node (data->sprite_list, + node); + if (sprite->remove_me) { + if (sprite->image) { + region_add_area (region, + sprite->old_x, + sprite->old_y, + sprite->old_width, +diff --git a/src/plugins/splash/script/script-parse.c b/src/plugins/splash/script/script-parse.c +index a4c7656..ea5fdd2 100644 +--- a/src/plugins/splash/script/script-parse.c ++++ b/src/plugins/splash/script/script-parse.c +@@ -27,60 +27,61 @@ + #include "ply-hashtable.h" + #include "ply-list.h" + #include "ply-bitarray.h" + #include "ply-logger.h" + #include + #include + #include + #include + #include + #include + #include + #include + + #include "script-debug.h" + #include "script-scan.h" + #include "script-parse.h" + + #define WITH_SEMIES + + typedef struct + { + const char *symbol; + script_exp_type_t exp_type; + int presedence; + }script_parse_operator_table_entry_t; + + static script_op_t *script_parse_op (script_scan_t *scan); + static script_exp_t *script_parse_exp (script_scan_t *scan); + static ply_list_t *script_parse_op_list (script_scan_t *scan); + static void script_parse_op_list_free (ply_list_t *op_list); ++static void script_parse_exp_free (script_exp_t *exp); + + static script_exp_t *script_parse_new_exp (script_exp_type_t type, + script_debug_location_t *location) + { + script_exp_t *exp = malloc (sizeof(script_exp_t)); + + exp->type = type; + script_debug_add_element (exp, location); + return exp; + } + + static script_exp_t *script_parse_new_exp_single (script_exp_type_t type, + script_exp_t *sub, + script_debug_location_t *location) + { + script_exp_t *exp = script_parse_new_exp (type, location); + + exp->data.sub = sub; + return exp; + } + + static script_exp_t *script_parse_new_exp_dual (script_exp_type_t type, + script_exp_t *sub_a, + script_exp_t *sub_b, + script_debug_location_t *location) + { + script_exp_t *exp = script_parse_new_exp (type, location); + + exp->data.dual.sub_a = sub_a; + exp->data.dual.sub_b = sub_b; +@@ -198,101 +199,127 @@ static void script_parse_error (script_debug_location_t *location, + static const script_parse_operator_table_entry_t * /* Only allows 1 or 2 character symbols */ + script_parse_operator_table_entry_lookup (script_scan_t *scan, + const script_parse_operator_table_entry_t *table) + { + int entry_index; + script_scan_token_t *curtoken = script_scan_get_current_token (scan); + script_scan_token_t *peektoken = script_scan_peek_next_token (scan); + + for (entry_index = 0; table[entry_index].symbol; entry_index++) { + if (!script_scan_token_is_symbol (curtoken)) continue; + if (curtoken->data.symbol != table[entry_index].symbol[0]) continue; + if (table[entry_index].symbol[1]) { + if (!script_scan_token_is_symbol (peektoken)) continue; + if (peektoken->data.symbol != table[entry_index].symbol[1]) continue; + if (peektoken->whitespace) continue; + } + break; + } + return &table[entry_index]; + } + + static void script_parse_advance_scan_by_string (script_scan_t *scan, + const char *string) + { + while (*string) { + script_scan_get_next_token (scan); + string++; + } + } + ++static void ++free_parameter_list (script_scan_t *scan, ++ ply_list_t *parameter_list) ++{ ++ if (parameter_list != NULL) { ++ ply_list_node_t *node; ++ ++ node = ply_list_get_first_node (parameter_list); ++ while (node != NULL) { ++ ply_list_node_t *next_node; ++ char *parameter; ++ ++ parameter = ply_list_node_get_data (node); ++ next_node = ply_list_get_next_node (parameter_list, node); ++ free (parameter); ++ ply_list_remove_node (parameter_list, node); ++ ++ node = next_node; ++ } ++ } ++} ++ + static script_function_t *script_parse_function_def (script_scan_t *scan) + { + script_scan_token_t *curtoken = script_scan_get_current_token (scan); +- ply_list_t *parameter_list; ++ script_function_t *function = NULL; ++ ply_list_t *parameter_list = NULL; + + if (!script_scan_token_is_symbol_of_value (curtoken, '(')) { + script_parse_error (&curtoken->location, + "Function declaration requires parameters to be declared within '(' brackets"); + return NULL; + } + curtoken = script_scan_get_next_token (scan); + parameter_list = ply_list_new (); + + while (true) { + if (script_scan_token_is_symbol_of_value (curtoken, ')')) break; + if (!script_scan_token_is_identifier (curtoken)) { + script_parse_error (&curtoken->location, + "Function declaration parameters must be valid identifiers"); +- return NULL; ++ goto out; + } + char *parameter = strdup (curtoken->data.string); + ply_list_append_data (parameter_list, parameter); + + curtoken = script_scan_get_next_token (scan); + + if (script_scan_token_is_symbol_of_value (curtoken, ')')) break; + if (!script_scan_token_is_symbol_of_value (curtoken, ',')) { + script_parse_error (&curtoken->location, + "Function declaration parameters must separated with ',' and terminated with a ')'"); +- return NULL; ++ goto out; + } + curtoken = script_scan_get_next_token (scan); + } + + curtoken = script_scan_get_next_token (scan); + + script_op_t *func_op = script_parse_op (scan); + +- script_function_t *function = script_function_script_new (func_op, +- NULL, +- parameter_list); ++ function = script_function_script_new (func_op, ++ NULL, ++ parameter_list); ++ parameter_list = NULL; ++out: ++ free_parameter_list (scan, parameter_list); + return function; + } + + static script_exp_t *script_parse_exp_tm (script_scan_t *scan) + { + script_scan_token_t *curtoken = script_scan_get_current_token (scan); + script_exp_t *exp = NULL; + + if (script_scan_token_is_integer (curtoken)) { + exp = script_parse_new_exp_number (curtoken->data.integer, &curtoken->location); + script_scan_get_next_token (scan); + return exp; + } + if (script_scan_token_is_float (curtoken)) { + exp = script_parse_new_exp_number (curtoken->data.floatpoint, &curtoken->location); + script_scan_get_next_token (scan); + return exp; + } + if (script_scan_token_is_identifier (curtoken)) { + if (script_scan_token_is_identifier_of_value (curtoken, "NULL")) { + exp = script_parse_new_exp (SCRIPT_EXP_TYPE_TERM_NULL, &curtoken->location); + } else if (script_scan_token_is_identifier_of_value (curtoken, "INFINITY")) { + exp = script_parse_new_exp_number (INFINITY, &curtoken->location); + } else if (script_scan_token_is_identifier_of_value (curtoken, "NAN")) { + exp = script_parse_new_exp_number (NAN, &curtoken->location); + } else if (script_scan_token_is_identifier_of_value (curtoken, "global")) { + exp = script_parse_new_exp (SCRIPT_EXP_TYPE_TERM_GLOBAL, &curtoken->location); + } else if (script_scan_token_is_identifier_of_value (curtoken, "local")) { + exp = script_parse_new_exp (SCRIPT_EXP_TYPE_TERM_LOCAL, &curtoken->location); + } else if (script_scan_token_is_identifier_of_value (curtoken, "this")) { +@@ -300,112 +327,132 @@ static script_exp_t *script_parse_exp_tm (script_scan_t *scan) + } else if (script_scan_token_is_identifier_of_value (curtoken, "fun")) { + script_debug_location_t location = curtoken->location; + script_scan_get_next_token (scan); + exp = script_parse_new_exp_function_def (script_parse_function_def (scan), &location); + return exp; + } else { + exp = script_parse_new_exp_var (curtoken->data.string, &curtoken->location); + } + curtoken = script_scan_get_next_token (scan); + return exp; + } + if (script_scan_token_is_string (curtoken)) { + exp = script_parse_new_exp_string (curtoken->data.string, &curtoken->location); + script_scan_get_next_token (scan); + return exp; + } + + if (script_scan_token_is_symbol_of_value (curtoken, '[')) { + ply_list_t *parameters = ply_list_new (); + script_debug_location_t location = curtoken->location; + script_scan_get_next_token (scan); + while (true) { + if (script_scan_token_is_symbol_of_value (curtoken, ']')) break; + script_exp_t *parameter = script_parse_exp (scan); + + ply_list_append_data (parameters, parameter); + + curtoken = script_scan_get_current_token (scan); + if (script_scan_token_is_symbol_of_value (curtoken, ']')) break; + if (!script_scan_token_is_symbol_of_value (curtoken, ',')) { ++ ply_list_node_t *node; + script_parse_error (&curtoken->location, + "Set parameters should be separated with a ',' and terminated with a ']'"); ++ ++ ++ for (node = ply_list_get_first_node (parameters); ++ node; ++ node = ply_list_get_next_node (parameters, node)) { ++ script_exp_t *sub = ply_list_node_get_data (node); ++ script_parse_exp_free (sub); ++ } ++ ply_list_free (parameters); + return NULL; + } + curtoken = script_scan_get_next_token (scan); + } + script_scan_get_next_token (scan); + exp = script_parse_new_exp_set (parameters, &location); + return exp; + } + if (script_scan_token_is_symbol_of_value (curtoken, '(')) { + script_scan_get_next_token (scan); + exp = script_parse_exp (scan); + curtoken = script_scan_get_current_token (scan); + if (!exp) { + script_parse_error (&curtoken->location, + "Expected valid contents of bracketed expression"); + return NULL; + } + if (!script_scan_token_is_symbol_of_value (curtoken, ')')) { + script_parse_error (&curtoken->location, + "Expected bracketed block to be terminated with a ')'"); + return NULL; + } + script_scan_get_next_token (scan); + return exp; + } + return NULL; + } + + static script_exp_t *script_parse_exp_pi (script_scan_t *scan) + { + script_exp_t *exp = script_parse_exp_tm (scan); + script_scan_token_t *curtoken = script_scan_get_current_token (scan); + + while (true) { + script_debug_location_t location = curtoken->location; + if (!script_scan_token_is_symbol (curtoken)) break; + if (script_scan_token_is_symbol_of_value (curtoken, '(')) { + ply_list_t *parameters = ply_list_new (); + script_scan_get_next_token (scan); + while (true) { + if (script_scan_token_is_symbol_of_value (curtoken, ')')) break; + script_exp_t *parameter = script_parse_exp (scan); + + ply_list_append_data (parameters, parameter); + + curtoken = script_scan_get_current_token (scan); + if (script_scan_token_is_symbol_of_value (curtoken, ')')) break; + if (!script_scan_token_is_symbol_of_value (curtoken, ',')) { ++ ply_list_node_t *node; ++ + script_parse_error (&curtoken->location, + "Function parameters should be separated with a ',' and terminated with a ')'"); ++ ++ for (node = ply_list_get_first_node (parameters); ++ node; ++ node = ply_list_get_next_node (parameters, node)) { ++ script_exp_t *sub = ply_list_node_get_data (node); ++ script_parse_exp_free (sub); ++ } ++ ply_list_free (parameters); + return NULL; + } + curtoken = script_scan_get_next_token (scan); + } + script_scan_get_next_token (scan); + exp = script_parse_new_exp_function_exe (exp, parameters, &location); + continue; + } + script_exp_t *key; + + if (script_scan_token_is_symbol_of_value (curtoken, '.')) { + script_scan_get_next_token (scan); + if (script_scan_token_is_identifier (curtoken)) { + key = script_parse_new_exp_string (curtoken->data.string, &curtoken->location); + } else { + script_parse_error (&curtoken->location, + "A dot based hash index must be an identifier"); + return NULL; + } + curtoken = script_scan_get_next_token (scan); + } else if (script_scan_token_is_symbol_of_value (curtoken, '[')) { + script_scan_get_next_token (scan); + key = script_parse_exp (scan); + if (!key) { + script_parse_error (&curtoken->location, + "Expected a valid index expression"); + return NULL; + } + curtoken = script_scan_get_current_token (scan); + if (!script_scan_token_is_symbol_of_value (curtoken, ']')) { +@@ -965,59 +1012,61 @@ void script_parse_op_free (script_op_t *op) + + static void script_parse_op_list_free (ply_list_t *op_list) + { + ply_list_node_t *node; + + for (node = ply_list_get_first_node (op_list); + node; + node = ply_list_get_next_node (op_list, node)) { + script_op_t *op = ply_list_node_get_data (node); + script_parse_op_free (op); + } + ply_list_free (op_list); + return; + } + + script_op_t *script_parse_file (const char *filename) + { + script_scan_t *scan = script_scan_file (filename); + + if (!scan) { + ply_error ("Parser error : Error opening file %s\n", filename); + return NULL; + } + script_scan_token_t *curtoken = script_scan_get_current_token (scan); + script_debug_location_t location = curtoken->location; + ply_list_t *list = script_parse_op_list (scan); + + curtoken = script_scan_get_current_token (scan); + if (curtoken->type != SCRIPT_SCAN_TOKEN_TYPE_EOF) { + script_parse_error (&curtoken->location, "Unparsed characters at end of file"); ++ script_parse_op_list_free (list); + return NULL; + } + script_op_t *op = script_parse_new_op_block (list, &location); + script_scan_free (scan); + return op; + } + + script_op_t *script_parse_string (const char *string, + const char *name) + { + script_scan_t *scan = script_scan_string (string, name); + + if (!scan) { + ply_error ("Parser error : Error creating a parser with a string"); + return NULL; + } + script_scan_token_t *curtoken = script_scan_get_current_token (scan); + script_debug_location_t location = curtoken->location; + ply_list_t *list = script_parse_op_list (scan); + + curtoken = script_scan_get_current_token (scan); + if (curtoken->type != SCRIPT_SCAN_TOKEN_TYPE_EOF) { + script_parse_error (&curtoken->location, "Unparsed characters at end of file"); ++ script_parse_op_list_free (list); + return NULL; + } + script_op_t *op = script_parse_new_op_block (list, &location); + script_scan_free (scan); + return op; + } +-- +2.17.1 + diff --git a/SOURCES/0006-boot-server-free-the-argument-and-triggers.patch b/SOURCES/0006-boot-server-free-the-argument-and-triggers.patch new file mode 100644 index 0000000..26fb57b --- /dev/null +++ b/SOURCES/0006-boot-server-free-the-argument-and-triggers.patch @@ -0,0 +1,351 @@ +From ebb1c642cd62592afc1ece9e0cf5d2ec9dfb84c0 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Oct 2018 21:56:03 -0400 +Subject: [PATCH 6/6] boot-server: free the argument and triggers + +coverity found some pervasive leaking of the argument +and triggers. + +This commit mops them up. +--- + src/ply-boot-server.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/src/ply-boot-server.c b/src/ply-boot-server.c +index 3c1a268..ff0e6fd 100644 +--- a/src/ply-boot-server.c ++++ b/src/ply-boot-server.c +@@ -359,60 +359,61 @@ print_connection_process_identity (ply_boot_connection_t *connection) + + static void + ply_boot_connection_on_request (ply_boot_connection_t *connection) + { + ply_boot_server_t *server; + char *command, *argument; + + assert (connection != NULL); + assert (connection->fd >= 0); + + server = connection->server; + assert (server != NULL); + + if (!ply_boot_connection_read_request (connection, + &command, &argument)) { + ply_trace ("could not read connection request"); + return; + } + + if (ply_is_tracing ()) + print_connection_process_identity (connection); + + if (!ply_boot_connection_is_from_root (connection)) { + ply_error ("request came from non-root user"); + + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK))) + ply_trace ("could not finish writing is-not-root nak: %m"); + ++ free (argument); + free (command); + return; + } + + if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_UPDATE) == 0) { + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK)) && + errno != EPIPE) + ply_trace ("could not finish writing update reply: %m"); + + ply_trace ("got update request"); + if (server->update_handler != NULL) + server->update_handler (server->user_data, argument, server); + free (argument); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_CHANGE_MODE) == 0) { + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK))) + ply_trace ("could not finish writing update reply: %m"); + + ply_trace ("got change mode notification"); + if (server->change_mode_handler != NULL) + server->change_mode_handler (server->user_data, argument, server); + free (argument); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SYSTEM_UPDATE) == 0) { +@@ -439,105 +440,112 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection) + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SYSTEM_INITIALIZED) == 0) { + ply_trace ("got system initialized notification"); + if (server->system_initialized_handler != NULL) + server->system_initialized_handler (server->user_data, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_ERROR) == 0) { + ply_trace ("got error notification"); + if (server->error_handler != NULL) + server->error_handler (server->user_data, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH) == 0) { + ply_trace ("got show splash request"); + if (server->show_splash_handler != NULL) + server->show_splash_handler (server->user_data, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_HIDE_SPLASH) == 0) { + ply_trace ("got hide splash request"); + if (server->hide_splash_handler != NULL) + server->hide_splash_handler (server->user_data, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_DEACTIVATE) == 0) { + ply_trigger_t *deactivate_trigger; + + ply_trace ("got deactivate request"); + + deactivate_trigger = ply_trigger_new (NULL); + + ply_trigger_add_handler (deactivate_trigger, + (ply_trigger_handler_t) + ply_boot_connection_on_deactivated, + connection); + + if (server->deactivate_handler != NULL) + server->deactivate_handler (server->user_data, deactivate_trigger, server); ++ else ++ ply_trigger_free (deactivate_trigger); + + free (argument); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_REACTIVATE) == 0) { + ply_trace ("got reactivate request"); + if (server->reactivate_handler != NULL) + server->reactivate_handler (server->user_data, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_QUIT) == 0) { + bool retain_splash; + ply_trigger_t *quit_trigger; + + retain_splash = (bool) argument[0]; + + ply_trace ("got quit %srequest", retain_splash ? "--retain-splash " : ""); + + quit_trigger = ply_trigger_new (NULL); + + ply_trigger_add_handler (quit_trigger, + (ply_trigger_handler_t) + ply_boot_connection_on_quit_complete, + connection); + + if (server->quit_handler != NULL) + server->quit_handler (server->user_data, retain_splash, quit_trigger, server); ++ else ++ ply_trigger_free (quit_trigger); + + free (argument); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PASSWORD) == 0) { + ply_trigger_t *answer; + + ply_trace ("got password request"); + + answer = ply_trigger_new (NULL); + ply_trigger_add_handler (answer, + (ply_trigger_handler_t) + ply_boot_connection_on_password_answer, + connection); + + if (server->ask_for_password_handler != NULL) { + server->ask_for_password_handler (server->user_data, + argument, + answer, + server); ++ } else { ++ ply_trigger_free (answer); ++ free (argument); + } + /* will reply later + */ + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_CACHED_PASSWORD) == 0) { + ply_list_node_t *node; + ply_buffer_t *buffer; + size_t buffer_size; + uint32_t size; + + ply_trace ("got cached password request"); + + buffer = ply_buffer_new (); + + node = ply_list_get_first_node (server->cached_passwords); + + ply_trace ("There are %d cached passwords", + ply_list_get_length (server->cached_passwords)); + + /* Add each answer separated by their NUL terminators into + * a buffer that we write out to the client + */ + while (node != NULL) { + ply_list_node_t *next_node; + const char *password; + + next_node = ply_list_get_next_node (server->cached_passwords, node); + password = (const char *) ply_list_node_get_data (node); + +@@ -565,146 +573,155 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection) + ply_list_get_length (server->cached_passwords)); + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_MULTIPLE_ANSWERS, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_MULTIPLE_ANSWERS)) || + !ply_write_uint32 (connection->fd, + size) || + !ply_write (connection->fd, + ply_buffer_get_bytes (buffer), size)) + ply_trace ("could not finish writing cached answer reply: %m"); + } + + ply_buffer_free (buffer); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_QUESTION) == 0) { + ply_trigger_t *answer; + + ply_trace ("got question request"); + + answer = ply_trigger_new (NULL); + ply_trigger_add_handler (answer, + (ply_trigger_handler_t) + ply_boot_connection_on_question_answer, + connection); + + if (server->ask_question_handler != NULL) { + server->ask_question_handler (server->user_data, + argument, + answer, + server); ++ } else { ++ ply_trigger_free (answer); ++ free (argument); + } + /* will reply later + */ + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_MESSAGE) == 0) { + ply_trace ("got show message request"); + if (server->display_message_handler != NULL) + server->display_message_handler (server->user_data, argument, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_HIDE_MESSAGE) == 0) { + ply_trace ("got hide message request"); + if (server->hide_message_handler != NULL) + server->hide_message_handler (server->user_data, argument, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_KEYSTROKE) == 0) { + ply_trigger_t *answer; + + ply_trace ("got keystroke request"); + + answer = ply_trigger_new (NULL); + ply_trigger_add_handler (answer, + (ply_trigger_handler_t) + ply_boot_connection_on_keystroke_answer, + connection); + + if (server->watch_for_keystroke_handler != NULL) { + server->watch_for_keystroke_handler (server->user_data, + argument, + answer, + server); ++ } else { ++ ply_trigger_free (answer); ++ free (argument); + } + /* will reply later + */ + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_KEYSTROKE_REMOVE) == 0) { + ply_trace ("got keystroke remove request"); + if (server->ignore_keystroke_handler != NULL) + server->ignore_keystroke_handler (server->user_data, + argument, + server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PROGRESS_PAUSE) == 0) { + ply_trace ("got progress pause request"); + if (server->progress_pause_handler != NULL) + server->progress_pause_handler (server->user_data, + server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PROGRESS_UNPAUSE) == 0) { + ply_trace ("got progress unpause request"); + if (server->progress_unpause_handler != NULL) + server->progress_unpause_handler (server->user_data, + server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT) == 0) { + ply_trace ("got newroot request"); + if (server->newroot_handler != NULL) + server->newroot_handler (server->user_data, argument, server); + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_HAS_ACTIVE_VT) == 0) { + bool answer = false; + + ply_trace ("got has_active vt? request"); + if (server->has_active_vt_handler != NULL) + answer = server->has_active_vt_handler (server->user_data, server); + + if (!answer) { + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK))) + ply_trace ("could not finish writing nak: %m"); + ++ free (argument); + free (command); + return; + } + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PING) != 0) { + ply_error ("received unknown command '%s' from client", command); + + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK))) + ply_trace ("could not finish writing ping reply: %m"); + ++ free (argument); + free (command); + return; + } + + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK))) + ply_trace ("could not finish writing ack: %m"); ++ free (argument); + free (command); + } + + static void + ply_boot_connection_on_hangup (ply_boot_connection_t *connection) + { + ply_list_node_t *node; + ply_boot_server_t *server; + + assert (connection != NULL); + assert (connection->server != NULL); + + server = connection->server; + + node = ply_list_find_node (server->connections, connection); + + assert (node != NULL); + + ply_boot_connection_free (connection); + ply_list_remove_node (server->connections, node); + } + + static void + ply_boot_server_on_new_connection (ply_boot_server_t *server) + { + ply_boot_connection_t *connection; + int fd; + + assert (server != NULL); + +-- +2.17.1 + diff --git a/SOURCES/0006-pixel-buffer-switch-device-rotation-to-an-enum.patch b/SOURCES/0006-pixel-buffer-switch-device-rotation-to-an-enum.patch new file mode 100644 index 0000000..bd94acc --- /dev/null +++ b/SOURCES/0006-pixel-buffer-switch-device-rotation-to-an-enum.patch @@ -0,0 +1,80 @@ +From 555257c74f75bbb1086155fca52c29d71399b305 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Tue, 10 Apr 2018 16:40:06 -0400 +Subject: [PATCH 6/6] pixel-buffer: switch device rotation to an enum + +Right now device rotation is stored in a bare integer. + +For clarity, switch that to an enum. +--- + src/libply-splash-core/ply-pixel-buffer.c | 12 +++++++----- + src/libply-splash-core/ply-pixel-buffer.h | 13 ++++++++----- + 2 files changed, 15 insertions(+), 10 deletions(-) + +diff --git a/src/libply-splash-core/ply-pixel-buffer.c b/src/libply-splash-core/ply-pixel-buffer.c +index a337407..de3b107 100644 +--- a/src/libply-splash-core/ply-pixel-buffer.c ++++ b/src/libply-splash-core/ply-pixel-buffer.c +@@ -50,7 +50,8 @@ struct _ply_pixel_buffer + ply_region_t *updated_areas; /* in device pixels */ + uint32_t is_opaque : 1; + int device_scale; +- int device_rotation; ++ ++ ply_pixel_buffer_rotation_t device_rotation; + }; + + static inline void ply_pixel_buffer_blend_value_at_pixel (ply_pixel_buffer_t *buffer, +@@ -363,13 +364,14 @@ ply_pixel_buffer_new (unsigned long width, + } + + ply_pixel_buffer_t * +-ply_pixel_buffer_new_with_device_rotation (unsigned long width, +- unsigned long height, +- int device_rotation) ++ply_pixel_buffer_new_with_device_rotation (unsigned long width, ++ unsigned long height, ++ ply_pixel_buffer_rotation_t device_rotation) + { + ply_pixel_buffer_t *buffer; + +- if (device_rotation >= PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE) { ++ if (device_rotation == PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE || ++ device_rotation == PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE) { + unsigned long tmp = width; + width = height; + height = tmp; +diff --git a/src/libply-splash-core/ply-pixel-buffer.h b/src/libply-splash-core/ply-pixel-buffer.h +index 7736dd3..ea7f833 100644 +--- a/src/libply-splash-core/ply-pixel-buffer.h ++++ b/src/libply-splash-core/ply-pixel-buffer.h +@@ -37,10 +37,13 @@ typedef struct _ply_pixel_buffer ply_pixel_buffer_t; + | ((uint8_t) (CLAMP (g * 255.0, 0.0, 255.0)) << 8) \ + | ((uint8_t) (CLAMP (b * 255.0, 0.0, 255.0)))) + +-#define PLY_PIXEL_BUFFER_ROTATE_UPRIGHT 0 +-#define PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN 1 +-#define PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE 2 +-#define PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE 3 ++typedef enum ++{ ++ PLY_PIXEL_BUFFER_ROTATE_UPRIGHT = 0, ++ PLY_PIXEL_BUFFER_ROTATE_UPSIDE_DOWN, ++ PLY_PIXEL_BUFFER_ROTATE_CLOCKWISE, ++ PLY_PIXEL_BUFFER_ROTATE_COUNTER_CLOCKWISE ++} ply_pixel_buffer_rotation_t; + + #ifndef PLY_HIDE_FUNCTION_DECLARATIONS + ply_pixel_buffer_t *ply_pixel_buffer_new (unsigned long width, +@@ -48,7 +51,7 @@ ply_pixel_buffer_t *ply_pixel_buffer_new (unsigned long width, + ply_pixel_buffer_t * + ply_pixel_buffer_new_with_device_rotation (unsigned long width, + unsigned long height, +- int device_rotation); ++ ply_pixel_buffer_rotation_t device_rotation); + void ply_pixel_buffer_free (ply_pixel_buffer_t *buffer); + void ply_pixel_buffer_get_size (ply_pixel_buffer_t *buffer, + ply_rectangle_t *size); +-- +2.17.0 + diff --git a/SOURCES/0007-terminal-add-include-for-sysmacros.h.patch b/SOURCES/0007-terminal-add-include-for-sysmacros.h.patch new file mode 100644 index 0000000..41b9311 --- /dev/null +++ b/SOURCES/0007-terminal-add-include-for-sysmacros.h.patch @@ -0,0 +1,27 @@ +From e12b5ee34c619e88509f59424068417790b69e04 Mon Sep 17 00:00:00 2001 +From: Sakaki +Date: Fri, 18 Aug 2017 10:08:23 -0400 +Subject: [PATCH] terminal: add include for sysmacros.h + +That file is, in some cases, not included implicitly by sys/types.h. + +This commit explicitly includes it. +--- + src/libply-splash-core/ply-terminal.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/libply-splash-core/ply-terminal.c b/src/libply-splash-core/ply-terminal.c +index a0954f2..f3b32fe 100644 +--- a/src/libply-splash-core/ply-terminal.c ++++ b/src/libply-splash-core/ply-terminal.c +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + #include + #include + #include +-- +2.17.0 + diff --git a/SOURCES/boot-duration b/SOURCES/boot-duration new file mode 100644 index 0000000..7fe728c --- /dev/null +++ b/SOURCES/boot-duration @@ -0,0 +1,39 @@ +0.222:RCkernelparam +0.223:RChostname +0.238:RCmountfs +0.275:RCswap +0.330:microcode_ctl +0.357:cpuspeed +0.365:ip6tables +0.380:iptables +0.385:isdn +0.504:auditd +0.508:restorecond +0.523:rsyslog +0.530:irqbalance +0.533:rpcbind +0.549:nfslock +0.561:mdmonitor +0.563:rpcidmapd +0.578:rpcgssd +0.579:messagebus +0.580:fuse +0.594:netfs +0.600:acpid +0.611:haldaemon +0.660:pcscd +0.691:udev-post +0.703:portreserve +0.712:setroubleshoot +0.749:bluetooth +0.738:sshd +0.763:ntpd +0.807:sendmail +0.876:crond +0.902:kerneloops +0.907:smolt +0.915:atd +0.927:avahi-daemon +0.941:cups +0.983:anacron +0.992:local diff --git a/SOURCES/bootlog b/SOURCES/bootlog new file mode 100644 index 0000000..9be1a64 --- /dev/null +++ b/SOURCES/bootlog @@ -0,0 +1,8 @@ +/var/log/boot.log +{ + missingok + daily + copytruncate + rotate 7 + notifempty +} diff --git a/SOURCES/charge.plymouth b/SOURCES/charge.plymouth new file mode 100644 index 0000000..f53413f --- /dev/null +++ b/SOURCES/charge.plymouth @@ -0,0 +1,13 @@ +[Plymouth Theme] +Name=Charge +Description=A theme that features a stylized 8 and spinner +ModuleName=two-step + +[two-step] +ImageDir=/usr/share/plymouth/themes/charge +HorizontalAlignment=.5 +VerticalAlignment=.75 +Transition=none +TransitionDuration=0.0 +BackgroundStartColor=0x202020 +BackgroundEndColor=0x202020 diff --git a/SOURCES/plymouth-update-initrd b/SOURCES/plymouth-update-initrd new file mode 100755 index 0000000..4ed5709 --- /dev/null +++ b/SOURCES/plymouth-update-initrd @@ -0,0 +1,2 @@ +#!/bin/bash +dracut -f diff --git a/SPECS/plymouth.spec b/SPECS/plymouth.spec new file mode 100644 index 0000000..86b29d0 --- /dev/null +++ b/SPECS/plymouth.spec @@ -0,0 +1,1277 @@ +%global plymouthdaemon_execdir %{_sbindir} +%global plymouthclient_execdir %{_bindir} +%global plymouth_libdir %{_libdir} +%global plymouth_initrd_file /boot/initrd-plymouth.img + +# Set to 1 if building from snapshots. +%global snapshot_build 0 + +%if %{snapshot_build} +%global snapshot_date 20160620 +%global snapshot_hash 0e65b86c +%global snapshot_rel %{?snapshot_date}git%{?snapshot_hash} +%endif + + +Summary: Graphical Boot Animation and Logger +Name: plymouth +Version: 0.9.3 +Release: 12%{?snapshot_rel}%{?dist} +License: GPLv2+ +URL: http://www.freedesktop.org/wiki/Software/Plymouth +Group: System Environment/Base + +Source0: http://freedesktop.org/software/plymouth/releases/%{name}-%{version}.tar.xz +Source1: boot-duration +Source2: charge.plymouth +Source3: plymouth-update-initrd +Source4: bootlog + +# Patches from upstream git for rotated-display support +# https://bugs.freedesktop.org/show_bug.cgi?id=104714 +# These can all be dropped on the next rebase +Patch1: 0001-device-manager-drop-superfluous-create_pixel_display.patch +Patch2: 0002-main-Do-not-update-the-display-on-backspace-when-the.patch +Patch3: 0003-pixel-buffer-Add-the-concept-of-device-rotation.patch +Patch4: 0004-drm-Check-for-panel-orientation-connector-property.patch +Patch5: 0005-drm-Reset-primary-plane-rotation-to-DRM_MODE_ROTATE_.patch +Patch6: 0006-pixel-buffer-switch-device-rotation-to-an-enum.patch +Patch7: 0007-terminal-add-include-for-sysmacros.h.patch + +# Patches to handle text mode situations better +Patch10: 0001-device-manager-skip-graphical-renderer-setup-when-de.patch +Patch11: 0001-device-manager-fall-back-to-text-mode-if-graphical-d.patch + +# Coverity fixes +Patch21: 0001-populate-initrd-drop-unused-local-variable.patch +Patch22: 0002-boot-splash-fix-memory-leak-in-error-path.patch +Patch23: 0003-event-loop-fix-leak-in-error-path.patch +Patch24: 0004-key-file-ply_key_file_get_value-returns-duplicated-m.patch +Patch25: 0005-script-fix-various-memory-leaks.patch +Patch26: 0006-boot-server-free-the-argument-and-triggers.patch + +# https://bugzilla.redhat.com/show_bug.cgi?id=1658026 +Patch31: 0001-logger-Add-a-separator-between-different-boot-logs.patch + +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libudev) +BuildRequires: kernel-headers +BuildRequires: libpng-devel +BuildRequires: libxslt, docbook-style-xsl +BuildRequires: pkgconfig(gtk+-3.0) +BuildRequires: pango-devel >= 1.21.0 +BuildRequires: cairo-devel + +Requires(post): plymouth-scripts + +%description +Plymouth provides an attractive graphical boot animation in +place of the text messages that normally get shown. Text +messages are instead redirected to a log file for viewing +after boot. + +%package system-theme +Summary: Plymouth default theme +Group: System Environment/Base +Requires: plymouth(system-theme) = %{version}-%{release} + +%description system-theme +This metapackage tracks the current distribution default theme. + +%package core-libs +Summary: Plymouth core libraries +Group: Development/Libraries + +%description core-libs +This package contains the libply and libply-splash-core libraries +used by Plymouth. + +%package graphics-libs +Summary: Plymouth graphics libraries +Group: Development/Libraries +Requires: %{name}-core-libs = %{version}-%{release} +Requires: system-logos + +%description graphics-libs +This package contains the libply-splash-graphics library +used by graphical Plymouth splashes. + +%package devel +Summary: Libraries and headers for writing Plymouth splash plugins +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: pkgconfig + +%description devel +This package contains the libply and libplybootsplash libraries +and headers needed to develop 3rd party splash plugins for Plymouth. + +%package scripts +Summary: Plymouth related scripts +Group: Applications/System +Requires: findutils, coreutils, gzip, cpio, dracut, plymouth + +%description scripts +This package contains scripts that help integrate Plymouth with +the system. + +%package plugin-label +Summary: Plymouth label plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} + +%description plugin-label +This package contains the label control plugin for +Plymouth. It provides the ability to render text on +graphical boot splashes using pango and cairo. + +%package plugin-fade-throbber +Summary: Plymouth "Fade-Throbber" plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} + +%description plugin-fade-throbber +This package contains the "Fade-In" boot splash plugin for +Plymouth. It features a centered image that fades in and out +while other images pulsate around during system boot up. + +%package theme-fade-in +Summary: Plymouth "Fade-In" theme +Group: System Environment/Base +Requires: %{name}-plugin-fade-throbber = %{version}-%{release} +Requires(post): plymouth-scripts + +%description theme-fade-in +This package contains the "Fade-In" boot splash theme for +Plymouth. It features a centered logo that fades in and out +while stars twinkle around the logo during system boot up. + +%package plugin-throbgress +Summary: Plymouth "Throbgress" plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} +Requires: plymouth-plugin-label + +%description plugin-throbgress +This package contains the "throbgress" boot splash plugin for +Plymouth. It features a centered logo and animated spinner that +spins repeatedly while a progress bar advances at the bottom of +the screen. + +%package theme-spinfinity +Summary: Plymouth "Spinfinity" theme +Group: System Environment/Base +Requires: %{name}-plugin-throbgress = %{version}-%{release} +Requires(post): plymouth-scripts + +%description theme-spinfinity +This package contains the "Spinfinity" boot splash theme for +Plymouth. It features a centered logo and animated spinner that +spins in the shape of an infinity sign. + +%package plugin-space-flares +Summary: Plymouth "space-flares" plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} +Requires: plymouth-plugin-label + +%description plugin-space-flares +This package contains the "space-flares" boot splash plugin for +Plymouth. It features a corner image with animated flares. + +%package theme-solar +Summary: Plymouth "Solar" theme +Group: System Environment/Base +Requires: %{name}-plugin-space-flares = %{version}-%{release} +Requires(post): plymouth-scripts + +%description theme-solar +This package contains the "Solar" boot splash theme for +Plymouth. It features a blue flamed sun with animated solar flares. + +%package plugin-two-step +Summary: Plymouth "two-step" plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} +Requires: plymouth-plugin-label + +%description plugin-two-step +This package contains the "two-step" boot splash plugin for +Plymouth. It features a two phased boot process that starts with +a progressing animation synced to boot time and finishes with a +short, fast one-shot animation. + +%package theme-charge +Summary: Plymouth "Charge" plugin +Group: System Environment/Base +Requires: %{name}-plugin-two-step = %{version}-%{release} +Requires(post): plymouth-scripts +Provides: plymouth(system-theme) = %{version}-%{release} + +%description theme-charge +This package contains the "charge" boot splash theme for +Plymouth. It is the default theme for Red Hat Enterprise Linux. + +%package plugin-script +Summary: Plymouth "script" plugin +Group: System Environment/Base +Requires: %{name} = %{version}-%{release} +Requires: %{name}-graphics-libs = %{version}-%{release} + +%description plugin-script +This package contains the "script" boot splash plugin for +Plymouth. It features an extensible, scriptable boot splash +language that simplifies the process of designing custom +boot splash themes. + +%package theme-script +Summary: Plymouth "Script" plugin +Group: System Environment/Base +Requires: %{name}-plugin-script = %{version}-%{release} +Requires(post): %{_sbindir}/plymouth-set-default-theme + +%description theme-script +This package contains the "script" boot splash theme for +Plymouth. It it is a simple example theme the uses the "script" +plugin. + +%package theme-spinner +Summary: Plymouth "Spinner" theme +Group: System Environment/Base +Requires: %{name}-plugin-two-step = %{version}-%{release} +Requires(post): plymouth-scripts + +%description theme-spinner +This package contains the "spinner" boot splash theme for +Plymouth. It features a small spinner on a dark background. + +%prep +%autosetup -p1 + +# Change the default theme +sed -i -e 's/spinner/charge/g' src/plymouthd.defaults + +%build +%configure --enable-tracing --disable-tests \ + --with-logo=%{_datadir}/pixmaps/system-logo-white.png \ + --with-background-start-color-stop=0x0073B3 \ + --with-background-end-color-stop=0x00457E \ + --with-background-color=0x3391cd \ + --disable-gdm-transition \ + --enable-systemd-integration \ + --without-system-root-install \ + --without-log-viewer \ + --without-rhgb-compat-link \ + --disable-libkms + +make + +%install +make install DESTDIR=$RPM_BUILD_ROOT + +# Glow isn't quite ready for primetime +rm -rf $RPM_BUILD_ROOT%{_datadir}/plymouth/glow/ +rm -f $RPM_BUILD_ROOT%{_libdir}/plymouth/glow.so + +find $RPM_BUILD_ROOT -name '*.a' -delete +find $RPM_BUILD_ROOT -name '*.la' -delete + +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/plymouth +cp $RPM_SOURCE_DIR/boot-duration $RPM_BUILD_ROOT%{_datadir}/plymouth/default-boot-duration +cp -f $RPM_SOURCE_DIR/plymouth-update-initrd $RPM_BUILD_ROOT%{_libexecdir}/plymouth + +# Add charge, our new default +mkdir -p $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge +cp %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge +cp $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/glow/{box,bullet,entry,lock}.png $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/charge + +# Drop glow, it's not very Fedora-y +rm -rf $RPM_BUILD_ROOT%{_datadir}/plymouth/themes/glow + +install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +install -p -m 644 $RPM_SOURCE_DIR/bootlog $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/bootlog + +%postun +if [ $1 -eq 0 ]; then + rm -f %{_libdir}/plymouth/default.so + rm -f /boot/initrd-plymouth.img +fi + +%post core-libs -p /sbin/ldconfig +%postun core-libs -p /sbin/ldconfig + +%post graphics-libs -p /sbin/ldconfig +%postun graphics-libs -p /sbin/ldconfig + +%postun theme-spinfinity +export LIB=%{_lib} +if [ $1 -eq 0 ]; then + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "spinfinity" ]; then + %{_sbindir}/plymouth-set-default-theme text + fi +fi + +%postun theme-fade-in +export LIB=%{_lib} +if [ $1 -eq 0 ]; then + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "fade-in" ]; then + %{_sbindir}/plymouth-set-default-theme --reset + fi +fi + +%postun theme-spinner +export LIB=%{_lib} +if [ $1 -eq 0 ]; then + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "spinner" ]; then + %{_sbindir}/plymouth-set-default-theme --reset + fi +fi + +%postun theme-solar +export LIB=%{_lib} +if [ $1 -eq 0 ]; then + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "solar" ]; then + %{_sbindir}/plymouth-set-default-theme --reset + fi +fi + +%post theme-charge +export LIB=%{_lib} +if [ $1 -eq 1 ]; then + %{_sbindir}/plymouth-set-default-theme charge +else + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "solar" ]; then + %{_sbindir}/plymouth-set-default-theme charge + fi +fi + +%postun theme-charge +export LIB=%{_lib} +if [ $1 -eq 0 ]; then + if [ "$(%{_sbindir}/plymouth-set-default-theme)" == "charge" ]; then + %{_sbindir}/plymouth-set-default-theme --reset + fi +fi + +%files +%license COPYING +%doc AUTHORS README +%dir %{_datadir}/plymouth +%dir %{_datadir}/plymouth/themes +%dir %{_datadir}/plymouth/themes/details +%dir %{_datadir}/plymouth/themes/text +%dir %{_libexecdir}/plymouth +%dir %{_localstatedir}/lib/plymouth +%dir %{_libdir}/plymouth/renderers +%dir %{_sysconfdir}/plymouth +%config(noreplace) %{_sysconfdir}/plymouth/plymouthd.conf +%config(noreplace) %{_sysconfdir}/logrotate.d/bootlog +%{plymouthdaemon_execdir}/plymouthd +%{plymouthclient_execdir}/plymouth +%{_bindir}/plymouth +%{_libdir}/plymouth/details.so +%{_libdir}/plymouth/text.so +%{_libdir}/plymouth/tribar.so +%{_datadir}/plymouth/default-boot-duration +%{_datadir}/plymouth/themes/details/details.plymouth +%{_datadir}/plymouth/themes/text/text.plymouth +%{_datadir}/plymouth/themes/tribar/tribar.plymouth +%{_datadir}/plymouth/plymouthd.defaults +%{_localstatedir}/run/plymouth +%{_localstatedir}/spool/plymouth +%{_mandir}/man?/* +%ghost %{_localstatedir}/lib/plymouth/boot-duration +%{_prefix}/lib/systemd/system/* +%{_prefix}/lib/systemd/system/ + +%files devel +%{plymouth_libdir}/libply.so +%{plymouth_libdir}/libply-splash-core.so +%{_libdir}/libply-boot-client.so +%{_libdir}/libply-splash-graphics.so +%{_libdir}/pkgconfig/ply-splash-core.pc +%{_libdir}/pkgconfig/ply-splash-graphics.pc +%{_libdir}/pkgconfig/ply-boot-client.pc +%{_libdir}/plymouth/renderers/x11* +%{_includedir}/plymouth-1 + +%files core-libs +%{plymouth_libdir}/libply.so.* +%{plymouth_libdir}/libply-splash-core.so.* +%{_libdir}/libply-boot-client.so.* +%dir %{_libdir}/plymouth + +%files graphics-libs +%{_libdir}/plymouth/renderers/drm* +%{_libdir}/plymouth/renderers/frame-buffer* +%{_libdir}/libply-splash-graphics.so.* + +%files scripts +%{_sbindir}/plymouth-set-default-theme +%{_libexecdir}/plymouth/plymouth-update-initrd +%{_libexecdir}/plymouth/plymouth-generate-initrd +%{_libexecdir}/plymouth/plymouth-populate-initrd + +%files plugin-label +%{_libdir}/plymouth/label.so + +%files plugin-fade-throbber +%{_libdir}/plymouth/fade-throbber.so + +%files theme-fade-in +%dir %{_datadir}/plymouth/themes/fade-in +%{_datadir}/plymouth/themes/fade-in/bullet.png +%{_datadir}/plymouth/themes/fade-in/entry.png +%{_datadir}/plymouth/themes/fade-in/lock.png +%{_datadir}/plymouth/themes/fade-in/star.png +%{_datadir}/plymouth/themes/fade-in/fade-in.plymouth + +%files theme-spinner +%dir %{_datadir}/plymouth/themes/spinner +%{_datadir}/plymouth/themes/spinner/*.png +%{_datadir}/plymouth/themes/spinner/spinner.plymouth + +%files plugin-throbgress +%{_libdir}/plymouth/throbgress.so + +%files theme-spinfinity +%dir %{_datadir}/plymouth/themes/spinfinity +%{_datadir}/plymouth/themes/spinfinity/box.png +%{_datadir}/plymouth/themes/spinfinity/bullet.png +%{_datadir}/plymouth/themes/spinfinity/entry.png +%{_datadir}/plymouth/themes/spinfinity/lock.png +%{_datadir}/plymouth/themes/spinfinity/throbber-[0-3][0-9].png +%{_datadir}/plymouth/themes/spinfinity/spinfinity.plymouth + +%files plugin-space-flares +%{_libdir}/plymouth/space-flares.so + +%files theme-solar +%dir %{_datadir}/plymouth/themes/solar +%{_datadir}/plymouth/themes/solar/*.png +%{_datadir}/plymouth/themes/solar/solar.plymouth + +%files plugin-two-step +%{_libdir}/plymouth/two-step.so + +%files theme-charge +%dir %{_datadir}/plymouth/themes/charge +%{_datadir}/plymouth/themes/charge/*.png +%{_datadir}/plymouth/themes/charge/charge.plymouth + +%files plugin-script +%{_libdir}/plymouth/script.so + +%files theme-script +%dir %{_datadir}/plymouth/themes/script +%{_datadir}/plymouth/themes/script/*.png +%{_datadir}/plymouth/themes/script/script.script +%{_datadir}/plymouth/themes/script/script.plymouth + +%files system-theme + +%changelog +* Fri Feb 08 2019 Ray Strode - 0.9.3-12 +- Make /var/log/boot.log more modular + Resolves: #1658026 + +* Mon Oct 15 2018 Ray Strode - 0.9.3-11 +- Update description of charge theme (found by rpmdiff + when building previous fix) + Related: #1607020 + +* Mon Oct 15 2018 Ray Strode - 0.9.3-10 +- Coverity leak fixes + Resolves: #1607020 + +* Thu Aug 30 2018 Ray Strode - 0.9.3-9 +- Fix placement of spinner to patch rhel 8 design + Resolves: #1623525 + +* Wed Aug 15 2018 Ray Strode - 0.9.3-8 +- drop initscripts requirement + Resolves: #1610282 + +* Thu Jul 12 2018 Ray Strode - 0.9.3-7 +- Add backports to avoid loading renderers on non-rhgb boot + and to handle 'rhgb' when no renderers available +- Move framebuffer plugin to graphics subpackage + Related: #1600634 + +* Sun Apr 15 2018 Hans de Goede - 0.9.3-6 +- Add patches from upstream git for devices with non upright mounted LCD panels + https://bugs.freedesktop.org/show_bug.cgi?id=104714 + +* Thu Mar 29 2018 Colin Walters - 0.9.3-5 +- Drop default boot duration: https://src.fedoraproject.org/rpms/plymouth/pull-request/1 + +* Fri Feb 09 2018 Igor Gnatenko - 0.9.3-4 +- Escape macros in %%changelog + +* Fri Feb 09 2018 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Nov 28 2017 Ray Strode - 0.9.3-2 +- Bump ShowDelay back up to 5 + Related: #1518037 + +* Tue Nov 28 2017 Björn Esser - 0.9.3-1 +- Update to 0.9.3 release +- Reduce ShowDelay to 0 (rhbz#1518037) +- Change %%define to %%global + +* Thu Aug 03 2017 Fedora Release Engineering - 0.9.3-0.9.20160620git0e65b86c +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 0.9.3-0.8.20160620git0e65b86c +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 0.9.3-0.7.20160620git0e65b86c +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Jun 20 2016 Ray Strode - 0.9.3-0.6.git +- Fix color palette issue +- Fix splash at shutdown (if shutdown takes longer than 5 secs) +- Make sure text based splashes update terminal size when fbcon loads + +* Thu Jun 16 2016 Ray Strode - 0.9.3-0.5.git +- really (?) fix password prompt on text plugin + Resolves: #1344141 + +* Tue Jun 14 2016 Ray Strode - 0.9.3-0.4.git +- fix password prompt on text plugin + Resolves: #1344141 + +* Wed Jun 08 2016 Ray Strode - 0.9.3-0.3.git +- new release versioning scheme to be more guideliney + +* Tue Jun 07 2016 Ray Strode - 0.9.3-0.1. +- Update to latest git snapshot +- Fixes use after free + Related: #1342673 + +* Tue May 24 2016 Ray Strode - 0.9.3-0.1.20160524 +- Update to latest git snapshot +- Drop plymouth-generate-initrd scriptlets + +* Thu Feb 04 2016 Fedora Release Engineering - 0.8.9-17.2013.08.14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Sun Nov 15 2015 Ray Strode 0.8.9-16.2013.08.14 +- Fix plymouth-update-initrd script + +* Mon Oct 26 2015 Ray Strode 0.8.9-15.2013.08.15 +- Fix updates with script and spinner themes + Resolves: #1267949 + +* Mon Aug 24 2015 Kalev Lember 0.8.9-13.2013.08.14 +- Fix a typo in Requires + +* Mon Aug 24 2015 Peter Robinson 0.8.9-12.2013.08.14 +- Fix Requires for various libs subpackages + +* Sun Aug 23 2015 Peter Robinson 0.8.9-11.2013.08.14 +- Use %%license +- Cleanup spec +- Move drm render driver to graphics-libs sub package + +* Thu Jun 18 2015 Fedora Release Engineering - 0.8.9-10.2013.08.14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed May 20 2015 Will Woods 0.8.9-9.2013.08.14 +- Fix theme override using PLYMOUTH_THEME_NAME (#1223344) + +* Sat Feb 21 2015 Till Maas - 0.8.9-8.2013.08.14 +- Rebuilt for Fedora 23 Change + https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code + +* Sun Aug 17 2014 Fedora Release Engineering - 0.8.9-7.2013.08.14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 0.8.9-6.2013.08.14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat May 31 2014 Peter Robinson 0.8.9-4.2013.08.15 +- Move system-logos dep to graphics-libs (no use on text/serial console minimal installs) + +* Thu Feb 20 2014 Ray Strode 0.8.9-4.2013.08.14 +- Fix splash after change in /sys/class/tty/console/active + +* Thu Oct 31 2013 Ray Strode 0.8.9-3.2013.08.14 +- Don't timeout plymouth quit waiting + Related: #967521 + +* Wed Oct 16 2013 Ray Strode 0.8.9-2.2013.08.14 +- Drop rhgb-client compat link + +* Sun Oct 06 2013 Kalev Lember - 0.8.9-1.2013.08.14 +- Make sure the release number compares higher than the previous builds + +* Wed Aug 14 2013 Ray Strode 0.8.9-0.1.2013.08.14.0 +- Update to snapshot to fix system units + +* Sun Aug 04 2013 Fedora Release Engineering - 0.8.9-0.2014.03.26.0 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Tue Mar 26 2013 Ray Strode 0.8.9-0.2013.03.26.0 +- Update to snapshot to fix systemd vconsole issue + +* Thu Feb 21 2013 Peter Robinson 0.8.8-6 +- Merge newer F18 release into rawhide + +* Thu Dec 13 2012 Ray Strode 0.8.8-5 +- Ensure fedup gets right splash screen + Related: #879295 + +* Thu Nov 15 2012 Ray Strode 0.8.8-4 +- Drop set-default-plugin compat script +- Just use upstream update-initrd + +* Fri Nov 02 2012 Ray Strode 0.8.8-3 +- More boot blocking fixes + Related: #870695 + +* Thu Nov 01 2012 Ray Strode 0.8.8-2 +- Fix crash when deactivating multiple times + Related: #870695 + +* Fri Oct 26 2012 Ray Strode 0.8.8-1 +- Latest upstream release +- includes systemd fixes and system update fixes + +* Tue Aug 21 2012 Ray Strode 0.8.7-1 +- Latest upstream release +- includes systemd fixes + +* Tue Aug 21 2012 Dave Airlie 0.8.6.2-1.2012.07.23 +- fix plymouth race at bootup breaking efi/vesa handoff. +- fix version number - its against fedora package policy to have 0.year + +* Mon Jul 23 2012 Ray Strode 0.8.6.2-0.2012.07.23 +- One more crack at #830482 (will probably need additional fixes tomorrow) + +* Mon Jul 23 2012 Tom Callaway - 0.8.6.1-3 +- fix bz704658 (thanks to Ian Pilcher for the patch), resolves issue where spinfinity theme + never goes idle and thus, never exits to gdm + +* Sat Jul 21 2012 Fedora Release Engineering - 0.8.6.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Tue Jul 10 2012 Ray Strode 0.8.6.1-1 +- Update to 0.8.6.1 since I mucked up 0.8.6 + Resolves: #830482 + +* Mon Jul 09 2012 Ray Strode 0.8.6-1 +- Update to 0.8.6 +- Fixes encrypted fs bug + Resolves: #830482 +- Adds support for offline package updates + +* Mon Jun 25 2012 Adam Jackson 0.8.5.1-3 +- Rebuild without libkms + +* Wed Jun 06 2012 Ray Strode 0.8.5.1-2 +- Add %%{_prefix} to systemd service path + +* Wed Jun 06 2012 Ray Strode 0.8.5.1-1 +- Update to latest release +- Ship systemd service files +- Conflict with old systemd + +* Tue Apr 24 2012 Richard Hughes 0.8.4-0.20120319.3 +- Disable the nouveau driver as I've broken it with the new libdrm ABI + +* Tue Mar 20 2012 Daniel Drake 0.8.4-0.20120319.1 +- Don't try to build against libdrm_intel on non-intel architectures + +* Mon Mar 19 2012 Ray Strode 0.8.4-0.20120319.1 +- Update to latest snapshot + +* Mon Mar 12 2012 Ray Strode 0.8.4-0.20110810.6 +- Don't require libdrm_intel on non intel arches + +* Mon Feb 20 2012 Adam Williamson 0.8.4-0.20110810.5 +- make plymouth-scripts require plymouth (RH #794894) + +* Wed Jan 25 2012 Harald Hoyer 0.8.4-0.20110810.4 +- install everything in /usr + https://fedoraproject.org/wiki/Features/UsrMove + +* Sat Jan 14 2012 Fedora Release Engineering - 0.8.4-0.20110810.3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Dec 15 2011 Ray Strode 0.8.4-0.20110809.3 +- Change spec based on suggestion from Nicolas Chauvet + to fix scriptlet error during livecd creation + Resolves: #666419 + +* Tue Nov 08 2011 Adam Jackson 0.8.4-0.20110822.3 +- Rebuild for libpng 1.5 + +* Fri Sep 02 2011 Ray Strode 0.8.4-0.20110822.2 +- Make plymouth background dark gray at the request of Mo / design + team. + +* Mon Aug 22 2011 Ray Strode 0.8.4-0.20110822.1 +- Update to latest git snapshot +- Reintroduce accidentally dropped spinner theme and systemd integration + +* Tue Aug 09 2011 Ray Strode 0.8.4-0.20110809.1 +- Rebuild + +* Fri Mar 04 2011 Ray Strode 0.8.4-0.1.20110304.1 +- retry reopening tty if we get EIO + Hopefully Resolves: #681167 + +* Fri Feb 18 2011 Ray Strode 0.8.4-0.20110419.1 +- unlock tty when reopening in case it spontaenously goes bonkers + and we need to fix it up + Resolves: #655538 + +* Wed Feb 09 2011 Christopher Aillon 0.8.4-0.20110209.2 +- Fix up obsoletes typo + +* Wed Feb 09 2011 Ray Strode 0.8.4-0.20110209.1 +- Update to latest snapshot + +* Wed Feb 09 2011 Fedora Release Engineering - 0.8.4-0.20101120.4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Feb 04 2011 Ray Strode 0.8.4-0.20101119.4 +- Drop log viewer + +* Sat Jan 29 2011 Ville Skyttä - 0.8.4-0.20101119.3 +- Dir ownership fixes (#645044). + +* Fri Nov 19 2010 Ray Strode 0.8.4-0.20101119.2 +- Fix serial console issue eparis was seeing + +* Fri Nov 19 2010 Ray Strode 0.8.4-0.20101119.1 +- Update to recent snapshot + +* Tue Nov 02 2010 Ray Strode 0.8.4-0.20101002.1 +- Update to recent snapshot + +* Wed Sep 01 2010 Ray Strode 0.8.4-0.20100823.4 +- Add more Requirse + +* Thu Aug 26 2010 Ray Strode 0.8.4-0.20100823.3 +- Add more Requires + +* Thu Aug 26 2010 Ray Strode 0.8.4-0.20100823.2 +- Fix plymouth-update-initrd + It's regressed to the pre-dracut version. This commit fixes that. + +* Mon Aug 23 2010 Ray Strode 0.8.4-0.20100823.1 +- Update to newer pre-release snapshot of 0.8.4 +- Generate separate initrd in /boot + +* Sat Aug 21 2010 Ray Strode 0.8.4-0.20100821.1 +- Update to newer pre-release snapshot of 0.8.4 +- Fix bizarre-o animation during boot up. + +* Fri Jul 23 2010 Ray Strode 0.8.4-0.20100723.1 +- Update to pre-release snapshot of 0.8.4 + +* Thu Jan 14 2010 Ray Strode 0.8.0-0.20100114.2 +- Don't link plymouthd against libpng either + +* Thu Jan 14 2010 Ray Strode 0.8.0-0.20100114.1 +- Make it possible to do a basic plymouth installations without + libpng + +* Thu Jan 07 2010 Ray Strode 0.8.0-0.2009129.2 +- Drop nash dep + +* Tue Dec 22 2009 Dave Airlie 0.8.0-0.2009129.1 +- rebuild for API bump in libdrm + +* Wed Dec 09 2009 Ray Strode 0.8.0-0.2009129 +- Update to latest snapshot + +* Tue Sep 29 2009 Ray Strode 0.8.0-0.2009.10.05 +- Add new x11-renderer plugin from Charlie Brej for debugging + +* Tue Sep 29 2009 Ray Strode 0.8.0-0.2009.29.09 +- Fix escape and ask-for-password + +* Mon Sep 28 2009 Ray Strode 0.8.0-0.2009.28.09 +- Add prerelease of 0.8.0 for multihead support + +* Fri Sep 11 2009 Ray Strode 0.7.1-7 +- Go back to blue charge background (bug 522460) + +* Fri Sep 11 2009 Ray Strode 0.7.1-6 +- Remove duplicate Provides: plymouth(system-theme) + +* Thu Sep 10 2009 Ray Strode 0.7.1-5 +- Fix set_verbose error reported by yaneti. + +* Wed Sep 9 2009 Ray Strode 0.7.1-4 +- Look for inst() in dracut as well as mkinitrd bash source file +- Drop plymouth initrd for now. + +* Fri Aug 28 2009 Ray Strode 0.7.1-3 +- Create plymouth supplementary initrd in post (bug 515589) + +* Tue Aug 25 2009 Ray Strode 0.7.1-2 +- Get plugin path from plymouth instead of trying + to guess. Should fix bug 502667 + +* Tue Aug 25 2009 Ray Strode 0.7.1-1 +- Update to 0.7.1 + +* Mon Aug 24 2009 Adam Jackson 0.7.0-2 +- Set charge bgcolor to black. (#519052) + +* Tue Aug 11 2009 Ray Strode 0.7.0-1 +- Update to 0.7.0 + +* Sun Jul 26 2009 Fedora Release Engineering - 0.7.0-0.2010.05.15.1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Fri May 15 2009 Ray Strode 0.7.0-0.2009.05.15.1 +- Fix spinfinity theme to point to the right image directory + (bug 500994) + +* Thu May 14 2009 Ray Strode 0.7.0-0.2009.05.14.1 +- Update to new snapshot that renames plugins to fix upgrades + somewhat (bug 499940) + +* Fri May 08 2009 Ray Strode 0.7.0-0.2009.05.08.1 +- Add some fixes for shutdown + +* Fri May 08 2009 Ray Strode 0.7.0-0.2009.05.06.4 +- Don't slow down progress updating at the end of boot + +* Thu May 07 2009 Ray Strode 0.7.0-0.2009.05.06.3 +- Change colors to transition better to gdm + +* Wed May 06 2009 Ray Strode 0.7.0-0.2009.05.06.2 +- Make "charge" theme require two-step plugin instead of solar (oops) + +* Wed May 06 2009 Ray Strode 0.7.0-0.2009.05.06.1 +- Update to "plugin-rework" branch from git + +* Wed Apr 08 2009 Jesse Keating - 0.7.0-0.2009.03.10.3 +- Drop the version on system-logos requires for now, causing hell with + other -logos providers not having the same version. + +* Wed Mar 18 2009 Ray Strode 0.7.0-0.2009.03.10.2 +- Destroy terminal on detach (may help with bug 490965) + +* Tue Mar 10 2009 Ray Strode 0.7.0-0.2009.03.10.1 +- Address one more issue with password handling. It wasn't working + well for secondary devices when using the "details" plugin. + +* Mon Mar 9 2009 Ray Strode 0.7.0-0.2009.03.09.1 +- Attempt to address some problems with password handling in the + 0.7.0 snapshots + +* Fri Mar 6 2009 Ray Strode 0.7.0-0.2009.03.06.2 +- Fix set default script + +* Fri Mar 6 2009 Ray Strode 0.7.0-0.2009.03.06.1 +- more scriptlet changes to move from solar to spinfinity + +* Fri Mar 6 2009 Ray Strode 0.7.0-0.2009.03.06 +- Updated to development snapshot +- Guess progress better on second boot of persistent live images +- Drop upstream patches +- swap "solar" and "spinfinity" scriptlet behavior + +* Tue Feb 24 2009 Ray Strode 0.6.0-3 +- Add fix-heap-corruptor patch from master. Problem + spotted by Mr. McCann. + +* Wed Dec 17 2008 Ray Strode 0.6.0-2 +- Add patch from drop-nash branch for jeremy + +* Wed Dec 3 2008 Ray Strode 0.6.0-1 +- Update to 0.6.0 + +* Sat Nov 22 2008 Matthias Clasen 0.6.0-0.2008.11.17.3.1 +- Strip %%name from %%summary + +* Mon Nov 17 2008 Ray Strode 0.6.0-0.2008.11.17.3 +- don't give error about missing default.so +- rework packaging of boot-duration to prevent .rpmnew droppings + (bug 469752) + +* Mon Nov 17 2008 Ray Strode 0.6.0-0.2008.11.17.2 +- Don't tell gdm to transition unless booting into runlevel 3 + (bug 471785) + +* Mon Nov 17 2008 Ray Strode 0.6.0-0.2008.11.17.1 +- Crawl progress bar if boot is way off course (Charlie, bug 471089) + +* Fri Nov 14 2008 Ray Strode 0.6.0-0.2008.11.14.2 +- Don't loop forever when tty returns NUL byte (bug 471498) + +* Fri Nov 14 2008 Ray Strode 0.6.0-0.2008.11.14.1 +- Generate solar background dynamically to reduce ondisk size, and + look better at various resolutions (Charlie, bug 471227) + +* Thu Nov 13 2008 Ray Strode 0.6.0-0.2008.11.12.4 +- Move Obsoletes: plymouth-text-and-details-only to base package + so people who had it installed don't end up solar on upgrade + +* Wed Nov 12 2008 Ray Strode 0.6.0-0.2008.11.12.3 +- Redo packaging to work better with minimal installs + (bug 471314) + +* Wed Nov 12 2008 Ray Strode 0.6.0-0.2008.11.12.2 +- Fix plymouth-set-default-plugin to allow external $LIB + +* Wed Nov 12 2008 Ray Strode 0.6.0-0.2008.11.12.1 +- Fix star image (Charlie, bug 471113) + +* Tue Nov 11 2008 Ray Strode 0.6.0-0.2008.11.11.2 +- Improve solar flares (Charlie) +- redirect tty again on --show-splash +- ignore subsequent --hide-splash calls after the first one +- turn off kernel printks during boot up + +* Tue Nov 11 2008 Ray Strode 0.6.0-0.2008.11.11.1 +- Disconnect from tty when init=/bin/bash (bug 471007) + +* Mon Nov 10 2008 Ray Strode 0.6.0-0.2008.11.10.5 +- Force the right arch when calling plymouth-set-default-plugin + (bug 470732) + +* Mon Nov 10 2008 Ray Strode 0.6.0-0.2008.11.10.4 +- Drop comet (bug 468705) +- make boot-duration config(noreplace) + +* Mon Nov 10 2008 Ray Strode 0.6.0-0.2008.11.10.3 +- Don't abort if no splash when root is mounted +- Actually move patches upstream + +* Mon Nov 10 2008 Ray Strode 0.6.0-0.2008.11.10.1 +- Fix feedback loop with plymouth:debug +- Move patches upstream +- Improve comet animation + +* Sun Nov 9 2008 Ray Strode 0.6.0-0.2008.11.06.4 +- Fix up more-debug patch to not assert with plymouth:nolog + (bug 470569) + +* Fri Nov 7 2008 Ray Strode 0.6.0-0.2008.11.06.3 +- add some more debug spew to help debug a problem jlaska is having + +* Thu Nov 6 2008 Ray Strode 0.6.0-0.2008.11.06.2 +- show details plugin on --hide-splash so people can see why the splash + got hidden. + +* Thu Nov 6 2008 Ray Strode 0.6.0-0.2008.11.06.1 +- Don't exit on plymouth --show-splash after sulogin +- Properly retake console after that --show-splash + +* Wed Nov 5 2008 Ray Strode 0.6.0-0.2008.11.05.1 +- reset colors on quit --retain-splash +- fix off by one in damage calculation for label + +* Tue Nov 4 2008 Ray Strode 0.6.0-0.2008.10.30.5 +- Add a sample boot-duration for livecds and first time boots + (bug 469752) + +* Mon Nov 3 2008 Jeremy Katz - 0.6.0-0.2008.10.30.4 +- Allow pre-setting the default plugin when calling plymouth-populate-initrd + +* Fri Oct 31 2008 Ray Strode 0.6.0-0.2008.10.30.3 +- Add pango minimum version to buildrequires + +* Thu Oct 30 2008 Ray Strode 0.6.0-0.2008.10.30.2 +- Update prompt text colors to be legible on new artwork + +* Thu Oct 30 2008 Ray Strode 0.6.0-0.2008.10.30.1 +- Drop upstreamed patches +- Patch from Charlie to update artwork +- Patch from Charlie to make password screen match animation better + (bug 468899) + +* Thu Oct 30 2008 Ray Strode 0.6.0-0.2008.10.27.8 +- Fix escape at password prompt (bug 467533) + +* Tue Oct 28 2008 Ray Strode 0.6.0-0.2008.10.27.7 +- Don't require /bin/plymouth before it's installed (bug 468925) + +* Tue Oct 28 2008 Ray Strode 0.6.0-0.2008.10.27.6 +- Force raw mode for keyboard input with solar and fade-in + (bug 468880) +- make sure windows get closed on exit + +* Mon Oct 27 2008 Ray Strode 0.6.0-0.2008.10.27.5 +- Make "Solar" lock icon the same as the "Spinfinity" one. + +* Mon Oct 27 2008 Ray Strode 0.6.0-0.2008.10.27.4 +- Make plymouth-libs own /usr/lib/plymouth (bug 458071) + +* Mon Oct 27 2008 Ray Strode 0.6.0-0.2008.10.27.3 +- Default to "Solar" instead of "Spinfinity" + +* Mon Oct 27 2008 Ray Strode 0.6.0-0.2008.10.27.2 +- Don't set plymouth default plugin to text in %%post + +* Mon Oct 27 2008 Ray Strode 0.6.0-0.2008.10.27.1 +- Add Charlie patch to dither in lower color modes (bug 468276) + +* Sun Oct 26 2008 Jeremy Katz - 0.6.0-0.2008.10.24.2 +- More requires changing to avoid loops (#467356) + +* Fri Oct 24 2008 Ray Strode 0.6.0-0.2008.10.24.1 +- Add updated progress bar for solar plugin from Charlie +- Log plymouth:debug output to boot log +- Ignore sigpipe signals in daemon + +* Thu Oct 23 2008 Ray Strode 0.6.0-0.2008.10.23.2 +- Bump so name of libply to hopefully force plymouth to get installed + before kernel (or at least make plymouth-libs and plymouth get installed + on the same side of kernel in the transaction). + +* Thu Oct 23 2008 Ray Strode 0.6.0-0.2008.10.23.1 +- Add patch from Charlie to align progress bar to milestones during boot up +- force tty to be sane on exit (bug 467207) + +* Thu Oct 23 2008 Ray Strode 0.6.0-0.2008.10.21.3 +- add empty files section for text-and-details-only so the subpackage + shows up. + +* Wed Oct 22 2008 Ray Strode 0.6.0-0.2008.10.21.2 +- add text-and-details-only subpackage so davej can uninstall + spinfinity, pango, cairo etc from his router. + +* Tue Oct 21 2008 Ray Strode 0.6.0-0.2008.10.21.1 +- Minor event loop changes +- drop upstream patches +- Charlie Brej fix for progress bar resetting when escape gets pressed + +* Tue Oct 21 2008 Ray Strode 0.6.0-0.2008.10.17.4 +- Don't make plymouth-libs require plymouth (more fun with 467356) + +* Mon Oct 20 2008 Ray Strode 0.6.0-0.2008.10.17.3 +- Add initscripts requires (bug 461322) + +* Mon Oct 20 2008 Ray Strode 0.6.0-0.2008.10.17.2 +- Put tty1 back in "cooked" mode when going into runlevel 3 + (bug 467207) + +* Fri Oct 17 2008 Ray Strode 0.6.0-0.2008.10.17.1 +- Clear screen in details plugin when it's done +- Make plymouth-update-initrd a small wrapper around mkinitrd instead + of the broken monstrosity it was before. + +* Fri Oct 17 2008 Ray Strode 0.6.0-0.2008.10.15.3 +- Move plymouth-set-default-plugin, plymouth-update-initrd, and + plymouth-populate-initrd to plymouth-scripts subpackage + (the last fix didn't actually help with bug 467356) + +* Fri Oct 17 2008 Ray Strode 0.6.0-0.2008.10.15.2 +- Move plymouth-set-default-plugin to -libs (might help with bug 467356) +- Fix up requires, provides and postun scripts + +* Wed Oct 15 2008 Ray Strode 0.6.0-0.2008.10.15.1 +- Don't free windows on --hide-splash (fix from Jeremy) + +* Tue Oct 14 2008 Ray Strode 0.6.0-0.2008.10.14.1 +- Solar fixes from Charlie Brej +- Better cpu usage from Charlie + +* Fri Oct 10 2008 Ray Strode 0.6.0-0.2008.10.08.2 +- Add Requires(post): nash (bug 466500) + +* Wed Oct 08 2008 Ray Strode 0.6.0-0.2008.10.08.1 +- Rework how "console=" args done again, to hopefully fix + bug 460565 + +* Mon Oct 06 2008 Ray Strode 0.6.0-0.2008.10.06.1 +- Add "Solar" plugin from Charles Brej +- Move things around so computers with separate /usr boot + (hopefully this won't break things, but it probably will) +- Make GDM show up on vt1 for all plugins + +* Tue Sep 30 2008 Jeremy Katz 0.6.0-0.2008.09.25.2 +- Remove mkinitrd requires to break the dep loop and ensure things + get installed in the right order + +* Thu Sep 25 2008 Ray Strode 0.6.0-0.2008.09.25.1 +- Add new snapshot to fold in Will Woods progress bar, and + move ajax's splash upstream, putting the old text splash + in a "pulser" subpackage + +* Tue Sep 23 2008 Ray Strode 0.6.0-0.2008.09.23.1 +- Last snapshot was broken + +* Mon Sep 22 2008 Ray Strode 0.6.0-0.2008.09.22.1 +- Update to latest snapshot to get better transition support + +* Fri Sep 19 2008 Ray Strode 0.6.0-0.2008.09.15.2 +- Turn on gdm trigger for transition + +* Mon Sep 15 2008 Ray Strode 0.6.0-0.2008.09.15.1 +- add quit command with --retain-splash option to client + +* Wed Sep 10 2008 Ray Strode 0.6.0-0.2008.09.10.1 +- Fix text rendering for certain machines + +* Mon Sep 8 2008 Ray Strode 0.6.0-0.2008.09.05.4 +- More serial console fixes (bug 460565 again) + +* Fri Sep 5 2008 Bill Nottingham 0.6.0-0.2008.09.05.3 +- make the text plugin use the system release info rather than a hardcoded 'Fedora 10' + +* Fri Sep 5 2008 Ray Strode 0.6.0-0.2008.09.05.2 +- Try to support multiple serial consoles better + (bug 460565) + +* Fri Sep 5 2008 Ray Strode 0.6.0-0.2008.09.05.1 +- Fix some confusion with password handling in details plugin + +* Wed Aug 27 2008 Ray Strode 0.6.0-0.2008.08.27.1 +- Fix another crasher for users with encrypted disks (this time in + the text plugin, not the client) + +* Wed Aug 27 2008 Ray Strode 0.6.0-0.2008.08.27 +- Update to latest snapshot +- Add the ability to show text prompts in graphical plugin +- Fix crasher for users with encrypted disks + +* Fri Aug 22 2008 Ray Strode 0.6.0-0.2008.08.22 +- Update to latest snapshot + +* Wed Aug 13 2008 Ray Strode 0.5.0-20.2008.08.13 +- Update previous patch to remove some assertions + +* Wed Aug 13 2008 Ray Strode 0.5.0-19.2008.08.13 +- add a patch that may help serial console users + +* Wed Aug 13 2008 Ray Strode 0.5.0-18.2008.08.13 +- add spool directory to file list + +* Wed Aug 13 2008 Ray Strode 0.5.0-17.2008.08.13 +- Make plymouth-gdm-hooks require plymouth-utils + +* Wed Aug 13 2008 Ray Strode 0.5.0-16.2008.08.13 +- Add a boot failure viewer to login screen (written by Matthias) + +* Tue Aug 12 2008 Adam Jackson 0.5.0-15.2008.08.08 +- plymouth-0.5.0-textbar-hotness.patch: Change the text plugin to a slightly + more traditional progress bar, to maintain the illusion of progress better + than the eternally oscillating cylon. Note: still incomplete. + +* Fri Aug 8 2008 Ray Strode - 0.5.0-14.2008.08.08 +- Don't require a modifiable text color map (may fix serial consoles) + +* Thu Aug 7 2008 Ray Strode - 0.5.0-13.2008.08.07 +- Update to new snapshot which when combined with a new mkinitrd should + make unlocking encrypted root partitions work again + +* Wed Aug 6 2008 Ray Strode - 0.5.0-12.2008.08.06 +- Update to new snapshot which fixes some assertion failures in the + client code + +* Wed Aug 6 2008 Ray Strode - 0.5.0-11.2008.08.01 +- Add Requires(post): plymouth to plugins so they get plymouth-set-default-plugin (bug 458071) + +* Tue Aug 5 2008 Ray Strode - 0.5.0-10.2008.08.01 +- Add plymouth dirs to file list (bug 457871) + +* Fri Aug 1 2008 Ray Strode - 0.5.0-9.2008.08.01 +- new plymout-populate-initrd features don't work with the set -e at the + top of it. + +* Thu Jul 31 2008 Ray Strode - 0.5.0-8.2008.08.01 +- Update to another snapshot to actually get new + plymouth-populate-initrd features + +* Thu Jul 31 2008 Ray Strode - 0.5.0-8.2008.07.31 +- Update to snapshot to get new plymouth-populate-initrd features +- Make removing rhgb use details plugin instead of exiting + +* Thu Jul 31 2008 Peter Jones - 0.5.0-7 +- Make it a mkinitrd requires instead of a nash requires (that will + still pull in nash, but we need mkinitrd for newer plymouth-populate-initrd) + +* Wed Jul 30 2008 Ray Strode - 0.5.0-6 +- Add nash requires + +* Wed Jul 9 2008 Ray Strode - 0.5.0-5 +- Use a new heuristic for finding libdir, since the old + one falls over on ia64 + +* Wed Jul 9 2008 Ray Strode - 0.5.0-4 +- add ctrl-r to rotate text color palette back to stock values + +* Tue Jul 8 2008 Ray Strode - 0.5.0-3 +- Fix populate script on ppc (bug 454353) + +* Tue Jul 1 2008 Ray Strode - 0.5.0-2 +- Pull in spinfinity by default. This whole "figure out + which plugin to use" set of scripts and scriptlets + needs work. We need to separate distro default from + user choice. + +* Tue Jul 1 2008 Ray Strode - 0.5.0-1 +- Add new client "ask-for-password" command which feeds + the user input to a program instead of standard output, + and loops when the program returns non-zero exit status. + +* Thu Jun 26 2008 Ray Strode - 0.4.5-1 +- Update to version 0.4.5 +- Make text plugin blue and less 80s + +* Wed Jun 25 2008 Ray Strode - 0.4.0-4 +- Make "Password: " show up correctly in text plugin + +* Wed Jun 25 2008 Ray Strode - 0.4.0-3 +- Require elfutils (bug 452797) + +* Sun Jun 22 2008 Ray Strode - 0.4.0-2 +- Make plymouth-set-default-plugin --reset choose the latest + installed plugin, not the earliest + +* Sun Jun 22 2008 Ray Strode - 0.4.0-1 +- Update to version 0.4.0 +- Only run if rhgb is on kernel command line +- Make text plugin more animated + +* Mon Jun 16 2008 Ray Strode - 0.3.2-2 +- dont go back to text mode on exit + +* Mon Jun 16 2008 Ray Strode - 0.3.2-1 +- Update to version 0.3.2 +- show gradient in spinfinity plugin +- Drop fade out in spinfinity plugin +- fix throbber placement +- rename graphical.so to default.so + +* Thu Jun 12 2008 Ray Strode - 0.3.1-3 +- scriplet should be preun, not postun + +* Thu Jun 12 2008 Ray Strode - 0.3.1-2 +- Fix postun scriptlet + +* Thu Jun 12 2008 Ray Strode - 0.3.1-1 +- Update to version 0.3.1 +- Don't ship generated initrd scripts in tarball + +* Thu Jun 12 2008 Ray Strode - 0.3.0-1 +- Update to version 0.3.0 +- Better plugin handling +- Better integration with mkinitrd (pending mkinitrd changes) +- random bug fixes + +* Mon Jun 9 2008 Ray Strode - 0.2.0-1 +- Update to version 0.2.0 +- Integrate more tightly with nash (pending nash changes) +- ship libs for out of tree splash plugins +- gradient support +- random bug fixes + +* Fri May 30 2008 Ray Strode - 0.1.0-1 +- Initial import, version 0.1.0