gtk4: Attach channel receiver to the default main context from the main thread

It requires acquiring the main context for thread-safety reasons and
that is only possible from the main thread itself.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/319

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1101>
This commit is contained in:
Sebastian Dröge 2023-02-22 10:02:45 +02:00
parent e100506194
commit 2723fc4713

View file

@ -505,7 +505,21 @@ impl PaintableSink {
) {
gst::debug!(CAT, imp: self, "Initializing paintable");
let paintable = utils::invoke_on_main_thread(|| {
// The channel for the SinkEvents
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
let self_ = self.to_owned();
let paintable = utils::invoke_on_main_thread(move || {
// Attach the receiver from the main thread to make sure it is called
// from a place where it can acquire the default main context.
receiver.attach(
Some(&glib::MainContext::default()),
glib::clone!(
@weak self_ => @default-return glib::Continue(false),
move |action| self_.do_action(action)
),
);
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
{
let gdk_context = if let GLContext::Initialized { gdk_context, .. } =
@ -523,17 +537,6 @@ impl PaintableSink {
}
});
// The channel for the SinkEvents
let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
let self_ = self.to_owned();
receiver.attach(
None,
glib::clone!(
@weak self_ => @default-return glib::Continue(false),
move |action| self_.do_action(action)
),
);
**paintable_storage = Some(paintable);
*self.sender.lock().unwrap() = Some(sender);