summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2016-03-15 12:46:06 +0800
committerJonas Ådahl <jadahl@gmail.com>2016-03-29 18:02:31 +0800
commitaa7bc501d59feff5fbf2fd50edf0bb06948df90f (patch)
tree5ef421e2d13e59868afb13ad63b2660f12283eca
parent623eb6eacce6e30dd3f7e51066a02dc43f5310ab (diff)
downloadmutter-aa7bc501d59feff5fbf2fd50edf0bb06948df90f.tar.gz
wayland: Replace buffer destroy wl_signal with a GObject signal
Don't use the libwayland-* utilities when we have our own that do the same thing. https://bugzilla.gnome.org/show_bug.cgi?id=762828
-rw-r--r--src/wayland/meta-wayland-buffer.c19
-rw-r--r--src/wayland/meta-wayland-buffer.h1
-rw-r--r--src/wayland/meta-wayland-surface.c34
-rw-r--r--src/wayland/meta-wayland-surface.h2
4 files changed, 41 insertions, 15 deletions
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 3fc536208..b59fd3007 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -30,6 +30,15 @@
#include <cogl/cogl-wayland-server.h>
#include <meta/util.h>
+enum
+{
+ RESOURCE_DESTROYED,
+
+ LAST_SIGNAL
+};
+
+guint signals[LAST_SIGNAL];
+
G_DEFINE_TYPE (MetaWaylandBuffer, meta_wayland_buffer, G_TYPE_OBJECT);
static void
@@ -40,7 +49,7 @@ meta_wayland_buffer_destroy_handler (struct wl_listener *listener,
wl_container_of (listener, buffer, destroy_listener);
buffer->resource = NULL;
- wl_signal_emit (&buffer->destroy_signal, buffer);
+ g_signal_emit (buffer, signals[RESOURCE_DESTROYED], 0);
g_object_unref (buffer);
}
@@ -82,7 +91,6 @@ meta_wayland_buffer_from_resource (struct wl_resource *resource)
buffer = g_object_new (META_TYPE_WAYLAND_BUFFER, NULL);
buffer->resource = resource;
- wl_signal_init (&buffer->destroy_signal);
buffer->destroy_listener.notify = meta_wayland_buffer_destroy_handler;
wl_resource_add_destroy_listener (resource, &buffer->destroy_listener);
}
@@ -181,4 +189,11 @@ meta_wayland_buffer_class_init (MetaWaylandBufferClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_wayland_buffer_finalize;
+
+ signals[RESOURCE_DESTROYED] = g_signal_new ("resource-destroyed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
}
diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
index e9b0aa2d3..dcfef2dc2 100644
--- a/src/wayland/meta-wayland-buffer.h
+++ b/src/wayland/meta-wayland-buffer.h
@@ -36,7 +36,6 @@ struct _MetaWaylandBuffer
GObject parent;
struct wl_resource *resource;
- struct wl_signal destroy_signal;
struct wl_listener destroy_listener;
CoglTexture *texture;
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index b130ade61..5e92e1301 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -432,11 +432,11 @@ toplevel_surface_commit (MetaWaylandSurfaceRole *surface_role,
}
static void
-surface_handle_pending_buffer_destroy (struct wl_listener *listener, void *data)
+pending_buffer_resource_destroyed (MetaWaylandBuffer *buffer,
+ MetaWaylandPendingState *pending)
{
- MetaWaylandPendingState *state = wl_container_of (listener, state, buffer_destroy_listener);
-
- state->buffer = NULL;
+ g_signal_handler_disconnect (buffer, pending->buffer_destroy_handler_id);
+ pending->buffer = NULL;
}
static void
@@ -454,7 +454,6 @@ pending_state_init (MetaWaylandPendingState *state)
state->opaque_region_set = FALSE;
state->damage = cairo_region_create ();
- state->buffer_destroy_listener.notify = surface_handle_pending_buffer_destroy;
wl_list_init (&state->frame_callback_list);
state->has_new_geometry = FALSE;
@@ -470,7 +469,8 @@ pending_state_destroy (MetaWaylandPendingState *state)
g_clear_pointer (&state->opaque_region, cairo_region_destroy);
if (state->buffer)
- wl_list_remove (&state->buffer_destroy_listener.link);
+ g_signal_handler_disconnect (state->buffer,
+ state->buffer_destroy_handler_id);
wl_list_for_each_safe (cb, next, &state->frame_callback_list, link)
wl_resource_destroy (cb->resource);
}
@@ -487,7 +487,7 @@ move_pending_state (MetaWaylandPendingState *from,
MetaWaylandPendingState *to)
{
if (from->buffer)
- wl_list_remove (&from->buffer_destroy_listener.link);
+ g_signal_handler_disconnect (from->buffer, from->buffer_destroy_handler_id);
to->newly_attached = from->newly_attached;
to->buffer = from->buffer;
@@ -506,7 +506,12 @@ move_pending_state (MetaWaylandPendingState *from,
wl_list_insert_list (&to->frame_callback_list, &from->frame_callback_list);
if (to->buffer)
- wl_signal_add (&to->buffer->destroy_signal, &to->buffer_destroy_listener);
+ {
+ to->buffer_destroy_handler_id =
+ g_signal_connect (to->buffer, "resource-destroyed",
+ G_CALLBACK (pending_buffer_resource_destroyed),
+ to);
+ }
pending_state_init (from);
}
@@ -779,7 +784,10 @@ wl_surface_attach (struct wl_client *client,
buffer = NULL;
if (surface->pending->buffer)
- wl_list_remove (&surface->pending->buffer_destroy_listener.link);
+ {
+ g_signal_handler_disconnect (surface->pending->buffer,
+ surface->pending->buffer_destroy_handler_id);
+ }
surface->pending->newly_attached = TRUE;
surface->pending->buffer = buffer;
@@ -787,8 +795,12 @@ wl_surface_attach (struct wl_client *client,
surface->pending->dy = dy;
if (buffer)
- wl_signal_add (&buffer->destroy_signal,
- &surface->pending->buffer_destroy_listener);
+ {
+ surface->pending->buffer_destroy_handler_id =
+ g_signal_connect (buffer, "resource-destroyed",
+ G_CALLBACK (pending_buffer_resource_destroyed),
+ surface->pending);
+ }
}
static void
diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
index ff3835f9e..806903eaa 100644
--- a/src/wayland/meta-wayland-surface.h
+++ b/src/wayland/meta-wayland-surface.h
@@ -104,7 +104,7 @@ struct _MetaWaylandPendingState
/* wl_surface.attach */
gboolean newly_attached;
MetaWaylandBuffer *buffer;
- struct wl_listener buffer_destroy_listener;
+ gulong buffer_destroy_handler_id;
int32_t dx;
int32_t dy;