From c5d7b61dc52064f9653b5d95ce4399e1508b3149 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 7 Feb 2019 17:44:32 +0100 Subject: [PATCH] two-step: Add MessageBelowAnimation option So far we've always printed messages coming from "plymouth display-message" in the top left corner. In some cases the theme may want to instead display the messages below the animation (where they are more prominently visible). My first attempt to support this added MessageHorizontal/VerticalAlignment options. That did not work since we want a more or less fixed distance between the animation bottom and the message and with screen-heights varying from 480 to 1200 that is not possible using alignment options to place both the animation and the message. Note the default is unchanged and still is the top left corner. Signed-off-by: Hans de Goede --- src/plugins/splash/two-step/plugin.c | 46 ++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c index 2051240f..c6f99edb 100644 --- a/src/plugins/splash/two-step/plugin.c +++ b/src/plugins/splash/two-step/plugin.c @@ -96,6 +96,7 @@ typedef struct ply_rectangle_t box_area, lock_area, watermark_area, dialog_area; ply_trigger_t *end_trigger; ply_pixel_buffer_t *background_buffer; + int animation_bottom; } view_t; typedef struct @@ -154,6 +155,7 @@ struct _ply_boot_splash_plugin uint32_t is_idle : 1; uint32_t use_firmware_background : 1; uint32_t dialog_clears_firmware_background : 1; + uint32_t message_below_animation : 1; }; ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void); @@ -647,6 +649,7 @@ view_start_end_animation (view_t *view, ply_animation_start (view->end_animation, view->display, trigger, x, y); + view->animation_bottom = y + height; } static void @@ -689,6 +692,7 @@ view_start_progress_animation (view_t *view) plugin->loop, view->display, x, y); ply_pixel_display_draw_area (view->display, x, y, width, height); + view->animation_bottom = y + height; } /* We don't really know how long shutdown will so @@ -706,6 +710,7 @@ view_start_progress_animation (view_t *view) view->display, x, y); ply_pixel_display_draw_area (view->display, x, y, width, height); + view->animation_bottom = y + height; } } @@ -952,6 +957,9 @@ create_plugin (ply_key_file_t *key_file) plugin->dialog_clears_firmware_background = ply_key_file_get_bool (key_file, "two-step", "DialogClearsFirmwareBackground"); + plugin->message_below_animation = + ply_key_file_get_bool (key_file, "two-step", "MessageBelowAnimation"); + progress_function = ply_key_file_get_value (key_file, "two-step", "ProgressFunction"); if (progress_function != NULL) { @@ -1668,6 +1676,29 @@ hide_prompt (ply_boot_splash_plugin_t *plugin) } +static void +view_show_message (view_t *view, + const char *message) +{ + ply_boot_splash_plugin_t *plugin = view->plugin; + int x, y, width, height; + + ply_label_set_text (view->message_label, message); + width = ply_label_get_width (view->message_label); + height = ply_label_get_height (view->message_label); + + if (plugin->message_below_animation) { + x = (ply_pixel_display_get_width (view->display) - width) * 0.5; + y = view->animation_bottom + 10; + } else { + x = 10; + y = 10; + } + + ply_label_show (view->message_label, view->display, x, y); + ply_pixel_display_draw_area (view->display, x, y, width, height); +} + static void show_message (ply_boot_splash_plugin_t *plugin, const char *message) @@ -1676,19 +1707,8 @@ show_message (ply_boot_splash_plugin_t *plugin, ply_list_node_t *node; 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); - - ply_label_set_text (view->message_label, message); - ply_label_show (view->message_label, view->display, 10, 10); - - ply_pixel_display_draw_area (view->display, 10, 10, - ply_label_get_width (view->message_label), - ply_label_get_height (view->message_label)); - node = next_node; + view_show_message (ply_list_node_get_data (node), message); + node = ply_list_get_next_node (plugin->views, node); } }