++ gnome-screensaver-2.28.0/debian/patches/09_remove_session_inhibitors.patch Description: Fix issue when applications leave inhibitors behind. Origin: upstream, http://git.gnome.org/cgit/gnome-screensaver/commit/?id=284c9924969a49dbf2d5fae1d680d3310c4df4a3 Bug: https://bugzilla.gnome.org/show_bug.cgi?id=600488 Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/411350 diff -Nur -x '*.orig' -x '*~' gnome-screensaver-2.28.0/src/gs-listener-dbus.c gnome-screensaver-2.28.0.new/src/gs-listener-dbus.c --- gnome-screensaver-2.28.0/src/gs-listener-dbus.c 2009-08-19 19:19:14.000000000 -0400 +++ gnome-screensaver-2.28.0.new/src/gs-listener-dbus.c 2009-12-03 12:46:58.000000000 -0500 @@ -985,47 +985,40 @@ } static gboolean -listener_ref_entry_has_connection (gpointer key, - gpointer value, - gpointer user_data) -{ - GSListenerRefEntry *entry; - const char *connection; - gboolean matches; - - entry = (GSListenerRefEntry *)value; - connection = (const char *) user_data; - - matches = FALSE; - if (connection != NULL && entry->connection != NULL) { - matches = (strcmp (connection, entry->connection) == 0); - if (matches) { - gs_debug ("removing %s from %s for reason '%s' on connection %s", - get_name_for_entry_type (entry->entry_type), - entry->application, - entry->reason, - entry->connection); - } - } - - return matches; -} - -static gboolean listener_ref_entry_remove_for_connection (GSListener *listener, int entry_type, const char *connection) { gboolean removed; - guint n_removed; GHashTable *hash; + GHashTableIter iter; + GSListenerRefEntry *entry; + + if (connection == NULL) + return FALSE; hash = get_hash_for_entry_type (listener, entry_type); removed = FALSE; - n_removed = g_hash_table_foreach_remove (hash, listener_ref_entry_has_connection, (gpointer)connection); + g_hash_table_iter_init (&iter, hash); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&entry)) { + if (entry->connection != NULL && + strcmp (connection, entry->connection) == 0) { + gs_debug ("removing %s from %s for reason '%s' on connection %s", + get_name_for_entry_type (entry->entry_type), + entry->application, + entry->reason, + entry->connection); + + if (entry->entry_type == REF_ENTRY_TYPE_INHIBIT) { + /* remove inhibit from gnome session */ + remove_session_inhibit (listener, entry); + } - removed = (n_removed > 0); + g_hash_table_iter_remove (&iter); + removed = TRUE; + } + } return removed; }