[gtk+] GtkComboBox: Improve gtk_combo_box_set_active_id



commit 7ae4a06d1f2591a95f521660a587b3d28a756e69
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Apr 26 07:59:53 2011 -0400

    GtkComboBox: Improve gtk_combo_box_set_active_id
    
    - Passing a NULL ID string should be equivalent to
      gtk_combo_box_set_active (combo_box, -1).
    - Use g_strcmp0() instead of strcmp() when comparing
      ID strings to avoid a crash when an ID is NULL.
    - Return a boolean indicating if the ID was found or not.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=647806

 gtk/gtkcombobox.c |   44 ++++++++++++++++++++++++++++++--------------
 gtk/gtkcombobox.h |    2 +-
 2 files changed, 31 insertions(+), 15 deletions(-)
---
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 98d3e0c..dfd27d8 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -5594,15 +5594,16 @@ gtk_combo_box_get_id_column (GtkComboBox *combo_box)
  * @combo_box: a #GtkComboBox
  *
  * Returns the ID of the active row of @combo_box.  This value is taken
- * from the active row and the column specified by the 'id-column'
+ * from the active row and the column specified by the #GtkComboBox:id-column
  * property of @combo_box (see gtk_combo_box_set_id_column()).
  *
  * The returned value is an interned string which means that you can
  * compare the pointer by value to other interned strings and that you
  * must not free it.
  *
- * If the 'id-column' property of @combo_box is not set or if no row is
- * selected then %NULL is returned.
+ * If the #GtkComboBox:id-column property of @combo_box is not set, or if
+ * no row is active, or if the active row has a %NULL ID value, then %NULL
+ * is returned.
  *
  * Return value: the ID of the active row, or %NULL
  *
@@ -5644,41 +5645,54 @@ gtk_combo_box_get_active_id (GtkComboBox *combo_box)
 /**
  * gtk_combo_box_set_active_id:
  * @combo_box: a #GtkComboBox
- * @active_id: the ID of the row to select
+ * @active_id: (allow-none): the ID of the row to select, or %NULL
  *
- * Changes the active row of @combo_box to the one that has an ID equal to @id.
+ * Changes the active row of @combo_box to the one that has an ID equal to
+ * @active_id, or unsets the active row if @active_id is %NULL.  Rows having
+ * a %NULL ID string cannot be made active by this function.
  *
- * If the 'id-column' property of @combo_box is unset or if no row has
- * the given ID then nothing happens.
+ * If the #GtkComboBox:id-column property of @combo_box is unset or if no
+ * row has the given ID then the function does nothing and returns %FALSE.
+ *
+ * Returns: %TRUE if a row with a matching ID was found.  If a %NULL
+ *          @active_id was given to unset the active row, the function
+ *          always returns %TRUE.
  *
  * Since: 3.0
  **/
-void
+gboolean
 gtk_combo_box_set_active_id (GtkComboBox *combo_box,
                              const gchar *active_id)
 {
   GtkTreeModel *model;
   GtkTreeIter iter;
+  gboolean match = FALSE;
   gint column;
 
-  g_return_if_fail (GTK_IS_COMBO_BOX (combo_box));
+  g_return_val_if_fail (GTK_IS_COMBO_BOX (combo_box), FALSE);
+
+  if (active_id == NULL)
+    {
+      gtk_combo_box_set_active (combo_box, -1);
+      return TRUE;  /* active row was successfully unset */
+    }
 
   column = combo_box->priv->id_column;
 
   if (column < 0)
-    return;
+    return FALSE;
 
   model = gtk_combo_box_get_model (combo_box);
-  g_return_if_fail (gtk_tree_model_get_column_type (model, column) ==
-                    G_TYPE_STRING);
+  g_return_val_if_fail (gtk_tree_model_get_column_type (model, column) ==
+                        G_TYPE_STRING, FALSE);
 
   if (gtk_tree_model_get_iter_first (model, &iter))
     do {
-      gboolean match;
       gchar *id;
 
       gtk_tree_model_get (model, &iter, column, &id, -1);
-      match = strcmp (id, active_id) == 0;
+      if (id != NULL)
+        match = strcmp (id, active_id) == 0;
       g_free (id);
 
       if (match)
@@ -5687,4 +5701,6 @@ gtk_combo_box_set_active_id (GtkComboBox *combo_box,
           break;
         }
     } while (gtk_tree_model_iter_next (model, &iter));
+
+    return match;
 }
diff --git a/gtk/gtkcombobox.h b/gtk/gtkcombobox.h
index 124a9bf..6156659 100644
--- a/gtk/gtkcombobox.h
+++ b/gtk/gtkcombobox.h
@@ -140,7 +140,7 @@ gint          gtk_combo_box_get_id_column        (GtkComboBox *combo_box);
 void          gtk_combo_box_set_id_column        (GtkComboBox *combo_box,
                                                   gint         id_column);
 const gchar * gtk_combo_box_get_active_id        (GtkComboBox *combo_box);
-void          gtk_combo_box_set_active_id        (GtkComboBox *combo_box,
+gboolean      gtk_combo_box_set_active_id        (GtkComboBox *combo_box,
                                                   const gchar *active_id);
 
 G_END_DECLS



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