[mutter] window-actor: Make it clearer that the surface actor doesn't change
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] window-actor: Make it clearer that the surface actor doesn't change
- Date: Fri, 28 Jun 2019 19:41:40 +0000 (UTC)
commit f2f4af0d50ba9f2d36cf225162a30928f55d7bd6
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Thu Jun 27 19:33:24 2019 +0200
window-actor: Make it clearer that the surface actor doesn't change
The way code was structured made it easy to misunderstand things as the
surface actor of a window actor could change over time. So is not the
case, however, the intention of the corresponding "update" function was
so that a surface actor could be assigned to a window actor as soon as
the X11 window was associated with its corresponding wl_surface, if the
window in question came from Xwayland.
Restructure the code and internal API a bit to make it clear that a
window actor only once gets a surface actor assigned to it, and that it
after that point never changes.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/659
src/compositor/compositor.c | 12 -----
src/compositor/meta-window-actor-private.h | 9 ++--
src/compositor/meta-window-actor-x11.c | 38 +++++++-------
src/compositor/meta-window-actor.c | 79 +++++++++++++++---------------
src/meta/compositor.h | 4 --
src/wayland/meta-xwayland.c | 11 ++++-
6 files changed, 72 insertions(+), 81 deletions(-)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 1ec31d338..ba05451ad 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -778,18 +778,6 @@ meta_compositor_window_opacity_changed (MetaCompositor *compositor,
meta_window_actor_update_opacity (window_actor);
}
-void
-meta_compositor_window_surface_changed (MetaCompositor *compositor,
- MetaWindow *window)
-{
- MetaWindowActor *window_actor;
- window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
- if (!window_actor)
- return;
-
- meta_window_actor_update_surface (window_actor);
-}
-
/**
* meta_compositor_process_event: (skip)
* @compositor:
diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
index 6333f43db..9a97d53e2 100644
--- a/src/compositor/meta-window-actor-private.h
+++ b/src/compositor/meta-window-actor-private.h
@@ -17,8 +17,8 @@ struct _MetaWindowActorClass
ClutterFrameInfo *frame_info,
int64_t presentation_time);
- void (*set_surface_actor) (MetaWindowActor *actor,
- MetaSurfaceActor *surface);
+ void (*assign_surface_actor) (MetaWindowActor *actor,
+ MetaSurfaceActor *surface_actor);
void (*queue_frame_drawn) (MetaWindowActor *actor,
gboolean skip_sync_delay);
@@ -73,7 +73,10 @@ void meta_window_actor_effect_completed (MetaWindowActor *actor,
MetaPluginEffect event);
MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
-void meta_window_actor_update_surface (MetaWindowActor *self);
+
+void meta_window_actor_assign_surface_actor (MetaWindowActor *self,
+ MetaSurfaceActor *surface_actor);
+
MetaWindowActor *meta_window_actor_from_window (MetaWindow *window);
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
diff --git a/src/compositor/meta-window-actor-x11.c b/src/compositor/meta-window-actor-x11.c
index 4dc687530..05045ba4e 100644
--- a/src/compositor/meta-window-actor-x11.c
+++ b/src/compositor/meta-window-actor-x11.c
@@ -329,32 +329,19 @@ meta_window_actor_x11_frame_complete (MetaWindowActor *actor,
}
static void
-meta_window_actor_x11_set_surface_actor (MetaWindowActor *actor,
- MetaSurfaceActor *surface)
+meta_window_actor_x11_assign_surface_actor (MetaWindowActor *actor,
+ MetaSurfaceActor *surface_actor)
{
MetaWindowActorClass *parent_class =
META_WINDOW_ACTOR_CLASS (meta_window_actor_x11_parent_class);
MetaWindowActorX11 *actor_x11 = META_WINDOW_ACTOR_X11 (actor);
- MetaSurfaceActor *old_surface;
- old_surface = meta_window_actor_get_surface (actor);
+ parent_class->assign_surface_actor (actor, surface_actor);
- if (old_surface)
- {
- g_signal_handler_disconnect (old_surface,
- actor_x11->repaint_scheduled_id);
- actor_x11->repaint_scheduled_id = 0;
- }
-
- parent_class->set_surface_actor (actor, surface);
-
- if (surface)
- {
- actor_x11->repaint_scheduled_id =
- g_signal_connect (surface, "repaint-scheduled",
- G_CALLBACK (surface_repaint_scheduled),
- actor_x11);
- }
+ actor_x11->repaint_scheduled_id =
+ g_signal_connect (surface_actor, "repaint-scheduled",
+ G_CALLBACK (surface_repaint_scheduled),
+ actor_x11);
}
static void
@@ -503,10 +490,19 @@ static void
meta_window_actor_x11_dispose (GObject *object)
{
MetaWindowActorX11 *actor_x11 = META_WINDOW_ACTOR_X11 (object);
+ MetaSurfaceActor *surface_actor;
if (actor_x11->send_frame_messages_timer != 0)
remove_frame_messages_timer (actor_x11);
+ surface_actor = meta_window_actor_get_surface (META_WINDOW_ACTOR (actor_x11));
+ if (surface_actor)
+ {
+ g_signal_handler_disconnect (surface_actor,
+ actor_x11->repaint_scheduled_id);
+ actor_x11->repaint_scheduled_id = 0;
+ }
+
G_OBJECT_CLASS (meta_window_actor_x11_parent_class)->dispose (object);
}
@@ -528,7 +524,7 @@ meta_window_actor_x11_class_init (MetaWindowActorX11Class *klass)
MetaWindowActorClass *window_actor_class = META_WINDOW_ACTOR_CLASS (klass);
window_actor_class->frame_complete = meta_window_actor_x11_frame_complete;
- window_actor_class->set_surface_actor = meta_window_actor_x11_set_surface_actor;
+ window_actor_class->assign_surface_actor = meta_window_actor_x11_assign_surface_actor;
window_actor_class->queue_frame_drawn = meta_window_actor_x11_queue_frame_drawn;
window_actor_class->pre_paint = meta_window_actor_x11_pre_paint;
window_actor_class->post_paint = meta_window_actor_x11_post_paint;
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index c3879cef9..1e049ceb1 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -137,12 +137,13 @@ static void meta_window_actor_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
+static void meta_window_actor_real_assign_surface_actor (MetaWindowActor *self,
+ MetaSurfaceActor *surface_actor);
+
static void meta_window_actor_paint (ClutterActor *actor);
static gboolean meta_window_actor_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume);
-static void set_surface (MetaWindowActor *actor,
- MetaSurfaceActor *surface);
static gboolean meta_window_actor_has_shadow (MetaWindowActor *self);
@@ -159,13 +160,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaWindowActor, meta_window_actor, CLUTTER_TY
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)
G_IMPLEMENT_INTERFACE (META_TYPE_SCREEN_CAST_WINDOW,
screen_cast_window_iface_init));
-static void
-meta_window_actor_real_set_surface_actor (MetaWindowActor *actor,
- MetaSurfaceActor *surface)
-{
- set_surface (actor, surface);
-}
-
static void
meta_window_actor_class_init (MetaWindowActorClass *klass)
{
@@ -181,7 +175,7 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
actor_class->paint = meta_window_actor_paint;
actor_class->get_paint_volume = meta_window_actor_get_paint_volume;
- klass->set_surface_actor = meta_window_actor_real_set_surface_actor;
+ klass->assign_surface_actor = meta_window_actor_real_assign_surface_actor;
/**
* MetaWindowActor::first-frame:
@@ -365,56 +359,55 @@ meta_window_actor_thaw (MetaWindowActor *self)
}
static void
-set_surface (MetaWindowActor *self,
- MetaSurfaceActor *surface)
+meta_window_actor_real_assign_surface_actor (MetaWindowActor *self,
+ MetaSurfaceActor *surface_actor)
{
MetaWindowActorPrivate *priv =
meta_window_actor_get_instance_private (self);
- if (priv->surface)
- {
- g_signal_handler_disconnect (priv->surface, priv->size_changed_id);
- clutter_actor_remove_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->surface));
- g_object_unref (priv->surface);
- }
-
- priv->surface = surface;
+ g_assert (!priv->surface);
- if (priv->surface)
- {
- g_object_ref_sink (priv->surface);
- priv->size_changed_id = g_signal_connect (priv->surface, "size-changed",
- G_CALLBACK (surface_size_changed), self);
- clutter_actor_add_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->surface));
+ priv->surface = g_object_ref_sink (surface_actor);
+ priv->size_changed_id = g_signal_connect (priv->surface, "size-changed",
+ G_CALLBACK (surface_size_changed),
+ self);
+ clutter_actor_add_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->surface));
- meta_window_actor_update_shape (self);
+ meta_window_actor_update_shape (self);
- if (is_frozen (self))
- meta_surface_actor_set_frozen (priv->surface, TRUE);
- else
- meta_window_actor_sync_thawed_state (self);
- }
+ if (is_frozen (self))
+ meta_surface_actor_set_frozen (priv->surface, TRUE);
+ else
+ meta_window_actor_sync_thawed_state (self);
}
void
-meta_window_actor_update_surface (MetaWindowActor *self)
+meta_window_actor_assign_surface_actor (MetaWindowActor *self,
+ MetaSurfaceActor *surface_actor)
+{
+ META_WINDOW_ACTOR_GET_CLASS (self)->assign_surface_actor (self,
+ surface_actor);
+}
+
+static void
+init_surface_actor (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv =
meta_window_actor_get_instance_private (self);
MetaWindow *window = priv->window;
MetaSurfaceActor *surface_actor;
+ if (!meta_is_wayland_compositor ())
+ surface_actor = meta_surface_actor_x11_new (window);
#ifdef HAVE_WAYLAND
- if (window->surface)
+ else if (window->surface)
surface_actor = meta_wayland_surface_get_actor (window->surface);
- else
#endif
- if (!meta_is_wayland_compositor ())
- surface_actor = meta_surface_actor_x11_new (window);
else
surface_actor = NULL;
- META_WINDOW_ACTOR_GET_CLASS (self)->set_surface_actor (self, surface_actor);
+ if (surface_actor)
+ meta_window_actor_assign_surface_actor (self, surface_actor);
}
static void
@@ -430,7 +423,7 @@ meta_window_actor_constructed (GObject *object)
/* Hang our compositor window state off the MetaWindow for fast retrieval */
meta_window_set_compositor_private (window, object);
- meta_window_actor_update_surface (self);
+ init_surface_actor (self);
meta_window_actor_update_opacity (self);
@@ -476,7 +469,13 @@ meta_window_actor_dispose (GObject *object)
g_clear_object (&priv->window);
- META_WINDOW_ACTOR_GET_CLASS (self)->set_surface_actor (self, NULL);
+ if (priv->surface)
+ {
+ g_signal_handler_disconnect (priv->surface, priv->size_changed_id);
+ clutter_actor_remove_child (CLUTTER_ACTOR (self),
+ CLUTTER_ACTOR (priv->surface));
+ g_clear_object (&priv->surface);
+ }
G_OBJECT_CLASS (meta_window_actor_parent_class)->dispose (object);
}
diff --git a/src/meta/compositor.h b/src/meta/compositor.h
index 31d14dda3..43dcc2b19 100644
--- a/src/meta/compositor.h
+++ b/src/meta/compositor.h
@@ -82,10 +82,6 @@ META_EXPORT
void meta_compositor_window_opacity_changed (MetaCompositor *compositor,
MetaWindow *window);
-META_EXPORT
-void meta_compositor_window_surface_changed (MetaCompositor *compositor,
- MetaWindow *window);
-
META_EXPORT
gboolean meta_compositor_process_event (MetaCompositor *compositor,
XEvent *event,
diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c
index 88a4b4c11..aa2844d33 100644
--- a/src/wayland/meta-xwayland.c
+++ b/src/wayland/meta-xwayland.c
@@ -40,6 +40,7 @@
#include <X11/Xauth.h>
#include "compositor/meta-surface-actor-wayland.h"
+#include "compositor/meta-window-actor-private.h"
#include "meta/main.h"
#include "wayland/meta-wayland-actor-surface.h"
@@ -74,6 +75,7 @@ meta_xwayland_associate_window_with_surface (MetaWindow *window,
MetaWaylandSurface *surface)
{
MetaDisplay *display = window->display;
+ MetaWindowActor *window_actor;
/* If the window has an existing surface, like if we're
* undecorating or decorating the window, then we need
@@ -102,7 +104,14 @@ meta_xwayland_associate_window_with_surface (MetaWindow *window,
xwayland_surface_signals[XWAYLAND_SURFACE_WINDOW_ASSOCIATED],
0);
- meta_compositor_window_surface_changed (display->compositor, window);
+ window_actor = meta_window_actor_from_window (window);
+ if (window_actor)
+ {
+ MetaSurfaceActor *surface_actor;
+
+ surface_actor = meta_wayland_surface_get_actor (surface);
+ meta_window_actor_assign_surface_actor (window_actor, surface_actor);
+ }
/* Now that we have a surface check if it should have focus. */
meta_display_sync_wayland_input_focus (display);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]