diff --git a/plymouth-support-multi-monitor-hotplugin.patch b/plymouth-support-multi-monitor-hotplugin.patch new file mode 100644 index 0000000..9cacc10 --- /dev/null +++ b/plymouth-support-multi-monitor-hotplugin.patch @@ -0,0 +1,291 @@ +commit 1896ea7439457a33ad1d1cc72a5dceb564dd77ef +Author: Timo Teräs +Date: Wed Mar 22 13:54:39 2023 +0200 + + script: handle display hotplug + + - Fix script plugin to handle monitor hotplug events + + - Expose Plymouth.SetDisplayHotplugFunction to set script callback + after display hotplug + + fixes #186 + +--- plymouth-22.02.122+94.4bd41a3/src/plugins/splash/script/plugin.c ++++ plymouth-22.02.122+94.4bd41a3_new/src/plugins/splash/script/plugin.c +@@ -392,13 +392,22 @@ + ply_pixel_display_t *display) + { + ply_list_append_data (plugin->displays, display); ++ ++ if (plugin->script_sprite_lib != NULL) { ++ script_lib_sprite_pixel_display_added (plugin->script_sprite_lib, display); ++ script_lib_plymouth_on_display_hotplug (plugin->script_state, plugin->script_plymouth_lib); ++ } + } + + static void + remove_pixel_display (ply_boot_splash_plugin_t *plugin, + ply_pixel_display_t *display) + { +- script_lib_sprite_pixel_display_removed (plugin->script_sprite_lib, display); ++ if (plugin->script_sprite_lib != NULL) { ++ script_lib_sprite_pixel_display_removed (plugin->script_sprite_lib, display); ++ script_lib_plymouth_on_display_hotplug (plugin->script_state, plugin->script_plymouth_lib); ++ } ++ + ply_list_remove_data (plugin->displays, display); + } + +--- plymouth-22.02.122+94.4bd41a3/src/plugins/splash/script/script-lib-plymouth.c ++++ plymouth-22.02.122+94.4bd41a3_new/src/plugins/splash/script/script-lib-plymouth.c +@@ -108,6 +108,7 @@ + data->script_display_prompt_func = script_obj_new_null (); + data->script_validate_input_func = script_obj_new_null (); + data->script_display_message_func = script_obj_new_null (); ++ data->script_display_hotplug_func = script_obj_new_null (); + data->script_hide_message_func = script_obj_new_null (); + data->script_quit_func = script_obj_new_null (); + data->script_system_update_func = script_obj_new_null (); +@@ -177,6 +178,12 @@ + "function", + NULL); ++ script_add_native_function (plymouth_hash, ++ "SetDisplayHotplugFunction", ++ plymouth_set_function, ++ &data->script_display_hotplug_func, ++ "function", ++ NULL); + script_add_native_function (plymouth_hash, + "SetValidateInputFunction", + plymouth_set_function, + &data->script_validate_input_func, +@@ -233,6 +240,7 @@ + script_obj_unref (data->script_display_password_func); + script_obj_unref (data->script_display_question_func); + script_obj_unref (data->script_display_prompt_func); ++ script_obj_unref (data->script_display_hotplug_func); + script_obj_unref (data->script_validate_input_func); + script_obj_unref (data->script_display_message_func); + script_obj_unref (data->script_hide_message_func); +@@ -384,6 +392,16 @@ + script_obj_unref (ret.object); + } + ++void script_lib_plymouth_on_display_hotplug (script_state_t *state, ++ script_lib_plymouth_data_t *data) ++{ ++ script_return_t ret = script_execute_object (state, ++ data->script_display_hotplug_func, ++ NULL, ++ NULL); ++ script_obj_unref (ret.object); ++} ++ + bool script_lib_plymouth_on_validate_input (script_state_t *state, + script_lib_plymouth_data_t *data, + const char *entry_text, +--- plymouth-22.02.122+94.4bd41a3/src/plugins/splash/script/script-lib-plymouth.h ++++ plymouth-22.02.122+94.4bd41a3_new/src/plugins/splash/script/script-lib-plymouth.h +@@ -37,6 +37,7 @@ + script_obj_t *script_display_password_func; + script_obj_t *script_display_question_func; + script_obj_t *script_display_prompt_func; ++ script_obj_t *script_display_hotplug_func; + script_obj_t *script_validate_input_func; + script_obj_t *script_display_message_func; + script_obj_t *script_hide_message_func; +@@ -80,6 +81,8 @@ + const char *prompt, + const char *entry_text, + bool is_secret); ++void script_lib_plymouth_on_display_hotplug (script_state_t *state, ++ script_lib_plymouth_data_t *data); + bool script_lib_plymouth_on_validate_input (script_state_t *state, + script_lib_plymouth_data_t *data, + const char *entry_text, +--- plymouth-22.02.122+94.4bd41a3/src/plugins/splash/script/script-lib-sprite.c ++++ plymouth-22.02.122+94.4bd41a3_new/src/plugins/splash/script/script-lib-sprite.c +@@ -223,17 +223,7 @@ + return script_return_obj (script_obj_new_number (width)); + } + +- width = 0; +- for (node = ply_list_get_first_node (data->displays); +- node; +- node = ply_list_get_next_node (data->displays, node)) { +- display = ply_list_node_get_data (node); +- if (width == 0) +- width = ply_pixel_display_get_width (display->pixel_display); +- else +- width = MAX (width, ply_pixel_display_get_width (display->pixel_display)); +- } +- return script_return_obj (script_obj_new_number (width)); ++ return script_return_obj (script_obj_new_number (data->max_width)); + } + + static script_return_t sprite_window_get_height (script_state_t *state, +@@ -261,17 +251,7 @@ + return script_return_obj (script_obj_new_number (height)); + } + +- height = 0; +- for (node = ply_list_get_first_node (data->displays); +- node; +- node = ply_list_get_next_node (data->displays, node)) { +- display = ply_list_node_get_data (node); +- if (height == 0) +- height = ply_pixel_display_get_height (display->pixel_display); +- else +- height = MAX (height, ply_pixel_display_get_height (display->pixel_display)); +- } +- return script_return_obj (script_obj_new_number (height)); ++ return script_return_obj (script_obj_new_number (data->max_height)); + } + + static script_return_t sprite_window_get_x (script_state_t *state, +@@ -519,45 +499,65 @@ + } + } + ++static void ++update_displays (script_lib_sprite_data_t *data) ++{ ++ ply_list_node_t *node; ++ script_lib_display_t *script_display; ++ ++ data->max_width = 0; ++ data->max_height = 0; ++ for (node = ply_list_get_first_node (data->displays); ++ node; ++ node = ply_list_get_next_node (data->displays, node)) { ++ script_display = ply_list_node_get_data (node); ++ data->max_width = MAX (data->max_width, ply_pixel_display_get_width (script_display->pixel_display)); ++ data->max_height = MAX (data->max_height, ply_pixel_display_get_height (script_display->pixel_display)); ++ } ++ ++ for (node = ply_list_get_first_node (data->displays); ++ node; ++ node = ply_list_get_next_node (data->displays, node)) { ++ script_display = ply_list_node_get_data (node); ++ script_display->x = (data->max_width - ply_pixel_display_get_width (script_display->pixel_display)) / 2; ++ script_display->y = (data->max_height - ply_pixel_display_get_height (script_display->pixel_display)) / 2; ++ } ++ ++ data->full_refresh = true; ++} ++ ++static void ++add_display (script_lib_sprite_data_t *data, ++ ply_pixel_display_t *pixel_display) ++{ ++ script_lib_display_t *script_display = malloc (sizeof(script_lib_display_t)); ++ ++ script_display->pixel_display = pixel_display; ++ script_display->data = data; ++ ply_pixel_display_set_draw_handler (pixel_display, ++ (ply_pixel_display_draw_handler_t) ++ script_lib_sprite_draw_area, script_display); ++ ++ ply_list_append_data (data->displays, script_display); ++} ++ + script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state, + ply_list_t *pixel_displays) + { + ply_list_node_t *node; +- unsigned int max_width, max_height; + script_lib_sprite_data_t *data = malloc (sizeof(script_lib_sprite_data_t)); + + data->class = script_obj_native_class_new (sprite_free, "sprite", data); + data->sprite_list = ply_list_new (); + data->displays = ply_list_new (); + +- max_width = 0; +- max_height = 0; +- + for (node = ply_list_get_first_node (pixel_displays); + node; + node = ply_list_get_next_node (pixel_displays, node)) { + ply_pixel_display_t *pixel_display = ply_list_node_get_data (node); +- max_width = MAX (max_width, ply_pixel_display_get_width (pixel_display)); +- max_height = MAX (max_height, ply_pixel_display_get_height (pixel_display)); +- } +- +- for (node = ply_list_get_first_node (pixel_displays); +- node; +- node = ply_list_get_next_node (pixel_displays, node)) { +- ply_pixel_display_t *pixel_display = ply_list_node_get_data (node); +- script_lib_display_t *script_display = malloc (sizeof(script_lib_display_t)); +- script_display->pixel_display = pixel_display; +- +- script_display->x = (max_width - ply_pixel_display_get_width (pixel_display)) / 2; +- script_display->y = (max_height - ply_pixel_display_get_height (pixel_display)) / 2; +- +- script_display->data = data; +- ply_pixel_display_set_draw_handler (pixel_display, +- (ply_pixel_display_draw_handler_t) +- script_lib_sprite_draw_area, script_display); +- +- ply_list_append_data (data->displays, script_display); ++ add_display (data, pixel_display); + } ++ update_displays (data); + + script_obj_t *sprite_hash = script_obj_hash_get_element (state->global, "Sprite"); + +@@ -718,12 +718,20 @@ + ply_region_add_rectangle (region, &rectangle); + } + ++void script_lib_sprite_pixel_display_added (script_lib_sprite_data_t *data, ++ ply_pixel_display_t *pixel_display) ++{ ++ add_display (data, pixel_display); ++ update_displays (data); ++} ++ + 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; ++ bool update = false; + + if (!data) + return; +@@ -735,9 +743,13 @@ + + if (display->pixel_display == pixel_display) { + ply_list_remove_node (data->displays, node); ++ update = true; + } + node = next_node; + } ++ ++ if (update) ++ update_displays (data); + } + + void +--- plymouth-22.02.122+94.4bd41a3/src/plugins/splash/script/script-lib-sprite.h ++++ plymouth-22.02.122+94.4bd41a3_new/src/plugins/splash/script/script-lib-sprite.h +@@ -35,6 +35,8 @@ + uint32_t background_color_start; + uint32_t background_color_end; + bool full_refresh; ++ unsigned int max_width; ++ unsigned int max_height; + } script_lib_sprite_data_t; + + typedef struct +@@ -65,6 +67,8 @@ + + script_lib_sprite_data_t *script_lib_sprite_setup (script_state_t *state, + ply_list_t *displays); ++void script_lib_sprite_pixel_display_added (script_lib_sprite_data_t *data, ++ ply_pixel_display_t *pixel_display); + void script_lib_sprite_pixel_display_removed (script_lib_sprite_data_t *data, + ply_pixel_display_t *pixel_display); + void script_lib_sprite_refresh (script_lib_sprite_data_t *data); diff --git a/plymouth.changes b/plymouth.changes index 3f4b69d..ca17464 100644 --- a/plymouth.changes +++ b/plymouth.changes @@ -6,6 +6,14 @@ Wed Dec 4 14:03:31 UTC 2024 - Thomas Zimmermann that forces them to use fbdev. Resolves the blank screen when disabling fbdev interfaces.(bsc#1232727) +------------------------------------------------------------------- +Fri Nov 1 13:17:39 UTC 2024 - Cliff Zhao + +- Add plymouth-support-multi-monitor-hotplugin.patch: + To support the 2nd monitor hotplugin to the system in random + order. Display the same content is fine. + (bsc#1231214) + ------------------------------------------------------------------- Mon Aug 28 03:33:51 UTC 2023 - Cliff Zhao diff --git a/plymouth.spec b/plymouth.spec index 5175b7e..17c20ab 100644 --- a/plymouth.spec +++ b/plymouth.spec @@ -1,7 +1,7 @@ # # spec file for package plymouth # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -52,6 +52,8 @@ Patch8: plymouth-log-on-default.patch Patch9: plymouth-screen-twice-scale-on-160DPI-higher.patch # PATCH-FIX-OPENSUSE plymouth-crash-avoid-on-keyboard-remove-input-handler.patch bsc#1193736 qzhao@suse.com -- Confirm keyboard handler list not NULL before release memory to avoid crash. Patch10: plymouth-crash-avoid-on-keyboard-remove-input-handler.patch +# PATCH-FIX-SLE plymouth-support-multi-monitor-hotplugin.patch bsc#1231214 qzhao@suse.com -- support the 2nd monitor hotplugin to the system to display the same content with the first monitor. +Patch13: plymouth-support-multi-monitor-hotplugin.patch BuildRequires: automake BuildRequires: docbook-xsl-stylesheets BuildRequires: gcc