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
This commit is contained in:
Jonas Ådahl 2019-01-21 19:16:19 +01:00
parent 183de60d91
commit c22edeff1f

View File

@ -48,9 +48,16 @@ struct _MetaScreenCastWindowStream
unsigned long window_unmanaged_handler_id; unsigned long window_unmanaged_handler_id;
}; };
G_DEFINE_TYPE (MetaScreenCastWindowStream, 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_screen_cast_window_stream,
META_TYPE_SCREEN_CAST_STREAM) META_TYPE_SCREEN_CAST_STREAM,
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
meta_screen_cast_window_stream_init_initable_iface))
MetaWindow * MetaWindow *
meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream) meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream)
@ -76,38 +83,13 @@ meta_screen_cast_window_stream_new (MetaScreenCastSession *session,
MetaWindow *window, MetaWindow *window,
GError **error) GError **error)
{ {
MetaScreenCastWindowStream *window_stream; return g_initable_new (META_TYPE_SCREEN_CAST_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, NULL,
error, error,
"session", session, "session", session,
"connection", connection, "connection", connection,
"window", window, "window", window,
NULL); 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;
} }
static MetaScreenCastStreamSrc * static MetaScreenCastStreamSrc *
@ -175,20 +157,6 @@ on_window_unmanaged (MetaScreenCastWindowStream *window_stream)
meta_screen_cast_stream_close (META_SCREEN_CAST_STREAM (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 static void
meta_screen_cast_window_stream_set_property (GObject *object, meta_screen_cast_window_stream_set_property (GObject *object,
guint prop_id, guint prop_id,
@ -233,12 +201,56 @@ meta_screen_cast_window_stream_finalize (GObject *object)
MetaScreenCastWindowStream *window_stream = MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (object); META_SCREEN_CAST_WINDOW_STREAM (object);
if (window_stream->window_unmanaged_handler_id)
g_signal_handler_disconnect (window_stream->window, g_signal_handler_disconnect (window_stream->window,
window_stream->window_unmanaged_handler_id); window_stream->window_unmanaged_handler_id);
G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->finalize (object); 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 static void
meta_screen_cast_window_stream_init (MetaScreenCastWindowStream *window_stream) 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 = MetaScreenCastStreamClass *stream_class =
META_SCREEN_CAST_STREAM_CLASS (klass); 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->set_property = meta_screen_cast_window_stream_set_property;
object_class->get_property = meta_screen_cast_window_stream_get_property; object_class->get_property = meta_screen_cast_window_stream_get_property;
object_class->finalize = meta_screen_cast_window_stream_finalize; object_class->finalize = meta_screen_cast_window_stream_finalize;