[gtk/wip/otte/for-master: 2/10] listmodels: Stop respecting item-type



commit c85fd97225d9366d250466c2daeea76aedf2b97f
Author: Benjamin Otte <otte redhat com>
Date:   Sat Jul 4 21:47:48 2020 +0200

    listmodels: Stop respecting item-type
    
    Simplify all view model APIs and always return G_TYPE_OBJECT as the
    item-type for every model.
    
    It turns out nobody uses item-type anyway.
    
    So instead of adding lots of APIs, forcing people to think about it and
    trying to figure out how to handle filter or map models that modify item
    types, just having an easy life is a better approach.
    
    All the models need to be able to deal with any type of object going
    through anyway.

 demos/constraint-editor/constraint-view.c |  2 +-
 docs/reference/gtk/gtk4-sections.txt      |  3 --
 gtk/gtkcustompaperunixdialog.c            |  2 +-
 gtk/gtkfilterlistmodel.c                  | 52 +++--------------------------
 gtk/gtkfilterlistmodel.h                  |  2 --
 gtk/gtkflattenlistmodel.c                 | 46 +++-----------------------
 gtk/gtkflattenlistmodel.h                 |  3 +-
 gtk/gtkfontchooserwidget.c                |  2 +-
 gtk/gtkmaplistmodel.c                     | 37 ++-------------------
 gtk/gtkmaplistmodel.h                     |  3 +-
 gtk/gtkmultiselection.c                   |  4 +--
 gtk/gtknoselection.c                      |  4 +--
 gtk/gtkpagesetupunixdialog.c              |  4 +--
 gtk/gtkprintunixdialog.c                  |  4 +--
 gtk/gtkshortcutmanager.c                  |  4 +--
 gtk/gtksingleselection.c                  |  4 +--
 gtk/gtkslicelistmodel.c                   | 50 ++--------------------------
 gtk/gtkslicelistmodel.h                   |  2 --
 gtk/gtksortlistmodel.c                    | 55 ++-----------------------------
 gtk/gtksortlistmodel.h                    |  3 --
 gtk/gtktreelistmodel.c                    | 12 +------
 gtk/inspector/controllers.c               |  4 +--
 gtk/inspector/object-tree.c               | 14 ++++----
 testsuite/gtk/expression.c                |  2 +-
 testsuite/gtk/flattenlistmodel.c          |  2 +-
 testsuite/gtk/maplistmodel.c              |  2 +-
 testsuite/gtk/slicelistmodel.c            |  6 +---
 testsuite/gtk/sortlistmodel.c             |  2 +-
 28 files changed, 46 insertions(+), 284 deletions(-)
---
diff --git a/demos/constraint-editor/constraint-view.c b/demos/constraint-editor/constraint-view.c
index 76b4acd848..c9d08acab8 100644
--- a/demos/constraint-editor/constraint-view.c
+++ b/demos/constraint-editor/constraint-view.c
@@ -188,7 +188,7 @@ constraint_view_init (ConstraintView *self)
   g_list_store_append (list, children);
   g_list_store_append (list, guides);
   g_list_store_append (list, constraints);
-  self->model = G_LIST_MODEL (gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (list)));
+  self->model = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
   g_object_unref (children);
   g_object_unref (guides);
   g_object_unref (constraints);
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 208151976c..15bdac5bc3 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1539,7 +1539,6 @@ gtk_custom_filter_get_type
 <TITLE>GtkFilterListModel</TITLE>
 GtkFilterListModel
 gtk_filter_list_model_new
-gtk_filter_list_model_new_for_type
 gtk_filter_list_model_set_model
 gtk_filter_list_model_get_model
 gtk_filter_list_model_set_filter
@@ -2698,7 +2697,6 @@ gtk_size_group_get_type
 <TITLE>GtkSliceListModel</TITLE>
 GtkSliceListModel
 gtk_slice_list_model_new
-gtk_slice_list_model_new_for_type
 gtk_slice_list_model_set_model
 gtk_slice_list_model_get_model
 gtk_slice_list_model_set_offset
@@ -2830,7 +2828,6 @@ gtk_tree_list_row_sorter_get_type
 <TITLE>GtkSortListModel</TITLE>
 GtkSortListModel
 gtk_sort_list_model_new
-gtk_sort_list_model_new_for_type
 gtk_sort_list_model_set_sorter
 gtk_sort_list_model_get_sorter
 gtk_sort_list_model_set_model
diff --git a/gtk/gtkcustompaperunixdialog.c b/gtk/gtkcustompaperunixdialog.c
index 608a637c88..75e471689c 100644
--- a/gtk/gtkcustompaperunixdialog.c
+++ b/gtk/gtkcustompaperunixdialog.c
@@ -321,7 +321,7 @@ gtk_custom_paper_unix_dialog_init (GtkCustomPaperUnixDialog *dialog)
   g_list_store_append (printer_list_list, printer_list);
   g_object_unref (printer_list);
 
-  full_list = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PRINTER, G_LIST_MODEL (printer_list_list)));
+  full_list = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (printer_list_list)));
   g_object_unref (printer_list_list);
 
   filter = gtk_custom_filter_new (match_func, NULL, NULL);
diff --git a/gtk/gtkfilterlistmodel.c b/gtk/gtkfilterlistmodel.c
index af29154fcb..12a456ca8a 100644
--- a/gtk/gtkfilterlistmodel.c
+++ b/gtk/gtkfilterlistmodel.c
@@ -40,7 +40,6 @@
 enum {
   PROP_0,
   PROP_FILTER,
-  PROP_ITEM_TYPE,
   PROP_MODEL,
   NUM_PROPERTIES
 };
@@ -63,7 +62,6 @@ struct _GtkFilterListModel
 {
   GObject parent_instance;
 
-  GType item_type;
   GListModel *model;
   GtkFilter *filter;
   GtkFilterMatch strictness;
@@ -194,9 +192,7 @@ gtk_filter_list_model_get_nth (GtkRbTree *tree,
 static GType
 gtk_filter_list_model_get_item_type (GListModel *list)
 {
-  GtkFilterListModel *self = GTK_FILTER_LIST_MODEL (list);
-
-  return self->item_type;
+  return G_TYPE_OBJECT;
 }
 
 static guint
@@ -364,10 +360,6 @@ gtk_filter_list_model_set_property (GObject      *object,
       gtk_filter_list_model_set_filter (self, g_value_get_object (value));
       break;
 
-    case PROP_ITEM_TYPE:
-      self->item_type = g_value_get_gtype (value);
-      break;
-
     case PROP_MODEL:
       gtk_filter_list_model_set_model (self, g_value_get_object (value));
       break;
@@ -392,10 +384,6 @@ gtk_filter_list_model_get_property (GObject     *object,
       g_value_set_object (value, self->filter);
       break;
 
-    case PROP_ITEM_TYPE:
-      g_value_set_gtype (value, self->item_type);
-      break;
-
     case PROP_MODEL:
       g_value_set_object (value, self->model);
       break;
@@ -662,18 +650,6 @@ gtk_filter_list_model_class_init (GtkFilterListModelClass *class)
                            GTK_TYPE_FILTER,
                            GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
-  /**
-   * GtkFilterListModel:item-type:
-   *
-   * The #GType for elements of this object
-   */
-  properties[PROP_ITEM_TYPE] =
-      g_param_spec_gtype ("item-type",
-                          P_("Item type"),
-                          P_("The type of elements of this object"),
-                          G_TYPE_OBJECT,
-                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GtkFilterListModel:model:
    *
@@ -697,7 +673,7 @@ gtk_filter_list_model_init (GtkFilterListModel *self)
 
 /**
  * gtk_filter_list_model_new:
- * @model: the model to sort
+ * @model: (allow-none): the model to sort
  * @filter: (allow-none): filter or %NULL to not filter items
  *
  * Creates a new #GtkFilterListModel that will filter @model using the given
@@ -711,10 +687,10 @@ gtk_filter_list_model_new (GListModel *model,
 {
   GtkFilterListModel *result;
 
-  g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
+  g_return_val_if_fail (model == NULL || G_IS_LIST_MODEL (model), NULL);
+  g_return_val_if_fail (filter == NULL || GTK_IS_FILTER (filter), NULL);
 
   result = g_object_new (GTK_TYPE_FILTER_LIST_MODEL,
-                         "item-type", g_list_model_get_item_type (model),
                          "model", model,
                          "filter", filter,
                          NULL);
@@ -722,26 +698,6 @@ gtk_filter_list_model_new (GListModel *model,
   return result;
 }
 
-/**
- * gtk_filter_list_model_new_for_type:
- * @item_type: the type of the items that will be returned
- *
- * Creates a new empty filter list model set up to return items of type @item_type.
- * It is up to the application to set a proper filter and model to ensure
- * the item type is matched.
- *
- * Returns: a new #GtkFilterListModel
- **/
-GtkFilterListModel *
-gtk_filter_list_model_new_for_type (GType item_type)
-{
-  g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
-
-  return g_object_new (GTK_TYPE_FILTER_LIST_MODEL,
-                       "item-type", item_type,
-                       NULL);
-}
-
 /**
  * gtk_filter_list_model_set_filter:
  * @self: a #GtkFilterListModel
diff --git a/gtk/gtkfilterlistmodel.h b/gtk/gtkfilterlistmodel.h
index fcb8dfab5c..c496f302c5 100644
--- a/gtk/gtkfilterlistmodel.h
+++ b/gtk/gtkfilterlistmodel.h
@@ -39,8 +39,6 @@ G_DECLARE_FINAL_TYPE (GtkFilterListModel, gtk_filter_list_model, GTK, FILTER_LIS
 GDK_AVAILABLE_IN_ALL
 GtkFilterListModel *    gtk_filter_list_model_new               (GListModel             *model,
                                                                  GtkFilter              *filter);
-GDK_AVAILABLE_IN_ALL
-GtkFilterListModel *    gtk_filter_list_model_new_for_type      (GType                   item_type);
 
 GDK_AVAILABLE_IN_ALL
 void                    gtk_filter_list_model_set_filter        (GtkFilterListModel     *self,
diff --git a/gtk/gtkflattenlistmodel.c b/gtk/gtkflattenlistmodel.c
index 78ea061a53..fe681b265e 100644
--- a/gtk/gtkflattenlistmodel.c
+++ b/gtk/gtkflattenlistmodel.c
@@ -40,7 +40,6 @@
 
 enum {
   PROP_0,
-  PROP_ITEM_TYPE,
   PROP_MODEL,
   NUM_PROPERTIES
 };
@@ -64,7 +63,6 @@ struct _GtkFlattenListModel
 {
   GObject parent_instance;
 
-  GType item_type;
   GListModel *model;
   GtkRbTree *items; /* NULL if model == NULL */
 };
@@ -157,9 +155,7 @@ gtk_flatten_list_model_get_nth_model (GtkRbTree *tree,
 static GType
 gtk_flatten_list_model_get_item_type (GListModel *list)
 {
-  GtkFlattenListModel *self = GTK_FLATTEN_LIST_MODEL (list);
-
-  return self->item_type;
+  return G_TYPE_OBJECT;
 }
 
 static guint
@@ -299,7 +295,6 @@ gtk_flatten_list_model_add_items (GtkFlattenListModel *self,
     {
       node = gtk_rb_tree_insert_before (self->items, after);
       node->model = g_list_model_get_item (self->model, position + i);
-      g_warn_if_fail (g_type_is_a (g_list_model_get_item_type (node->model), self->item_type));
       g_signal_connect (node->model,
                         "items-changed",
                         G_CALLBACK (gtk_flatten_list_model_items_changed_cb),
@@ -321,10 +316,6 @@ gtk_flatten_list_model_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      self->item_type = g_value_get_gtype (value);
-      break;
-
     case PROP_MODEL:
       gtk_flatten_list_model_set_model (self, g_value_get_object (value));
       break;
@@ -345,10 +336,6 @@ gtk_flatten_list_model_get_property (GObject     *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      g_value_set_gtype (value, self->item_type);
-      break;
-
     case PROP_MODEL:
       g_value_set_object (value, self->model);
       break;
@@ -416,18 +403,6 @@ gtk_flatten_list_model_class_init (GtkFlattenListModelClass *class)
   gobject_class->get_property = gtk_flatten_list_model_get_property;
   gobject_class->dispose = gtk_flatten_list_model_dispose;
 
-  /**
-   * GtkFlattenListModel:item-type:
-   *
-   * The #GType for elements of this object
-   */
-  properties[PROP_ITEM_TYPE] =
-      g_param_spec_gtype ("item-type",
-                          P_("Item type"),
-                          P_("The type of elements of this object"),
-                          G_TYPE_OBJECT,
-                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GtkFlattenListModel:model:
    *
@@ -450,26 +425,20 @@ gtk_flatten_list_model_init (GtkFlattenListModel *self)
 
 /**
  * gtk_flatten_list_model_new:
- * @item_type: The type of items in the to-be-flattened models
- * @model: (nullable) (transfer none): the item to be flattened
+ * @model: (nullable) (transfer none): the model to be flattened
  *
- * Creates a new #GtkFlattenListModel that flattens @list. The
- * models returned by @model must conform to the given @item_type,
- * either by having an identical type or a subtype.
+ * Creates a new #GtkFlattenListModel that flattens @list.
  *
  * Returns: a new #GtkFlattenListModel
  **/
 GtkFlattenListModel *
-gtk_flatten_list_model_new (GType       item_type,
-                            GListModel *model)
+gtk_flatten_list_model_new (GListModel *model)
 {
   GtkFlattenListModel *result;
 
-  g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
   g_return_val_if_fail (model == NULL || G_IS_LIST_MODEL (model), NULL);
 
   result = g_object_new (GTK_TYPE_FLATTEN_LIST_MODEL,
-                         "item-type", item_type,
                          "model", model,
                          NULL);
 
@@ -481,8 +450,7 @@ gtk_flatten_list_model_new (GType       item_type,
  * @self: a #GtkFlattenListModel
  * @model: (nullable) (transfer none): the new model or %NULL
  *
- * Sets a new model to be flattened. The model must contain items of
- * #GListModel that conform to the item type of @self.
+ * Sets a new model to be flattened.
  **/
 void
 gtk_flatten_list_model_set_model (GtkFlattenListModel *self,
@@ -492,10 +460,6 @@ gtk_flatten_list_model_set_model (GtkFlattenListModel *self,
 
   g_return_if_fail (GTK_IS_FLATTEN_LIST_MODEL (self));
   g_return_if_fail (model == NULL || G_IS_LIST_MODEL (model));
-  if (model)
-    {
-      g_return_if_fail (g_type_is_a (g_list_model_get_item_type (model), G_TYPE_LIST_MODEL));
-    }
 
   if (self->model == model)
     return;
diff --git a/gtk/gtkflattenlistmodel.h b/gtk/gtkflattenlistmodel.h
index ec1eaaa84e..c934674ff3 100644
--- a/gtk/gtkflattenlistmodel.h
+++ b/gtk/gtkflattenlistmodel.h
@@ -36,8 +36,7 @@ GDK_AVAILABLE_IN_ALL
 G_DECLARE_FINAL_TYPE (GtkFlattenListModel, gtk_flatten_list_model, GTK, FLATTEN_LIST_MODEL, GObject)
 
 GDK_AVAILABLE_IN_ALL
-GtkFlattenListModel *    gtk_flatten_list_model_new             (GType                   item_type,
-                                                                 GListModel             *model);
+GtkFlattenListModel *    gtk_flatten_list_model_new             (GListModel             *model);
 
 GDK_AVAILABLE_IN_ALL
 void                    gtk_flatten_list_model_set_model        (GtkFlattenListModel    *self,
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 1d4cd53aa8..42101f29d3 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -784,7 +784,7 @@ update_fontlist (GtkFontChooserWidget *self)
   if ((self->level & GTK_FONT_CHOOSER_LEVEL_STYLE) == 0)
     model = g_object_ref (G_LIST_MODEL (fontmap));
   else
-    model = G_LIST_MODEL (gtk_flatten_list_model_new (PANGO_TYPE_FONT_FACE, G_LIST_MODEL (fontmap)));
+    model = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (fontmap)));
   gtk_filter_list_model_set_model (self->filter_model, model);
   g_object_unref (model);
 }
diff --git a/gtk/gtkmaplistmodel.c b/gtk/gtkmaplistmodel.c
index b77906fcc9..ea43269c07 100644
--- a/gtk/gtkmaplistmodel.c
+++ b/gtk/gtkmaplistmodel.c
@@ -63,7 +63,6 @@
 enum {
   PROP_0,
   PROP_HAS_MAP,
-  PROP_ITEM_TYPE,
   PROP_MODEL,
   NUM_PROPERTIES
 };
@@ -86,7 +85,6 @@ struct _GtkMapListModel
 {
   GObject parent_instance;
 
-  GType item_type;
   GListModel *model;
   GtkMapListModelMapFunc map_func;
   gpointer user_data;
@@ -145,9 +143,7 @@ gtk_map_list_model_get_nth (GtkRbTree *tree,
 static GType
 gtk_map_list_model_get_item_type (GListModel *list)
 {
-  GtkMapListModel *self = GTK_MAP_LIST_MODEL (list);
-
-  return self->item_type;
+  return G_TYPE_OBJECT;
 }
 
 static guint
@@ -199,11 +195,6 @@ gtk_map_list_model_get_item (GListModel *list,
     }
 
   node->item = self->map_func (g_list_model_get_item (self->model, position), self->user_data);
-  if (!G_TYPE_CHECK_INSTANCE_TYPE (node->item, self->item_type))
-    {
-      g_critical ("Map function returned a %s, but it is not a subtype of the model's type %s",
-                  G_OBJECT_TYPE_NAME (node->item), g_type_name (self->item_type));
-    }
   g_object_add_weak_pointer (node->item, &node->item);
 
   return node->item;
@@ -293,10 +284,6 @@ gtk_map_list_model_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      self->item_type = g_value_get_gtype (value);
-      break;
-
     case PROP_MODEL:
       gtk_map_list_model_set_model (self, g_value_get_object (value));
       break;
@@ -321,10 +308,6 @@ gtk_map_list_model_get_property (GObject     *object,
       g_value_set_boolean (value, self->items != NULL);
       break;
 
-    case PROP_ITEM_TYPE:
-      g_value_set_gtype (value, self->item_type);
-      break;
-
     case PROP_MODEL:
       g_value_set_object (value, self->model);
       break;
@@ -382,18 +365,6 @@ gtk_map_list_model_class_init (GtkMapListModelClass *class)
                             FALSE,
                             GTK_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
 
-  /**
-   * GtkMapListModel:item-type:
-   *
-   * The #GType for elements of this object
-   */
-  properties[PROP_ITEM_TYPE] =
-      g_param_spec_gtype ("item-type",
-                          P_("Item type"),
-                          P_("The type of elements of this object"),
-                          G_TYPE_OBJECT,
-                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GtkMapListModel:model:
    *
@@ -441,7 +412,6 @@ gtk_map_list_model_augment (GtkRbTree *map,
 
 /**
  * gtk_map_list_model_new:
- * @item_type: the #GType to use as the model's item type
  * @model: (allow-none): The model to map or %NULL for none
  * @map_func: (allow-none): map function or %NULL to not map items
  * @user_data: (closure): user data passed to @map_func
@@ -452,19 +422,16 @@ gtk_map_list_model_augment (GtkRbTree *map,
  * Returns: a new #GtkMapListModel
  **/
 GtkMapListModel *
-gtk_map_list_model_new (GType                   item_type,
-                        GListModel             *model,
+gtk_map_list_model_new (GListModel             *model,
                         GtkMapListModelMapFunc  map_func,
                         gpointer                user_data,
                         GDestroyNotify          user_destroy)
 {
   GtkMapListModel *result;
 
-  g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
   g_return_val_if_fail (model == NULL || G_IS_LIST_MODEL (model), NULL);
 
   result = g_object_new (GTK_TYPE_MAP_LIST_MODEL,
-                         "item-type", item_type,
                          "model", model,
                          NULL);
 
diff --git a/gtk/gtkmaplistmodel.h b/gtk/gtkmaplistmodel.h
index f0ddcc9524..85a39823ab 100644
--- a/gtk/gtkmaplistmodel.h
+++ b/gtk/gtkmaplistmodel.h
@@ -53,8 +53,7 @@ G_DECLARE_FINAL_TYPE (GtkMapListModel, gtk_map_list_model, GTK, MAP_LIST_MODEL,
 typedef gpointer (* GtkMapListModelMapFunc) (gpointer item, gpointer user_data);
 
 GDK_AVAILABLE_IN_ALL
-GtkMapListModel *       gtk_map_list_model_new                  (GType                   item_type,
-                                                                 GListModel             *model,
+GtkMapListModel *       gtk_map_list_model_new                  (GListModel             *model,
                                                                  GtkMapListModelMapFunc  map_func,
                                                                  gpointer                user_data,
                                                                  GDestroyNotify          user_destroy);
diff --git a/gtk/gtkmultiselection.c b/gtk/gtkmultiselection.c
index e8bd0759ef..ad6d3857de 100644
--- a/gtk/gtkmultiselection.c
+++ b/gtk/gtkmultiselection.c
@@ -62,9 +62,7 @@ static GParamSpec *properties[N_PROPS] = { NULL, };
 static GType
 gtk_multi_selection_get_item_type (GListModel *list)
 {
-  GtkMultiSelection *self = GTK_MULTI_SELECTION (list);
-
-  return g_list_model_get_item_type (self->model);
+  return G_TYPE_OBJECT;
 }
 
 static guint
diff --git a/gtk/gtknoselection.c b/gtk/gtknoselection.c
index 72ace9a5a5..652b148735 100644
--- a/gtk/gtknoselection.c
+++ b/gtk/gtknoselection.c
@@ -60,9 +60,7 @@ static GParamSpec *properties[N_PROPS] = { NULL, };
 static GType
 gtk_no_selection_get_item_type (GListModel *list)
 {
-  GtkNoSelection *self = GTK_NO_SELECTION (list);
-
-  return g_list_model_get_item_type (self->model);
+  return G_TYPE_OBJECT;
 }
 
 static guint
diff --git a/gtk/gtkpagesetupunixdialog.c b/gtk/gtkpagesetupunixdialog.c
index 5e2679affd..2e353c0033 100644
--- a/gtk/gtkpagesetupunixdialog.c
+++ b/gtk/gtkpagesetupunixdialog.c
@@ -306,7 +306,7 @@ gtk_page_setup_unix_dialog_init (GtkPageSetupUnixDialog *dialog)
   g_list_store_append (store, dialog->page_setup_list);
   g_list_store_append (store, dialog->custom_paper_list);
   g_list_store_append (store, dialog->manage_papers_list);
-  paper_size_list = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PAGE_SETUP, G_LIST_MODEL (store)));
+  paper_size_list = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (store)));
   gtk_drop_down_set_model (GTK_DROP_DOWN (dialog->paper_size_combo), paper_size_list);
   g_object_unref (store);
   g_object_unref (paper_size_list);
@@ -321,7 +321,7 @@ gtk_page_setup_unix_dialog_init (GtkPageSetupUnixDialog *dialog)
   g_list_store_append (printer_list_list, printer_list);
   g_object_unref (printer_list);
 
-  full_list = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PRINTER, G_LIST_MODEL (printer_list_list)));
+  full_list = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (printer_list_list)));
 
   filter = gtk_custom_filter_new (match_func, NULL, NULL);
   dialog->printer_list = G_LIST_MODEL (gtk_filter_list_model_new (full_list, filter));
diff --git a/gtk/gtkprintunixdialog.c b/gtk/gtkprintunixdialog.c
index 37a9e58e6f..dab4548b49 100644
--- a/gtk/gtkprintunixdialog.c
+++ b/gtk/gtkprintunixdialog.c
@@ -806,7 +806,7 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
   g_list_store_append (store, dialog->page_setup_list);
   g_list_store_append (store, dialog->custom_paper_list);
   g_list_store_append (store, dialog->manage_papers_list);
-  paper_size_list = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PAGE_SETUP, G_LIST_MODEL (store)));
+  paper_size_list = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (store)));
   gtk_drop_down_set_model (GTK_DROP_DOWN (dialog->paper_size_combo), paper_size_list);
   g_object_unref (store);
   g_object_unref (paper_size_list);
@@ -1056,7 +1056,7 @@ load_print_backends (GtkPrintUnixDialog *dialog)
       g_list_store_append (lists, gtk_print_backend_get_printers (backend));
     }
 
-  model = G_LIST_MODEL (gtk_flatten_list_model_new (GTK_TYPE_PRINTER, G_LIST_MODEL (lists)));
+  model = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (lists)));
 
   g_object_unref (lists);
 
diff --git a/gtk/gtkshortcutmanager.c b/gtk/gtkshortcutmanager.c
index 9aa3577703..a6f2559b1d 100644
--- a/gtk/gtkshortcutmanager.c
+++ b/gtk/gtkshortcutmanager.c
@@ -49,7 +49,7 @@ gtk_shortcut_manager_create_controllers (GtkWidget *widget)
   GtkEventController *controller;
 
   store = g_list_store_new (GTK_TYPE_SHORTCUT_CONTROLLER);
-  model = gtk_flatten_list_model_new (GTK_TYPE_SHORTCUT, G_LIST_MODEL (store));
+  model = gtk_flatten_list_model_new (G_LIST_MODEL (store));
   g_object_unref (store);
   g_object_set_data_full (G_OBJECT (widget), "gtk-shortcut-manager-bubble", model, g_object_unref);
   controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (model));
@@ -57,7 +57,7 @@ gtk_shortcut_manager_create_controllers (GtkWidget *widget)
   gtk_widget_add_controller (widget, controller);
 
   store = g_list_store_new (GTK_TYPE_SHORTCUT_CONTROLLER);
-  model = gtk_flatten_list_model_new (GTK_TYPE_SHORTCUT, G_LIST_MODEL (store));
+  model = gtk_flatten_list_model_new (G_LIST_MODEL (store));
   g_object_unref (store);
   g_object_set_data_full (G_OBJECT (widget), "gtk-shortcut-manager-capture", model, g_object_unref);
   controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (model));
diff --git a/gtk/gtksingleselection.c b/gtk/gtksingleselection.c
index bd35aed782..70f0beab27 100644
--- a/gtk/gtksingleselection.c
+++ b/gtk/gtksingleselection.c
@@ -72,9 +72,7 @@ static GParamSpec *properties[N_PROPS] = { NULL, };
 static GType
 gtk_single_selection_get_item_type (GListModel *list)
 {
-  GtkSingleSelection *self = GTK_SINGLE_SELECTION (list);
-
-  return g_list_model_get_item_type (self->model);
+  return G_TYPE_OBJECT;
 }
 
 static guint
diff --git a/gtk/gtkslicelistmodel.c b/gtk/gtkslicelistmodel.c
index d002252fff..8d0273c037 100644
--- a/gtk/gtkslicelistmodel.c
+++ b/gtk/gtkslicelistmodel.c
@@ -41,7 +41,6 @@
 
 enum {
   PROP_0,
-  PROP_ITEM_TYPE,
   PROP_MODEL,
   PROP_OFFSET,
   PROP_SIZE,
@@ -52,7 +51,6 @@ struct _GtkSliceListModel
 {
   GObject parent_instance;
 
-  GType item_type;
   GListModel *model;
   guint offset;
   guint size;
@@ -70,9 +68,7 @@ static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 static GType
 gtk_slice_list_model_get_item_type (GListModel *list)
 {
-  GtkSliceListModel *self = GTK_SLICE_LIST_MODEL (list);
-
-  return self->item_type;
+  return G_TYPE_OBJECT;
 }
 
 static guint
@@ -182,10 +178,6 @@ gtk_slice_list_model_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      self->item_type = g_value_get_gtype (value);
-      break;
-
     case PROP_MODEL:
       gtk_slice_list_model_set_model (self, g_value_get_object (value));
       break;
@@ -214,10 +206,6 @@ gtk_slice_list_model_get_property (GObject     *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      g_value_set_gtype (value, self->item_type);
-      break;
-
     case PROP_MODEL:
       g_value_set_object (value, self->model);
       break;
@@ -265,18 +253,6 @@ gtk_slice_list_model_class_init (GtkSliceListModelClass *class)
   gobject_class->get_property = gtk_slice_list_model_get_property;
   gobject_class->dispose = gtk_slice_list_model_dispose;
 
-  /**
-   * GtkSliceListModel:item-type:
-   *
-   * The #GType for elements of this object
-   */
-  properties[PROP_ITEM_TYPE] =
-      g_param_spec_gtype ("item-type",
-                          P_("Item type"),
-                          P_("The type of elements of this object"),
-                          G_TYPE_OBJECT,
-                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GtkSliceListModel:model:
    *
@@ -324,7 +300,7 @@ gtk_slice_list_model_init (GtkSliceListModel *self)
 
 /**
  * gtk_slice_list_model_new:
- * @model: (transfer none): The model to use
+ * @model: (transfer none) (allow-none): The model to use
  * @offset: the offset of the slice
  * @size: maximum size of the slice
  *
@@ -338,35 +314,15 @@ gtk_slice_list_model_new (GListModel *model,
                           guint       offset,
                           guint       size)
 {
-  g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
+  g_return_val_if_fail (model == NULL || G_IS_LIST_MODEL (model), NULL);
 
   return g_object_new (GTK_TYPE_SLICE_LIST_MODEL,
-                       "item-type", g_list_model_get_item_type (model),
                        "model", model,
                        "offset", offset,
                        "size", size,
                        NULL);
 }
 
-/**
- * gtk_slice_list_model_new_for_type:
- * @item_type: the type of items
- *
- * Creates a new empty #GtkSliceListModel for the given @item_type that
- * can be set up later.
- *
- * Returns: a new empty #GtkSliceListModel
- **/
-GtkSliceListModel *
-gtk_slice_list_model_new_for_type (GType item_type)
-{
-  g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
-
-  return g_object_new (GTK_TYPE_SLICE_LIST_MODEL,
-                       "item-type", item_type,
-                       NULL);
-}
-
 /**
  * gtk_slice_list_model_set_model:
  * @self: a #GtkSliceListModel
diff --git a/gtk/gtkslicelistmodel.h b/gtk/gtkslicelistmodel.h
index 837e67ef7a..d1b0cd8edc 100644
--- a/gtk/gtkslicelistmodel.h
+++ b/gtk/gtkslicelistmodel.h
@@ -40,8 +40,6 @@ GDK_AVAILABLE_IN_ALL
 GtkSliceListModel *     gtk_slice_list_model_new                (GListModel             *model,
                                                                  guint                   offset,
                                                                  guint                   size);
-GDK_AVAILABLE_IN_ALL
-GtkSliceListModel *     gtk_slice_list_model_new_for_type       (GType                   item_type);
 
 GDK_AVAILABLE_IN_ALL
 void                    gtk_slice_list_model_set_model          (GtkSliceListModel      *self,
diff --git a/gtk/gtksortlistmodel.c b/gtk/gtksortlistmodel.c
index 0406d1e86f..06e1c6f3b2 100644
--- a/gtk/gtksortlistmodel.c
+++ b/gtk/gtksortlistmodel.c
@@ -42,7 +42,6 @@
 
 enum {
   PROP_0,
-  PROP_ITEM_TYPE,
   PROP_MODEL,
   PROP_SORTER,
   NUM_PROPERTIES
@@ -54,7 +53,6 @@ struct _GtkSortListModel
 {
   GObject parent_instance;
 
-  GType item_type;
   GListModel *model;
   GtkSorter *sorter;
 
@@ -89,9 +87,7 @@ gtk_sort_list_entry_free (gpointer data)
 static GType
 gtk_sort_list_model_get_item_type (GListModel *list)
 {
-  GtkSortListModel *self = GTK_SORT_LIST_MODEL (list);
-
-  return self->item_type;
+  return G_TYPE_OBJECT;
 }
 
 static guint
@@ -262,10 +258,6 @@ gtk_sort_list_model_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      self->item_type = g_value_get_gtype (value);
-      break;
-
     case PROP_MODEL:
       gtk_sort_list_model_set_model (self, g_value_get_object (value));
       break;
@@ -290,10 +282,6 @@ gtk_sort_list_model_get_property (GObject     *object,
 
   switch (prop_id)
     {
-    case PROP_ITEM_TYPE:
-      g_value_set_gtype (value, self->item_type);
-      break;
-
     case PROP_MODEL:
       g_value_set_object (value, self->model);
       break;
@@ -405,18 +393,6 @@ gtk_sort_list_model_class_init (GtkSortListModelClass *class)
                             GTK_TYPE_SORTER,
                             GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
-  /**
-   * GtkSortListModel:item-type:
-   *
-   * The #GType for items of this model
-   */
-  properties[PROP_ITEM_TYPE] =
-      g_param_spec_gtype ("item-type",
-                          P_("Item type"),
-                          P_("The type of items of this list"),
-                          G_TYPE_OBJECT,
-                          GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY);
-
   /**
    * GtkSortListModel:model:
    *
@@ -439,7 +415,7 @@ gtk_sort_list_model_init (GtkSortListModel *self)
 
 /**
  * gtk_sort_list_model_new:
- * @model: the model to sort
+ * @model: (allow-none): the model to sort
  * @sorter: (allow-none): the #GtkSorter to sort @model with
  *
  * Creates a new sort list model that uses the @sorter to sort @model.
@@ -452,11 +428,10 @@ gtk_sort_list_model_new (GListModel *model,
 {
   GtkSortListModel *result;
 
-  g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
+  g_return_val_if_fail (model == NULL || G_IS_LIST_MODEL (model), NULL);
   g_return_val_if_fail (sorter == NULL || GTK_IS_SORTER (sorter), NULL);
 
   result = g_object_new (GTK_TYPE_SORT_LIST_MODEL,
-                         "item-type", g_list_model_get_item_type (model),
                          "model", model,
                          "sorter", sorter,
                          NULL);
@@ -464,26 +439,6 @@ gtk_sort_list_model_new (GListModel *model,
   return result;
 }
 
-/**
- * gtk_sort_list_model_new_for_type:
- * @item_type: the type of the items that will be returned
- *
- * Creates a new empty sort list model set up to return items of type @item_type.
- * It is up to the application to set a proper sort function and model to ensure
- * the item type is matched.
- *
- * Returns: a new #GtkSortListModel
- **/
-GtkSortListModel *
-gtk_sort_list_model_new_for_type (GType item_type)
-{
-  g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
-
-  return g_object_new (GTK_TYPE_SORT_LIST_MODEL,
-                       "item-type", item_type,
-                       NULL);
-}
-
 /**
  * gtk_sort_list_model_set_model:
  * @self: a #GtkSortListModel
@@ -500,10 +455,6 @@ gtk_sort_list_model_set_model (GtkSortListModel *self,
 
   g_return_if_fail (GTK_IS_SORT_LIST_MODEL (self));
   g_return_if_fail (model == NULL || G_IS_LIST_MODEL (model));
-  if (model)
-    {
-      g_return_if_fail (g_type_is_a (g_list_model_get_item_type (model), self->item_type));
-    }
 
   if (self->model == model)
     return;
diff --git a/gtk/gtksortlistmodel.h b/gtk/gtksortlistmodel.h
index 3e009502e2..b78029af2f 100644
--- a/gtk/gtksortlistmodel.h
+++ b/gtk/gtksortlistmodel.h
@@ -40,9 +40,6 @@ G_DECLARE_FINAL_TYPE (GtkSortListModel, gtk_sort_list_model, GTK, SORT_LIST_MODE
 GDK_AVAILABLE_IN_ALL
 GtkSortListModel *      gtk_sort_list_model_new                 (GListModel            *model,
                                                                  GtkSorter             *sorter);
-GDK_AVAILABLE_IN_ALL
-GtkSortListModel *      gtk_sort_list_model_new_for_type        (GType                  item_type);
-
 GDK_AVAILABLE_IN_ALL
 void                    gtk_sort_list_model_set_sorter          (GtkSortListModel       *self,
                                                                  GtkSorter              *sorter);
diff --git a/gtk/gtktreelistmodel.c b/gtk/gtktreelistmodel.c
index 246d9f2eb7..4311acb9d3 100644
--- a/gtk/gtktreelistmodel.c
+++ b/gtk/gtktreelistmodel.c
@@ -533,16 +533,6 @@ gtk_tree_list_model_expand_node (GtkTreeListModel *self,
   if (model == NULL)
     return 0;
   
-  if (!g_type_is_a (g_list_model_get_item_type (model), g_list_model_get_item_type (self->root_node.model)))
-    {
-      g_critical ("The GtkTreeListModelCreateModelFunc for %p returned a model with item type \"%s\" "
-                  "but \"%s\" is required.",
-                  self,
-                  g_type_name (g_list_model_get_item_type (model)),
-                  g_type_name (g_list_model_get_item_type (self->root_node.model)));
-      return 0;
-    }
-
   gtk_tree_list_model_init_node (self, node, model);
 
   tree_node_mark_dirty (node);
@@ -576,7 +566,7 @@ gtk_tree_list_model_get_item_type (GListModel *list)
   GtkTreeListModel *self = GTK_TREE_LIST_MODEL (list);
 
   if (self->passthrough)
-    return g_list_model_get_item_type (self->root_node.model);
+    return G_TYPE_OBJECT;
   else
     return GTK_TYPE_TREE_LIST_ROW;
 }
diff --git a/gtk/inspector/controllers.c b/gtk/inspector/controllers.c
index d20bef493b..0eae1caafd 100644
--- a/gtk/inspector/controllers.c
+++ b/gtk/inspector/controllers.c
@@ -245,10 +245,10 @@ gtk_inspector_controllers_set_object (GtkInspectorControllers *self,
   self->model = gtk_property_lookup_list_model_new (GTK_TYPE_WIDGET, "parent");
   gtk_property_lookup_list_model_set_object (self->model, object);
 
-  map_model = gtk_map_list_model_new (G_TYPE_LIST_MODEL, G_LIST_MODEL (self->model), map_to_controllers, 
NULL, NULL);
+  map_model = gtk_map_list_model_new (G_LIST_MODEL (self->model), map_to_controllers, NULL, NULL);
   g_object_unref (self->model);
 
-  flatten_model = gtk_flatten_list_model_new (GTK_TYPE_EVENT_CONTROLLER, G_LIST_MODEL (map_model));
+  flatten_model = gtk_flatten_list_model_new (G_LIST_MODEL (map_model));
 
   sorter = gtk_custom_sorter_new (compare_controllers, NULL, NULL);
   sort_model = gtk_sort_list_model_new (G_LIST_MODEL (flatten_model), sorter);
diff --git a/gtk/inspector/object-tree.c b/gtk/inspector/object-tree.c
index add6da624c..44d8cf0fc3 100644
--- a/gtk/inspector/object-tree.c
+++ b/gtk/inspector/object-tree.c
@@ -130,7 +130,7 @@ object_tree_widget_get_children (GObject *object)
   g_list_store_append (list, sublist);
   g_object_unref (sublist);
 
-  flatten = gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (list));
+  flatten = gtk_flatten_list_model_new (G_LIST_MODEL (list));
   g_object_unref (list);
 
   return G_LIST_MODEL (flatten);
@@ -225,7 +225,7 @@ list_model_for_properties (GObject     *object,
       g_object_unref (tmp);
     }
 
-  result = G_LIST_MODEL (gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (concat)));
+  result = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (concat)));
   g_object_unref (concat);
   return result;
 }
@@ -330,7 +330,7 @@ object_tree_tree_view_get_children (GObject *object)
   g_object_unref (selection);
   g_list_store_append (result_list, columns);
   g_object_unref (columns);
-  result = gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (result_list));
+  result = gtk_flatten_list_model_new (G_LIST_MODEL (result_list));
   g_object_unref (result_list);
 
   return G_LIST_MODEL (result);
@@ -353,7 +353,7 @@ object_tree_column_view_get_children (GObject *object)
   g_list_store_append (result_list, sublist);
   g_object_unref (sublist);
 
-  result = gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (result_list));
+  result = gtk_flatten_list_model_new (G_LIST_MODEL (result_list));
   g_object_unref (result_list);
 
   return G_LIST_MODEL (result);
@@ -640,7 +640,7 @@ object_get_children (GObject *object)
 
   if (result_list)
     {
-      result = G_LIST_MODEL (gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (result_list)));
+      result = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (result_list)));
       g_object_unref (result_list);
     }
 
@@ -1179,7 +1179,7 @@ create_root_model (GdkDisplay *display)
   g_list_store_append (list, special);
   g_object_unref (special);
 
-  filter = gtk_filter_list_model_new_for_type (G_TYPE_OBJECT);
+  filter = gtk_filter_list_model_new (NULL, NULL);
   custom_filter = gtk_custom_filter_new (toplevel_filter_func,
                                          display, NULL);
   gtk_filter_list_model_set_filter (filter, custom_filter);
@@ -1187,7 +1187,7 @@ create_root_model (GdkDisplay *display)
   g_list_store_append (list, filter);
   g_object_unref (filter);
 
-  flatten = gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (list));
+  flatten = gtk_flatten_list_model_new (G_LIST_MODEL (list));
   g_object_unref (list);
   return G_LIST_MODEL (flatten);
 }
diff --git a/testsuite/gtk/expression.c b/testsuite/gtk/expression.c
index d8c75e527b..08b6e4d97d 100644
--- a/testsuite/gtk/expression.c
+++ b/testsuite/gtk/expression.c
@@ -492,7 +492,7 @@ test_bind_child (void)
                                       "filter");
 
   filter = gtk_string_filter_new ();
-  child = gtk_filter_list_model_new_for_type (G_TYPE_OBJECT);
+  child = gtk_filter_list_model_new (NULL, NULL);
   gtk_filter_list_model_set_filter (child, filter);
   target = gtk_filter_list_model_new (G_LIST_MODEL (child), NULL);
   g_object_unref (child);
diff --git a/testsuite/gtk/flattenlistmodel.c b/testsuite/gtk/flattenlistmodel.c
index dd56e37464..12fc279d18 100644
--- a/testsuite/gtk/flattenlistmodel.c
+++ b/testsuite/gtk/flattenlistmodel.c
@@ -210,7 +210,7 @@ new_model (GListStore *store)
   GtkFlattenListModel *result;
   GString *changes;
 
-  result = gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (store));
+  result = gtk_flatten_list_model_new (G_LIST_MODEL (store));
   changes = g_string_new ("");
   g_object_set_qdata_full (G_OBJECT(result), changes_quark, changes, free_changes);
   g_signal_connect (result, "items-changed", G_CALLBACK (items_changed), changes);
diff --git a/testsuite/gtk/maplistmodel.c b/testsuite/gtk/maplistmodel.c
index 5b6af7b5e4..94a437f842 100644
--- a/testsuite/gtk/maplistmodel.c
+++ b/testsuite/gtk/maplistmodel.c
@@ -196,7 +196,7 @@ new_model (GListStore *store)
   GtkMapListModel *result;
   GString *changes;
 
-  result = gtk_map_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (store), map_multiply, GUINT_TO_POINTER (2), 
NULL);
+  result = gtk_map_list_model_new (G_LIST_MODEL (store), map_multiply, GUINT_TO_POINTER (2), NULL);
   changes = g_string_new ("");
   g_object_set_qdata_full (G_OBJECT(result), changes_quark, changes, free_changes);
   g_signal_connect (result, "items-changed", G_CALLBACK (items_changed), changes);
diff --git a/testsuite/gtk/slicelistmodel.c b/testsuite/gtk/slicelistmodel.c
index c3ae685c59..631444182f 100644
--- a/testsuite/gtk/slicelistmodel.c
+++ b/testsuite/gtk/slicelistmodel.c
@@ -191,11 +191,7 @@ new_model (GListStore *store, guint offset, guint size)
   GtkSliceListModel *result;
   GString *changes;
 
-  result = gtk_slice_list_model_new_for_type (G_TYPE_OBJECT);
-  if (store)
-    gtk_slice_list_model_set_model (result, G_LIST_MODEL (store));
-  gtk_slice_list_model_set_offset (result, offset);
-  gtk_slice_list_model_set_size (result, size);
+  result = gtk_slice_list_model_new (G_LIST_MODEL (store), offset, size);
 
   changes = g_string_new ("");
   g_object_set_qdata_full (G_OBJECT(result), changes_quark, changes, free_changes);
diff --git a/testsuite/gtk/sortlistmodel.c b/testsuite/gtk/sortlistmodel.c
index e0ed7e37df..e7a3004d9d 100644
--- a/testsuite/gtk/sortlistmodel.c
+++ b/testsuite/gtk/sortlistmodel.c
@@ -203,7 +203,7 @@ new_model (gpointer model)
       g_object_unref (sorter);
     }
   else
-    result = gtk_sort_list_model_new_for_type (G_TYPE_OBJECT);
+    result = gtk_sort_list_model_new (NULL, NULL);
 
   changes = g_string_new ("");
   g_object_set_qdata_full (G_OBJECT(result), changes_quark, changes, free_changes);



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