diff --git a/src/backends/native/meta-kms-private.h b/src/backends/native/meta-kms-private.h index 8c0ce9425..a2f2a05db 100644 --- a/src/backends/native/meta-kms-private.h +++ b/src/backends/native/meta-kms-private.h @@ -41,6 +41,10 @@ gboolean meta_kms_run_impl_task_sync (MetaKms *kms, gpointer user_data, GError **error); +GSource * meta_kms_add_source_in_impl (MetaKms *kms, + GSourceFunc func, + gpointer user_data); + gboolean meta_kms_in_impl_task (MetaKms *kms); #define meta_assert_in_kms_impl(kms) \ diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c index 408b9f5a2..27b709658 100644 --- a/src/backends/native/meta-kms.c +++ b/src/backends/native/meta-kms.c @@ -34,6 +34,12 @@ typedef struct _MetaKmsCallbackData GDestroyNotify user_data_destroy; } MetaKmsCallbackData; +typedef struct _MetaKmsSimpleImplSource +{ + GSource source; + MetaKms *kms; +} MetaKmsSimpleImplSource; + struct _MetaKms { GObject parent; @@ -117,6 +123,48 @@ meta_kms_run_impl_task_sync (MetaKms *kms, return ret; } +static gboolean +simple_impl_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + MetaKmsSimpleImplSource *simple_impl_source = + (MetaKmsSimpleImplSource *) source; + MetaKms *kms = simple_impl_source->kms; + gboolean ret; + + kms->in_impl_task = TRUE; + ret = callback (user_data); + kms->in_impl_task = FALSE; + + return ret; +} + +static GSourceFuncs simple_impl_source_funcs = { + .dispatch = simple_impl_source_dispatch, +}; + +GSource * +meta_kms_add_source_in_impl (MetaKms *kms, + GSourceFunc func, + gpointer user_data) +{ + GSource *source; + MetaKmsSimpleImplSource *simple_impl_source; + + meta_assert_in_kms_impl (kms); + + source = g_source_new (&simple_impl_source_funcs, + sizeof (MetaKmsSimpleImplSource)); + simple_impl_source = (MetaKmsSimpleImplSource *) source; + simple_impl_source->kms = kms; + + g_source_set_callback (source, func, user_data, NULL); + g_source_attach (source, g_main_context_get_thread_default ()); + + return source; +} + gboolean meta_kms_in_impl_task (MetaKms *kms) {