linuxOS_AP06/buildroot/package/weston/0030-Support-holding-display-for-the-first-app.patch
2025-06-03 12:28:32 +08:00

109 lines
3.7 KiB
Diff

From 9a434579cec0ade11e92e01b78736a81d4bd6da8 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Fri, 3 Jul 2020 10:20:40 +0800
Subject: [PATCH 30/97] Support holding display for the first app
Use '-w' or '--warm-up' to enable it.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
frontend/main.c | 8 ++++++++
include/libweston/libweston.h | 2 ++
libweston/compositor.c | 16 ++++++++++++++++
3 files changed, 26 insertions(+)
diff --git a/frontend/main.c b/frontend/main.c
index 009f0d22b..f9824b8a1 100644
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -731,6 +731,7 @@ usage(int error_code)
" -f, --flight-rec-scopes=SCOPE\n\t\t\tSpecify log scopes to "
"subscribe to.\n\t\t\tCan specify multiple scopes, "
"each followed by comma\n"
+ " -w, --warm-up\t\tHold display for the first app\n"
" -h, --help\t\tThis help message\n\n");
#if defined(BUILD_DRM_COMPOSITOR)
@@ -4482,6 +4483,8 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data)
bool wait_for_debugger = false;
struct wl_protocol_logger *protologger = NULL;
+ bool warm_up = false;
+
const struct weston_option core_options[] = {
{ WESTON_OPTION_STRING, "backend", 'B', &backends },
{ WESTON_OPTION_STRING, "backends", 0, &backends },
@@ -4502,6 +4505,7 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data)
{ WESTON_OPTION_BOOLEAN, "debug", 0, &debug_protocol },
{ WESTON_OPTION_STRING, "logger-scopes", 'l', &log_scopes },
{ WESTON_OPTION_STRING, "flight-rec-scopes", 'f', &flight_rec_scopes },
+ { WESTON_OPTION_BOOLEAN, "warm-up", 'w', &warm_up },
};
wl_list_init(&wet.layoutput_list);
@@ -4719,9 +4723,13 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data)
if (idle_time < 0)
idle_time = 300; /* default idle timeout, in seconds */
+ if (!warm_up)
+ weston_config_section_get_bool(section, "warm-up", &warm_up, false);
+
wet.compositor->idle_time = idle_time;
wet.compositor->default_pointer_grab = NULL;
wet.compositor->exit = handle_exit;
+ wet.compositor->warm_up = warm_up;
weston_compositor_log_capabilities(wet.compositor);
diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
index 5342af89d..ba961a861 100644
--- a/include/libweston/libweston.h
+++ b/include/libweston/libweston.h
@@ -1653,6 +1653,8 @@ struct weston_compositor {
enum weston_output_flow output_flow;
bool pin_output;
+
+ bool warm_up;
};
struct weston_solid_buffer_values {
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 463e2118b..650e51b0b 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -3705,7 +3705,14 @@ weston_compositor_build_view_list(struct weston_compositor *compositor)
wl_list_init(&compositor->view_list);
wl_list_for_each(layer, &compositor->layer_list, link) {
+ bool system_layer = weston_compositor_is_system_layer(layer);
+
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
+ if (compositor->warm_up && !system_layer) {
+ weston_log("seeing the first app\n");
+ compositor->warm_up = false;
+ }
+
view_list_add(compositor, view);
}
}
@@ -3837,6 +3844,15 @@ weston_output_repaint(struct weston_output *output, struct timespec *now)
if (ec->view_list_needs_rebuild)
weston_compositor_build_view_list(ec);
+ if (ec->warm_up) {
+ static bool warm_up_msg = false;
+ if (!warm_up_msg) {
+ weston_log("holding display for the first app...\n");
+ warm_up_msg = true;
+ }
+ return -1;
+ }
+
wl_list_for_each(pnode, &output->paint_node_z_order_list,
z_order_link) {
assert(pnode->view->output_mask & (1u << pnode->output->id));
--
2.20.1