Blob Blame History Raw
From 49383786d96414e7204ea50ca5ea0263be97b581 Mon Sep 17 00:00:00 2001
From: xiaoguang wang <xwang@suse.com>
Date: Wed, 20 Feb 2019 09:26:02 +0800
Subject: [PATCH 40/51] display-store: make foreach ignore callback return
 value

gdm_display_store_foreach is designed to iterate through all
displays in the display store.  Under the hood, it currently
uses gdm_display_store_find, though, so will prematurely stop
it's loop if a callback returns TRUE.  Callers are getting this
wrong.  Some return TRUE with the expectation it goes on, and
some fail to return a value at all.

This commit changes gdm_display_store_foreach to use
g_hash_table_foreach instead, so the callback return values no
longer matter.
---
 daemon/gdm-display-store.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/daemon/gdm-display-store.c b/daemon/gdm-display-store.c
index fd24334eb..910468cd7 100644
--- a/daemon/gdm-display-store.c
+++ b/daemon/gdm-display-store.c
@@ -119,76 +119,86 @@ remove_display (char              *id,
 }
 
 gboolean
 gdm_display_store_remove (GdmDisplayStore    *store,
                           GdmDisplay         *display)
 {
         g_return_val_if_fail (store != NULL, FALSE);
 
         gdm_display_store_foreach_remove (store,
                                           (GdmDisplayStoreFunc)remove_display,
                                           display);
         return FALSE;
 }
 
 typedef struct
 {
         GdmDisplayStoreFunc predicate;
         gpointer            user_data;
 } FindClosure;
 
 static gboolean
 find_func (const char    *id,
            StoredDisplay *stored_display,
            FindClosure   *closure)
 {
         return closure->predicate (id,
                                    stored_display->display,
                                    closure->user_data);
 }
 
+static void
+foreach_func (const char    *id,
+              StoredDisplay *stored_display,
+              FindClosure   *closure)
+{
+        (void) closure->predicate (id,
+                                   stored_display->display,
+                                   closure->user_data);
+}
+
 void
 gdm_display_store_foreach (GdmDisplayStore    *store,
                            GdmDisplayStoreFunc func,
                            gpointer            user_data)
 {
         FindClosure  closure;
 
         g_return_if_fail (store != NULL);
         g_return_if_fail (func != NULL);
 
         closure.predicate = func;
         closure.user_data = user_data;
 
-        g_hash_table_find (store->priv->displays,
-                           (GHRFunc) find_func,
-                           &closure);
+        g_hash_table_foreach (store->priv->displays,
+                              (GHFunc) foreach_func,
+                              &closure);
 }
 
 GdmDisplay *
 gdm_display_store_lookup (GdmDisplayStore *store,
                           const char      *id)
 {
         StoredDisplay *stored_display;
 
         g_return_val_if_fail (store != NULL, NULL);
         g_return_val_if_fail (id != NULL, NULL);
 
         stored_display = g_hash_table_lookup (store->priv->displays,
                                               id);
         if (stored_display == NULL) {
                 return NULL;
         }
 
         return stored_display->display;
 }
 
 GdmDisplay *
 gdm_display_store_find (GdmDisplayStore    *store,
                         GdmDisplayStoreFunc predicate,
                         gpointer            user_data)
 {
         StoredDisplay *stored_display;
         FindClosure    closure;
 
         g_return_val_if_fail (store != NULL, NULL);
         g_return_val_if_fail (predicate != NULL, NULL);
-- 
2.27.0