summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2015-12-14 17:13:35 +0800
committerJonas Ådahl <jadahl@gmail.com>2016-02-16 19:02:48 +0800
commite2efc85b08d30a648fc5021e38380928a779540d (patch)
tree2d26b48f6cf4a7f47cd03d6e58e3eccda9213632
parent020ae58fe4f890a9a9ebbc8545d4b34e22aff906 (diff)
downloadmutter-e2efc85b08d30a648fc5021e38380928a779540d.tar.gz
wayland: Make the pending surface state a GObject
Making the pending state an GObject makes it easier to extend it with additional optional state without putting everything inside one big struct. https://bugzilla.gnome.org/show_bug.cgi?id=744104
-rw-r--r--src/wayland/meta-wayland-surface.c99
-rw-r--r--src/wayland/meta-wayland-surface.h12
2 files changed, 79 insertions, 32 deletions
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 4c569c5a3..7fe7ab71c 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -79,6 +79,10 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaWaylandSurfaceRole,
meta_wayland_surface_role,
G_TYPE_OBJECT);
+G_DEFINE_TYPE (MetaWaylandPendingState,
+ meta_wayland_pending_state,
+ G_TYPE_OBJECT);
+
struct _MetaWaylandSurfaceRoleSubsurface
{
MetaWaylandSurfaceRole parent;
@@ -468,7 +472,18 @@ move_pending_state (MetaWaylandPendingState *from,
if (from->buffer)
wl_list_remove (&from->buffer_destroy_listener.link);
- *to = *from;
+ to->newly_attached = from->newly_attached;
+ to->buffer = from->buffer;
+ to->dx = from->dx;
+ to->dy = from->dy;
+ to->scale = from->scale;
+ to->damage = from->damage;
+ to->input_region = from->input_region;
+ to->input_region_set = from->input_region_set;
+ to->opaque_region = from->opaque_region;
+ to->opaque_region_set = from->opaque_region_set;
+ to->new_geometry = from->new_geometry;
+ to->has_new_geometry = from->has_new_geometry;
wl_list_init (&to->frame_callback_list);
wl_list_insert_list (&to->frame_callback_list, &from->frame_callback_list);
@@ -480,6 +495,30 @@ move_pending_state (MetaWaylandPendingState *from,
}
static void
+meta_wayland_pending_state_finalize (GObject *object)
+{
+ MetaWaylandPendingState *state = META_WAYLAND_PENDING_STATE (object);
+
+ pending_state_destroy (state);
+
+ G_OBJECT_CLASS (meta_wayland_pending_state_parent_class)->finalize (object);
+}
+
+static void
+meta_wayland_pending_state_init (MetaWaylandPendingState *state)
+{
+ pending_state_init (state);
+}
+
+static void
+meta_wayland_pending_state_class_init (MetaWaylandPendingStateClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = meta_wayland_pending_state_finalize;
+}
+
+static void
subsurface_surface_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandPendingState *pending)
{
@@ -577,7 +616,7 @@ parent_surface_state_applied (gpointer data, gpointer user_data)
}
if (is_surface_effectively_synchronized (surface))
- apply_pending_state (surface, &surface->sub.pending);
+ apply_pending_state (surface, surface->sub.pending);
meta_surface_actor_wayland_sync_subsurface_state (
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor));
@@ -670,9 +709,9 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
* surface is in effective desynchronized mode.
*/
if (is_surface_effectively_synchronized (surface))
- move_pending_state (&surface->pending, &surface->sub.pending);
+ move_pending_state (surface->pending, surface->sub.pending);
else
- apply_pending_state (surface, &surface->pending);
+ apply_pending_state (surface, surface->pending);
}
static void
@@ -701,17 +740,17 @@ wl_surface_attach (struct wl_client *client,
else
buffer = NULL;
- if (surface->pending.buffer)
- wl_list_remove (&surface->pending.buffer_destroy_listener.link);
+ if (surface->pending->buffer)
+ wl_list_remove (&surface->pending->buffer_destroy_listener.link);
- surface->pending.newly_attached = TRUE;
- surface->pending.buffer = buffer;
- surface->pending.dx = dx;
- surface->pending.dy = dy;
+ surface->pending->newly_attached = TRUE;
+ surface->pending->buffer = buffer;
+ surface->pending->dx = dx;
+ surface->pending->dy = dy;
if (buffer)
wl_signal_add (&buffer->destroy_signal,
- &surface->pending.buffer_destroy_listener);
+ &surface->pending->buffer_destroy_listener);
}
static void
@@ -729,7 +768,7 @@ wl_surface_damage (struct wl_client *client,
if (!surface)
return;
- cairo_region_union_rectangle (surface->pending.damage, &rectangle);
+ cairo_region_union_rectangle (surface->pending->damage, &rectangle);
}
static void
@@ -759,7 +798,7 @@ wl_surface_frame (struct wl_client *client,
callback->resource = wl_resource_create (client, &wl_callback_interface, META_WL_CALLBACK_VERSION, callback_id);
wl_resource_set_implementation (callback->resource, NULL, callback, destroy_frame_callback);
- wl_list_insert (surface->pending.frame_callback_list.prev, &callback->link);
+ wl_list_insert (surface->pending->frame_callback_list.prev, &callback->link);
}
static void
@@ -773,14 +812,14 @@ wl_surface_set_opaque_region (struct wl_client *client,
if (!surface)
return;
- g_clear_pointer (&surface->pending.opaque_region, cairo_region_destroy);
+ g_clear_pointer (&surface->pending->opaque_region, cairo_region_destroy);
if (region_resource)
{
MetaWaylandRegion *region = wl_resource_get_user_data (region_resource);
cairo_region_t *cr_region = meta_wayland_region_peek_cairo_region (region);
- surface->pending.opaque_region = cairo_region_copy (cr_region);
+ surface->pending->opaque_region = cairo_region_copy (cr_region);
}
- surface->pending.opaque_region_set = TRUE;
+ surface->pending->opaque_region_set = TRUE;
}
static void
@@ -794,14 +833,14 @@ wl_surface_set_input_region (struct wl_client *client,
if (!surface)
return;
- g_clear_pointer (&surface->pending.input_region, cairo_region_destroy);
+ g_clear_pointer (&surface->pending->input_region, cairo_region_destroy);
if (region_resource)
{
MetaWaylandRegion *region = wl_resource_get_user_data (region_resource);
cairo_region_t *cr_region = meta_wayland_region_peek_cairo_region (region);
- surface->pending.input_region = cairo_region_copy (cr_region);
+ surface->pending->input_region = cairo_region_copy (cr_region);
}
- surface->pending.input_region_set = TRUE;
+ surface->pending->input_region_set = TRUE;
}
static void
@@ -832,7 +871,7 @@ wl_surface_set_buffer_scale (struct wl_client *client,
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
if (scale > 0)
- surface->pending.scale = scale;
+ surface->pending->scale = scale;
else
g_warning ("Trying to set invalid buffer_scale of %d\n", scale);
}
@@ -1034,7 +1073,7 @@ wl_surface_destructor (struct wl_resource *resource)
destroy_window (surface);
surface_set_buffer (surface, NULL);
- pending_state_destroy (&surface->pending);
+ g_clear_object (&surface->pending);
if (surface->opaque_region)
cairo_region_destroy (surface->opaque_region);
@@ -1109,7 +1148,6 @@ meta_wayland_surface_create (MetaWaylandCompositor *compositor,
surface->outputs_to_destroy_notify_id = g_hash_table_new (NULL, NULL);
- pending_state_init (&surface->pending);
return surface;
}
@@ -1312,11 +1350,11 @@ xdg_surface_set_window_geometry (struct wl_client *client,
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
- surface->pending.has_new_geometry = TRUE;
- surface->pending.new_geometry.x = x;
- surface->pending.new_geometry.y = y;
- surface->pending.new_geometry.width = width;
- surface->pending.new_geometry.height = height;
+ surface->pending->has_new_geometry = TRUE;
+ surface->pending->new_geometry.x = x;
+ surface->pending->new_geometry.y = y;
+ surface->pending->new_geometry.width = width;
+ surface->pending->new_geometry.height = height;
}
static void
@@ -2025,7 +2063,7 @@ wl_subsurface_destructor (struct wl_resource *resource)
surface->sub.parent = NULL;
}
- pending_state_destroy (&surface->sub.pending);
+ g_clear_object (&surface->sub.pending);
surface->wl_subsurface = NULL;
}
@@ -2151,7 +2189,7 @@ wl_subsurface_set_desync (struct wl_client *client,
surface->sub.synchronous = FALSE;
if (was_effectively_synchronized &&
!is_surface_effectively_synchronized (surface))
- apply_pending_state (surface, &surface->sub.pending);
+ apply_pending_state (surface, surface->sub.pending);
}
static const struct wl_subsurface_interface meta_wayland_wl_subsurface_interface = {
@@ -2215,7 +2253,7 @@ wl_subcompositor_get_subsurface (struct wl_client *client,
surface->wl_subsurface = wl_resource_create (client, &wl_subsurface_interface, wl_resource_get_version (resource), id);
wl_resource_set_implementation (surface->wl_subsurface, &meta_wayland_wl_subsurface_interface, surface, wl_subsurface_destructor);
- pending_state_init (&surface->sub.pending);
+ surface->sub.pending = g_object_new (META_TYPE_WAYLAND_PENDING_STATE, NULL);
surface->sub.synchronous = TRUE;
surface->sub.parent = parent;
surface->sub.parent_destroy_listener.notify = surface_handle_parent_surface_destroyed;
@@ -2448,6 +2486,7 @@ meta_wayland_surface_get_relative_coordinates (MetaWaylandSurface *surface,
static void
meta_wayland_surface_init (MetaWaylandSurface *surface)
{
+ surface->pending = g_object_new (META_TYPE_WAYLAND_PENDING_STATE, NULL);
}
static void
diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
index 6f3c1e853..3105eec27 100644
--- a/src/wayland/meta-wayland-surface.h
+++ b/src/wayland/meta-wayland-surface.h
@@ -44,6 +44,12 @@ G_DECLARE_FINAL_TYPE (MetaWaylandSurface,
G_DECLARE_DERIVABLE_TYPE (MetaWaylandSurfaceRole, meta_wayland_surface_role,
META, WAYLAND_SURFACE_ROLE, GObject);
+#define META_TYPE_WAYLAND_PENDING_STATE (meta_wayland_pending_state_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandPendingState,
+ meta_wayland_pending_state,
+ META, WAYLAND_PENDING_STATE,
+ GObject);
+
struct _MetaWaylandSurfaceRoleClass
{
GObjectClass parent_class;
@@ -92,6 +98,8 @@ G_DECLARE_FINAL_TYPE (MetaWaylandSurfaceRoleDND,
struct _MetaWaylandPendingState
{
+ GObject parent;
+
/* wl_surface.attach */
gboolean newly_attached;
MetaWaylandBuffer *buffer;
@@ -161,7 +169,7 @@ struct _MetaWaylandSurface
} dnd;
/* All the pending state that wl_surface.commit will apply. */
- MetaWaylandPendingState pending;
+ MetaWaylandPendingState *pending;
/* Extension resources. */
struct wl_resource *xdg_surface;
@@ -202,7 +210,7 @@ struct _MetaWaylandSurface
* state here.
*/
gboolean synchronous;
- MetaWaylandPendingState pending;
+ MetaWaylandPendingState *pending;
int32_t pending_x;
int32_t pending_y;