summaryrefslogtreecommitdiff
path: root/clients/desktop-shell.c
diff options
context:
space:
mode:
Diffstat (limited to 'clients/desktop-shell.c')
-rw-r--r--clients/desktop-shell.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
index 497e4ffd..3b71403b 100644
--- a/clients/desktop-shell.c
+++ b/clients/desktop-shell.c
@@ -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);