[gnome-flashback] backends: add method/property to get accelerometer availability



commit 6cff8965f6bbd4d4152b71a7f2d0d474e9e69485
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Sep 5 17:05:33 2020 +0300

    backends: add method/property to get accelerometer availability
    
    Based on mutter commit:
    https://gitlab.gnome.org/GNOME/mutter/-/commit/7f9949a5e31b954a2c84

 backends/gf-orientation-manager-private.h |  6 ++-
 backends/gf-orientation-manager.c         | 84 ++++++++++++++++++++++++++++---
 2 files changed, 81 insertions(+), 9 deletions(-)
---
diff --git a/backends/gf-orientation-manager-private.h b/backends/gf-orientation-manager-private.h
index e0e5cb5e..62963934 100644
--- a/backends/gf-orientation-manager-private.h
+++ b/backends/gf-orientation-manager-private.h
@@ -40,9 +40,11 @@ typedef enum
 G_DECLARE_FINAL_TYPE (GfOrientationManager, gf_orientation_manager,
                       GF, ORIENTATION_MANAGER, GObject)
 
-GfOrientationManager *gf_orientation_manager_new             (void);
+GfOrientationManager *gf_orientation_manager_new               (void);
 
-GfOrientation         gf_orientation_manager_get_orientation (GfOrientationManager *manager);
+GfOrientation         gf_orientation_manager_get_orientation   (GfOrientationManager *manager);
+
+gboolean              gf_orientation_manager_has_accelerometer (GfOrientationManager *self);
 
 G_END_DECLS
 
diff --git a/backends/gf-orientation-manager.c b/backends/gf-orientation-manager.c
index 9c1fe81d..fa777266 100644
--- a/backends/gf-orientation-manager.c
+++ b/backends/gf-orientation-manager.c
@@ -38,10 +38,22 @@ struct _GfOrientationManager
   GDBusProxy    *iio_proxy;
   GfOrientation  prev_orientation;
   GfOrientation  curr_orientation;
+  gboolean       has_accel;
 
   GSettings     *settings;
 };
 
+enum
+{
+  PROP_0,
+
+  PROP_HAS_ACCELEROMETER,
+
+  LAST_PROP
+};
+
+static GParamSpec *manager_properties[LAST_PROP] = { NULL };
+
 enum
 {
   ORIENTATION_CHANGED,
@@ -71,24 +83,25 @@ orientation_from_string (const gchar *orientation)
 static void
 read_iio_proxy (GfOrientationManager *manager)
 {
-  gboolean has_accel;
   GVariant *variant;
 
   manager->curr_orientation = GF_ORIENTATION_UNDEFINED;
 
   if (!manager->iio_proxy)
-    return;
+    {
+      manager->has_accel = FALSE;
+      return;
+    }
 
-  has_accel = FALSE;
   variant = g_dbus_proxy_get_cached_property (manager->iio_proxy, "HasAccelerometer");
 
   if (variant)
     {
-      has_accel = g_variant_get_boolean (variant);
+      manager->has_accel = g_variant_get_boolean (variant);
       g_variant_unref (variant);
     }
 
-  if (!has_accel)
+  if (!manager->has_accel)
     return;
 
   variant = g_dbus_proxy_get_cached_property (manager->iio_proxy, "AccelerometerOrientation");
@@ -106,11 +119,21 @@ read_iio_proxy (GfOrientationManager *manager)
 static void
 sync_state (GfOrientationManager *manager)
 {
-  if (g_settings_get_boolean (manager->settings, ORIENTATION_LOCK_KEY))
-    return;
+  gboolean had_accel;
+
+  had_accel = manager->has_accel;
 
   read_iio_proxy (manager);
 
+  if (had_accel != manager->has_accel)
+    {
+      g_object_notify_by_pspec (G_OBJECT (manager),
+                                manager_properties[PROP_HAS_ACCELEROMETER]);
+    }
+
+  if (g_settings_get_boolean (manager->settings, ORIENTATION_LOCK_KEY))
+    return;
+
   if (manager->prev_orientation == manager->curr_orientation)
     return;
 
@@ -274,6 +297,45 @@ gf_orientation_manager_dispose (GObject *object)
   G_OBJECT_CLASS (gf_orientation_manager_parent_class)->dispose (object);
 }
 
+static void
+gf_orientation_manager_get_property (GObject    *object,
+                                     guint       property_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
+{
+  GfOrientationManager *self;
+
+  self = GF_ORIENTATION_MANAGER (object);
+
+  switch (property_id)
+    {
+      case PROP_HAS_ACCELEROMETER:
+        g_value_set_boolean (value, self->has_accel);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+gf_orientation_manager_install_properties (GObjectClass *object_class)
+{
+  manager_properties[PROP_HAS_ACCELEROMETER] =
+    g_param_spec_boolean ("has-accelerometer",
+                          "Has accelerometer",
+                          "Has accelerometer",
+                          FALSE,
+                          G_PARAM_READABLE |
+                          G_PARAM_EXPLICIT_NOTIFY |
+                          G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class,
+                                     LAST_PROP,
+                                     manager_properties);
+}
+
 static void
 gf_orientation_manager_install_signals (GObjectClass *object_class)
 {
@@ -291,7 +353,9 @@ gf_orientation_manager_class_init (GfOrientationManagerClass *manager_class)
   object_class = G_OBJECT_CLASS (manager_class);
 
   object_class->dispose = gf_orientation_manager_dispose;
+  object_class->get_property = gf_orientation_manager_get_property;
 
+  gf_orientation_manager_install_properties (object_class);
   gf_orientation_manager_install_signals (object_class);
 }
 
@@ -325,3 +389,9 @@ gf_orientation_manager_get_orientation (GfOrientationManager *manager)
 {
   return manager->curr_orientation;
 }
+
+gboolean
+gf_orientation_manager_has_accelerometer (GfOrientationManager *self)
+{
+  return self->has_accel;
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]