[mutter] barrier: Add GInitable based constructor method
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] barrier: Add GInitable based constructor method
- Date: Tue, 26 Jul 2022 20:50:26 +0000 (UTC)
commit 3c6c1af0a0e5161a503ee661619475d25269d2c2
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Fri Mar 18 17:31:25 2022 +0100
barrier: Add GInitable based constructor method
This one does proper error reporting. Via Javascript, barriers are
constructed directly via GObject construction, which currently can't
handle error reporting, but when calling from C we can. However, if we
initialize using GInitable, and use that in our constructor method, once
gjs gains support for construction using GInitable, including the error
reporting, we'll automatically get proper error reporting to Javascript.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2442>
src/backends/meta-barrier.c | 53 ++++++++++++++++++++++++++++++++++++++++++++-
src/meta/barrier.h | 9 ++++++++
2 files changed, 61 insertions(+), 1 deletion(-)
---
diff --git a/src/backends/meta-barrier.c b/src/backends/meta-barrier.c
index 45ccd99f9f..e227a83f15 100644
--- a/src/backends/meta-barrier.c
+++ b/src/backends/meta-barrier.c
@@ -35,7 +35,13 @@ typedef struct _MetaBarrierPrivate
MetaBarrierImpl *impl;
} MetaBarrierPrivate;
-G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrier, meta_barrier, G_TYPE_OBJECT)
+static void initable_iface_init (GInitableIface *initable_iface);
+
+G_DEFINE_TYPE_WITH_CODE (MetaBarrier, meta_barrier, G_TYPE_OBJECT,
+ G_ADD_PRIVATE (MetaBarrier)
+ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+ initable_iface_init))
+
G_DEFINE_TYPE (MetaBarrierImpl, meta_barrier_impl, G_TYPE_OBJECT)
G_STATIC_ASSERT ((int) META_BARRIER_DIRECTION_POSITIVE_X ==
@@ -225,6 +231,31 @@ meta_barrier_release (MetaBarrier *barrier,
META_BARRIER_IMPL_GET_CLASS (impl)->release (impl, event);
}
+static gboolean
+meta_barrier_initable_init (GInitable *initable,
+ GCancellable *cancellable,
+ GError **error)
+{
+ MetaBarrier *barrier = META_BARRIER (initable);
+ MetaBarrierPrivate *priv = meta_barrier_get_instance_private (barrier);
+
+ priv = meta_barrier_get_instance_private (barrier);
+ if (!priv->impl)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Failed to create barrier impl");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+initable_iface_init (GInitableIface *initable_iface)
+{
+ initable_iface->init = meta_barrier_initable_init;
+}
+
static void
init_barrier_impl (MetaBarrier *barrier)
{
@@ -393,6 +424,26 @@ meta_barrier_init (MetaBarrier *barrier)
{
}
+MetaBarrier *
+meta_barrier_new (MetaBackend *backend,
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ MetaBarrierDirection directions,
+ GError **error)
+{
+ return g_initable_new (META_TYPE_BARRIER,
+ NULL, error,
+ "backend", backend,
+ "x1", x1,
+ "y1", y1,
+ "x2", x2,
+ "y2", y2,
+ "directions", directions,
+ NULL);
+}
+
void
meta_barrier_emit_hit_signal (MetaBarrier *barrier,
MetaBarrierEvent *event)
diff --git a/src/meta/barrier.h b/src/meta/barrier.h
index a73bcd25bc..374c42f0b7 100644
--- a/src/meta/barrier.h
+++ b/src/meta/barrier.h
@@ -33,6 +33,15 @@ G_DECLARE_FINAL_TYPE (MetaBarrier, meta_barrier,
typedef struct _MetaBarrierEvent MetaBarrierEvent;
+META_EXPORT
+MetaBarrier * meta_barrier_new (MetaBackend *backend,
+ int x1,
+ int y1,
+ int x2,
+ int y2,
+ MetaBarrierDirection directions,
+ GError **error);
+
META_EXPORT
gboolean meta_barrier_is_active (MetaBarrier *barrier);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]