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

Bug#691520: marked as done (unblock: gnome-settings-daemon/3.4.2+git20120925.a4c817-2)



Your message dated Sat, 27 Oct 2012 10:22:40 +0100
with message-id <1351329760.5616.20.camel@jacala.jungle.funky-badger.org>
and subject line Re: Bug#691520: unblock: gnome-settings-daemon/3.4.2+git20120925.a4c817-2
has caused the Debian Bug report #691520,
regarding unblock: gnome-settings-daemon/3.4.2+git20120925.a4c817-2
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
691520: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=691520
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Hi,

please unblock gnome-settings-daemon for the fix to two infamous bugs:
 - crash upon startup when CUPS doesn’t answer,
 - infinite loop with NumLock switching.
It should also startup faster.

gnome-settings-daemon (3.4.2+git20120925.a4c817-2) unstable; urgency=low

  * Pull upstream fixes for the print-notifications plugin:
    + 01_print_proxy.patch: don’t create an unused GDBusProxy.
    + 02_print_init.patch: delay CUPS initialization.
    + 03_print_async.patch: test asynchronously whether the CUPS server 
      actually works. Closes: #687978.
  * 11_numlock_loop.patch: patch from Andrew Potter to fix infinite loop 
    triggered by switching the numlock status.
  * gnome-settings-daemon.gsettings-override: dropped, NumLock saving is 
    back to work now.

unblock gnome-settings-daemon/3.4.2+git20120925.a4c817-2

Thanks,
-- 
 .''`.      Josselin Mouette
: :' :
`. `'
  `-
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog	2012-09-29 13:13:39.000000000 +0200
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog	2012-10-26 19:04:58.000000000 +0200
@@ -1,3 +1,17 @@
+gnome-settings-daemon (3.4.2+git20120925.a4c817-2) unstable; urgency=low
+
+  * Pull upstream fixes for the print-notifications plugin:
+    + 01_print_proxy.patch: don’t create an unused GDBusProxy.
+    + 02_print_init.patch: delay CUPS initialization.
+    + 03_print_async.patch: test asynchronously whether the CUPS server 
+      actually works. Closes: #687978.
+  * 11_numlock_loop.patch: patch from Andrew Potter to fix infinite loop 
+    triggered by switching the numlock status.
+  * gnome-settings-daemon.gsettings-override: dropped, NumLock saving is 
+    back to work now.
+
+ -- Josselin Mouette <joss@debian.org>  Fri, 26 Oct 2012 19:04:37 +0200
+
 gnome-settings-daemon (3.4.2+git20120925.a4c817-1) unstable; urgency=low
 
   * debian/g-s-d.gsettings-override: disable remember-numlock-state, 
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override	2012-09-29 12:14:58.000000000 +0200
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override	1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[org.gnome.settings-daemon.peripherals.keyboard]
-remember-numlock-state=false
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch	2012-10-26 18:51:44.000000000 +0200
@@ -0,0 +1,87 @@
+From 4dd2bc1f5ba76663710285d4d9c17172682af56e Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen@redhat.com>
+Date: Sat, 21 Apr 2012 23:26:05 +0000
+Subject: print-notifications: Don't create an unused proxy object
+
+The proxy object was not used for anything, and it was creating
+synchronously.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=674550
+---
+diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c
+index bb9c7b9..44fbbbe 100644
+--- a/plugins/print-notifications/gsd-print-notifications-manager.c
++++ b/plugins/print-notifications/gsd-print-notifications-manager.c
+@@ -54,7 +54,6 @@
+ 
+ struct GsdPrintNotificationsManagerPrivate
+ {
+-        GDBusProxy                   *cups_proxy;
+         GDBusConnection              *cups_bus_connection;
+         gint                          subscription_id;
+         cups_dest_t                  *dests;
+@@ -909,8 +908,6 @@ gboolean
+ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
+                                        GError                      **error)
+ {
+-        GError     *lerror;
+-
+         g_debug ("Starting print-notifications manager");
+ 
+         gnome_settings_profile_start (NULL);
+@@ -925,25 +922,12 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
+ 
+         renew_subscription (manager);
+         g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager);
++        gnome_settings_profile_msg ("renewed subscriptions");
+ 
+         manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
++        gnome_settings_profile_msg ("got dests");
+ 
+-        lerror = NULL;
+-        manager->priv->cups_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+-                                                                   0,
+-                                                                   NULL,
+-                                                                   CUPS_DBUS_NAME,
+-                                                                   CUPS_DBUS_PATH,
+-                                                                   CUPS_DBUS_INTERFACE,
+-                                                                   NULL,
+-                                                                   &lerror);
+-
+-        if (lerror != NULL) {
+-                g_propagate_error (error, lerror);
+-                return FALSE;
+-        }
+-
+-        manager->priv->cups_bus_connection = g_dbus_proxy_get_connection (manager->priv->cups_proxy);
++        manager->priv->cups_bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
+ 
+         g_dbus_connection_signal_subscribe (manager->priv->cups_bus_connection,
+                                             NULL,
+@@ -981,12 +965,7 @@ gsd_print_notifications_manager_stop (GsdPrintNotificationsManager *manager)
+ 
+         g_hash_table_destroy (manager->priv->printing_printers);
+ 
+-        manager->priv->cups_bus_connection = NULL;
+-
+-        if (manager->priv->cups_proxy != NULL) {
+-                g_object_unref (manager->priv->cups_proxy);
+-                manager->priv->cups_proxy = NULL;
+-        }
++        g_clear_object (&manager->priv->cups_bus_connection);
+ 
+         for (tmp = manager->priv->timeouts; tmp; tmp = g_list_next (tmp)) {
+                 data = (TimeoutData *) tmp->data;
+@@ -1058,10 +1037,6 @@ gsd_print_notifications_manager_finalize (GObject *object)
+ 
+         g_return_if_fail (manager->priv != NULL);
+ 
+-        if (manager->priv->cups_proxy != NULL) {
+-                g_object_unref (manager->priv->cups_proxy);
+-        }
+-
+         G_OBJECT_CLASS (gsd_print_notifications_manager_parent_class)->finalize (object);
+ }
+ 
+--
+cgit v0.9.0.2
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch	2012-10-26 18:51:44.000000000 +0200
@@ -0,0 +1,89 @@
+From 5f1df8fc7767b9d5967bbbe988346f22995a6285 Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen@redhat.com>
+Date: Mon, 23 Apr 2012 15:14:28 +0000
+Subject: printers: Move expensive initialization to an idle
+
+The start() function is running before gsd finishes its
+session registration, so everything we do here is in the
+critical path for session startup. Both cupsGetDests and
+the subscription registration are potentially expensive,
+and can very well be done later.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=674551
+---
+diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c
+index 44fbbbe..33e6452 100644
+--- a/plugins/print-notifications/gsd-print-notifications-manager.c
++++ b/plugins/print-notifications/gsd-print-notifications-manager.c
+@@ -904,25 +904,17 @@ renew_subscription (gpointer data)
+         return TRUE;
+ }
+ 
+-gboolean
+-gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
+-                                       GError                      **error)
++static gboolean
++gsd_print_notifications_manager_start_idle (gpointer data)
+ {
+-        g_debug ("Starting print-notifications manager");
++        GsdPrintNotificationsManager *manager = data;
+ 
+         gnome_settings_profile_start (NULL);
+ 
+-        manager->priv->subscription_id = -1;
+-        manager->priv->dests = NULL;
+-        manager->priv->num_dests = 0;
+-        manager->priv->scp_handler_spawned = FALSE;
+-        manager->priv->timeouts = NULL;
+         manager->priv->printing_printers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+-        manager->priv->active_notifications = NULL;
+ 
+         renew_subscription (manager);
+         g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager);
+-        gnome_settings_profile_msg ("renewed subscriptions");
+ 
+         manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
+         gnome_settings_profile_msg ("got dests");
+@@ -944,6 +936,30 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
+ 
+         gnome_settings_profile_end (NULL);
+ 
++        return G_SOURCE_REMOVE;
++}
++
++gboolean
++gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
++                                       GError                      **error)
++{
++        g_debug ("Starting print-notifications manager");
++
++        gnome_settings_profile_start (NULL);
++
++        manager->priv->subscription_id = -1;
++        manager->priv->dests = NULL;
++        manager->priv->num_dests = 0;
++        manager->priv->scp_handler_spawned = FALSE;
++        manager->priv->timeouts = NULL;
++        manager->priv->printing_printers = NULL;
++        manager->priv->active_notifications = NULL;
++        manager->priv->cups_bus_connection = NULL;
++
++        g_idle_add (gsd_print_notifications_manager_start_idle, manager);
++
++        gnome_settings_profile_end (NULL);
++
+         return TRUE;
+ }
+ 
+@@ -963,7 +979,8 @@ gsd_print_notifications_manager_stop (GsdPrintNotificationsManager *manager)
+         if (manager->priv->subscription_id >= 0)
+                 cancel_subscription (manager->priv->subscription_id);
+ 
+-        g_hash_table_destroy (manager->priv->printing_printers);
++        if (manager->priv->printing_printers)
++                g_hash_table_destroy (manager->priv->printing_printers);
+ 
+         g_clear_object (&manager->priv->cups_bus_connection);
+ 
+--
+cgit v0.9.0.2
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch	2012-10-26 18:51:44.000000000 +0200
@@ -0,0 +1,209 @@
+From f2da010bb2423ff8d797306d7b0bdcd6f33c93f8 Mon Sep 17 00:00:00 2001
+From: Marek Kasik <mkasik@redhat.com>
+Date: Tue, 26 Jun 2012 12:04:29 +0000
+Subject: print-notifications: Perform async connection tests to CUPS during start
+
+Perform asynchronous connection tests before getting destinations
+from CUPS server and before creating a subscription for CUPS
+messages (#677081).
+---
+diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c
+index 33e6452..0092865 100644
+--- a/plugins/print-notifications/gsd-print-notifications-manager.c
++++ b/plugins/print-notifications/gsd-print-notifications-manager.c
+@@ -47,10 +47,11 @@
+ #define CUPS_DBUS_PATH      "/org/cups/cupsd/Notifier"
+ #define CUPS_DBUS_INTERFACE "org.cups.cupsd.Notifier"
+ 
+-#define RENEW_INTERVAL        3500
+-#define SUBSCRIPTION_DURATION 3600
+-#define CONNECTING_TIMEOUT    60
+-#define REASON_TIMEOUT        15000
++#define RENEW_INTERVAL                   3500
++#define SUBSCRIPTION_DURATION            3600
++#define CONNECTING_TIMEOUT               60
++#define REASON_TIMEOUT                   15000
++#define CUPS_CONNECTION_TEST_INTERVAL    300
+ 
+ struct GsdPrintNotificationsManagerPrivate
+ {
+@@ -63,6 +64,7 @@ struct GsdPrintNotificationsManagerPrivate
+         GList                        *timeouts;
+         GHashTable                   *printing_printers;
+         GList                        *active_notifications;
++        guint                         cups_connection_timeout_id;
+ };
+ 
+ enum {
+@@ -72,6 +74,7 @@ enum {
+ static void     gsd_print_notifications_manager_class_init  (GsdPrintNotificationsManagerClass *klass);
+ static void     gsd_print_notifications_manager_init        (GsdPrintNotificationsManager      *print_notifications_manager);
+ static void     gsd_print_notifications_manager_finalize    (GObject                           *object);
++static gboolean cups_connection_test                        (gpointer                           user_data);
+ 
+ G_DEFINE_TYPE (GsdPrintNotificationsManager, gsd_print_notifications_manager, G_TYPE_OBJECT)
+ 
+@@ -904,6 +907,140 @@ renew_subscription (gpointer data)
+         return TRUE;
+ }
+ 
++static void
++renew_subscription_with_connection_test_cb (GObject      *source_object,
++                                            GAsyncResult *res,
++                                            gpointer      user_data)
++{
++        GSocketConnection *connection;
++        GError            *error = NULL;
++
++        connection = g_socket_client_connect_to_host_finish (G_SOCKET_CLIENT (source_object),
++                                                             res,
++                                                             &error);
++
++        if (connection) {
++                g_debug ("Test connection to CUPS server \'%s:%d\' succeeded.", cupsServer (), ippPort ());
++
++                g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
++                g_object_unref (connection);
++
++                renew_subscription (user_data);
++        }
++        else {
++                g_debug ("Test connection to CUPS server \'%s:%d\' failed.", cupsServer (), ippPort ());
++        }
++}
++
++static gboolean
++renew_subscription_with_connection_test (gpointer user_data)
++{
++        GSocketClient *client;
++        gchar         *address;
++
++        address = g_strdup_printf ("%s:%d", cupsServer (), ippPort ());
++
++        if (address && address[0] != '/') {
++                client = g_socket_client_new ();
++
++                g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), ippPort ());
++
++                g_socket_client_connect_to_host_async (client,
++                                                       address,
++                                                       631,
++                                                       NULL,
++                                                       renew_subscription_with_connection_test_cb,
++                                                       user_data);
++
++                g_object_unref (client);
++        }
++        else {
++                renew_subscription (user_data);
++        }
++
++        g_free (address);
++
++        return TRUE;
++}
++
++static void
++cups_connection_test_cb (GObject      *source_object,
++                         GAsyncResult *res,
++                         gpointer      user_data)
++{
++        GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data;
++        GSocketConnection            *connection;
++        GError                       *error = NULL;
++
++        connection = g_socket_client_connect_to_host_finish (G_SOCKET_CLIENT (source_object),
++                                                             res,
++                                                             &error);
++
++        if (connection) {
++                g_debug ("Test connection to CUPS server \'%s:%d\' succeeded.", cupsServer (), ippPort ());
++
++                g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
++                g_object_unref (connection);
++
++                manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
++                gnome_settings_profile_msg ("got dests");
++
++                renew_subscription (user_data);
++                g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription_with_connection_test, manager);
++        }
++        else {
++                g_debug ("Test connection to CUPS server \'%s:%d\' failed.", cupsServer (), ippPort ());
++                if (manager->priv->cups_connection_timeout_id == 0)
++                        manager->priv->cups_connection_timeout_id =
++                                g_timeout_add_seconds (CUPS_CONNECTION_TEST_INTERVAL, cups_connection_test, manager);
++        }
++}
++
++static gboolean
++cups_connection_test (gpointer user_data)
++{
++        GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data;
++        GSocketClient                *client;
++        gchar                        *address;
++
++        if (!manager->priv->dests) {
++                address = g_strdup_printf ("%s:%d", cupsServer (), ippPort ());
++
++                if (address && address[0] != '/') {
++                        client = g_socket_client_new ();
++
++                        g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), ippPort ());
++
++                        g_socket_client_connect_to_host_async (client,
++                                                               address,
++                                                               631,
++                                                               NULL,
++                                                               cups_connection_test_cb,
++                                                               manager);
++
++                        g_object_unref (client);
++                }
++                else {
++                        manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
++                        gnome_settings_profile_msg ("got dests");
++
++                        renew_subscription (user_data);
++                        g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription_with_connection_test, manager);
++                }
++
++                g_free (address);
++        }
++
++        if (manager->priv->dests) {
++                manager->priv->cups_connection_timeout_id = 0;
++
++                return FALSE;
++        }
++        else {
++                return TRUE;
++        }
++}
++
+ static gboolean
+ gsd_print_notifications_manager_start_idle (gpointer data)
+ {
+@@ -913,11 +1050,7 @@ gsd_print_notifications_manager_start_idle (gpointer data)
+ 
+         manager->priv->printing_printers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+ 
+-        renew_subscription (manager);
+-        g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager);
+-
+-        manager->priv->num_dests = cupsGetDests (&manager->priv->dests);
+-        gnome_settings_profile_msg ("got dests");
++        cups_connection_test (manager);
+ 
+         manager->priv->cups_bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
+ 
+@@ -955,6 +1088,7 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager,
+         manager->priv->printing_printers = NULL;
+         manager->priv->active_notifications = NULL;
+         manager->priv->cups_bus_connection = NULL;
++        manager->priv->cups_connection_timeout_id = 0;
+ 
+         g_idle_add (gsd_print_notifications_manager_start_idle, manager);
+ 
+--
+cgit v0.9.0.2
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch	1970-01-01 01:00:00.000000000 +0100
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch	2012-10-26 19:04:58.000000000 +0200
@@ -0,0 +1,82 @@
+commit 82c7fcf7fd4fe43e73ea5ce6408c79d35ec3dfb8
+Author: Andrew Potter <agpotter@gmail.com>
+Date:   Wed Oct 24 13:52:09 2012 -0700
+
+    keyboard: Prevent potential infinite loop
+    
+    Ensure we don't set the numlock setting in response to our own
+    numlock-setting event.
+    
+    https://bugzilla.gnome.org/show_bug.cgi?id=679151
+
+diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
+index a33460c..1519510 100644
+--- a/plugins/keyboard/gsd-keyboard-manager.c
++++ b/plugins/keyboard/gsd-keyboard-manager.c
+@@ -73,6 +73,7 @@ struct GsdKeyboardManagerPrivate
+         gboolean   have_xkb;
+         gint       xkb_event_base;
+         GsdNumLockState old_state;
++        gulong     numlock_serial;
+ };
+ 
+ static void     gsd_keyboard_manager_class_init  (GsdKeyboardManagerClass *klass);
+@@ -128,13 +129,15 @@ numlock_NumLock_modifier_mask (void)
+ }
+ 
+ static void
+-numlock_set_xkb_state (GsdNumLockState new_state)
++numlock_set_xkb_state (GsdKeyboardManager *manager)
+ {
+         unsigned int num_mask;
+         Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
++        GsdNumLockState new_state = manager->priv->old_state;
+         if (new_state != GSD_NUM_LOCK_STATE_ON && new_state != GSD_NUM_LOCK_STATE_OFF)
+                 return;
+         num_mask = numlock_NumLock_modifier_mask ();
++        manager->priv->numlock_serial = NextRequest(dpy);
+         XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state == GSD_NUM_LOCK_STATE_ON ? num_mask : 0);
+ }
+ 
+@@ -156,16 +159,18 @@ numlock_xkb_callback (GdkXEvent *xev_,
+ 	if (xkbev->state.changed & XkbModifierLockMask) {
+ 		unsigned num_mask = numlock_NumLock_modifier_mask ();
+ 		unsigned locked_mods = xkbev->state.locked_mods;
++                unsigned long serial = xkbev->state.serial;
+ 		GsdNumLockState numlock_state;
+ 
+ 		numlock_state = (num_mask & locked_mods) ? GSD_NUM_LOCK_STATE_ON : GSD_NUM_LOCK_STATE_OFF;
+ 
+-		if (numlock_state != manager->priv->old_state) {
+-			g_settings_set_enum (manager->priv->settings,
+-					     KEY_NUMLOCK_STATE,
+-					     numlock_state);
+-			manager->priv->old_state = numlock_state;
+-		}
++		if (numlock_state != manager->priv->old_state
++                    && serial > manager->priv->numlock_serial) {
++                                g_settings_set_enum (manager->priv->settings,
++                                                     KEY_NUMLOCK_STATE,
++                                                     numlock_state);
++                                manager->priv->old_state = numlock_state;
++                }
+ 	}
+ 
+         return GDK_FILTER_CONTINUE;
+@@ -254,7 +259,7 @@ apply_settings (GSettings          *settings,
+         manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE);
+ 
+         if (manager->priv->have_xkb && rnumlock)
+-                numlock_set_xkb_state (manager->priv->old_state);
++                numlock_set_xkb_state (manager);
+ 
+         XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE);
+         gdk_error_trap_pop_ignored ();
+@@ -359,6 +364,7 @@ static void
+ gsd_keyboard_manager_init (GsdKeyboardManager *manager)
+ {
+         manager->priv = GSD_KEYBOARD_MANAGER_GET_PRIVATE (manager);
++        manager->priv->numlock_serial = G_MAXULONG;
+ }
+ 
+ static void
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series
--- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series	2012-09-29 13:12:40.000000000 +0200
+++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series	2012-10-26 19:04:58.000000000 +0200
@@ -1,5 +1,9 @@
+01_print_proxy.patch
+02_print_init.patch
+03_print_async.patch
 04_superP.patch
 10_smaller_syndaemon_timeout.patch
+11_numlock_loop.patch
 power-check-null-devices.patch
 power-ignore-bad-dbus-requests.patch
 revert_git_datetime_dropping.patch

--- End Message ---
--- Begin Message ---
On Fri, 2012-10-26 at 19:31 +0200, Josselin Mouette wrote:
> please unblock gnome-settings-daemon for the fix to two infamous bugs:
>  - crash upon startup when CUPS doesn’t answer,
>  - infinite loop with NumLock switching.
> It should also startup faster.

Unblocked; thanks.

Regards,

Adam

--- End Message ---

Reply to: