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 +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 - 3.10.2-2 +- Resolves: rhbz#1008965 - mouse cursor sometimes disappears on login + * Thu Nov 21 2013 Matthias Clasen - 3.10.2-1.fc20 - Update to 3.10.2