[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