[mutter] screen-cast-window-stream: Use initable to initialize
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] screen-cast-window-stream: Use initable to initialize
- Date: Tue, 26 Feb 2019 13:51:53 +0000 (UTC)
commit c22edeff1f5ad6307086d2c9fe6ab0d72aa8d17b
Author: Jonas Ådahl <jadahl gmail com>
Date: Mon Jan 21 19:16:19 2019 +0100
screen-cast-window-stream: Use initable to initialize
Move the initialization from _new() to an initable implementation. This
will allow us to initialize fields before MetaScreenCastStream
initializes.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/413
src/backends/meta-screen-cast-window-stream.c | 115 ++++++++++++++------------
1 file changed, 63 insertions(+), 52 deletions(-)
---
diff --git a/src/backends/meta-screen-cast-window-stream.c b/src/backends/meta-screen-cast-window-stream.c
index 4c9227116..748affb38 100644
--- a/src/backends/meta-screen-cast-window-stream.c
+++ b/src/backends/meta-screen-cast-window-stream.c
@@ -48,9 +48,16 @@ struct _MetaScreenCastWindowStream
unsigned long window_unmanaged_handler_id;
};
-G_DEFINE_TYPE (MetaScreenCastWindowStream,
- meta_screen_cast_window_stream,
- META_TYPE_SCREEN_CAST_STREAM)
+static GInitableIface *initable_parent_iface;
+
+static void
+meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MetaScreenCastWindowStream,
+ meta_screen_cast_window_stream,
+ META_TYPE_SCREEN_CAST_STREAM,
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+ meta_screen_cast_window_stream_init_initable_iface))
MetaWindow *
meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream)
@@ -76,38 +83,13 @@ meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
MetaWindow *window,
GError **error)
{
- MetaScreenCastWindowStream *window_stream;
- MetaLogicalMonitor *logical_monitor;
- int scale;
-
- logical_monitor = meta_window_get_main_logical_monitor (window);
- if (!logical_monitor)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Main logical monitor not found");
- return NULL;
- }
-
- window_stream = g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
- NULL,
- error,
- "session", session,
- "connection", connection,
- "window", window,
- NULL);
- if (!window_stream)
- return NULL;
-
- window_stream->window = window;
- /* We cannot set the stream size to the exact size of the window, because
- * windows can be resized, whereas streams cannot.
- * So we set a size equals to the size of the logical monitor for the window.
- */
- scale = (int) ceil (meta_logical_monitor_get_scale (logical_monitor));
- window_stream->stream_width = logical_monitor->rect.width * scale;
- window_stream->stream_height = logical_monitor->rect.height * scale;
-
- return window_stream;
+ return g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
+ NULL,
+ error,
+ "session", session,
+ "connection", connection,
+ "window", window,
+ NULL);
}
static MetaScreenCastStreamSrc *
@@ -175,20 +157,6 @@ on_window_unmanaged (MetaScreenCastWindowStream *window_stream)
meta_screen_cast_stream_close (META_SCREEN_CAST_STREAM (window_stream));
}
-static void
-meta_screen_cast_window_stream_constructed (GObject *object)
-{
- MetaScreenCastWindowStream *window_stream =
- META_SCREEN_CAST_WINDOW_STREAM (object);
-
- window_stream->window_unmanaged_handler_id =
- g_signal_connect_swapped (window_stream->window, "unmanaged",
- G_CALLBACK (on_window_unmanaged),
- window_stream);
-
- G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->constructed (object);
-}
-
static void
meta_screen_cast_window_stream_set_property (GObject *object,
guint prop_id,
@@ -233,12 +201,56 @@ meta_screen_cast_window_stream_finalize (GObject *object)
MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (object);
- g_signal_handler_disconnect (window_stream->window,
- window_stream->window_unmanaged_handler_id);
+ if (window_stream->window_unmanaged_handler_id)
+ g_signal_handler_disconnect (window_stream->window,
+ window_stream->window_unmanaged_handler_id);
G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->finalize (object);
}
+static gboolean
+meta_screen_cast_window_stream_initable_init (GInitable *initable,
+ GCancellable *cancellable,
+ GError **error)
+{
+ MetaScreenCastWindowStream *window_stream =
+ META_SCREEN_CAST_WINDOW_STREAM (initable);
+ MetaWindow *window = window_stream->window;
+ MetaLogicalMonitor *logical_monitor;
+ int scale;
+
+ logical_monitor = meta_window_get_main_logical_monitor (window);
+ if (!logical_monitor)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Main logical monitor not found");
+ return FALSE;
+ }
+
+ window_stream->window_unmanaged_handler_id =
+ g_signal_connect_swapped (window, "unmanaged",
+ G_CALLBACK (on_window_unmanaged),
+ window_stream);
+
+ /* We cannot set the stream size to the exact size of the window, because
+ * windows can be resized, whereas streams cannot.
+ * So we set a size equals to the size of the logical monitor for the window.
+ */
+ scale = (int) ceil (meta_logical_monitor_get_scale (logical_monitor));
+ window_stream->stream_width = logical_monitor->rect.width * scale;
+ window_stream->stream_height = logical_monitor->rect.height * scale;
+
+ return initable_parent_iface->init (initable, cancellable, error);
+}
+
+static void
+meta_screen_cast_window_stream_init_initable_iface (GInitableIface *iface)
+{
+ initable_parent_iface = g_type_interface_peek_parent (iface);
+
+ iface->init = meta_screen_cast_window_stream_initable_init;
+}
+
static void
meta_screen_cast_window_stream_init (MetaScreenCastWindowStream *window_stream)
{
@@ -251,7 +263,6 @@ meta_screen_cast_window_stream_class_init (MetaScreenCastWindowStreamClass *klas
MetaScreenCastStreamClass *stream_class =
META_SCREEN_CAST_STREAM_CLASS (klass);
- object_class->constructed = meta_screen_cast_window_stream_constructed;
object_class->set_property = meta_screen_cast_window_stream_set_property;
object_class->get_property = meta_screen_cast_window_stream_get_property;
object_class->finalize = meta_screen_cast_window_stream_finalize;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]