[mutter] backends: Introduce MetaIdleManager



commit 18d670e69fbb484d7e6b5a243ecbe1483c74bdf5
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Mon Apr 19 15:22:57 2021 +0200

    backends: Introduce MetaIdleManager
    
    This object takes over the functionality of meta-idle-monitor-dbus.c,
    meta-idle-monitor.c and meta-backend.c, all related to higher level
    management of idle watches etc.
    
    The idle D-Bus API is changed to be initialized by the backend instead
    of MetaDisplay, as it's more of a backend functionality than what
    MetaDisplay usually deals with.
    
    It also takes over the work of implementing "core" idle monitors. The
    singleton API is replaced with thin wrapper functions on the backend.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1859>

 src/backends/meta-backend-private.h                |   5 +-
 src/backends/meta-backend-types.h                  |   2 +
 src/backends/meta-backend.c                        | 132 +++++-----------
 ...eta-idle-monitor-dbus.c => meta-idle-manager.c} | 170 +++++++++++++++++----
 src/backends/meta-idle-manager.h                   |  39 +++++
 src/backends/meta-idle-monitor-dbus.h              |  28 ----
 src/backends/meta-idle-monitor-private.h           |  16 +-
 src/backends/meta-idle-monitor.c                   |  49 +++---
 src/backends/native/meta-backend-native.c          |   8 +-
 src/core/display.c                                 |   3 -
 src/core/events.c                                  |   9 +-
 src/meson.build                                    |   4 +-
 src/meta/meta-backend.h                            |   4 +
 src/meta/meta-idle-monitor.h                       |   3 -
 14 files changed, 273 insertions(+), 199 deletions(-)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index b930462b24..33a3752112 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -129,9 +129,8 @@ ClutterSeat * meta_backend_get_default_seat (MetaBackend *bakcend);
 
 MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend        *backend,
                                                  ClutterInputDevice *device);
-void meta_backend_foreach_device_monitor (MetaBackend *backend,
-                                          GFunc        func,
-                                          gpointer     user_data);
+
+MetaIdleManager * meta_backend_get_idle_manager (MetaBackend *backend);
 
 META_EXPORT_TEST
 MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
diff --git a/src/backends/meta-backend-types.h b/src/backends/meta-backend-types.h
index eae62c02f2..a959f6db29 100644
--- a/src/backends/meta-backend-types.h
+++ b/src/backends/meta-backend-types.h
@@ -62,6 +62,8 @@ typedef struct _MetaWaylandCompositor MetaWaylandCompositor;
 typedef struct _MetaVirtualMonitor MetaVirtualMonitor;
 typedef struct _MetaVirtualMonitorInfo MetaVirtualMonitorInfo;
 
+typedef struct _MetaIdleManager MetaIdleManager;
+
 #ifdef HAVE_REMOTE_DESKTOP
 typedef struct _MetaRemoteDesktop MetaRemoteDesktop;
 #endif
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index ff84bfe6a9..1dd90a3563 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -55,6 +55,7 @@
 
 #include "backends/meta-cursor-renderer.h"
 #include "backends/meta-cursor-tracker-private.h"
+#include "backends/meta-idle-manager.h"
 #include "backends/meta-idle-monitor-private.h"
 #include "backends/meta-input-mapper-private.h"
 #include "backends/meta-input-settings-private.h"
@@ -125,6 +126,7 @@ struct _MetaBackendPrivate
   MetaOrientationManager *orientation_manager;
   MetaCursorTracker *cursor_tracker;
   MetaInputMapper *input_mapper;
+  MetaIdleManager *idle_manager;
   MetaRenderer *renderer;
 #ifdef HAVE_EGL
   MetaEgl *egl;
@@ -160,8 +162,6 @@ struct _MetaBackendPrivate
 
   guint device_update_idle_id;
 
-  GHashTable *device_monitors;
-
   ClutterInputDevice *current_device;
 
   MetaPointerConstraint *client_pointer_constraint;
@@ -233,8 +233,6 @@ meta_backend_dispose (GObject *object)
 
   g_clear_handle_id (&priv->device_update_idle_id, g_source_remove);
 
-  g_clear_pointer (&priv->device_monitors, g_hash_table_destroy);
-
   g_clear_object (&priv->settings);
 
 #ifdef HAVE_PROFILER
@@ -244,6 +242,7 @@ meta_backend_dispose (GObject *object)
   g_clear_pointer (&priv->default_seat, clutter_seat_destroy);
   g_clear_pointer (&priv->stage, clutter_actor_destroy);
   g_clear_pointer (&priv->clutter_backend, clutter_backend_destroy);
+  g_clear_pointer (&priv->idle_manager, meta_idle_manager_free);
   g_clear_object (&priv->renderer);
   g_clear_list (&priv->gpus, g_object_unref);
 
@@ -361,63 +360,6 @@ meta_backend_monitors_changed (MetaBackend *backend)
   update_cursors (backend);
 }
 
-void
-meta_backend_foreach_device_monitor (MetaBackend *backend,
-                                     GFunc        func,
-                                     gpointer     user_data)
-{
-  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-  GHashTableIter iter;
-  gpointer value;
-
-  g_hash_table_iter_init (&iter, priv->device_monitors);
-  while (g_hash_table_iter_next (&iter, NULL, &value))
-    {
-      MetaIdleMonitor *device_monitor = META_IDLE_MONITOR (value);
-
-      func (device_monitor, user_data);
-    }
-}
-
-static MetaIdleMonitor *
-meta_backend_create_idle_monitor (MetaBackend        *backend,
-                                  ClutterInputDevice *device)
-{
-  return g_object_new (META_TYPE_IDLE_MONITOR,
-                       "device", device,
-                       NULL);
-}
-
-static void
-create_device_monitor (MetaBackend        *backend,
-                       ClutterInputDevice *device)
-{
-  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-  MetaIdleMonitor *idle_monitor;
-
-  if (g_hash_table_contains (priv->device_monitors, device))
-    return;
-
-  idle_monitor = meta_backend_create_idle_monitor (backend, device);
-  g_hash_table_insert (priv->device_monitors, device, idle_monitor);
-}
-
-static void
-destroy_device_monitor (MetaBackend        *backend,
-                        ClutterInputDevice *device)
-{
-  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-
-  g_hash_table_remove (priv->device_monitors, device);
-}
-
-static void
-meta_backend_monitor_device (MetaBackend        *backend,
-                             ClutterInputDevice *device)
-{
-  create_device_monitor (backend, device);
-}
-
 static inline gboolean
 check_has_pointing_device (ClutterSeat *seat)
 {
@@ -454,8 +396,6 @@ on_device_added (ClutterSeat        *seat,
   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
   ClutterInputDeviceType device_type;
 
-  create_device_monitor (backend, device);
-
   if (clutter_input_device_get_device_mode (device) ==
       CLUTTER_INPUT_MODE_LOGICAL)
     return;
@@ -485,8 +425,6 @@ on_device_removed (ClutterSeat        *seat,
   MetaBackend *backend = META_BACKEND (user_data);
   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
 
-  destroy_device_monitor (backend, device);
-
   if (clutter_input_device_get_device_mode (device) ==
       CLUTTER_INPUT_MODE_LOGICAL)
     return;
@@ -526,26 +464,6 @@ on_device_removed (ClutterSeat        *seat,
     meta_backend_update_last_device (backend, NULL);
 }
 
-static void
-create_device_monitors (MetaBackend *backend,
-                        ClutterSeat *seat)
-{
-  GList *l, *devices;
-
-  create_device_monitor (backend, clutter_seat_get_pointer (seat));
-  create_device_monitor (backend, clutter_seat_get_keyboard (seat));
-
-  devices = clutter_seat_list_devices (seat);
-  for (l = devices; l; l = l->next)
-    {
-      ClutterInputDevice *device = l->data;
-
-      meta_backend_monitor_device (backend, device);
-    }
-
-  g_list_free (devices);
-}
-
 static void
 input_mapper_device_mapped_cb (MetaInputMapper    *mapper,
                                ClutterInputDevice *device,
@@ -617,10 +535,7 @@ meta_backend_real_post_init (MetaBackend *backend)
 
   meta_backend_sync_screen_size (backend);
 
-  priv->device_monitors =
-    g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref);
-
-  create_device_monitors (backend, seat);
+  priv->idle_manager = meta_idle_manager_new (backend);
 
   g_signal_connect_object (seat, "device-added",
                            G_CALLBACK (on_device_added), backend, 0);
@@ -740,7 +655,7 @@ upower_properties_changed (GDBusProxy *proxy,
   if (lid_is_closed)
     return;
 
-  meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
+  meta_idle_manager_reset_idle_time (priv->idle_manager);
 }
 
 static void
@@ -935,12 +850,15 @@ prepare_for_sleep_cb (GDBusConnection *connection,
                       GVariant        *parameters,
                       gpointer         user_data)
 {
+  MetaBackend *backend = user_data;
+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
   gboolean suspending;
 
   g_variant_get (parameters, "(b)", &suspending);
   if (suspending)
     return;
-  meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
+
+  meta_idle_manager_reset_idle_time (priv->idle_manager);
 }
 
 static void
@@ -948,6 +866,7 @@ system_bus_gotten_cb (GObject      *object,
                       GAsyncResult *res,
                       gpointer      user_data)
 {
+  MetaBackend *backend = user_data;
   MetaBackendPrivate *priv;
   GDBusConnection *bus;
 
@@ -955,7 +874,7 @@ system_bus_gotten_cb (GObject      *object,
   if (!bus)
     return;
 
-  priv = meta_backend_get_instance_private (user_data);
+  priv = meta_backend_get_instance_private (backend);
   priv->system_bus = bus;
   priv->sleep_signal_id =
     g_dbus_connection_signal_subscribe (priv->system_bus,
@@ -966,7 +885,7 @@ system_bus_gotten_cb (GObject      *object,
                                         NULL,
                                         G_DBUS_SIGNAL_FLAGS_NONE,
                                         prepare_for_sleep_cb,
-                                        NULL,
+                                        backend,
                                         NULL);
 }
 
@@ -1170,7 +1089,32 @@ meta_backend_get_idle_monitor (MetaBackend        *backend,
 {
   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
 
-  return g_hash_table_lookup (priv->device_monitors, device);
+  return meta_idle_manager_get_monitor (priv->idle_manager, device);
+}
+
+/**
+ * meta_backend_get_core_idle_monitor:
+ *
+ * Returns: (transfer none): the #MetaIdleMonitor that tracks server-global
+ * idle time for all devices.
+ */
+MetaIdleMonitor *
+meta_backend_get_core_idle_monitor (MetaBackend *backend)
+{
+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+  return meta_idle_manager_get_core_monitor (priv->idle_manager);
+}
+
+/**
+ * meta_backend_get_idle_manager: (skip)
+ */
+MetaIdleManager *
+meta_backend_get_idle_manager (MetaBackend *backend)
+{
+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+  return priv->idle_manager;
 }
 
 /**
diff --git a/src/backends/meta-idle-monitor-dbus.c b/src/backends/meta-idle-manager.c
similarity index 60%
rename from src/backends/meta-idle-monitor-dbus.c
rename to src/backends/meta-idle-manager.c
index 1ed54b0337..8369ae5066 100644
--- a/src/backends/meta-idle-monitor-dbus.c
+++ b/src/backends/meta-idle-manager.c
@@ -1,7 +1,7 @@
 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 
 /*
- * Copyright 2013 Red Hat, Inc.
+ * Copyright 2013-2021 Red Hat, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -22,7 +22,7 @@
 
 #include "config.h"
 
-#include "backends/meta-idle-monitor-dbus.h"
+#include "backends/meta-idle-manager.h"
 
 #include "backends/meta-idle-monitor-private.h"
 #include "clutter/clutter.h"
@@ -32,6 +32,14 @@
 
 #include "meta-dbus-idle-monitor.h"
 
+typedef struct _MetaIdleManager
+{
+  MetaBackend *backend;
+  guint dbus_name_id;
+
+  GHashTable *device_monitors;
+} MetaIdleManager;
+
 static gboolean
 handle_get_idletime (MetaDBusIdleMonitor   *skeleton,
                      GDBusMethodInvocation *invocation,
@@ -59,7 +67,7 @@ handle_reset_idletime (MetaDBusIdleMonitor   *skeleton,
       return TRUE;
     }
 
-  meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
+  meta_idle_manager_reset_idle_time (meta_idle_monitor_get_manager (monitor));
   meta_dbus_idle_monitor_complete_reset_idletime (skeleton, invocation);
 
   return TRUE;
@@ -189,16 +197,16 @@ create_monitor_skeleton (GDBusObjectManagerServer *manager,
   MetaDBusObjectSkeleton *object;
 
   skeleton = meta_dbus_idle_monitor_skeleton_new ();
-  g_signal_connect_object (skeleton, "handle-add-idle-watch",
-                           G_CALLBACK (handle_add_idle_watch), monitor, 0);
-  g_signal_connect_object (skeleton, "handle-add-user-active-watch",
-                           G_CALLBACK (handle_add_user_active_watch), monitor, 0);
-  g_signal_connect_object (skeleton, "handle-remove-watch",
-                           G_CALLBACK (handle_remove_watch), monitor, 0);
-  g_signal_connect_object (skeleton, "handle-reset-idletime",
-                           G_CALLBACK (handle_reset_idletime), monitor, 0);
-  g_signal_connect_object (skeleton, "handle-get-idletime",
-                           G_CALLBACK (handle_get_idletime), monitor, 0);
+  g_signal_connect (skeleton, "handle-add-idle-watch",
+                    G_CALLBACK (handle_add_idle_watch), monitor);
+  g_signal_connect (skeleton, "handle-add-user-active-watch",
+                    G_CALLBACK (handle_add_user_active_watch), monitor);
+  g_signal_connect (skeleton, "handle-remove-watch",
+                    G_CALLBACK (handle_remove_watch), monitor);
+  g_signal_connect (skeleton, "handle-reset-idletime",
+                    G_CALLBACK (handle_reset_idletime), monitor);
+  g_signal_connect (skeleton, "handle-get-idletime",
+                    G_CALLBACK (handle_get_idletime), monitor);
 
   object = meta_dbus_object_skeleton_new (path);
   meta_dbus_object_skeleton_set_idle_monitor (object, skeleton);
@@ -214,20 +222,21 @@ on_bus_acquired (GDBusConnection *connection,
                  const char      *name,
                  gpointer         user_data)
 {
-  GDBusObjectManagerServer *manager;
+  MetaIdleManager *manager = user_data;
+  GDBusObjectManagerServer *object_manager;
   MetaIdleMonitor *monitor;
   char *path;
 
-  manager = g_dbus_object_manager_server_new ("/org/gnome/Mutter/IdleMonitor");
+  object_manager = g_dbus_object_manager_server_new ("/org/gnome/Mutter/IdleMonitor");
 
   /* We never clear the core monitor, as that's supposed to cumulate idle times from
      all devices */
-  monitor = meta_idle_monitor_get_core ();
+  monitor = meta_idle_manager_get_core_monitor (manager);
   path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core");
-  create_monitor_skeleton (manager, monitor, path);
+  create_monitor_skeleton (object_manager, monitor, path);
   g_free (path);
 
-  g_dbus_object_manager_server_set_connection (manager, connection);
+  g_dbus_object_manager_server_set_connection (object_manager, connection);
 }
 
 static void
@@ -246,21 +255,122 @@ on_name_lost (GDBusConnection *connection,
   meta_verbose ("Lost or failed to acquire name %s", name);
 }
 
+MetaIdleMonitor *
+meta_idle_manager_get_monitor (MetaIdleManager    *idle_manager,
+                               ClutterInputDevice *device)
+{
+  return g_hash_table_lookup (idle_manager->device_monitors, device);
+}
+
+MetaIdleMonitor *
+meta_idle_manager_get_core_monitor (MetaIdleManager *idle_manager)
+{
+  MetaBackend *backend = meta_get_backend ();
+  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
+  ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend);
+
+  return meta_backend_get_idle_monitor (backend,
+                                        clutter_seat_get_pointer (seat));
+}
+
 void
-meta_idle_monitor_init_dbus (void)
+meta_idle_manager_reset_idle_time (MetaIdleManager *idle_manager)
+{
+  MetaIdleMonitor *core_monitor;
+
+  core_monitor = meta_idle_manager_get_core_monitor (idle_manager);
+  meta_idle_monitor_reset_idletime (core_monitor);
+}
+
+static void
+create_device_monitor (MetaIdleManager    *idle_manager,
+                       ClutterInputDevice *device)
 {
-  static int dbus_name_id;
+  MetaIdleMonitor *idle_monitor;
 
-  if (dbus_name_id > 0)
+  if (g_hash_table_contains (idle_manager->device_monitors, device))
     return;
 
-  dbus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION,
-                                 "org.gnome.Mutter.IdleMonitor",
-                                 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                                 (meta_get_replace_current_wm () ?
-                                  G_BUS_NAME_OWNER_FLAGS_REPLACE : 0),
-                                 on_bus_acquired,
-                                 on_name_acquired,
-                                 on_name_lost,
-                                 NULL, NULL);
+  idle_monitor = meta_idle_monitor_new (idle_manager, device);
+  g_hash_table_insert (idle_manager->device_monitors, device, idle_monitor);
+}
+
+static void
+on_device_added (ClutterSeat        *seat,
+                 ClutterInputDevice *device,
+                 gpointer            user_data)
+{
+  MetaIdleManager *idle_manager = user_data;
+
+  create_device_monitor (idle_manager, device);
+}
+
+static void
+on_device_removed (ClutterSeat        *seat,
+                   ClutterInputDevice *device,
+                   gpointer            user_data)
+{
+  MetaIdleManager *idle_manager = user_data;
+
+  g_hash_table_remove (idle_manager->device_monitors, device);
+}
+
+static void
+create_device_monitors (MetaIdleManager *idle_manager,
+                        ClutterSeat     *seat)
+{
+  GList *l, *devices;
+
+  create_device_monitor (idle_manager, clutter_seat_get_pointer (seat));
+  create_device_monitor (idle_manager, clutter_seat_get_keyboard (seat));
+
+  devices = clutter_seat_list_devices (seat);
+  for (l = devices; l; l = l->next)
+    {
+      ClutterInputDevice *device = l->data;
+
+      create_device_monitor (idle_manager, device);
+    }
+
+  g_list_free (devices);
+}
+
+MetaIdleManager *
+meta_idle_manager_new (MetaBackend *backend)
+{
+  ClutterSeat *seat = meta_backend_get_default_seat (backend);
+  MetaIdleManager *idle_manager;
+
+  idle_manager = g_new0 (MetaIdleManager, 1);
+  idle_manager->backend = backend;
+
+  idle_manager->dbus_name_id =
+    g_bus_own_name (G_BUS_TYPE_SESSION,
+                    "org.gnome.Mutter.IdleMonitor",
+                    G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                    (meta_get_replace_current_wm () ?
+                     G_BUS_NAME_OWNER_FLAGS_REPLACE : 0),
+                    on_bus_acquired,
+                    on_name_acquired,
+                    on_name_lost,
+                    idle_manager,
+                    NULL);
+
+  idle_manager->device_monitors =
+    g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref);
+  g_signal_connect (seat, "device-added",
+                    G_CALLBACK (on_device_added), idle_manager);
+  g_signal_connect_after (seat, "device-removed",
+                          G_CALLBACK (on_device_removed), idle_manager);
+  create_device_monitors (idle_manager, seat);
+
+  return idle_manager;
+}
+
+void
+meta_idle_manager_free (MetaIdleManager *idle_manager)
+{
+  g_clear_pointer (&idle_manager->device_monitors, g_hash_table_destroy);
+  g_bus_unown_name (idle_manager->dbus_name_id);
+  g_free (idle_manager);
 }
diff --git a/src/backends/meta-idle-manager.h b/src/backends/meta-idle-manager.h
new file mode 100644
index 0000000000..c2a998feb7
--- /dev/null
+++ b/src/backends/meta-idle-manager.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2021 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef META_IDLE_MANAGER_H
+#define META_IDLE_MANAGER_H
+
+#include "backends/meta-backend-types.h"
+#include "clutter/clutter.h"
+
+typedef struct _MetaIdleMonitor MetaIdleMonitor;
+typedef struct _MetaIdleManager MetaIdleManager;
+
+MetaIdleMonitor * meta_idle_manager_get_monitor (MetaIdleManager    *idle_manager,
+                                                 ClutterInputDevice *device);
+
+MetaIdleMonitor * meta_idle_manager_get_core_monitor (MetaIdleManager *idle_manager);
+
+void meta_idle_manager_reset_idle_time (MetaIdleManager *idle_manager);
+
+MetaIdleManager * meta_idle_manager_new (MetaBackend *backend);
+
+void meta_idle_manager_free (MetaIdleManager *idle_manager);
+
+#endif /* META_IDLE_MANAGER_H */
diff --git a/src/backends/meta-idle-monitor-private.h b/src/backends/meta-idle-monitor-private.h
index d498f13f9e..6d43878767 100644
--- a/src/backends/meta-idle-monitor-private.h
+++ b/src/backends/meta-idle-monitor-private.h
@@ -38,17 +38,6 @@ typedef struct
   GSource                  *timeout_source;
 } MetaIdleMonitorWatch;
 
-struct _MetaIdleMonitor
-{
-  GObject parent_instance;
-
-  GDBusProxy *session_proxy;
-  gboolean inhibited;
-  GHashTable *watches;
-  ClutterInputDevice *device;
-  guint64 last_event_time;
-};
-
 struct _MetaIdleMonitorClass
 {
   GObjectClass parent_class;
@@ -56,4 +45,9 @@ struct _MetaIdleMonitorClass
 
 void meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor);
 
+MetaIdleManager * meta_idle_monitor_get_manager (MetaIdleMonitor *monitor);
+
+MetaIdleMonitor * meta_idle_monitor_new (MetaIdleManager    *idle_manager,
+                                         ClutterInputDevice *device);
+
 #endif /* META_IDLE_MONITOR_PRIVATE_H */
diff --git a/src/backends/meta-idle-monitor.c b/src/backends/meta-idle-monitor.c
index c678271cc0..df924d4ddb 100644
--- a/src/backends/meta-idle-monitor.c
+++ b/src/backends/meta-idle-monitor.c
@@ -35,7 +35,6 @@
 #include "backends/gsm-inhibitor-flag.h"
 #include "backends/meta-backend-private.h"
 #include "backends/meta-idle-monitor-private.h"
-#include "backends/meta-idle-monitor-dbus.h"
 #include "clutter/clutter.h"
 #include "meta/main.h"
 #include "meta/meta-idle-monitor.h"
@@ -52,6 +51,18 @@ enum
 
 static GParamSpec *obj_props[PROP_LAST];
 
+struct _MetaIdleMonitor
+{
+  GObject parent;
+
+  MetaIdleManager *idle_manager;
+  GDBusProxy *session_proxy;
+  gboolean inhibited;
+  GHashTable *watches;
+  ClutterInputDevice *device;
+  int64_t last_event_time;
+};
+
 G_DEFINE_TYPE (MetaIdleMonitor, meta_idle_monitor, G_TYPE_OBJECT)
 
 static void
@@ -266,22 +277,6 @@ meta_idle_monitor_init (MetaIdleMonitor *monitor)
     }
 }
 
-/**
- * meta_idle_monitor_get_core:
- *
- * Returns: (transfer none): the #MetaIdleMonitor that tracks the server-global
- * idletime for all devices.
- */
-MetaIdleMonitor *
-meta_idle_monitor_get_core (void)
-{
-  MetaBackend *backend = meta_get_backend ();
-  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-  ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend);
-
-  return meta_backend_get_idle_monitor (backend, clutter_seat_get_pointer (seat));
-}
-
 static guint32
 get_next_watch_serial (void)
 {
@@ -513,3 +508,23 @@ meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor)
 
   g_list_free (watch_ids);
 }
+
+MetaIdleManager *
+meta_idle_monitor_get_manager (MetaIdleMonitor *monitor)
+{
+  return monitor->idle_manager;
+}
+
+MetaIdleMonitor *
+meta_idle_monitor_new (MetaIdleManager    *idle_manager,
+                       ClutterInputDevice *device)
+{
+  MetaIdleMonitor *monitor;
+
+  monitor = g_object_new (META_TYPE_IDLE_MONITOR,
+                          "device", device,
+                          NULL);
+  monitor->idle_manager = idle_manager;
+
+  return monitor;
+}
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 98d6c1a571..dbf39d7e03 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -42,7 +42,7 @@
 #include <stdlib.h>
 
 #include "backends/meta-cursor-tracker-private.h"
-#include "backends/meta-idle-monitor-private.h"
+#include "backends/meta-idle-manager.h"
 #include "backends/meta-keymap-utils.h"
 #include "backends/meta-logical-monitor.h"
 #include "backends/meta-monitor-manager-private.h"
@@ -726,11 +726,11 @@ void meta_backend_native_resume (MetaBackendNative *native)
     meta_backend_get_monitor_manager (backend);
   MetaMonitorManagerNative *monitor_manager_native =
     META_MONITOR_MANAGER_NATIVE (monitor_manager);
-  MetaIdleMonitor *idle_monitor;
   ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
   MetaSeatNative *seat =
     META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
   MetaRenderer *renderer = meta_backend_get_renderer (backend);
+  MetaIdleManager *idle_manager;
   MetaInputSettings *input_settings;
 
   COGL_TRACE_BEGIN_SCOPED (MetaBackendNativeResume,
@@ -746,8 +746,8 @@ void meta_backend_native_resume (MetaBackendNative *native)
 
   clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
 
-  idle_monitor = meta_idle_monitor_get_core ();
-  meta_idle_monitor_reset_idletime (idle_monitor);
+  idle_manager = meta_backend_get_idle_manager (backend);
+  meta_idle_manager_reset_idle_time (idle_manager);
 
   input_settings = meta_backend_get_input_settings (backend);
   meta_input_settings_maybe_restore_numlock_state (input_settings);
diff --git a/src/core/display.c b/src/core/display.c
index 6c7c6b26bd..f19e5cb63a 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -43,7 +43,6 @@
 #include "backends/meta-backend-private.h"
 #include "backends/meta-cursor-sprite-xcursor.h"
 #include "backends/meta-cursor-tracker-private.h"
-#include "backends/meta-idle-monitor-dbus.h"
 #include "backends/meta-input-device-private.h"
 #include "backends/meta-input-mapper-private.h"
 #include "backends/meta-stage-private.h"
@@ -960,8 +959,6 @@ meta_display_open (GError **error)
       meta_display_unset_input_focus (display, timestamp);
     }
 
-  meta_idle_monitor_init_dbus ();
-
   display->sound_player = g_object_new (META_TYPE_SOUND_PLAYER, NULL);
 
   /* Done opening new display */
diff --git a/src/core/events.c b/src/core/events.c
index 7c23ac1740..92fb602c7e 100644
--- a/src/core/events.c
+++ b/src/core/events.c
@@ -25,7 +25,7 @@
 #include "core/events.h"
 
 #include "backends/meta-cursor-tracker-private.h"
-#include "backends/meta-idle-monitor-private.h"
+#include "backends/meta-idle-manager.h"
 #include "backends/x11/meta-backend-x11.h"
 #include "backends/x11/meta-input-device-x11.h"
 #include "compositor/meta-window-actor-private.h"
@@ -102,7 +102,8 @@ get_window_for_event (MetaDisplay        *display,
 static void
 handle_idletime_for_event (const ClutterEvent *event)
 {
-  MetaIdleMonitor *core_monitor;
+  MetaBackend *backend = meta_get_backend ();
+  MetaIdleManager *idle_manager;
 
   if (clutter_event_get_device (event) == NULL)
     return;
@@ -112,8 +113,8 @@ handle_idletime_for_event (const ClutterEvent *event)
       event->type == CLUTTER_LEAVE)
     return;
 
-  core_monitor = meta_idle_monitor_get_core ();
-  meta_idle_monitor_reset_idletime (core_monitor);
+  idle_manager = meta_backend_get_idle_manager (backend);
+  meta_idle_manager_reset_idle_time (idle_manager);
 }
 
 static gboolean
diff --git a/src/meson.build b/src/meson.build
index 64a65bc88d..85d66a455a 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -188,8 +188,8 @@ mutter_sources = [
   'backends/meta-gpu.c',
   'backends/meta-gpu.h',
   'backends/meta-idle-monitor.c',
-  'backends/meta-idle-monitor-dbus.c',
-  'backends/meta-idle-monitor-dbus.h',
+  'backends/meta-idle-manager.c',
+  'backends/meta-idle-manager.h',
   'backends/meta-idle-monitor-private.h',
   'backends/meta-input-device.c',
   'backends/meta-input-mapper.c',
diff --git a/src/meta/meta-backend.h b/src/meta/meta-backend.h
index 8edc0bf2c9..49e252adef 100644
--- a/src/meta/meta-backend.h
+++ b/src/meta/meta-backend.h
@@ -29,6 +29,7 @@
 
 #include "clutter/clutter.h"
 #include "meta/meta-dnd.h"
+#include "meta/meta-idle-monitor.h"
 #include "meta/meta-remote-access-controller.h"
 
 #define META_TYPE_BACKEND (meta_backend_get_type ())
@@ -61,6 +62,9 @@ MetaDnd      *meta_backend_get_dnd   (MetaBackend *backend);
 META_EXPORT
 MetaSettings *meta_backend_get_settings (MetaBackend *backend);
 
+META_EXPORT
+MetaIdleMonitor * meta_backend_get_core_idle_monitor (MetaBackend *backend);
+
 META_EXPORT
 MetaRemoteAccessController * meta_backend_get_remote_access_controller (MetaBackend *backend);
 
diff --git a/src/meta/meta-idle-monitor.h b/src/meta/meta-idle-monitor.h
index caacd1f796..b8b38a6063 100644
--- a/src/meta/meta-idle-monitor.h
+++ b/src/meta/meta-idle-monitor.h
@@ -40,9 +40,6 @@ typedef void (*MetaIdleMonitorWatchFunc) (MetaIdleMonitor *monitor,
                                           guint            watch_id,
                                           gpointer         user_data);
 
-META_EXPORT
-MetaIdleMonitor *meta_idle_monitor_get_core (void);
-
 META_EXPORT
 guint         meta_idle_monitor_add_idle_watch        (MetaIdleMonitor          *monitor,
                                                       guint64                   interval_msec,


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