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 <hdegoede@redhat.com>
This commit is contained in:
Hans de Goede 2019-02-07 17:44:32 +01:00
parent 2b7bad86b3
commit c5d7b61dc5

View file

@ -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);
}
}