[gnome-desktop3/f20] Resolves: rhbz#1008965 - mouse cursor sometimes disappears on login

rtcm rtcm at fedoraproject.org
Tue Nov 26 11:20:55 UTC 2013


commit cf205c930158da717801b685c5ccf3b377c5ead9
Author: Rui Matos <tiagomatos at gmail.com>
Date:   Tue Nov 26 01:02:53 2013 +0100

    Resolves: rhbz#1008965 - mouse cursor sometimes disappears on login

 ...r-Check-if-a-monitor-exists-before-creati.patch |  200 ++++++++++++++++++++
 gnome-desktop3.spec                                |    7 +-
 2 files changed, 206 insertions(+), 1 deletions(-)
---
diff --git a/0001-idle-monitor-Check-if-a-monitor-exists-before-creati.patch b/0001-idle-monitor-Check-if-a-monitor-exists-before-creati.patch
new file mode 100644
index 0000000..548555a
--- /dev/null
+++ b/0001-idle-monitor-Check-if-a-monitor-exists-before-creati.patch
@@ -0,0 +1,200 @@
+From f4402b64fd34b886a9d7e8c1e0833e4c3f7dcfe3 Mon Sep 17 00:00:00 2001
+From: Rui Matos <tiagomatos at gmail.com>
+Date: Tue, 26 Nov 2013 00:55:23 +0100
+Subject: [PATCH] idle-monitor: Check if a monitor exists before creating a
+ proxy for it
+
+The fact that we know about a given device doesn't mean that mutter
+also knows about it nor that it has created an idle monitor object on
+the bus for it.
+
+To fix this race, instead of immediately trying to create a proxy for
+the bus object, we instantiate an object manager and ask it whether
+the object we want already exists and if it doesn't we wait
+(indefinitely) until it shows up.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=706229
+---
+ libgnome-desktop/gnome-idle-monitor.c | 109 +++++++++++++++++++++++-----------
+ 1 file changed, 73 insertions(+), 36 deletions(-)
+
+diff --git a/libgnome-desktop/gnome-idle-monitor.c b/libgnome-desktop/gnome-idle-monitor.c
+index 6af1343..539c99b 100644
+--- a/libgnome-desktop/gnome-idle-monitor.c
++++ b/libgnome-desktop/gnome-idle-monitor.c
+@@ -40,10 +40,12 @@ struct _GnomeIdleMonitorPrivate
+ {
+ 	GCancellable        *cancellable;
+ 	MetaDBusIdleMonitor *proxy;
++	MetaDBusObjectManagerClient *om;
+ 	int                  name_watch_id;
+ 	GHashTable          *watches;
+ 	GHashTable          *watches_by_upstream_id;
+ 	GdkDevice           *device;
++	gchar               *path;
+ };
+ 
+ typedef struct
+@@ -163,8 +165,10 @@ gnome_idle_monitor_dispose (GObject *object)
+ 	}
+ 
+ 	g_clear_object (&monitor->priv->proxy);
++	g_clear_object (&monitor->priv->om);
+ 	g_clear_pointer (&monitor->priv->watches, g_hash_table_destroy);
+ 	g_clear_object (&monitor->priv->device);
++	g_clear_pointer (&monitor->priv->path, g_free);
+ 
+ 	G_OBJECT_CLASS (gnome_idle_monitor_parent_class)->dispose (object);
+ }
+@@ -198,6 +202,15 @@ gnome_idle_monitor_set_property (GObject      *object,
+ 	{
+ 	case PROP_DEVICE:
+ 		monitor->priv->device = g_value_dup_object (value);
++
++		g_free (monitor->priv->path);
++		if (monitor->priv->device) {
++			monitor->priv->path = g_strdup_printf ("/org/gnome/Mutter/IdleMonitor/Device%d",
++							       gdk_x11_device_get_id (monitor->priv->device));
++		} else {
++			monitor->priv->path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core");
++		}
++
+ 		break;
+ 	default:
+ 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+@@ -220,57 +233,74 @@ add_known_watch (gpointer key,
+ }
+ 
+ static void
+-on_proxy_acquired (GObject      *object,
+-		   GAsyncResult *result,
+-		   gpointer      user_data)
++connect_proxy (GDBusObject	*object,
++	       GnomeIdleMonitor	*monitor)
+ {
+-	GnomeIdleMonitor *monitor = user_data;
+-	GError *error;
+ 	MetaDBusIdleMonitor *proxy;
+ 
+-	error = NULL;
+-	proxy = meta_dbus_idle_monitor_proxy_new_finish (result, &error);
++	proxy = meta_dbus_object_get_idle_monitor (META_DBUS_OBJECT (object));
+ 	if (!proxy) {
+-		if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+-			g_error_free (error);
+-			return;
+-		}
+-
+-		g_warning ("Failed to acquire idle monitor proxy: %s", error->message);
+-		g_error_free (error);
++		g_critical ("Unable to get idle monitor from object at %s",
++			    g_dbus_object_get_object_path (object));
+ 		return;
+ 	}
+ 
+ 	monitor->priv->proxy = proxy;
+-
+ 	g_signal_connect_object (proxy, "watch-fired", G_CALLBACK (on_watch_fired), monitor, 0);
+ 	g_hash_table_foreach (monitor->priv->watches, add_known_watch, monitor);
+ }
+ 
+ static void
+-connect_proxy (GnomeIdleMonitor *monitor,
+-	       GDBusConnection  *connection,
+-	       const char       *unique_name)
+-{
+-	char *path;
+-	int device_id;
+-
+-	if (monitor->priv->device) {
+-		/* FIXME! Gdk! WTF? */
+-		device_id = gdk_x11_device_get_id (monitor->priv->device);
+-	path = g_strdup_printf ("/org/gnome/Mutter/IdleMonitor/Device%d", device_id);
+-	} else {
+-		path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core");
++on_object_added (GDBusObjectManager	*manager,
++		 GDBusObject		*object,
++		 gpointer		 user_data)
++{
++	GnomeIdleMonitor *monitor = user_data;
++
++	if (!g_str_equal (monitor->priv->path, g_dbus_object_get_object_path (object)))
++		return;
++
++	connect_proxy (object, monitor);
++
++	g_signal_handlers_disconnect_by_func (manager, on_object_added, user_data);
++}
++
++static void
++get_proxy (GnomeIdleMonitor *monitor)
++{
++	GDBusObject *object;
++
++	object = g_dbus_object_manager_get_object (G_DBUS_OBJECT_MANAGER (monitor->priv->om),
++						   monitor->priv->path);
++	if (object) {
++		connect_proxy (object, monitor);
++		g_object_unref (object);
++		return;
+ 	}
+ 
+-	meta_dbus_idle_monitor_proxy_new (connection,
+-					  G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+-					  unique_name, path,
+-					  monitor->priv->cancellable,
+-					  on_proxy_acquired,
+-					  monitor);
++	g_signal_connect_object (monitor->priv->om, "object-added",
++				 G_CALLBACK (on_object_added), monitor, 0);
++}
++
++static void
++on_object_manager_ready (GObject	*source,
++			 GAsyncResult	*res,
++			 gpointer	 user_data)
++{
++	GnomeIdleMonitor *monitor = user_data;
++	GDBusObjectManager *om;
++	GError *error = NULL;
++
++	om = meta_dbus_object_manager_client_new_finish (res, &error);
++	if (!om) {
++		if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
++			g_warning ("Failed to acquire idle monitor object manager: %s", error->message);
++		g_error_free (error);
++		return;
++	}
+ 
+-	g_free (path);
++	monitor->priv->om = META_DBUS_OBJECT_MANAGER_CLIENT (om);
++	get_proxy (monitor);
+ }
+ 
+ static void
+@@ -281,7 +311,13 @@ on_name_appeared (GDBusConnection *connection,
+ {
+ 	GnomeIdleMonitor *monitor = user_data;
+ 
+-	connect_proxy (monitor, connection, name_owner);
++	meta_dbus_object_manager_client_new (connection,
++					     G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
++					     name_owner,
++					     "/org/gnome/Mutter/IdleMonitor",
++					     monitor->priv->cancellable,
++					     on_object_manager_ready,
++					     monitor);
+ }
+ 
+ static void
+@@ -305,6 +341,7 @@ on_name_vanished (GDBusConnection *connection,
+ 
+ 	g_hash_table_foreach (monitor->priv->watches, clear_watch, monitor);
+ 	g_clear_object (&monitor->priv->proxy);
++	g_clear_object (&monitor->priv->om);
+ }
+ 
+ static gboolean
+-- 
+1.8.3.1
+
diff --git a/gnome-desktop3.spec b/gnome-desktop3.spec
index 0859c54..afa6292 100644
--- a/gnome-desktop3.spec
+++ b/gnome-desktop3.spec
@@ -7,10 +7,11 @@
 Summary: Shared code among gnome-panel, gnome-session, nautilus, etc
 Name: gnome-desktop3
 Version: 3.10.2
-Release: 1%{?dist}
+Release: 2%{?dist}
 URL: http://www.gnome.org
 Source0: http://download.gnome.org/sources/gnome-desktop/3.10/gnome-desktop-%{version}.tar.xz
 Patch0: 0001-default-input-sources-Switch-ja_JP-default-to-ibus-k.patch
+Patch1: 0001-idle-monitor-Check-if-a-monitor-exists-before-creati.patch
 
 License: GPLv2+ and LGPLv2+
 Group: System Environment/Libraries
@@ -66,6 +67,7 @@ libgnomedesktop.
 %prep
 %setup -q -n gnome-desktop-%{version}
 %patch0 -p1
+%patch1 -p1
 
 %build
 %configure --with-pnp-ids-path="/usr/share/hwdata/pnp.ids"
@@ -102,6 +104,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.a
 %doc %{_datadir}/gtk-doc/html/gnome-desktop3/
 
 %changelog
+* Tue Nov 26 2013 Rui Matos <rmatos at redhat.com> - 3.10.2-2
+- Resolves: rhbz#1008965 - mouse cursor sometimes disappears on login
+
 * Thu Nov 21 2013 Matthias Clasen <mclasen at redhat.com> - 3.10.2-1.fc20
 - Update to 3.10.2
 


More information about the scm-commits mailing list