shell: wait for desktop-shell init before fade in
On Raspberry Pi, weston-desktop-shell is so slow to start, that the compositor has time to run the fade-in before the wallpaper is up. The user launching Weston sees the screen flipping to black, the fbcon fading in, and then the desktop popping up. To fix this, wait for the weston-desktop-shell to draw everything before starting the initial fade-in. A new request is added to the private desktop-shell protocol to signal it. If a desktop-shell client does not support the new request, the fade-in happens already at bind time. If weston-desktop-shell crashes, or does not send the 'desktop_ready' request in 15 seconds, the compositor will fade in anyway. This should avoid a blocked screen in case weston-desktop-shell malfunction. shell_fade_startup() does not directly start the fade-in but schedules an idle callback, so that the compositor can process all pending events before starting the fade clock. Otherwise (on RPi) we risk skipping part of the animation. Yes, it is a hack, that should have been done in window.c and weston-desktop-shell instead. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
This commit is contained in:
committed by
Kristian Høgsberg
parent
17bd884bff
commit
79346ab3a5
+45
-1
@@ -49,6 +49,7 @@ extern char **environ; /* defined by libc */
|
||||
struct desktop {
|
||||
struct display *display;
|
||||
struct desktop_shell *shell;
|
||||
uint32_t interface_version;
|
||||
struct unlock_dialog *unlock_dialog;
|
||||
struct task unlock_task;
|
||||
struct wl_list outputs;
|
||||
@@ -57,6 +58,8 @@ struct desktop {
|
||||
struct widget *grab_widget;
|
||||
|
||||
enum cursor_type grab_cursor;
|
||||
|
||||
int painted;
|
||||
};
|
||||
|
||||
struct surface {
|
||||
@@ -72,12 +75,14 @@ struct panel {
|
||||
struct widget *widget;
|
||||
struct wl_list launcher_list;
|
||||
struct panel_clock *clock;
|
||||
int painted;
|
||||
};
|
||||
|
||||
struct background {
|
||||
struct surface base;
|
||||
struct window *window;
|
||||
struct widget *widget;
|
||||
int painted;
|
||||
};
|
||||
|
||||
struct output {
|
||||
@@ -175,6 +180,38 @@ show_menu(struct panel *panel, struct input *input, uint32_t time)
|
||||
x - 10, y - 10, menu_func, entries, 4);
|
||||
}
|
||||
|
||||
static int
|
||||
is_desktop_painted(struct desktop *desktop)
|
||||
{
|
||||
struct output *output;
|
||||
|
||||
wl_list_for_each(output, &desktop->outputs, link) {
|
||||
if (output->panel && !output->panel->painted)
|
||||
return 0;
|
||||
if (output->background && !output->background->painted)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
check_desktop_ready(struct window *window)
|
||||
{
|
||||
struct display *display;
|
||||
struct desktop *desktop;
|
||||
|
||||
display = window_get_display(window);
|
||||
desktop = display_get_user_data(display);
|
||||
|
||||
if (!desktop->painted && is_desktop_painted(desktop)) {
|
||||
desktop->painted = 1;
|
||||
|
||||
if (desktop->interface_version >= 2)
|
||||
desktop_shell_desktop_ready(desktop->shell);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
panel_launcher_activate(struct panel_launcher *widget)
|
||||
{
|
||||
@@ -261,6 +298,8 @@ panel_redraw_handler(struct widget *widget, void *data)
|
||||
cairo_destroy(cr);
|
||||
surface = window_get_surface(panel->window);
|
||||
cairo_surface_destroy(surface);
|
||||
panel->painted = 1;
|
||||
check_desktop_ready(panel->window);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -690,6 +729,9 @@ background_draw(struct widget *widget, void *data)
|
||||
allocation.width, allocation.height);
|
||||
wl_surface_set_opaque_region(window_get_wl_surface(background->window), opaque);
|
||||
wl_region_destroy(opaque);
|
||||
|
||||
background->painted = 1;
|
||||
check_desktop_ready(background->window);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1095,8 +1137,10 @@ global_handler(struct display *display, uint32_t id,
|
||||
struct desktop *desktop = data;
|
||||
|
||||
if (!strcmp(interface, "desktop_shell")) {
|
||||
desktop->interface_version = (version < 2) ? version : 2;
|
||||
desktop->shell = display_bind(desktop->display,
|
||||
id, &desktop_shell_interface, 1);
|
||||
id, &desktop_shell_interface,
|
||||
desktop->interface_version);
|
||||
desktop_shell_add_listener(desktop->shell, &listener, desktop);
|
||||
} else if (!strcmp(interface, "wl_output")) {
|
||||
create_output(desktop, id);
|
||||
|
||||
Reference in New Issue
Block a user