diff --git a/eek/layersurface.c b/eek/layersurface.c index 63f88eaf..05a14ad9 100644 --- a/eek/layersurface.c +++ b/eek/layersurface.c @@ -65,9 +65,9 @@ static void layer_surface_configure(void *data, uint32_t height) { PhoshLayerSurface *self = data; + gtk_window_resize (GTK_WINDOW (self), width, height); zwlr_layer_surface_v1_ack_configure(surface, serial); - gtk_widget_show_all (GTK_WIDGET (self)); g_signal_emit (self, signals[CONFIGURED], 0); } @@ -180,20 +180,21 @@ phosh_layer_surface_get_property (GObject *object, static void -phosh_layer_surface_constructed (GObject *object) +on_phosh_layer_surface_realized (PhoshLayerSurface *self, gpointer unused) { - PhoshLayerSurface *self = PHOSH_LAYER_SURFACE (object); - PhoshLayerSurfacePrivate *priv = phosh_layer_surface_get_instance_private (self); + PhoshLayerSurfacePrivate *priv; GdkWindow *gdk_window; - G_OBJECT_CLASS (phosh_layer_surface_parent_class)->constructed (object); - gtk_window_set_decorated (GTK_WINDOW (self), FALSE); - /* Realize the window so we can get the GDK window */ - gtk_widget_realize(GTK_WIDGET (self)); + g_return_if_fail (PHOSH_IS_LAYER_SURFACE (self)); + + priv = phosh_layer_surface_get_instance_private (self); gdk_window = gtk_widget_get_window (GTK_WIDGET (self)); gdk_wayland_window_set_use_custom_surface (gdk_window); + + wl_display_roundtrip (gdk_wayland_display_get_wl_display (gdk_display_get_default ())); + priv->wl_surface = gdk_wayland_window_get_wl_surface (gdk_window); priv->layer_surface = zwlr_layer_shell_v1_get_layer_surface(priv->layer_shell, @@ -209,8 +210,34 @@ phosh_layer_surface_constructed (GObject *object) &layer_surface_listener, self); wl_surface_commit(priv->wl_surface); + + gtk_window_set_decorated (GTK_WINDOW (self), FALSE); } + +static void +on_phosh_layer_surface_mapped (PhoshLayerSurface *self, gpointer unused) +{ + /* Process all pending events, otherwise we end up sending ack configure + * to a not yet configured surface */ + wl_display_roundtrip (gdk_wayland_display_get_wl_display (gdk_display_get_default ())); +} + + +static void +phosh_layer_surface_constructed (GObject *object) +{ + PhoshLayerSurface *self = PHOSH_LAYER_SURFACE (object); + + g_signal_connect (self, "realize", + G_CALLBACK (on_phosh_layer_surface_realized), + NULL); + g_signal_connect (self, "map", + G_CALLBACK (on_phosh_layer_surface_mapped), + NULL); +} + + static void phosh_layer_surface_dispose (GObject *object) { @@ -352,6 +379,12 @@ phosh_layer_surface_new (gpointer layer_shell, "wl-output", wl_output); } +/** + * phosh_layer_surface_get_surface: + * + * Get the layer layer surface or #NULL if the window + * is not yet realized. + */ struct zwlr_layer_surface_v1 * phosh_layer_surface_get_layer_surface(PhoshLayerSurface *self) { @@ -363,6 +396,12 @@ phosh_layer_surface_get_layer_surface(PhoshLayerSurface *self) } +/** + * phosh_layer_surface_get_wl_surface: + * + * Get the layer wayland surface or #NULL if the window + * is not yet realized. + */ struct wl_surface * phosh_layer_surface_get_wl_surface(PhoshLayerSurface *self) {