[mutter/gnome-3-28] backends: Remove X11 idle-monitor backend



commit e3e76d658bc0bfafc93e8de678a308c8d7e952e5
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Mar 20 10:59:04 2018 +0100

    backends: Remove X11 idle-monitor backend
    
    And use the old "native" backend for both X11 and Wayland. This will
    allow us to share fixes between implementations without having to delve
    into the XSync X11 extension code.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=705942

 src/Makefile.am                                |   4 -
 src/backends/meta-backend-private.h            |   2 -
 src/backends/meta-backend.c                    |   4 +-
 src/backends/meta-idle-monitor-private.h       |  13 +-
 src/backends/meta-idle-monitor.c               | 119 +++++++-
 src/backends/meta-monitor-manager.c            |   4 -
 src/backends/native/meta-backend-native.c      |  18 +-
 src/backends/native/meta-idle-monitor-native.c | 200 -------------
 src/backends/native/meta-idle-monitor-native.h |  43 ---
 src/backends/native/meta-launcher.c            |   1 -
 src/backends/x11/meta-backend-x11.c            |  23 --
 src/backends/x11/meta-idle-monitor-xsync.c     | 373 -------------------------
 src/backends/x11/meta-idle-monitor-xsync.h     |  47 ----
 src/core/events.c                              |  63 ++---
 14 files changed, 151 insertions(+), 763 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index be3010c28..1579c8b9c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -183,8 +183,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =      \
        backends/x11/nested/meta-cursor-renderer-x11-nested.h           \
        backends/x11/nested/meta-renderer-x11-nested.c  \
        backends/x11/nested/meta-renderer-x11-nested.h  \
-       backends/x11/meta-idle-monitor-xsync.c          \
-       backends/x11/meta-idle-monitor-xsync.h          \
        backends/x11/meta-input-settings-x11.c          \
        backends/x11/meta-input-settings-x11.h          \
        backends/x11/meta-monitor-manager-xrandr.c      \
@@ -487,8 +485,6 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES +=             \
        backends/native/meta-default-modes.h            \
        backends/native/meta-gpu-kms.c                  \
        backends/native/meta-gpu-kms.h                  \
-       backends/native/meta-idle-monitor-native.c      \
-       backends/native/meta-idle-monitor-native.h      \
        backends/native/meta-input-settings-native.c    \
        backends/native/meta-input-settings-native.h    \
        backends/native/meta-monitor-manager-kms.c      \
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 0dc6bf77a..a25275499 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -59,8 +59,6 @@ struct _MetaBackendClass
 
   void (* post_init) (MetaBackend *backend);
 
-  MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
-                                             int          device_id);
   MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
                                                    GError     **error);
   MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 4ebceb4ea..de20cddfe 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -222,7 +222,9 @@ static MetaIdleMonitor *
 meta_backend_create_idle_monitor (MetaBackend *backend,
                                   int          device_id)
 {
-  return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id);
+  return g_object_new (META_TYPE_IDLE_MONITOR,
+                       "device-id", device_id,
+                       NULL);
 }
 
 static void
diff --git a/src/backends/meta-idle-monitor-private.h b/src/backends/meta-idle-monitor-private.h
index 7a7021559..89b80ba43 100644
--- a/src/backends/meta-idle-monitor-private.h
+++ b/src/backends/meta-idle-monitor-private.h
@@ -26,9 +26,6 @@
 #include <meta/meta-idle-monitor.h>
 #include "display-private.h"
 
-#include <X11/Xlib.h>
-#include <X11/extensions/sync.h>
-
 typedef struct
 {
   MetaIdleMonitor          *monitor;
@@ -38,6 +35,7 @@ typedef struct
   GDestroyNotify            notify;
   guint64                   timeout_msec;
   int                       idle_source_id;
+  GSource                  *timeout_source;
 } MetaIdleMonitorWatch;
 
 struct _MetaIdleMonitor
@@ -46,20 +44,15 @@ struct _MetaIdleMonitor
 
   GHashTable *watches;
   int device_id;
+  guint64 last_event_time;
 };
 
 struct _MetaIdleMonitorClass
 {
   GObjectClass parent_class;
-
-  gint64 (*get_idletime) (MetaIdleMonitor *monitor);
-  MetaIdleMonitorWatch * (*make_watch) (MetaIdleMonitor           *monitor,
-                                        guint64                    timeout_msec,
-                                        MetaIdleMonitorWatchFunc   callback,
-                                        gpointer                   user_data,
-                                        GDestroyNotify             notify);
 };
 
 void _meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch);
+void meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor);
 
 #endif /* META_IDLE_MONITOR_PRIVATE_H */
diff --git a/src/backends/meta-idle-monitor.c b/src/backends/meta-idle-monitor.c
index 18d6155c1..3dc098f4d 100644
--- a/src/backends/meta-idle-monitor.c
+++ b/src/backends/meta-idle-monitor.c
@@ -151,9 +151,35 @@ meta_idle_monitor_class_init (MetaIdleMonitorClass *klass)
   g_object_class_install_property (object_class, PROP_DEVICE_ID, obj_props[PROP_DEVICE_ID]);
 }
 
+static void
+free_watch (gpointer data)
+{
+  MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) data;
+  MetaIdleMonitor *monitor = watch->monitor;
+
+  g_object_ref (monitor);
+
+  if (watch->idle_source_id)
+    {
+      g_source_remove (watch->idle_source_id);
+      watch->idle_source_id = 0;
+    }
+
+  if (watch->notify != NULL)
+    watch->notify (watch->user_data);
+
+  if (watch->timeout_source != NULL)
+    g_source_destroy (watch->timeout_source);
+
+  g_object_unref (monitor);
+  g_slice_free (MetaIdleMonitorWatch, watch);
+}
+
 static void
 meta_idle_monitor_init (MetaIdleMonitor *monitor)
 {
+  monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
+  monitor->last_event_time = g_get_monotonic_time ();
 }
 
 /**
@@ -185,6 +211,36 @@ meta_idle_monitor_get_for_device (int device_id)
   return meta_backend_get_idle_monitor (backend, device_id);
 }
 
+static guint32
+get_next_watch_serial (void)
+{
+  static guint32 serial = 0;
+
+  g_atomic_int_inc (&serial);
+
+  return serial;
+}
+
+static gboolean
+idle_monitor_dispatch_timeout (GSource     *source,
+                               GSourceFunc  callback,
+                               gpointer     user_data)
+{
+  MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) user_data;
+
+  _meta_idle_monitor_watch_fire (watch);
+  g_source_set_ready_time (watch->timeout_source, -1);
+
+  return TRUE;
+}
+
+static GSourceFuncs idle_monitor_source_funcs = {
+  .prepare = NULL,
+  .check = NULL,
+  .dispatch = idle_monitor_dispatch_timeout,
+  .finalize = NULL,
+};
+
 static MetaIdleMonitorWatch *
 make_watch (MetaIdleMonitor           *monitor,
             guint64                    timeout_msec,
@@ -194,11 +250,28 @@ make_watch (MetaIdleMonitor           *monitor,
 {
   MetaIdleMonitorWatch *watch;
 
-  watch = META_IDLE_MONITOR_GET_CLASS (monitor)->make_watch (monitor,
-                                                             timeout_msec,
-                                                             callback,
-                                                             user_data,
-                                                             notify);
+  watch = g_slice_new0 (MetaIdleMonitorWatch);
+
+  watch->monitor = monitor;
+  watch->id = get_next_watch_serial ();
+  watch->callback = callback;
+  watch->user_data = user_data;
+  watch->notify = notify;
+  watch->timeout_msec = timeout_msec;
+
+  if (timeout_msec != 0)
+    {
+      GSource *source = g_source_new (&idle_monitor_source_funcs,
+                                      sizeof (GSource));
+
+      g_source_set_callback (source, NULL, watch, NULL);
+      g_source_set_ready_time (source,
+                               monitor->last_event_time + timeout_msec * 1000);
+      g_source_attach (source, NULL);
+      g_source_unref (source);
+
+      watch->timeout_source = source;
+    }
 
   g_hash_table_insert (monitor->watches,
                        GUINT_TO_POINTER (watch->id),
@@ -314,5 +387,39 @@ meta_idle_monitor_remove_watch (MetaIdleMonitor *monitor,
 gint64
 meta_idle_monitor_get_idletime (MetaIdleMonitor *monitor)
 {
-  return META_IDLE_MONITOR_GET_CLASS (monitor)->get_idletime (monitor);
+  return (g_get_monotonic_time () - monitor->last_event_time) / 1000;
+}
+
+void
+meta_idle_monitor_reset_idletime (MetaIdleMonitor *monitor)
+{
+  GList *node, *watch_ids;
+
+  monitor->last_event_time = g_get_monotonic_time ();
+
+  watch_ids = g_hash_table_get_keys (monitor->watches);
+
+  for (node = watch_ids; node != NULL; node = node->next)
+    {
+      guint watch_id = GPOINTER_TO_UINT (node->data);
+      MetaIdleMonitorWatch *watch;
+
+      watch = g_hash_table_lookup (monitor->watches,
+                                   GUINT_TO_POINTER (watch_id));
+      if (!watch)
+        continue;
+
+      if (watch->timeout_msec == 0)
+        {
+          _meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch);
+        }
+      else
+        {
+          g_source_set_ready_time (watch->timeout_source,
+                                   monitor->last_event_time +
+                                   watch->timeout_msec * 1000);
+        }
+    }
+
+  g_list_free (watch_ids);
 }
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index e952e4f75..829c189ea 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -578,8 +578,6 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
                                                        &error))
         {
           g_clear_object (&config);
-          g_warning ("Failed to use linear monitor configuration: %s",
-                     error->message);
           g_clear_error (&error);
         }
       else
@@ -597,8 +595,6 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
                                                        &error))
         {
           g_clear_object (&config);
-          g_warning ("Failed to use fallback monitor configuration: %s",
-                 error->message);
           g_clear_error (&error);
         }
       else
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index e0e1cfa47..4c2342ff5 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -35,11 +35,11 @@
 #include "clutter/evdev/clutter-evdev.h"
 #include "meta-barrier-native.h"
 #include "meta-border.h"
-#include "meta-idle-monitor-native.h"
 #include "meta-monitor-manager-kms.h"
 #include "meta-cursor-renderer-native.h"
 #include "meta-launcher.h"
 #include "backends/meta-cursor-tracker-private.h"
+#include "backends/meta-idle-monitor-private.h"
 #include "backends/meta-logical-monitor.h"
 #include "backends/meta-monitor-manager-private.h"
 #include "backends/meta-pointer-constraint.h"
@@ -108,7 +108,7 @@ prepare_for_sleep_cb (GDBusConnection *connection,
   g_variant_get (parameters, "(b)", &suspending);
   if (suspending)
     return;
-  meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
+  meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
 }
 
 static void
@@ -145,7 +145,7 @@ lid_is_closed_changed_cb (UpClient   *client,
   if (up_client_get_lid_is_closed (client))
     return;
 
-  meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
+  meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
 }
 
 static void
@@ -398,15 +398,6 @@ meta_backend_native_post_init (MetaBackend *backend)
                                             meta_backend_get_monitor_manager (backend));
 }
 
-static MetaIdleMonitor *
-meta_backend_native_create_idle_monitor (MetaBackend *backend,
-                                         int          device_id)
-{
-  return g_object_new (META_TYPE_IDLE_MONITOR_NATIVE,
-                       "device-id", device_id,
-                       NULL);
-}
-
 static MetaMonitorManager *
 meta_backend_native_create_monitor_manager (MetaBackend *backend,
                                             GError     **error)
@@ -604,7 +595,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
 
   backend_class->post_init = meta_backend_native_post_init;
 
-  backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
   backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
   backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
   backend_class->create_renderer = meta_backend_native_create_renderer;
@@ -747,5 +737,5 @@ void meta_backend_native_resume (MetaBackendNative *native)
   meta_cursor_renderer_native_force_update (cursor_renderer_native);
 
   idle_monitor = meta_backend_get_idle_monitor (backend, 0);
-  meta_idle_monitor_native_reset_idletime (idle_monitor);
+  meta_idle_monitor_reset_idletime (idle_monitor);
 }
diff --git a/src/backends/native/meta-launcher.c b/src/backends/native/meta-launcher.c
index f655f0e26..8b066c9ff 100644
--- a/src/backends/native/meta-launcher.c
+++ b/src/backends/native/meta-launcher.c
@@ -44,7 +44,6 @@
 #include "backends/meta-backend-private.h"
 #include "backends/native/meta-backend-native.h"
 #include "meta-cursor-renderer-native.h"
-#include "meta-idle-monitor-native.h"
 #include "meta-renderer-native.h"
 
 struct _MetaLauncher
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index acb2b1d90..226d187c5 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -37,7 +37,6 @@
 #include <X11/Xlib-xcb.h>
 #include <xkbcommon/xkbcommon-x11.h>
 
-#include "meta-idle-monitor-xsync.h"
 #include "backends/meta-stage.h"
 #include "backends/x11/meta-clutter-backend-x11.h"
 #include "backends/x11/meta-renderer-x11.h"
@@ -83,15 +82,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND,
                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
                                                 initable_iface_init));
 
-static void
-handle_alarm_notify (MetaBackend *backend,
-                     XEvent      *event)
-{
-  meta_backend_foreach_device_monitor (backend,
-                                       (GFunc) meta_idle_monitor_xsync_handle_xevent,
-                                       event);
-}
-
 static void
 meta_backend_x11_translate_device_event (MetaBackendX11 *x11,
                                          XIDeviceEvent  *device_event)
@@ -274,9 +264,6 @@ handle_host_xevent (MetaBackend *backend,
   bypass_clutter = (meta_backend_x11_handle_host_xevent (x11, event) ||
                     bypass_clutter);
 
-  if (event->type == (priv->xsync_event_base + XSyncAlarmNotify))
-    handle_alarm_notify (backend, event);
-
   if (event->type == priv->xkb_event_base)
     {
       XkbEvent *xkb_ev = (XkbEvent *) event;
@@ -464,15 +451,6 @@ meta_backend_x11_create_clutter_backend (MetaBackend *backend)
   return g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
 }
 
-static MetaIdleMonitor *
-meta_backend_x11_create_idle_monitor (MetaBackend *backend,
-                                      int          device_id)
-{
-  return g_object_new (META_TYPE_IDLE_MONITOR_XSYNC,
-                       "device-id", device_id,
-                       NULL);
-}
-
 static gboolean
 meta_backend_x11_grab_device (MetaBackend *backend,
                               int          device_id,
@@ -686,7 +664,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
 
   backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
   backend_class->post_init = meta_backend_x11_post_init;
-  backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor;
   backend_class->grab_device = meta_backend_x11_grab_device;
   backend_class->ungrab_device = meta_backend_x11_ungrab_device;
   backend_class->warp_pointer = meta_backend_x11_warp_pointer;
diff --git a/src/core/events.c b/src/core/events.c
index f55e83c97..92503a168 100644
--- a/src/core/events.c
+++ b/src/core/events.c
@@ -32,9 +32,10 @@
 
 #ifdef HAVE_NATIVE_BACKEND
 #include "backends/native/meta-backend-native.h"
-#include "backends/native/meta-idle-monitor-native.h"
 #endif
 
+#include "backends/meta-idle-monitor-private.h"
+
 #ifdef HAVE_WAYLAND
 #include "wayland/meta-wayland-private.h"
 #endif
@@ -92,46 +93,38 @@ get_window_for_event (MetaDisplay        *display,
 static void
 handle_idletime_for_event (const ClutterEvent *event)
 {
-#ifdef HAVE_NATIVE_BACKEND
-  /* This is handled by XSync under X11. */
-  MetaBackend *backend = meta_get_backend ();
+  ClutterInputDevice *device, *source_device;
+  MetaIdleMonitor *core_monitor, *device_monitor;
+  int device_id;
 
-  if (META_IS_BACKEND_NATIVE (backend))
-    {
-      ClutterInputDevice *device, *source_device;
-      MetaIdleMonitor *core_monitor, *device_monitor;
-      int device_id;
-
-      device = clutter_event_get_device (event);
-      if (device == NULL)
-        return;
-
-      if (event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC ||
-          event->type == CLUTTER_ENTER ||
-          event->type == CLUTTER_LEAVE ||
-          event->type == CLUTTER_STAGE_STATE ||
-          event->type == CLUTTER_DESTROY_NOTIFY ||
-          event->type == CLUTTER_CLIENT_MESSAGE ||
-          event->type == CLUTTER_DELETE)
-        return;
+  device = clutter_event_get_device (event);
+  if (device == NULL)
+    return;
 
-      device_id = clutter_input_device_get_device_id (device);
+  if (event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC ||
+      event->type == CLUTTER_ENTER ||
+      event->type == CLUTTER_LEAVE ||
+      event->type == CLUTTER_STAGE_STATE ||
+      event->type == CLUTTER_DESTROY_NOTIFY ||
+      event->type == CLUTTER_CLIENT_MESSAGE ||
+      event->type == CLUTTER_DELETE)
+    return;
 
-      core_monitor = meta_idle_monitor_get_core ();
-      device_monitor = meta_idle_monitor_get_for_device (device_id);
+  device_id = clutter_input_device_get_device_id (device);
 
-      meta_idle_monitor_native_reset_idletime (core_monitor);
-      meta_idle_monitor_native_reset_idletime (device_monitor);
+  core_monitor = meta_idle_monitor_get_core ();
+  device_monitor = meta_idle_monitor_get_for_device (device_id);
 
-      source_device = clutter_event_get_source_device (event);
-      if (source_device != device)
-        {
-          device_id = clutter_input_device_get_device_id (device);
-          device_monitor = meta_idle_monitor_get_for_device (device_id);
-          meta_idle_monitor_native_reset_idletime (device_monitor);
-        }
+  meta_idle_monitor_reset_idletime (core_monitor);
+  meta_idle_monitor_reset_idletime (device_monitor);
+
+  source_device = clutter_event_get_source_device (event);
+  if (source_device != device)
+    {
+      device_id = clutter_input_device_get_device_id (device);
+      device_monitor = meta_idle_monitor_get_for_device (device_id);
+      meta_idle_monitor_reset_idletime (device_monitor);
     }
-#endif /* HAVE_NATIVE_BACKEND */
 }
 
 static gboolean


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