mirror of
https://github.com/brl/mutter.git
synced 2025-02-17 21:54:10 +00:00
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:
parent
183de60d91
commit
c22edeff1f
@ -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;
|
||||||
meta_screen_cast_window_stream,
|
|
||||||
META_TYPE_SCREEN_CAST_STREAM)
|
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 *
|
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;
|
NULL,
|
||||||
int scale;
|
error,
|
||||||
|
"session", session,
|
||||||
logical_monitor = meta_window_get_main_logical_monitor (window);
|
"connection", connection,
|
||||||
if (!logical_monitor)
|
"window", window,
|
||||||
{
|
NULL);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
g_signal_handler_disconnect (window_stream->window,
|
if (window_stream->window_unmanaged_handler_id)
|
||||||
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);
|
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user