[dia] layer: fix ownership of layer objects



commit 97dfdefb5d40ba93eca448c5e1f3794b59ae7b58
Author: Zander Brown <zbrown gnome org>
Date:   Sun Apr 5 01:03:24 2020 +0100

    layer: fix ownership of layer objects
    
    DiaLayer instances are now owned by the DiagramData they are in, rather than fluke leaked refs
    
    ->layer and ->active_layer are now effectivly private

 app/app_procs.c                         |  58 +++----
 app/commands.c                          |   5 +-
 app/diagram.c                           |  43 +++--
 app/find-and-replace.c                  |   2 +-
 app/highlight.c                         |  11 +-
 app/layer-editor/dia-layer-properties.c |   6 +-
 app/layer-editor/dia-layer-widget.c     |  20 ++-
 app/layer-editor/layer_dialog.c         |  72 +++-----
 app/load_save.c                         | 299 ++++++++++++++++++--------------
 app/modify_tool.c                       |   4 +-
 app/select.c                            |   6 +-
 app/undo.c                              |  40 ++---
 lib/dia_xml.h                           |   3 +
 lib/diagramdata.c                       | 272 +++++++++++++++++------------
 lib/diagramdata.h                       |  23 ++-
 lib/object.c                            |   5 +-
 plug-ins/drs/dia-render-script-import.c |  24 ++-
 plug-ins/drs/dia-render-script.c        |  13 +-
 plug-ins/dxf/dxf-export.c               |  52 +++---
 plug-ins/dxf/dxf-import.c               |  43 ++---
 plug-ins/pixbuf/pixbuf.c                |  54 +++---
 plug-ins/python/pydia-diagramdata.c     | 121 ++++++-------
 plug-ins/python/pydia-layer.c           |   3 +-
 plug-ins/svg/svg-import.c               |  11 +-
 plug-ins/vdx/vdx-export.c               |   8 +-
 plug-ins/vdx/vdx-import.c               | 137 ++++++++-------
 plug-ins/wpg/wpg-import.c               |   2 +-
 plug-ins/xfig/xfig-export.c             |  22 ++-
 plug-ins/xfig/xfig-import.c             |  46 ++---
 29 files changed, 768 insertions(+), 637 deletions(-)
---
diff --git a/app/app_procs.c b/app/app_procs.c
index b5b37b4c..11c8f64a 100644
--- a/app/app_procs.c
+++ b/app/app_procs.c
@@ -164,12 +164,14 @@ show_layers_parse_numbers (DiagramData *diagdata,
     g_warning (_("invalid layer range %lu - %lu"), low, high - 1);
     return;
   }
-  if (high > n_layers)
+
+  if (high > n_layers) {
     high = n_layers;
+  }
 
   /* Set the visible layers */
-  for ( i = low; i < high; i++ ) {
-    DiaLayer *lay = DIA_LAYER (g_ptr_array_index (diagdata->layers, i));
+  for (i = low; i < high; i++) {
+    DiaLayer *lay = data_layer_get_nth (diagdata, i);
 
     if (visible_layers[i] == TRUE) {
       g_warning (_("Layer %lu (%s) selected more than once."),
@@ -180,41 +182,37 @@ show_layers_parse_numbers (DiagramData *diagdata,
   }
 }
 
+
 static void
 show_layers_parse_word (DiagramData *diagdata,
                         gboolean    *visible_layers,
                         gint         n_layers,
                         const char  *str)
 {
-  GPtrArray *layers = diagdata->layers;
   gboolean found = FALSE;
+  int len;
+  char *p;
+  const char *name;
 
   /* Apply --show-layers=LAYER,LAYER,... switch. 13.3.2004 sampo iki fi */
-  if (layers) {
-    int len, k = 0;
-    DiaLayer *lay;
-    char *p;
-    const char *name;
-
-    for (k = 0; k < layers->len; k++) {
-      lay = DIA_LAYER (g_ptr_array_index (layers, k));
-      name = dia_layer_get_name (lay);
-
-      if (name) {
-        len = strlen (name);
-        if ((p = strstr (str, name)) != NULL) {
-          if (((p == str) || (p[-1] == ','))    /* zap false positives */
-              && ((p[len] == 0) || (p[len] == ','))){
-            found = TRUE;
-            if (visible_layers[k] == TRUE) {
-              g_warning (_("Layer %d (%s) selected more than once."), k, name);
-            }
-            visible_layers[k] = TRUE;
+
+  DIA_FOR_LAYER_IN_DIAGRAM (diagdata, lay, k, {
+    name = dia_layer_get_name (lay);
+
+    if (name) {
+      len = strlen (name);
+      if ((p = strstr (str, name)) != NULL) {
+        if (((p == str) || (p[-1] == ','))    /* zap false positives */
+            && ((p[len] == 0) || (p[len] == ','))){
+          found = TRUE;
+          if (visible_layers[k] == TRUE) {
+            g_warning (_("Layer %d (%s) selected more than once."), k, name);
           }
+          visible_layers[k] = TRUE;
         }
       }
     }
-  }
+  });
 
   if (found == FALSE) {
     g_warning (_("There is no layer named %s."), str);
@@ -262,21 +260,21 @@ handle_show_layers (DiagramData *diagdata,
   DiaLayer *layer;
   int i;
 
-  visible_layers = g_new (gboolean, diagdata->layers->len);
+  visible_layers = g_new (gboolean, data_layer_count (diagdata));
   /* Assume all layers are non-visible */
-  for (i = 0; i < diagdata->layers->len; i++) {
+  for (i = 0; i < data_layer_count (diagdata); i++) {
     visible_layers[i] = FALSE;
   }
 
   /* Split the layer-range by commas */
   show_layers_parse_string (diagdata,
                             visible_layers,
-                            diagdata->layers->len,
+                            data_layer_count (diagdata),
                             show_layers);
 
   /* Set the visibility of the layers */
-  for (i = 0; i < diagdata->layers->len; i++) {
-    layer = g_ptr_array_index (diagdata->layers, i);
+  for (i = 0; i < data_layer_count (diagdata); i++) {
+    layer = data_layer_get_nth (diagdata, i);
 
     if (visible_layers[i] == TRUE) {
       dia_layer_set_visible (layer, TRUE);
diff --git a/app/commands.c b/app/commands.c
index dcedd5a9..7c6e33f4 100644
--- a/app/commands.c
+++ b/app/commands.c
@@ -1513,6 +1513,7 @@ layers_add_layer_callback (GtkAction *action)
   diagram_edit_layer (dia, NULL);
 }
 
+
 void
 layers_rename_layer_callback (GtkAction *action)
 {
@@ -1523,9 +1524,11 @@ layers_rename_layer_callback (GtkAction *action)
     return;
   }
 
-  diagram_edit_layer (dia, dia->data->active_layer);
+  diagram_edit_layer (dia,
+                      dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
 }
 
+
 void
 objects_place_over_callback (GtkAction *action)
 {
diff --git a/app/diagram.c b/app/diagram.c
index aa2f0f1f..86e1bafc 100644
--- a/app/diagram.c
+++ b/app/diagram.c
@@ -151,7 +151,7 @@ dia_diagram_finalize (GObject *object)
 
   g_clear_object (&priv->file);
   g_clear_pointer (&dia->filename, g_free);
-  
+
   G_OBJECT_CLASS (dia_diagram_parent_class)->finalize (object);
 }
 
@@ -714,22 +714,27 @@ diagram_remove_ddisplay (Diagram *dia, DDisplay *ddisp)
   }
 }
 
+
 void
 diagram_add_object (Diagram *dia, DiaObject *obj)
 {
-  dia_layer_add_object (dia->data->active_layer, obj);
+  dia_layer_add_object (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
+                        obj);
 
   diagram_modified (dia);
 }
 
+
 void
 diagram_add_object_list (Diagram *dia, GList *list)
 {
-  dia_layer_add_objects (dia->data->active_layer, list);
+  dia_layer_add_objects (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
+                         list);
 
   diagram_modified (dia);
 }
 
+
 void
 diagram_selected_break_external (Diagram *dia)
 {
@@ -996,7 +1001,7 @@ diagram_find_clicked_object (Diagram *dia,
                              Point   *pos,
                              real     maxdist)
 {
-  return dia_layer_find_closest_object_except (dia->data->active_layer,
+  return dia_layer_find_closest_object_except (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
                                                pos, maxdist, NULL);
 }
 
@@ -1006,7 +1011,7 @@ diagram_find_clicked_object_except (Diagram *dia,
                                     real     maxdist,
                                     GList   *avoid)
 {
-  return dia_layer_find_closest_object_except (dia->data->active_layer,
+  return dia_layer_find_closest_object_except (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)),
                                                pos,
                                                maxdist,
                                                avoid);
@@ -1058,9 +1063,8 @@ diagram_find_closest_connectionpoint (Diagram          *dia,
                                       DiaObject        *notthis)
 {
   real dist = 100000000.0;
-  guint i;
-  for (i = 0; i < dia->data->layers->len; i++) {
-    DiaLayer *layer = DIA_LAYER (g_ptr_array_index (dia->data->layers, i));
+
+  DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), layer, i, {
     ConnectionPoint *this_cp;
     real this_dist;
     if (dia_layer_is_connectable (layer)) {
@@ -1073,7 +1077,8 @@ diagram_find_closest_connectionpoint (Diagram          *dia,
         *closest = this_cp;
       }
     }
-  }
+  });
+
   return dist;
 }
 
@@ -1287,7 +1292,7 @@ diagram_group_selected (Diagram *dia)
   dia->data->selected = parent_list_affected(dia->data->selected);
 #endif
 
-  orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+  orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(dia))));
 
   /* We have to rebuild the selection list so that it is the same
      order as in the Diagram list. */
@@ -1348,7 +1353,7 @@ void diagram_ungroup_selected(Diagram *dia)
 
       group_list = group_objects(group);
 
-      group_index = dia_layer_object_get_index (dia->data->active_layer, group);
+      group_index = dia_layer_object_get_index (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), 
group);
 
       change = dia_ungroup_objects_change_new (dia, group_list, group, group_index);
       dia_change_apply (change, dia);
@@ -1393,11 +1398,11 @@ diagram_place_under_selected (Diagram *dia)
   if (g_list_length (dia->data->selected) == 0)
     return;
 
-  orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+  orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(dia))));
 
   sorted_list = diagram_get_sorted_selected_remove (dia);
   object_add_updates_list (sorted_list, dia);
-  dia_layer_add_objects_first (dia->data->active_layer, sorted_list);
+  dia_layer_add_objects_first (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), sorted_list);
 
   dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
 
@@ -1415,11 +1420,11 @@ diagram_place_over_selected(Diagram *dia)
   if (g_list_length (dia->data->selected) == 0)
     return;
 
-  orig_list = g_list_copy (dia_layer_get_object_list (dia->data->active_layer));
+  orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(dia))));
 
   sorted_list = diagram_get_sorted_selected_remove (dia);
   object_add_updates_list (sorted_list, dia);
-  dia_layer_add_objects (dia->data->active_layer, sorted_list);
+  dia_layer_add_objects (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), sorted_list);
 
   dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
 
@@ -1439,7 +1444,7 @@ diagram_place_up_selected(Diagram *dia)
   if (g_list_length (dia->data->selected) == 0)
     return;
 
-  orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+  orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(dia))));
 
   sorted_list = diagram_get_sorted_selected(dia);
   object_add_updates_list(orig_list, dia);
@@ -1462,7 +1467,7 @@ diagram_place_up_selected(Diagram *dia)
     }
   }
 
-  dia_layer_set_object_list (dia->data->active_layer, new_list);
+  dia_layer_set_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), new_list);
 
   dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
 
@@ -1482,7 +1487,7 @@ diagram_place_down_selected (Diagram *dia)
   if (g_list_length (dia->data->selected) == 0)
     return;
 
-  orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+  orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(dia))));
 
   sorted_list = diagram_get_sorted_selected (dia);
   object_add_updates_list (orig_list, dia);
@@ -1508,7 +1513,7 @@ diagram_place_down_selected (Diagram *dia)
     }
   }
 
-  dia_layer_set_object_list (dia->data->active_layer, new_list);
+  dia_layer_set_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)), new_list);
 
   dia_reorder_objects_change_new (dia, g_list_copy (sorted_list), orig_list);
 
diff --git a/app/find-and-replace.c b/app/find-and-replace.c
index fa184559..fe692c59 100644
--- a/app/find-and-replace.c
+++ b/app/find-and-replace.c
@@ -408,7 +408,7 @@ fnr_respond (GtkWidget *widget, gint response_id, gpointer data)
     sd.last = sd.found ? sd.found : sd.first;
     g_object_set_data (G_OBJECT (widget), "last-found", sd.last);
     if (sd.last) {
-      if (dia_object_get_parent_layer(sd.last) != ddisp->diagram->data->active_layer) {
+      if (dia_object_get_parent_layer(sd.last) != dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(ddisp->diagram))) {
         /* can only select objects in the active layer */
         data_set_active_layer(ddisp->diagram->data, dia_object_get_parent_layer(sd.last));
         diagram_add_update_all(ddisp->diagram);
diff --git a/app/highlight.c b/app/highlight.c
index a46cc46f..e04d31ff 100644
--- a/app/highlight.c
+++ b/app/highlight.c
@@ -71,6 +71,7 @@ highlight_reset_objects(GList *objects, Diagram *dia)
   }
 }
 
+
 /* Currently does a brute-force run-through of all objects.
  * If this is too slow, we could create a list of currently highlighted
  * objects in the diagram and traverse that before killing it.
@@ -78,9 +79,9 @@ highlight_reset_objects(GList *objects, Diagram *dia)
  * the active layer.
  */
 void
-highlight_reset_all (Diagram *dia) {
-  int i;
-  for (i = 0; i < dia->data->layers->len; i++) {
-    highlight_reset_objects (dia_layer_get_object_list (DIA_LAYER (g_ptr_array_index (dia->data->layers, 
i))), dia);
-  }
+highlight_reset_all (Diagram *dia)
+{
+  DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), layer, i, {
+    highlight_reset_objects (dia_layer_get_object_list (layer), dia);
+  });
 }
diff --git a/app/layer-editor/dia-layer-properties.c b/app/layer-editor/dia-layer-properties.c
index 5abe50ed..93a2358d 100644
--- a/app/layer-editor/dia-layer-properties.c
+++ b/app/layer-editor/dia-layer-properties.c
@@ -136,7 +136,7 @@ dia_layer_properties_response (GtkDialog *dialog,
   } else if (priv->diagram) {
     DiaLayer *layer;
     int pos = data_layer_get_index (DIA_DIAGRAM_DATA (priv->diagram),
-                                    DIA_DIAGRAM_DATA (priv->diagram)->active_layer) + 1;
+                                    dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (priv->diagram)) + 
1);
 
     layer = dia_layer_new (gtk_entry_get_text (GTK_ENTRY (priv->entry)),
                            DIA_DIAGRAM_DATA (priv->diagram));
@@ -148,6 +148,8 @@ dia_layer_properties_response (GtkDialog *dialog,
 
     dia_layer_change_new (priv->diagram, layer, TYPE_ADD_LAYER, pos);
     undo_set_transactionpoint (priv->diagram->undo);
+
+    g_clear_object (&layer);
   } else {
     g_critical ("Huh, no layer or diagram");
   }
@@ -312,7 +314,7 @@ dia_layer_properties_set_diagram (DiaLayerProperties *self,
                             data_layer_count (DIA_DIAGRAM_DATA (dia)));
     gtk_entry_set_text (GTK_ENTRY (priv->entry), name);
 
-    g_free (name);
+    g_clear_pointer (&name, g_free);
   }
 
   g_object_notify_by_pspec (G_OBJECT (self), lp_pspecs[LP_PROP_DIAGRAM]);
diff --git a/app/layer-editor/dia-layer-widget.c b/app/layer-editor/dia-layer-widget.c
index 64dd0afc..d66dde95 100644
--- a/app/layer-editor/dia-layer-widget.c
+++ b/app/layer-editor/dia-layer-widget.c
@@ -250,7 +250,8 @@ connectable_toggled (GtkToggleButton *widget,
                                gtk_toggle_button_get_active (widget));
   }
 
-  if (priv->layer == dia_layer_get_parent_diagram (priv->layer)->active_layer) {
+
+  if (priv->layer == dia_diagram_data_get_active_layer (dia_layer_get_parent_diagram (priv->layer))) {
     priv->connect_off = !gtk_toggle_button_get_active (widget);
     if (priv->connect_off) {
       priv->connect_on = FALSE;
@@ -272,6 +273,7 @@ connectable_toggled (GtkToggleButton *widget,
   }
 }
 
+
 static void
 visible_clicked (GtkToggleButton *widget,
                  gpointer         userdata)
@@ -427,7 +429,19 @@ dia_layer_widget_set_layer (DiaLayerWidget *self,
   if (layer) {
     priv->layer = g_object_ref (layer);
 
+  if (g_set_object (&priv->layer, layer)) {
     g_clear_object (&priv->name_binding);
+
+    g_message (" -> accepted %p", priv->layer);
+
+    if (!layer) {
+      gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
+
+      g_object_notify_by_pspec (G_OBJECT (self), lw_pspecs[LW_PROP_LAYER]);
+
+      return;
+    }
+
     priv->name_binding = g_object_bind_property (layer, "name",
                                                 priv->label, "label",
                                                 G_BINDING_SYNC_CREATE);
@@ -449,12 +463,10 @@ dia_layer_widget_set_layer (DiaLayerWidget *self,
     priv->connect_off = FALSE;
 
     gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
-  } else {
-    gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
-  }
 
   g_object_notify_by_pspec (G_OBJECT (self), lw_pspecs[LW_PROP_LAYER]);
 }
+}
 
 
 DiaLayer *
diff --git a/app/layer-editor/layer_dialog.c b/app/layer-editor/layer_dialog.c
index 5a416daa..dcd81182 100644
--- a/app/layer-editor/layer_dialog.c
+++ b/app/layer-editor/layer_dialog.c
@@ -160,16 +160,16 @@ dia_layer_change_apply (DiaChange *self, Diagram *dia)
 
   switch (change->type) {
     case TYPE_DELETE_LAYER:
-      data_remove_layer(dia->data, change->layer);
+      data_remove_layer (dia->data, change->layer);
       break;
     case TYPE_ADD_LAYER:
-      data_add_layer_at(dia->data, change->layer, change->index);
+      data_add_layer_at (dia->data, change->layer, change->index);
       break;
     case TYPE_RAISE_LAYER:
-      data_raise_layer(dia->data, change->layer);
+      data_raise_layer (dia->data, change->layer);
       break;
     case TYPE_LOWER_LAYER:
-      data_lower_layer(dia->data, change->layer);
+      data_lower_layer (dia->data, change->layer);
       break;
     default:
       g_return_if_reached ();
@@ -186,16 +186,16 @@ dia_layer_change_revert (DiaChange *self, Diagram *dia)
 
   switch (change->type) {
     case TYPE_DELETE_LAYER:
-      data_add_layer_at(dia->data, change->layer, change->index);
+      data_add_layer_at (dia->data, change->layer, change->index);
       break;
     case TYPE_ADD_LAYER:
-      data_remove_layer(dia->data, change->layer);
+      data_remove_layer (dia->data, change->layer);
       break;
     case TYPE_RAISE_LAYER:
-      data_lower_layer(dia->data, change->layer);
+      data_lower_layer (dia->data, change->layer);
       break;
     case TYPE_LOWER_LAYER:
-      data_raise_layer(dia->data, change->layer);
+      data_raise_layer (dia->data, change->layer);
       break;
     default:
       g_return_if_reached ();
@@ -212,31 +212,17 @@ dia_layer_change_free (DiaChange *self)
 {
   DiaLayerChange *change = DIA_LAYER_CHANGE (self);
 
-  switch (change->type) {
-    case TYPE_DELETE_LAYER:
-      if (change->applied) {
-        g_clear_object (&change->layer);
-      }
-      break;
-    case TYPE_ADD_LAYER:
-      if (!change->applied) {
-        g_clear_object (&change->layer);
-      }
-      break;
-    case TYPE_RAISE_LAYER:
-    case TYPE_LOWER_LAYER:
-    default:
-      break;
-  }
+  g_clear_object (&change->layer);
 }
 
+
 DiaChange *
 dia_layer_change_new (Diagram *dia, DiaLayer *layer, enum LayerChangeType type, int index)
 {
   DiaLayerChange *change = dia_change_new (DIA_TYPE_LAYER_CHANGE);
 
   change->type = type;
-  change->layer = layer;
+  g_set_object (&change->layer, layer);
   change->index = index;
   change->applied = 1;
 
@@ -264,34 +250,30 @@ dia_layer_visibility_change_apply (DiaChange *self,
                                    Diagram   *dia)
 {
   DiaLayerVisibilityChange *change = DIA_LAYER_VISIBILITY_CHANGE (self);
-  GPtrArray *layers;
   DiaLayer *layer = change->layer;
   int visible = FALSE;
-  int i;
 
   if (change->is_exclusive) {
     /*  First determine if _any_ other layer widgets are set to visible.
      *  If there is, exclusive switching turns all off.  */
-    for (i=0;i<dia->data->layers->len;i++) {
-      DiaLayer *temp_layer = g_ptr_array_index(dia->data->layers, i);
+    DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
       if (temp_layer != layer) {
         visible |= dia_layer_is_visible (temp_layer);
       }
-    }
+    });
 
     /*  Now, toggle the visibility for all layers except the specified one  */
-    layers = dia->data->layers;
-    for (i = 0; i < layers->len; i++) {
-      DiaLayer *temp_layer = (DiaLayer *) g_ptr_array_index(layers, i);
+    DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
       if (temp_layer == layer) {
         dia_layer_set_visible (temp_layer, TRUE);
       } else {
         dia_layer_set_visible (temp_layer, !visible);
       }
-    }
+    });
   } else {
     dia_layer_set_visible (layer, !dia_layer_is_visible (layer));
   }
+
   diagram_add_update_all (dia);
 }
 
@@ -305,17 +287,17 @@ dia_layer_visibility_change_revert (DiaChange *self,
 {
   DiaLayerVisibilityChange *change = DIA_LAYER_VISIBILITY_CHANGE (self);
   GList *vis = change->original_visibility;
-  GPtrArray *layers = dia->data->layers;
   int i;
 
-  for (i = 0; vis != NULL && i < layers->len; vis = g_list_next(vis), i++) {
-    DiaLayer *layer = DIA_LAYER (g_ptr_array_index (layers, i));
+  for (i = 0; vis != NULL && i < data_layer_count (DIA_DIAGRAM_DATA (dia)); vis = g_list_next (vis), i++) {
+    DiaLayer *layer = data_layer_get_nth (DIA_DIAGRAM_DATA (dia), i);
     dia_layer_set_visible (layer, GPOINTER_TO_INT (vis->data));
   }
 
-  if (vis != NULL || i < layers->len) {
-    g_printerr ("Internal error: visibility undo has %d visibilities, but %d layers\n",
-                g_list_length(change->original_visibility), layers->len);
+  if (vis != NULL || i < data_layer_count (DIA_DIAGRAM_DATA (dia))) {
+    g_critical ("Internal error: visibility undo has %d visibilities, but %d layers\n",
+                g_list_length (change->original_visibility),
+                data_layer_count (DIA_DIAGRAM_DATA (dia)));
   }
 
   diagram_add_update_all(dia);
@@ -336,13 +318,11 @@ dia_layer_visibility_change_new (Diagram *dia, DiaLayer *layer, gboolean exclusi
 {
   DiaLayerVisibilityChange *change = dia_change_new (DIA_TYPE_LAYER_VISIBILITY_CHANGE);
   GList *visibilities = NULL;
-  int i;
-  GPtrArray *layers = dia->data->layers;
 
-  for (i = 0; i < layers->len; i++) {
-    DiaLayer *temp_layer = DIA_LAYER (g_ptr_array_index (layers, i));
-    visibilities = g_list_append (visibilities, GINT_TO_POINTER (dia_layer_is_visible (temp_layer)));
-  }
+  DIA_FOR_LAYER_IN_DIAGRAM (DIA_DIAGRAM_DATA (dia), temp_layer, i, {
+    visibilities = g_list_append (visibilities,
+                                  GINT_TO_POINTER (dia_layer_is_visible (temp_layer)));
+  });
 
   change->original_visibility = visibilities;
   change->layer = layer;
diff --git a/app/load_save.c b/app/load_save.c
index a32bdf94..a9c321e4 100644
--- a/app/load_save.c
+++ b/app/load_save.c
@@ -373,8 +373,12 @@ _get_bool_prop (xmlNodePtr node, const char *name, gboolean preset)
   return ret;
 }
 
+
 static gboolean
-diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, void* user_data)
+diagram_data_load (const char  *filename,
+                   DiagramData *data,
+                   DiaContext  *ctx,
+                   void        *user_data)
 {
   GHashTable *objects_hash;
   int fd;
@@ -393,21 +397,24 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
   GHashTable* unknown_objects_hash = g_hash_table_new(g_str_hash, g_str_equal);
   int num_layers_added = 0;
 
-  g_return_val_if_fail(data!=NULL, FALSE);
+  g_return_val_if_fail (data != NULL, FALSE);
 
   if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
-    dia_context_add_message(ctx, _("You must specify a file, not a directory."));
+    dia_context_add_message (ctx,
+                             _("You must specify a file, not a directory."));
     return FALSE;
   }
 
-  fd = g_open(filename, O_RDONLY, 0);
+  fd = g_open (filename, O_RDONLY, 0);
 
   if (fd==-1) {
-    dia_context_add_message(ctx, _("Couldn't open: '%s' for reading.\n"), filename);
+    dia_context_add_message (ctx,
+                             _("Couldn't open: '%s' for reading.\n"),
+                             filename);
     return FALSE;
   }
 
-  if (read(fd, &firstchar, 1)) {
+  if (read (fd, &firstchar, 1)) {
     data->is_compressed = (firstchar != '<');
   } else {
     /* Couldn't read a single char?  Set to default. */
@@ -415,39 +422,40 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
   }
 
   /* Note that this closing and opening means we can't read from a pipe */
-  close(fd);
+  close (fd);
 
   doc = diaXmlParseFile (filename, ctx, TRUE);
 
   if (doc == NULL){
     /* this was talking about unknown file type but it could as well be broken XML */
-    dia_context_add_message(ctx, _("Error loading diagram %s."), filename);
+    dia_context_add_message (ctx, _("Error loading diagram %s."), filename);
     return FALSE;
   }
 
   root = doc->xmlRootNode;
   /* skip comments */
-  while (root && (root->type != XML_ELEMENT_NODE))
+  while (root && (root->type != XML_ELEMENT_NODE)) {
     root = root->next;
+  }
+
   if (root == NULL) {
-    message_error(_("Error loading diagram %s.\nUnknown file type."),
-                 dia_message_filename(filename));
+    message_error (_("Error loading diagram %s.\nUnknown file type."),
+                   dia_message_filename (filename));
     xmlFreeDoc (doc);
     return FALSE;
   }
 
-  namespace = xmlSearchNs(doc, root, (const xmlChar *)"dia");
-  if (xmlStrcmp (root->name, (const xmlChar *)"diagram") || (namespace == NULL)){
-    message_error(_("Error loading diagram %s.\nNot a Dia file."),
-                 dia_message_filename(filename));
+  namespace = xmlSearchNs (doc, root, "dia");
+  if (xmlStrcmp (root->name, "diagram") || (namespace == NULL)) {
+    message_error (_("Error loading diagram %s.\nNot a Dia file."),
+                   dia_message_filename (filename));
     xmlFreeDoc (doc);
     return FALSE;
   }
 
   /* Destroy the default layer: */
-  if (dia_layer_object_count (data->active_layer) == 0) {
-    g_ptr_array_remove (data->layers, data->active_layer);
-    g_clear_object (&data->active_layer);
+  if (dia_layer_object_count (dia_diagram_data_get_active_layer (data)) == 0) {
+    data_remove_layer (data, dia_diagram_data_get_active_layer (data));
   }
 
   diagramdata =
@@ -455,80 +463,98 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
 
   /* Read in diagram data: */
   data->bg_color = prefs.new_diagram.bg_color;
-  attr = composite_find_attribute(diagramdata, "background");
-  if (attr != NULL)
-    data_color(attribute_first_data(attr), &data->bg_color, ctx);
+  attr = composite_find_attribute (diagramdata, "background");
+  if (attr != NULL) {
+    data_color (attribute_first_data (attr), &data->bg_color, ctx);
+  }
 
   if (diagram) {
     diagram->pagebreak_color = prefs.new_diagram.pagebreak_color;
-    attr = composite_find_attribute(diagramdata, "pagebreak");
-    if (attr != NULL)
-      data_color(attribute_first_data(attr), &diagram->pagebreak_color, ctx);
+    attr = composite_find_attribute (diagramdata, "pagebreak");
+    if (attr != NULL) {
+      data_color (attribute_first_data (attr), &diagram->pagebreak_color, ctx);
+    }
   }
+
   /* load paper information from diagramdata section */
-  attr = composite_find_attribute(diagramdata, "paper");
+  attr = composite_find_attribute (diagramdata, "paper");
   if (attr != NULL) {
-    paperinfo = attribute_first_data(attr);
+    paperinfo = attribute_first_data (attr);
 
-    attr = composite_find_attribute(paperinfo, "name");
+    attr = composite_find_attribute (paperinfo, "name");
     if (attr != NULL) {
       g_clear_pointer (&data->paper.name, g_free);
-      data->paper.name = data_string(attribute_first_data(attr), ctx);
+      data->paper.name = data_string (attribute_first_data (attr), ctx);
     }
+
     if (data->paper.name == NULL || data->paper.name[0] == '\0') {
-      data->paper.name = g_strdup(prefs.new_diagram.papertype);
+      data->paper.name = g_strdup (prefs.new_diagram.papertype);
     }
+
     /* set default margins for paper size ... */
-    dia_page_layout_get_default_margins(data->paper.name,
-                                       &data->paper.tmargin,
-                                       &data->paper.bmargin,
-                                       &data->paper.lmargin,
-                                       &data->paper.rmargin);
-
-    attr = composite_find_attribute(paperinfo, "tmargin");
-    if (attr != NULL)
-      data->paper.tmargin = data_real(attribute_first_data(attr), ctx);
-    attr = composite_find_attribute(paperinfo, "bmargin");
-    if (attr != NULL)
-      data->paper.bmargin = data_real(attribute_first_data(attr), ctx);
-    attr = composite_find_attribute(paperinfo, "lmargin");
-    if (attr != NULL)
-      data->paper.lmargin = data_real(attribute_first_data(attr), ctx);
-    attr = composite_find_attribute(paperinfo, "rmargin");
-    if (attr != NULL)
-      data->paper.rmargin = data_real(attribute_first_data(attr), ctx);
-
-    attr = composite_find_attribute(paperinfo, "is_portrait");
+    dia_page_layout_get_default_margins (data->paper.name,
+                                         &data->paper.tmargin,
+                                         &data->paper.bmargin,
+                                         &data->paper.lmargin,
+                                         &data->paper.rmargin);
+
+    attr = composite_find_attribute (paperinfo, "tmargin");
+    if (attr != NULL) {
+      data->paper.tmargin = data_real (attribute_first_data(attr), ctx);
+    }
+
+    attr = composite_find_attribute (paperinfo, "bmargin");
+    if (attr != NULL) {
+      data->paper.bmargin = data_real (attribute_first_data (attr), ctx);
+    }
+
+    attr = composite_find_attribute (paperinfo, "lmargin");
+    if (attr != NULL) {
+      data->paper.lmargin = data_real (attribute_first_data (attr), ctx);
+    }
+
+    attr = composite_find_attribute (paperinfo, "rmargin");
+    if (attr != NULL) {
+      data->paper.rmargin = data_real (attribute_first_data (attr), ctx);
+    }
+
+    attr = composite_find_attribute (paperinfo, "is_portrait");
     data->paper.is_portrait = TRUE;
-    if (attr != NULL)
-      data->paper.is_portrait = data_boolean(attribute_first_data(attr), ctx);
+    if (attr != NULL) {
+      data->paper.is_portrait = data_boolean (attribute_first_data (attr),
+                                              ctx);
+    }
 
-    attr = composite_find_attribute(paperinfo, "scaling");
+    attr = composite_find_attribute (paperinfo, "scaling");
     data->paper.scaling = 1.0;
-    if (attr != NULL)
-      data->paper.scaling = data_real(attribute_first_data(attr), ctx);
+    if (attr != NULL) {
+      data->paper.scaling = data_real (attribute_first_data (attr), ctx);
+    }
 
-    attr = composite_find_attribute(paperinfo, "fitto");
+    attr = composite_find_attribute (paperinfo, "fitto");
     data->paper.fitto = FALSE;
-    if (attr != NULL)
-      data->paper.fitto = data_boolean(attribute_first_data(attr), ctx);
+    if (attr != NULL) {
+      data->paper.fitto = data_boolean (attribute_first_data (attr), ctx);
+    }
 
-    attr = composite_find_attribute(paperinfo, "fitwidth");
+    attr = composite_find_attribute (paperinfo, "fitwidth");
     data->paper.fitwidth = 1;
-    if (attr != NULL)
-      data->paper.fitwidth = data_int(attribute_first_data(attr), ctx);
+    if (attr != NULL) {
+      data->paper.fitwidth = data_int (attribute_first_data (attr), ctx);
+    }
 
-    attr = composite_find_attribute(paperinfo, "fitheight");
+    attr = composite_find_attribute (paperinfo, "fitheight");
     data->paper.fitheight = 1;
-    if (attr != NULL)
-      data->paper.fitheight = data_int(attribute_first_data(attr), ctx);
+    if (attr != NULL) {
+      data->paper.fitheight = data_int (attribute_first_data (attr), ctx);
+    }
 
     /* calculate effective width/height */
-    dia_page_layout_get_paper_size(data->paper.name,
-                                  &data->paper.width,
-                                  &data->paper.height);
+    dia_page_layout_get_paper_size (data->paper.name,
+                                    &data->paper.width,
+                                    &data->paper.height);
     if (!data->paper.is_portrait) {
-      gfloat tmp = data->paper.width;
+      float tmp = data->paper.width;
 
       data->paper.width = data->paper.height;
       data->paper.height = tmp;
@@ -616,37 +642,44 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
     if (attr != NULL) {
       DataNode dispinfo;
 
-      dispinfo = attribute_first_data(attr);
+      dispinfo = attribute_first_data (attr);
       /* using the diagramdata object as temporary storage is a bit hacky,
        * and also the magic numbers (keeping 0 as dont care) */
 
-      attr = composite_find_attribute(dispinfo, "antialiased");
-      if (attr != NULL)
-       g_object_set_data(G_OBJECT(diagram),
-         "antialiased", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+      attr = composite_find_attribute (dispinfo, "antialiased");
+      if (attr != NULL) {
+        g_object_set_data (G_OBJECT (diagram),
+                           "antialiased",
+                           GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+      }
 
-      attr = composite_find_attribute(dispinfo, "snap-to-grid");
-      if (attr != NULL)
-       g_object_set_data(G_OBJECT(diagram),
-         "snap-to-grid", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+      attr = composite_find_attribute (dispinfo, "snap-to-grid");
+      if (attr != NULL) {
+        g_object_set_data (G_OBJECT (diagram),
+                           "snap-to-grid",
+                           GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+      }
 
-      attr = composite_find_attribute(dispinfo, "snap-to-guides");
+      attr = composite_find_attribute (dispinfo, "snap-to-guides");
       if (attr != NULL) {
         g_object_set_data (G_OBJECT (diagram),
                            "snap-to-guides",
                            GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
       }
 
-      attr = composite_find_attribute(dispinfo, "snap-to-object");
-      if (attr != NULL)
-        g_object_set_data(G_OBJECT(diagram),
-         "snap-to-object", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
-
-      attr = composite_find_attribute(dispinfo, "show-grid");
-      if (attr != NULL)
-        g_object_set_data(G_OBJECT(diagram),
-         "show-grid", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+      attr = composite_find_attribute (dispinfo, "snap-to-object");
+      if (attr != NULL) {
+        g_object_set_data (G_OBJECT (diagram),
+                           "snap-to-object",
+                           GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+      }
 
+      attr = composite_find_attribute (dispinfo, "show-grid");
+      if (attr != NULL) {
+        g_object_set_data (G_OBJECT (diagram),
+                           "show-grid",
+                           GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
+      }
 
       attr = composite_find_attribute(dispinfo, "show-guides");
       if (attr != NULL) {
@@ -655,34 +688,35 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
                            GINT_TO_POINTER (data_boolean (attribute_first_data (attr), ctx) ? 1 : -1));
       }
 
-      attr = composite_find_attribute(dispinfo, "show-connection-points");
-      if (attr != NULL)
-        g_object_set_data(G_OBJECT(diagram),
-         "show-connection-points", GINT_TO_POINTER (data_boolean(attribute_first_data(attr), ctx) ? 1 : -1));
+      attr = composite_find_attribute (dispinfo, "show-connection-points");
+      if (attr != NULL) {
+        g_object_set_data (G_OBJECT (diagram),
+                           "show-connection-points",
+                           GINT_TO_POINTER (data_boolean (attribute_first_data(attr), ctx) ? 1 : -1));
+      }
     }
   }
   /* Read in all layers: */
   layer_node =
     find_node_named (root->xmlChildrenNode, "layer");
 
-  objects_hash = g_hash_table_new(g_str_hash, g_str_equal);
+  objects_hash = g_hash_table_new (g_str_hash, g_str_equal);
 
   while (layer_node != NULL) {
-    gchar *name;
-    gboolean active;
+    xmlChar *name;
 
-    if (xmlIsBlankNode(layer_node)) {
+    if (xmlIsBlankNode (layer_node)) {
       layer_node = layer_node->next;
       continue;
     }
 
     if (!layer_node) break;
 
-    name = (char *)xmlGetProp(layer_node, (const xmlChar *)"name");
+    name = xmlGetProp (layer_node, "name");
     if (!name) break; /* name is mandatory */
 
-    layer = dia_layer_new (name, data);
-    if (name) xmlFree (name);
+    layer = dia_layer_new ((char *) name, data);
+    dia_clear_xml_string (&name);
 
     g_object_set (layer,
                   "visible", _get_bool_prop (layer_node, "visible", FALSE),
@@ -696,9 +730,11 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
     data_add_layer (data, layer);
     ++num_layers_added;
 
-    active = _get_bool_prop (layer_node, "active", FALSE);
-    if (active)
-      active_layer = layer;
+    if (_get_bool_prop (layer_node, "active", FALSE)) {
+      g_set_object (&active_layer, layer);
+    }
+
+    g_clear_object (&layer);
 
     layer_node = layer_node->next;
   }
@@ -708,7 +744,7 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
     int i = data_layer_count (data) - num_layers_added;
     layer_node = find_node_named (root->xmlChildrenNode, "layer");
     for (; i < data_layer_count (data); ++i) {
-      layer = (DiaLayer *) g_ptr_array_index(data->layers, i);
+      layer = data_layer_get_nth (data, i);
 
       while (layer_node && xmlStrcmp (layer_node->name, (xmlChar *)"layer") != 0)
         layer_node = layer_node->next;
@@ -723,37 +759,40 @@ diagram_data_load(const gchar *filename, DiagramData *data, DiaContext *ctx, voi
     }
   }
 
-  if (!active_layer)
-    data->active_layer = DIA_LAYER (g_ptr_array_index (data->layers, 0));
-  else
+  if (!active_layer) {
+    data_set_active_layer (data, data_layer_get_nth (data, 0));
+  } else {
     data_set_active_layer (data, active_layer);
+  }
 
-  xmlFreeDoc(doc);
+  g_clear_object (&active_layer);
+  xmlFreeDoc (doc);
 
-  g_hash_table_foreach(objects_hash, hash_free_string, NULL);
+  g_hash_table_foreach (objects_hash, hash_free_string, NULL);
 
-  g_hash_table_destroy(objects_hash);
+  g_hash_table_destroy (objects_hash);
 
-  if (data->layers->len < 1) {
+  if (data_layer_count (data) < 1) {
     message_error (_("Error loading diagram:\n%s.\n"
                      "A valid Dia file defines at least one layer."),
-                    dia_message_filename(filename));
+                   dia_message_filename(filename));
     return FALSE;
-  } else if (0 < g_hash_table_size(unknown_objects_hash)) {
-    GString*    unknown_str = g_string_new("Unknown types while reading diagram file");
+  } else if (0 < g_hash_table_size (unknown_objects_hash)) {
+    GString *unknown_str = g_string_new ("Unknown types while reading diagram file");
 
     /* show all the unknown types in one message */
-    g_hash_table_foreach(unknown_objects_hash,
-                        GHFuncUnknownObjects,
-                        unknown_str);
-    message_warning("%s", unknown_str->str);
-    g_string_free(unknown_str, TRUE);
+    g_hash_table_foreach (unknown_objects_hash,
+                          GHFuncUnknownObjects,
+                          unknown_str);
+    message_warning ("%s", unknown_str->str);
+    g_string_free (unknown_str, TRUE);
   }
-  g_hash_table_destroy(unknown_objects_hash);
+  g_hash_table_destroy (unknown_objects_hash);
 
   return TRUE;
 }
 
+
 static gboolean
 write_objects(GList *objects, xmlNodePtr objects_node,
              GHashTable *objects_hash, int *obj_nr,
@@ -908,8 +947,6 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
   GHashTable *objects_hash;
   gboolean res;
   int obj_nr;
-  guint i;
-  DiaLayer *layer;
   AttributeNode attr;
   xmlNs *name_space;
   Diagram *diagram = DIA_IS_DIAGRAM (data) ? DIA_DIAGRAM (data) : NULL;
@@ -1024,11 +1061,10 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
 
   obj_nr = 0;
 
-  for (i = 0; i < data->layers->len; i++) {
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     layer_node = xmlNewChild (doc->xmlRootNode,
                               name_space,
                               (const xmlChar *) "layer", NULL);
-    layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
     xmlSetProp (layer_node,
                 (const xmlChar *) "name",
                 (xmlChar *) dia_layer_get_name (layer));
@@ -1040,7 +1076,7 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
                 (const xmlChar *) "connectable",
                 (const xmlChar *) (dia_layer_is_connectable (layer) ? "true" : "false"));
 
-    if (layer == data->active_layer) {
+    if (layer == dia_diagram_data_get_active_layer (data)) {
       xmlSetProp (layer_node,
                   (const xmlChar *) "active",
                   (const xmlChar *) "true");
@@ -1052,14 +1088,13 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
                    &obj_nr,
                    filename,
                    ctx);
-  }
+  });
   /* The connections are stored per layer in the file format, but connections are not any longer
    * restricted to objects on the same layer. So we iterate over all the layer (nodes) again to
    * 'know' all objects we might have to connect to
    */
   layer_node = doc->xmlRootNode->children;
-  for (i = 0; i < data->layers->len; i++) {
-    layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     while (layer_node && xmlStrcmp (layer_node->name, (xmlChar *) "layer") != 0) {
       layer_node = layer_node->next;
     }
@@ -1078,18 +1113,20 @@ diagram_data_write_doc(DiagramData *data, const char *filename, DiaContext *ctx)
                                dia_layer_get_name (layer));
     }
     layer_node = layer_node->next;
-  }
+  });
 
-  g_hash_table_destroy(objects_hash);
+  g_hash_table_destroy (objects_hash);
 
-  if (data->is_compressed)
-    xmlSetDocCompressMode(doc, 9);
-  else
-    xmlSetDocCompressMode(doc, 0);
+  if (data->is_compressed) {
+    xmlSetDocCompressMode (doc, 9);
+  } else {
+    xmlSetDocCompressMode (doc, 0);
+  }
 
   return doc;
 }
 
+
 /** This tries to save the diagram into a file, without any backup
  * Returns >= 0 on success.
  * Only for internal use. */
diff --git a/app/modify_tool.c b/app/modify_tool.c
index 96c1f6b9..d018abbf 100644
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -708,10 +708,10 @@ find_selected_objects(DDisplay *ddisp, ModifyTool *tool)
   if (prefs.reverse_rubberbanding_intersects &&
       tool->start_box.x > tool->end_box.x) {
     return
-      dia_layer_find_objects_intersecting_rectangle (ddisp->diagram->data->active_layer, &r);
+      dia_layer_find_objects_intersecting_rectangle (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(ddisp->diagram)), &r);
   } else {
     return
-      dia_layer_find_objects_in_rectangle (ddisp->diagram->data->active_layer, &r);
+      dia_layer_find_objects_in_rectangle (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA 
(ddisp->diagram)), &r);
   }
 }
 
diff --git a/app/select.c b/app/select.c
index 4294a855..0686babd 100644
--- a/app/select.c
+++ b/app/select.c
@@ -41,7 +41,7 @@ select_all_callback(GtkAction *action)
   if (!ddisp || textedit_mode(ddisp)) return;
   dia = ddisp->diagram;
 
-  objects = dia_layer_get_object_list (dia->data->active_layer);
+  objects = dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
 
   while (objects != NULL) {
     DiaObject *obj = DIA_OBJECT (objects->data);
@@ -84,7 +84,7 @@ select_invert_callback (GtkAction *action)
   if (!ddisp || textedit_mode (ddisp)) return;
   dia = ddisp->diagram;
 
-  tmp =  dia_layer_get_object_list (dia->data->active_layer);
+  tmp =  dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
 
   for (; tmp != NULL; tmp = g_list_next (tmp)) {
     DiaObject *obj = DIA_OBJECT (tmp->data);
@@ -233,7 +233,7 @@ select_same_type_callback (GtkAction *action)
   if (!ddisp || textedit_mode (ddisp)) return;
   dia = ddisp->diagram;
 
-  tmp = dia_layer_get_object_list (dia->data->active_layer);
+  tmp = dia_layer_get_object_list (dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia)));
 
   objects = dia->data->selected;
 
diff --git a/app/undo.c b/app/undo.c
index 78af391a..7ea73fa5 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -751,9 +751,9 @@ dia_delete_objects_change_new (Diagram *dia, GList *obj_list)
 {
   DiaDeleteObjectsChange *change = dia_change_new (DIA_TYPE_DELETE_OBJECTS_CHANGE);
 
-  change->layer = dia->data->active_layer;
+  change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
   change->obj_list = obj_list;
-  change->original_objects = g_list_copy (dia_layer_get_object_list (dia->data->active_layer));
+  change->original_objects = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer 
(DIA_DIAGRAM_DATA (dia))));
   change->applied = 0;
 
   undo_push_change (dia->undo, DIA_CHANGE (change));
@@ -829,7 +829,7 @@ dia_insert_objects_change_new (Diagram *dia, GList *obj_list, int applied)
 {
   DiaInsertObjectsChange *change = dia_change_new (DIA_TYPE_INSERT_OBJECTS_CHANGE);
 
-  change->layer = dia->data->active_layer;
+  change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
   change->obj_list = obj_list;
   change->applied = applied;
 
@@ -895,10 +895,10 @@ dia_reorder_objects_change_new (Diagram *dia, GList *changed_list, GList *orig_l
 {
   DiaReorderObjectsChange *change = dia_change_new (DIA_TYPE_REORDER_OBJECTS_CHANGE);
 
-  change->layer = dia->data->active_layer;
+  change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
   change->changed_list = changed_list;
   change->original_objects = orig_list;
-  change->reordered_objects = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA (dia)->active_layer));
+  change->reordered_objects = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer 
(DIA_DIAGRAM_DATA (dia))));
 
   undo_push_change (dia->undo, DIA_CHANGE (change));
 
@@ -1109,7 +1109,7 @@ dia_group_objects_change_new (Diagram   *dia,
 {
   DiaGroupObjectsChange *change = dia_change_new (DIA_TYPE_GROUP_OBJECTS_CHANGE);
 
-  change->layer = dia->data->active_layer;
+  change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
   change->group = group;
   change->obj_list = obj_list;
   change->orig_list = orig_list;
@@ -1207,7 +1207,7 @@ dia_ungroup_objects_change_new (Diagram   *dia,
 {
   DiaUngroupObjectsChange *change = dia_change_new (DIA_TYPE_UNGROUP_OBJECTS_CHANGE);
 
-  change->layer = dia->data->active_layer;
+  change->layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
   change->group = group;
   change->obj_list = obj_list;
   change->group_index = group_index;
@@ -1344,21 +1344,19 @@ move_object_layer_relative (Diagram *dia, GList *objects, gint dist)
   DiaLayer *active, *target;
   guint pos;
 
-  g_return_if_fail (dia->data->active_layer);
-  g_return_if_fail (dia->data->layers->len != 0);
+  g_return_if_fail (data_layer_count (DIA_DIAGRAM_DATA (dia)) != 0);
 
-  active =  dia->data->active_layer;
-  for (pos = 0; pos < dia->data->layers->len; ++pos) {
-    if (active == g_ptr_array_index (dia->data->layers, pos)) {
-      break;
-    }
-  }
+  active = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
+
+  g_return_if_fail (active);
+
+  pos = data_layer_get_index (DIA_DIAGRAM_DATA (dia), active);
 
-  pos = (pos + dia->data->layers->len + dist) % dia->data->layers->len;
-  target = g_ptr_array_index (dia->data->layers, pos);
+  pos = (pos + data_layer_count (DIA_DIAGRAM_DATA (dia)) + dist) % data_layer_count (DIA_DIAGRAM_DATA (dia));
+  target = data_layer_get_nth (DIA_DIAGRAM_DATA (dia), pos);
   object_add_updates_list (objects, dia);
   dia_layer_remove_objects (active, objects);
-  dia_layer_add_objects (target, g_list_copy(objects));
+  dia_layer_add_objects (target, g_list_copy (objects));
   data_set_active_layer (dia->data, target);
 }
 
@@ -1413,8 +1411,8 @@ dia_move_object_to_layer_change_new (Diagram  *dia,
 {
   DiaMoveObjectToLayerChange *movetolayerchange = dia_change_new (DIA_TYPE_MOVE_OBJECT_TO_LAYER_CHANGE);
 
-  movetolayerchange->orig_layer = dia->data->active_layer;
-  movetolayerchange->orig_list = g_list_copy (dia_layer_get_object_list (DIA_DIAGRAM_DATA 
(dia)->active_layer));
+  movetolayerchange->orig_layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
+  movetolayerchange->orig_list = g_list_copy (dia_layer_get_object_list (dia_diagram_data_get_active_layer 
(DIA_DIAGRAM_DATA (dia))));
   movetolayerchange->objects = g_list_copy (selected_list);
   movetolayerchange->moving_up = moving_up;
 
@@ -1442,7 +1440,7 @@ dia_import_change_apply (DiaChange *self,
 {
   DiaImportChange *change = DIA_IMPORT_CHANGE (self);
   GList *list;
-  DiaLayer *layer = dia->data->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (DIA_DIAGRAM_DATA (dia));
 
   /* add all objects and layers added from the diagram */
   for (list = change->layers; list != NULL; list = list->next) {
diff --git a/lib/dia_xml.h b/lib/dia_xml.h
index f6f9598b..d624292d 100644
--- a/lib/dia_xml.h
+++ b/lib/dia_xml.h
@@ -115,5 +115,8 @@ void data_add_pattern(AttributeNode attr, DiaPattern *pat, DiaContext *ctx);
 
 xmlDocPtr diaXmlParseFile(const char *filename, DiaContext *ctx, gboolean try_harder);
 
+#define dia_clear_xml_string(pointer) g_clear_pointer(pointer, xmlFree)
+
+
 #endif /* DIA_XML_H */
 
diff --git a/lib/diagramdata.c b/lib/diagramdata.c
index 1aadd2c8..0ee321dc 100644
--- a/lib/diagramdata.c
+++ b/lib/diagramdata.c
@@ -23,7 +23,9 @@
 #include <config.h>
 
 #include "intl.h"
+#define __in_diagram_data
 #include "diagramdata.h"
+#undef __in_diagram_data
 #include "diarenderer.h"
 #include "diainteractiverenderer.h"
 #include "paper.h"
@@ -124,12 +126,6 @@ diagram_data_init(DiagramData *data)
 
   get_paper_info (&data->paper, -1, NULL);
 
-  first_layer = dia_layer_new (_("Background"), data);
-
-  data->layers = g_ptr_array_new_with_free_func (g_object_unref);
-  g_ptr_array_add (data->layers, first_layer);
-  data->active_layer = first_layer;
-
   data->selected_count_private = 0;
   data->selected = NULL;
 
@@ -139,6 +135,14 @@ diagram_data_init(DiagramData *data)
 
   data->text_edits = NULL;
   data->active_text_edit = NULL;
+
+  first_layer = dia_layer_new (_("Background"), data);
+
+  data->layers = g_ptr_array_new_with_free_func (g_object_unref);
+  data_add_layer (data, first_layer);
+  data_set_active_layer (data, first_layer);
+
+  g_clear_object (&first_layer);
 }
 
 
@@ -152,8 +156,8 @@ diagram_data_finalize (GObject *object)
 
   g_clear_pointer (&data->paper.name, g_free);
 
+  g_clear_weak_pointer (&data->active_layer);
   g_ptr_array_free (data->layers, TRUE);
-  data->active_layer = NULL;
 
   g_list_free (data->selected);
   data->selected = NULL; /* for safety */
@@ -177,7 +181,6 @@ DiagramData *
 diagram_data_clone (DiagramData *data)
 {
   DiagramData *clone;
-  guint i;
 
   clone = g_object_new (DIA_TYPE_DIAGRAM_DATA, NULL);
 
@@ -187,20 +190,17 @@ diagram_data_clone (DiagramData *data)
   clone->paper.name = g_strdup (data->paper.name);
   clone->is_compressed = data->is_compressed;
 
-  g_ptr_array_remove_index (clone->layers, 0);
-  g_ptr_array_remove (clone->layers, clone->active_layer);
+  data_remove_layer (clone, data_layer_get_nth (clone, 0));
 
-  for (i=0; i < data->layers->len; ++i) {
-    DiaLayer *src_layer = g_ptr_array_index (data->layers, i);
+  DIA_FOR_LAYER_IN_DIAGRAM (data, src_layer, i, {
     DiaLayer *dest_layer = dia_layer_new_from_layer (src_layer);
 
-    g_ptr_array_add (clone->layers, dest_layer);
+    data_add_layer (clone, dest_layer);
 
-    if (src_layer == data->active_layer)
-      clone->active_layer = dest_layer;
+    g_clear_object (&dest_layer);
+  });
 
-    /* the rest should be initialized by construction */
-  }
+  data_set_active_layer (clone, dia_diagram_data_get_active_layer (data));
 
   return clone;
 }
@@ -213,6 +213,7 @@ DiagramData *
 diagram_data_clone_selected (DiagramData *data)
 {
   DiagramData *clone;
+  DiaLayer *src_layer;
   DiaLayer *dest_layer;
   GList *sorted;
 
@@ -224,13 +225,14 @@ diagram_data_clone_selected (DiagramData *data)
   clone->paper.name = g_strdup (data->paper.name);
   clone->is_compressed = data->is_compressed;
 
+  src_layer = dia_diagram_data_get_active_layer (data);
   /* the selection - if any - can only be on the active layer */
-  dest_layer = g_ptr_array_index (clone->layers, 0);
+  dest_layer = dia_diagram_data_get_active_layer (clone);
 
   g_object_set (dest_layer,
-                "name", dia_layer_get_name (data->active_layer),
-                "connectable", dia_layer_is_connectable (data->active_layer),
-                "visible", dia_layer_is_visible (data->active_layer),
+                "name", dia_layer_get_name (src_layer),
+                "connectable", dia_layer_is_connectable (src_layer),
+                "visible", dia_layer_is_visible (src_layer),
                 NULL);
 
   sorted = data_get_sorted_selected (data);
@@ -292,6 +294,7 @@ diagram_data_class_init(DiagramDataClass *klass)
   klass->selection_changed = _diagram_data_selection_changed;
 }
 
+
 /*!
  * \brief Raise a layer up one in a diagram.
  * @param data The diagram that the layer belongs to.
@@ -301,23 +304,20 @@ diagram_data_class_init(DiagramDataClass *klass)
 void
 data_raise_layer (DiagramData *data, DiaLayer *layer)
 {
-  guint i;
   guint layer_nr = 0;
   DiaLayer *tmp;
 
-  for (i=0;i<data->layers->len;i++) {
-    if (g_ptr_array_index(data->layers, i)==layer)
-      layer_nr = i;
-  }
+  layer_nr = data_layer_get_index (data, layer);
 
-  if (layer_nr < data->layers->len-1) {
-    tmp = g_ptr_array_index(data->layers, layer_nr+1);
-    g_ptr_array_index(data->layers, layer_nr+1) =
-      g_ptr_array_index(data->layers, layer_nr);
-    g_ptr_array_index(data->layers, layer_nr) = tmp;
+  if (layer_nr < data_layer_count (data) - 1) {
+    tmp = g_ptr_array_index (data->layers, layer_nr + 1);
+    g_ptr_array_index (data->layers, layer_nr + 1) =
+                                g_ptr_array_index (data->layers, layer_nr);
+    g_ptr_array_index (data->layers, layer_nr) = tmp;
   }
 }
 
+
 /*!
  * \brief Lower a layer by one in a diagram.
  * @param data The diagram that the layer belongs to.
@@ -325,27 +325,24 @@ data_raise_layer (DiagramData *data, DiaLayer *layer)
  * \memberof _DiagramData
  */
 void
-data_lower_layer(DiagramData *data, DiaLayer *layer)
+data_lower_layer (DiagramData *data, DiaLayer *layer)
 {
-  guint i;
   int layer_nr = -1;
   DiaLayer *tmp;
 
-  for (i=0;i<data->layers->len;i++) {
-    if (g_ptr_array_index(data->layers, i)==layer)
-      layer_nr = i;
-  }
+  layer_nr = data_layer_get_index (data, layer);
 
-  g_assert(layer_nr>=0);
+  g_return_if_fail (layer_nr >= 0);
 
   if (layer_nr > 0) {
-    tmp = g_ptr_array_index(data->layers, layer_nr-1);
-    g_ptr_array_index(data->layers, layer_nr-1) =
-      g_ptr_array_index(data->layers, layer_nr);
-    g_ptr_array_index(data->layers, layer_nr) = tmp;
+    tmp = g_ptr_array_index (data->layers, layer_nr-1);
+    g_ptr_array_index (data->layers, layer_nr-1) =
+                                g_ptr_array_index(data->layers, layer_nr);
+    g_ptr_array_index (data->layers, layer_nr) = tmp;
   }
 }
 
+
 /**
  * data_add_layer:
  * @data: The diagram to add the layer to.
@@ -356,13 +353,10 @@ data_lower_layer(DiagramData *data, DiaLayer *layer)
 void
 data_add_layer (DiagramData *data, DiaLayer *layer)
 {
-  g_ptr_array_add (data->layers, layer);
-  dia_layer_set_parent_diagram (layer, data);
-  data_emit (data, layer, NULL, "object_add");
-  dia_layer_update_extents (layer);
-  data_update_extents (data);
+  data_add_layer_at (data, layer, data_layer_count (data));
 }
 
+
 /**
  * data_add_layer_at:
  * @data: the diagram
@@ -379,14 +373,14 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
   int len;
   int i;
 
-  g_ptr_array_add(data->layers, layer);
-  len = data->layers->len;
+  g_ptr_array_add (data->layers, g_object_ref (layer));
+  len = data_layer_count (data);
 
-  if ( (pos>=0) && (pos < len)) {
-    for (i=len-1;i>pos;i--) {
-      g_ptr_array_index(data->layers, i) = g_ptr_array_index(data->layers, i-1);
+  if ((pos >= 0) && (pos < len)) {
+    for (i = len - 1; i > pos; i--) {
+      g_ptr_array_index (data->layers, i) = g_ptr_array_index (data->layers, i - 1);
     }
-    g_ptr_array_index(data->layers, pos) = layer;
+    g_ptr_array_index (data->layers, pos) = layer;
   }
 
   dia_layer_set_parent_diagram (layer, data);
@@ -395,6 +389,7 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
   data_update_extents (data);
 }
 
+
 /*!
  * \brief Get the index of a layer contained in the diagram
  *
@@ -407,40 +402,61 @@ data_add_layer_at (DiagramData *data, DiaLayer *layer, int pos)
 int
 data_layer_get_index (const DiagramData *data, const DiaLayer *layer)
 {
-  int len;
-  int i;
-
-  len = data->layers->len;
-  for (i=0;i<len;++i) {
-    if (layer == g_ptr_array_index(data->layers, i))
+  DIA_FOR_LAYER_IN_DIAGRAM (data, current, i, {
+    if (layer == current) {
       return i;
-  }
+    }
+  });
+
   return -1;
 }
 
-/*!
- * \brief Get the layer at position index
+
+/**
+ * data_layer_get_nth:
+ * @data: the #DiagramData
+ * @index: the layer position
  *
- * @param data the diagram
- * @param index the layer position
- * @return the _Layer or NULL if not found
+ * Get the layer at position @index
  *
- * \memberof _DiagramData
+ * Returns: the #DiaLayer or %NULL if not found
+ *
+ * Since: dawn-of-time
  */
 DiaLayer *
 data_layer_get_nth (const DiagramData *data, guint index)
 {
-  if (data->layers->len > index)
-    return g_ptr_array_index(data->layers, index);
+  g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (data), NULL);
+  g_return_val_if_fail (data->layers, NULL);
+
+  if (index < data_layer_count (data)) {
+    return g_ptr_array_index (data->layers, index);
+  }
+
   return NULL;
 }
 
+
+/**
+ * data_layer_count:
+ * @data: the #DiagramData
+ *
+ * Get the number of layers in @data
+ *
+ * Returns: the count
+ *
+ * Since: dawn-of-time
+ */
 int
-data_layer_count(const DiagramData *data)
+data_layer_count (const DiagramData *data)
 {
+  g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (data), -1);
+  g_return_val_if_fail (data->layers, -1);
+
   return data->layers->len;
 }
 
+
 /**
  * data_set_active_layer:
  * @data: The diagram in which to set the active layer.
@@ -451,9 +467,29 @@ data_layer_count(const DiagramData *data)
 void
 data_set_active_layer (DiagramData *data, DiaLayer *layer)
 {
-  data->active_layer = layer;
+  g_set_weak_pointer (&data->active_layer, layer);
 }
 
+
+/**
+ * dia_diagram_data_get_active_layer:
+ * @self: the #DiagramData
+ *
+ * Get the active layer, see data_set_active_layer()
+ *
+ * Returns: the active #DiaLayer, or %NULL
+ *
+ * Since: 0.98
+ */
+DiaLayer *
+dia_diagram_data_get_active_layer (DiagramData *self)
+{
+  g_return_val_if_fail (DIA_IS_DIAGRAM_DATA (self), NULL);
+
+  return self->active_layer;
+}
+
+
 /**
  * data_remove_layer:
  * @data: The diagram to remove the layer from.
@@ -464,21 +500,24 @@ data_set_active_layer (DiagramData *data, DiaLayer *layer)
 void
 data_remove_layer (DiagramData *data, DiaLayer *layer)
 {
-  if (data->layers->len<=1)
+  if (data_layer_count (data) <= 1) {
     return;
+  }
 
-  if (data->active_layer == layer) {
+  if (dia_diagram_data_get_active_layer (data) == layer) {
     data_remove_all_selected (data);
   }
+
   data_emit (data, layer, NULL, "object_remove");
   dia_layer_set_parent_diagram (layer, NULL);
   g_ptr_array_remove (data->layers, layer);
 
-  if (data->active_layer == layer) {
-    data->active_layer = g_ptr_array_index (data->layers, 0);
+  if (dia_diagram_data_get_active_layer (data) == NULL) {
+    data_set_active_layer (data, data_layer_get_nth (data, 0));
   }
 }
 
+
 static ObjectHighlight *
 find_object_highlight(GList *list, DiaObject *obj)
 {
@@ -585,41 +624,45 @@ data_remove_all_selected(DiagramData *data)
   g_signal_emit (data, diagram_data_signals[SELECTION_CHANGED], 0, data->selected_count_private);
 }
 
-/*!
- * \brief Return TRUE if the diagram has visible layers.
- * @param data The diagram to check.
- * @return TRUE if at least one layer in the diagram is visible.
- * \protected \memberof _DiagramData
+
+/**
+ * data_has_visible_layers:
+ * @data: The #DiagramData to check.
+ *
+ * Return %TRUE if the diagram has visible layers.
+ *
+ * Returns: %TRUE if at least one layer in the diagram is visible.
+ *
+ * Since: dawn-of-time
  */
 static gboolean
 data_has_visible_layers (DiagramData *data)
 {
-  guint i;
-  for (i = 0; i < data->layers->len; i++) {
-    DiaLayer *layer = g_ptr_array_index (data->layers, i);
-
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     if (dia_layer_is_visible (layer)) {
       return TRUE;
     }
-  }
+  });
+
   return FALSE;
 }
 
-/*!
- * \brief Set the diagram extents field to the union of the extents of the layers.
- * @param data The diagram to get the extents for.
- * \protected \memberof _DiagramData
+
+/**
+ * data_get_layers_extents_union:
+ * @data: The #DiagramData to get the extents for.
+ *
+ * Set the diagram extents field to the union of the extents of the layers.
+ *
+ * Since: dawn-of-time
  */
 static void
 data_get_layers_extents_union (DiagramData *data)
 {
-  guint i;
   gboolean first = TRUE;
   DiaRectangle new_extents;
 
-  for ( i = 0; i < data->layers->len; i++) {
-    DiaLayer *layer = g_ptr_array_index (data->layers, i);
-
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     if (!dia_layer_is_visible (layer)) {
       continue;
     }
@@ -638,11 +681,12 @@ data_get_layers_extents_union (DiagramData *data)
         rectangle_union (&new_extents, &extents);
       }
     }
-  }
+  });
 
   data->extents = new_extents;
 }
 
+
 /*!
  * \brief Change diagram scaling so that the extents are exactly visible.
  * @param data The diagram to adjust.
@@ -664,6 +708,7 @@ data_adapt_scaling_to_extents(DiagramData *data)
   data->paper.height = (float)(pheight / data->paper.scaling);
 }
 
+
 /*!
  * \brief Adjust the extents field of a diagram.
  * @param data The diagram to adjust.
@@ -676,8 +721,8 @@ data_compute_extents (DiagramData *data)
   DiaRectangle old_extents = data->extents;
 
   if (!data_has_visible_layers (data)) {
-    if (data->layers->len > 0) {
-      DiaLayer *layer = g_ptr_array_index (data->layers, 0);
+    if (data_layer_count (data) > 0) {
+      DiaLayer *layer = data_layer_get_nth (data, 0);
 
       dia_layer_update_extents (layer);
 
@@ -690,14 +735,16 @@ data_compute_extents (DiagramData *data)
   }
 
   if (rectangle_equals (&data->extents, &invalid_extents)) {
-      data->extents.left = 0.0;
-      data->extents.right = 10.0;
-      data->extents.top = 0.0;
-      data->extents.bottom = 10.0;
+    data->extents.left = 0.0;
+    data->extents.right = 10.0;
+    data->extents.top = 0.0;
+    data->extents.bottom = 10.0;
   }
+
   return (!rectangle_equals (&data->extents, &old_extents));
 }
 
+
 /*!
  * \brief Update the extents of a diagram and adjust scaling if needed.
  * @param data Diagram to update.
@@ -736,7 +783,7 @@ data_get_sorted_selected (DiagramData *data)
     return NULL;
 
   sorted_list = NULL;
-  list = g_list_last (dia_layer_get_object_list (data->active_layer));
+  list = g_list_last (dia_layer_get_object_list (dia_diagram_data_get_active_layer (data)));
   while (list != NULL) {
     found = g_list_find (data->selected, list->data);
     if (found) {
@@ -772,7 +819,7 @@ data_get_sorted_selected_remove (DiagramData *data)
     return NULL;
 
   sorted_list = NULL;
-  list = g_list_last (dia_layer_get_object_list (data->active_layer));
+  list = g_list_last (dia_layer_get_object_list (dia_diagram_data_get_active_layer (data)));
   while (list != NULL) {
     found = g_list_find (data->selected, list->data);
     if (found) {
@@ -781,7 +828,7 @@ data_get_sorted_selected_remove (DiagramData *data)
 
       list = g_list_previous (list);
 
-      dia_layer_remove_object (data->active_layer, obj);
+      dia_layer_remove_object (dia_diagram_data_get_active_layer (data), obj);
     } else {
       list = g_list_previous (list);
     }
@@ -831,16 +878,17 @@ data_render (DiagramData    *data,
              ObjectRenderer  obj_renderer,
              gpointer        gdata)
 {
-  DiaLayer *layer;
-  guint i, active_layer;
+  DiaLayer *active;
+  guint active_layer;
 
   if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
     dia_renderer_begin_render (renderer, update);
   }
 
-  for (i = 0; i < data->layers->len; i++) {
-    layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
-    active_layer = (layer == data->active_layer);
+  active = dia_diagram_data_get_active_layer (data);
+
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+    active_layer = (layer == active);
     if (dia_layer_is_visible (layer)) {
       if (obj_renderer) {
         dia_layer_render (layer, renderer, update, obj_renderer, gdata, active_layer);
@@ -848,7 +896,7 @@ data_render (DiagramData    *data,
         dia_renderer_draw_layer (renderer, layer, active_layer, update);
       }
     }
-  }
+  });
 
   if (!DIA_IS_INTERACTIVE_RENDERER (renderer)) {
     dia_renderer_end_render (renderer);
@@ -906,6 +954,7 @@ data_render_paginated (DiagramData *data, DiaRenderer *renderer, gpointer user_d
   }
 }
 
+
 /*!
  * \brief Visit all objects within the diagram
  * @param data the diagram
@@ -916,10 +965,7 @@ data_render_paginated (DiagramData *data, DiaRenderer *renderer, gpointer user_d
 void
 data_foreach_object (DiagramData *data, GFunc func, gpointer user_data)
 {
-  DiaLayer *layer;
-  guint i;
-  for (i=0; i<data->layers->len; i++) {
-    layer = (DiaLayer *) g_ptr_array_index (data->layers, i);
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     g_list_foreach (dia_layer_get_object_list (layer), func, user_data);
-  }
+  });
 }
diff --git a/lib/diagramdata.h b/lib/diagramdata.h
index 0bd3fbaf..bc18575e 100644
--- a/lib/diagramdata.h
+++ b/lib/diagramdata.h
@@ -30,6 +30,13 @@
 
 G_BEGIN_DECLS
 
+#ifndef __in_diagram_data
+#define DIA_DIAGRAM_DATA_PRIVATE(name) __priv_##name
+#else
+#define DIA_DIAGRAM_DATA_PRIVATE(name) name
+#endif
+
+
 /*!
  * \brief Helper to create new diagram
  */
@@ -72,8 +79,10 @@ struct _DiagramData {
   gboolean is_compressed; /*!< TRUE if by default it should be save compressed.
                             The user can override this in Save As... */
 
-  GPtrArray *layers;     /*!< Layers ordered by decreasing z-order */
-  DiaLayer *active_layer;   /*!< The active layer, Defensive programmers check for NULL */
+  /*!< Layers ordered by decreasing z-order */
+  GPtrArray *DIA_DIAGRAM_DATA_PRIVATE(layers);
+  /*!< The active layer, Defensive programmers check for NULL */
+  DiaLayer  *DIA_DIAGRAM_DATA_PRIVATE(active_layer);
 
   guint selected_count_private; /*!< kept for binary compatibility and sanity, don't use ! */
   GList *selected;        /*!< List of objects that are selected,
@@ -116,6 +125,7 @@ void data_lower_layer(DiagramData *data, DiaLayer *layer);
 void data_add_layer(DiagramData *data, DiaLayer *layer);
 void data_add_layer_at(DiagramData *data, DiaLayer *layer, int pos);
 void data_set_active_layer(DiagramData *data, DiaLayer *layer);
+DiaLayer *dia_diagram_data_get_active_layer (DiagramData *self);
 void data_remove_layer(DiagramData *data, DiaLayer *layer);
 int  data_layer_get_index (const DiagramData *data, const DiaLayer *layer);
 int data_layer_count(const DiagramData *data);
@@ -147,6 +157,15 @@ void data_render_paginated(DiagramData *data, DiaRenderer *renderer, gpointer us
 DiagramData *diagram_data_clone (DiagramData *data);
 DiagramData *diagram_data_clone_selected (DiagramData *data);
 
+#define DIA_FOR_LAYER_IN_DIAGRAM(diagram, layer, i, body) \
+  G_STMT_START {                                          \
+    int __dia_layers_len = data_layer_count (diagram);    \
+    for (int i = 0; i < __dia_layers_len; i++) {          \
+      DiaLayer *layer = data_layer_get_nth (diagram, i);  \
+      body                                                \
+    }                                                     \
+  } G_STMT_END
+
 G_END_DECLS
 
 #endif /* DIAGRAMDATA_H */
diff --git a/lib/object.c b/lib/object.c
index eacf58a5..fb8a2581 100644
--- a/lib/object.c
+++ b/lib/object.c
@@ -931,6 +931,7 @@ dia_object_get_parent_with_flags(DiaObject *obj, guint flags)
   return top;
 }
 
+
 /** Utility function: Checks if an objects can be selected.
  * Reasons for not being selectable include:
  * Being inside a closed group.
@@ -940,12 +941,12 @@ dia_object_get_parent_with_flags(DiaObject *obj, guint flags)
  * @returns TRUE if the object is not currently selected.
  */
 gboolean
-dia_object_is_selectable(DiaObject *obj)
+dia_object_is_selectable (DiaObject *obj)
 {
   if (obj->parent_layer == NULL) {
     return FALSE;
   }
-  return obj->parent_layer == dia_layer_get_parent_diagram (obj->parent_layer)->active_layer;
+  return obj->parent_layer == dia_diagram_data_get_active_layer (dia_layer_get_parent_diagram 
(obj->parent_layer));
 }
 
 
diff --git a/plug-ins/drs/dia-render-script-import.c b/plug-ins/drs/dia-render-script-import.c
index fff5a885..7d87ed78 100644
--- a/plug-ins/drs/dia-render-script-import.c
+++ b/plug-ins/drs/dia-render-script-import.c
@@ -488,17 +488,16 @@ import_drs (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user
   for (node = root->children; node != NULL; node = node->next) {
     if (xmlStrcmp (node->name, (const xmlChar *) "layer") == 0) {
       xmlChar *str;
-      xmlChar *name = xmlGetProp (node, (const xmlChar *) "name");
-      DiaLayer *layer = dia_layer_new (name ? (gchar *) name : _("Layer"), dia);
+      xmlChar *name = xmlGetProp (node, "name");
+      DiaLayer *layer = dia_layer_new (name ? (char *) name : _("Layer"), dia);
 
-      if (name)
-        xmlFree (name);
+      dia_clear_xml_string (&name);
 
-      str = xmlGetProp (node, (const xmlChar *) "active");
-      if (xmlStrcmp (str, (const xmlChar *) "true")) {
-        active_layer = layer;
-        xmlFree (str);
+      str = xmlGetProp (node, "active");
+      if (xmlStrcmp (str, "true")) {
+        g_set_object (&active_layer, layer);
       }
+      dia_clear_xml_string (&str);
 
       items = read_items (node->children, ctx);
       for (item = items; item != NULL; item = g_list_next (item)) {
@@ -507,10 +506,17 @@ import_drs (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user
       }
       g_list_free (items);
       data_add_layer (dia, layer);
+
+      g_clear_object (&layer);
     }
   }
-  if (active_layer)
+
+  if (active_layer) {
     data_set_active_layer (dia, active_layer);
+  }
+
   xmlFreeDoc(doc);
+  g_clear_object (&active_layer);
+
   return TRUE;
 }
diff --git a/plug-ins/drs/dia-render-script.c b/plug-ins/drs/dia-render-script.c
index e33a624e..d6958ab7 100644
--- a/plug-ins/drs/dia-render-script.c
+++ b/plug-ins/drs/dia-render-script.c
@@ -97,20 +97,23 @@ drs_render_layer (DiaRenderer *self, DiaLayer *layer, gboolean active)
   renderer->root = g_queue_pop_tail (renderer->parents);
 }
 
+
 /*! own version to render invisible layers, too */
 static void
 drs_data_render (DiagramData *data, DiaRenderer *renderer)
 {
-  int i;
+  DiaLayer *active = dia_diagram_data_get_active_layer (data);
 
   dia_renderer_begin_render (renderer, NULL);
-  for (i=0; i < data->layers->len; i++) {
-    DiaLayer *layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
-    drs_render_layer (renderer, layer, layer == data->active_layer);
-  }
+
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+    drs_render_layer (renderer, layer, layer == active);
+  });
+
   dia_renderer_end_render (renderer);
 }
 
+
 /* dia export funtion */
 static gboolean
 export_data(DiagramData *data, DiaContext *ctx,
diff --git a/plug-ins/dxf/dxf-export.c b/plug-ins/dxf/dxf-export.c
index ce228ae3..3f95d752 100644
--- a/plug-ins/dxf/dxf-export.c
+++ b/plug-ins/dxf/dxf-export.c
@@ -564,19 +564,20 @@ dxf_renderer_class_init (DxfRendererClass *klass)
   g_object_class_override_property (object_class, PROP_FONT_HEIGHT, "font-height");
 }
 
+
 static gboolean
-export_dxf(DiagramData *data, DiaContext *ctx,
-          const gchar *filename, const gchar *diafilename,
-           void* user_data)
+export_dxf (DiagramData *data,
+            DiaContext  *ctx,
+            const char  *filename,
+            const char  *diafilename,
+            void        *user_data)
 {
-    DxfRenderer *renderer;
-    FILE *file;
-    int i;
-    DiaLayer *layer;
-    gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-    gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
+  DxfRenderer *renderer;
+  FILE *file;
+  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar buf2[G_ASCII_DTOSTR_BUF_SIZE];
 
-    file = g_fopen(filename, "w");
+  file = g_fopen(filename, "w");
 
     if (file == NULL) {
        dia_context_add_message_with_errno (ctx, errno, _("Can't open output file %s"),
@@ -599,19 +600,19 @@ export_dxf(DiagramData *data, DiaContext *ctx,
     fprintf(file, "  0\nENDSEC\n");
 
     /* write layer description */
-    fprintf(file,"  0\nSECTION\n  2\nTABLES\n  0\nTABLE\n");
+    fprintf (file,"  0\nSECTION\n  2\nTABLES\n  0\nTABLE\n");
     /* some dummy entry to make it work for more DXF viewers */
-    fprintf(file,"  2\nLAYER\n 70\n255\n");
-
-    for (i=0; i<data->layers->len; i++) {
-      layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
-      fprintf (file,"  0\nLAYER\n  2\n%s\n", dia_layer_get_name (layer));
-      if (dia_layer_is_visible (layer))
-        fprintf (file," 62\n%d\n",i+1);
-      else
-        fprintf (file," 62\n%d\n",(-1)*(i+1));
+    fprintf (file,"  2\nLAYER\n 70\n255\n");
+
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+    fprintf (file,"  0\nLAYER\n  2\n%s\n", dia_layer_get_name (layer));
+    if (dia_layer_is_visible (layer)) {
+      fprintf (file, " 62\n%d\n", i + 1);
+    } else {
+      fprintf (file, " 62\n%d\n", (-1) * (i + 1));
     }
-    fprintf(file, "  0\nENDTAB\n  0\nENDSEC\n");
+  });
+  fprintf (file, "  0\nENDTAB\n  0\nENDSEC\n");
 
     /* write graphics */
     fprintf(file,"  0\nSECTION\n  2\nENTITIES\n");
@@ -620,11 +621,10 @@ export_dxf(DiagramData *data, DiaContext *ctx,
 
     dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
 
-    for (i=0; i<data->layers->len; i++) {
-        layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
-        renderer->layername = dia_layer_get_name (layer);
-        dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
-    }
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+    renderer->layername = dia_layer_get_name (layer);
+    dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
+  });
 
   dia_renderer_end_render (DIA_RENDERER (renderer));
 
diff --git a/plug-ins/dxf/dxf-import.c b/plug-ins/dxf/dxf-import.c
index 155acc8e..ea730e51 100644
--- a/plug-ins/dxf/dxf-import.c
+++ b/plug-ins/dxf/dxf-import.c
@@ -122,32 +122,34 @@ _color_init_from_rgb (Color *color, RGB_t rgb)
   color->alpha = 1.0;
 }
 
+
 /* returns the layer with the given name */
 /* TODO: merge this with other layer code? */
 static DiaLayer *
-layer_find_by_name(char *layername, DiagramData *dia)
+layer_find_by_name (char *layername, DiagramData *dia)
 {
-  DiaLayer *matching_layer, *layer;
-  guint i;
+  DiaLayer *matching_layer;
 
   matching_layer = NULL;
 
-  for (i=0; i<dia->layers->len; i++) {
-    layer = DIA_LAYER (g_ptr_array_index (dia->layers, i));
+  DIA_FOR_LAYER_IN_DIAGRAM (dia, layer, i, {
     if (strcmp (dia_layer_get_name (layer), layername) == 0) {
       matching_layer = layer;
       break;
     }
-  }
+  });
 
   if (matching_layer == NULL) {
     matching_layer = dia_layer_new (layername, dia);
     data_add_layer (dia, matching_layer);
+    // dia now owns the layer
+    g_object_unref (matching_layer);
   }
 
   return matching_layer;
 }
 
+
 /* returns the matching dia linestyle for a given dxf linestyle */
 /* if no matching style is found, LINESTYLE solid is returned as a default */
 static LineStyle
@@ -182,7 +184,7 @@ read_entity_line_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
 
     real line_width = DEFAULT_LINE_WIDTH;
     LineStyle style = LINESTYLE_SOLID;
-    DiaLayer *layer = dia->active_layer;
+    DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
 
     end.x=0;
     end.y=0;
@@ -269,7 +271,7 @@ read_entity_solid_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
 
    real line_width = 0.001;
    LineStyle style = LINESTYLE_SOLID;
-   DiaLayer *layer = dia->active_layer;
+   DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
    RGB_t color  = { 127, 127, 127 };
 
 /*   printf( "Solid " ); */
@@ -411,7 +413,7 @@ read_entity_polyline_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
   real line_width = DEFAULT_LINE_WIDTH;
   real radius, start_angle = 0;
   LineStyle style = LINESTYLE_SOLID;
-  DiaLayer *layer = dia->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
   RGB_t color = { 0, };
   unsigned char closed = 0;
   int points = 0;
@@ -600,7 +602,7 @@ read_entity_circle_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
   GPtrArray *props;
 
   real line_width = DEFAULT_LINE_WIDTH;
-  DiaLayer *layer = dia->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
 
   do {
     if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -681,7 +683,7 @@ read_entity_arc_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
   GPtrArray *props;
 
   real line_width = DEFAULT_LINE_WIDTH;
-  DiaLayer *layer = dia->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
 
   do {
     if (read_dxf_codes (filedxf, data) == FALSE){
@@ -775,7 +777,7 @@ read_entity_ellipse_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
   GPtrArray *props;
 
   real line_width = DEFAULT_LINE_WIDTH;
-  DiaLayer *layer = dia->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
 
   do {
     if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -865,7 +867,7 @@ read_entity_text_dxf (FILE *filedxf, DxfData *data, DiagramData *dia)
   TextProperty *tprop;
   GPtrArray *props;
 
-  DiaLayer *layer = dia->active_layer;
+  DiaLayer *layer = dia_diagram_data_get_active_layer (dia);
 
   do {
     if (read_dxf_codes (filedxf, data) == FALSE) {
@@ -1267,13 +1269,14 @@ read_section_blocks_dxf(FILE *filedxf, DxfData *data, DiagramData *dia)
         } else if((data->code == 0) && (strcmp(data->value, "ENDBLK") == 0)) {
                 /* printf( "End group %d\n", group_items ); */
 
-            if( group && group_items > 0 && group_list != NULL )
-            {
-                obj = group_create( group_list );
-                if (NULL == group_layer )
-                  dia_layer_add_object( dia->active_layer, obj );
-                else
-                  dia_layer_add_object( group_layer, obj );
+            if (group && group_items > 0 && group_list != NULL) {
+              obj = group_create (group_list);
+              if (NULL == group_layer) {
+                dia_layer_add_object (dia_diagram_data_get_active_layer (dia),
+                                      obj);
+              } else {
+                dia_layer_add_object (group_layer, obj);
+              }
             }
 
             group = FALSE;
diff --git a/plug-ins/pixbuf/pixbuf.c b/plug-ins/pixbuf/pixbuf.c
index e6f8aa52..f8c591d6 100644
--- a/plug-ins/pixbuf/pixbuf.c
+++ b/plug-ins/pixbuf/pixbuf.c
@@ -115,48 +115,50 @@ export_data(DiagramData *data, DiaContext *ctx,
   return TRUE;
 }
 
+
 static gboolean
-import_data (const gchar *filename, DiagramData *data, DiaContext *ctx, void* user_data)
+import_data (const char  *filename,
+             DiagramData *data,
+             DiaContext  *ctx,
+             void        *user_data)
 {
-  DiaObjectType *otype = object_get_type("Standard - Image");
+  DiaObjectType *otype = object_get_type ("Standard - Image");
   gint width, height;
 
   if (!otype) /* this would be really broken */
     return FALSE;
 
   if (!user_data) {
-    dia_context_add_message(ctx, _("Calling error, missing user_data."));
+    dia_context_add_message (ctx, _("Calling error, missing user_data."));
     return FALSE;
   }
 
-  if (gdk_pixbuf_get_file_info (filename, &width, &height))
-    {
-      DiaObject *obj;
-      Handle *h1, *h2;
-      Point point;
-      point.x = point.y = 0.0;
+  if (gdk_pixbuf_get_file_info (filename, &width, &height)) {
+    DiaObject *obj;
+    Handle *h1, *h2;
+    Point point;
+    point.x = point.y = 0.0;
 
-      obj = otype->ops->create(&point, otype->default_user_data, &h1, &h2);
-      if (obj)
-        {
-          GPtrArray *plist = g_ptr_array_new ();
+    obj = otype->ops->create(&point, otype->default_user_data, &h1, &h2);
+    if (obj) {
+      GPtrArray *plist = g_ptr_array_new ();
 
-          prop_list_add_filename (plist, "image_file", filename);
-          prop_list_add_real (plist, "elem_width", width / 20.0);
-          prop_list_add_real (plist, "elem_height", height / 20.0);
+      prop_list_add_filename (plist, "image_file", filename);
+      prop_list_add_real (plist, "elem_width", width / 20.0);
+      prop_list_add_real (plist, "elem_height", height / 20.0);
 
-          dia_object_set_properties (obj, plist);
-          prop_list_free (plist);
+      dia_object_set_properties (obj, plist);
+      prop_list_free (plist);
 
-          dia_layer_add_object (data->active_layer, obj);
-          return TRUE;
-        }
-    }
-  else
-    {
-      dia_context_add_message(ctx, _("Pixbuf[%s] can't load:\n%s"),
-                             (gchar*)user_data, dia_context_get_filename(ctx));
+      dia_layer_add_object (dia_diagram_data_get_active_layer (data), obj);
+      return TRUE;
     }
+  } else {
+    dia_context_add_message (ctx,
+                             _("Pixbuf[%s] can't load:\n%s"),
+                             (char *) user_data,
+                             dia_context_get_filename (ctx));
+  }
 
   return FALSE;
 }
diff --git a/plug-ins/python/pydia-diagramdata.c b/plug-ins/python/pydia-diagramdata.c
index 9416dde3..c5f12f83 100644
--- a/plug-ins/python/pydia-diagramdata.c
+++ b/plug-ins/python/pydia-diagramdata.c
@@ -132,13 +132,17 @@ PyDiaDiagramData_AddLayer (PyDiaDiagramData *self, PyObject *args)
 
   layer = dia_layer_new (name, self->data);
   if (pos != -1) {
-    data_add_layer_at(self->data, layer, pos);
+    data_add_layer_at (self->data, layer, pos);
   } else {
     data_add_layer (self->data, layer);
   }
+  // self->data now owns the layer
+  g_object_unref (layer);
+
   return PyDiaLayer_New (layer);
 }
 
+
 static PyObject *
 PyDiaDiagramData_RaiseLayer(PyDiaDiagramData *self, PyObject *args)
 {
@@ -355,76 +359,65 @@ static PyMemberDef PyDiaDiagramData_Members[] = {
 static PyObject *
 PyDiaDiagramData_GetAttr (PyDiaDiagramData *self, char *attr)
 {
-    DiagramData *data = self->data;
-
-    if (!strcmp(attr, "__members__"))
-       return Py_BuildValue("[ssssssssssss]",
-                           "extents", "bg_color", "paper",
-                           "layers", "active_layer",
-                           "grid_width", "grid_visible",
-                           "hguides", "vguides",
-                           "layers", "active_layer",
-                           "selected" );
-    else if (!strcmp(attr, "extents"))
-      return PyDiaRectangle_New(&data->extents, NULL);
-    else if (!strcmp(attr, "bg_color")) {
-      return PyDiaColor_New (&(data->bg_color));
+  DiagramData *data = self->data;
+
+  if (!strcmp (attr, "__members__")) {
+    return Py_BuildValue ("[ssssssssssss]",
+                          "extents", "bg_color", "paper",
+                          "layers", "active_layer",
+                          "grid_width", "grid_visible",
+                          "hguides", "vguides",
+                          "selected" );
+  } else if (!strcmp (attr, "extents")) {
+    return PyDiaRectangle_New (&data->extents, NULL);
+  } else if (!strcmp (attr, "bg_color")) {
+    return PyDiaColor_New (&(data->bg_color));
+  } else if (!strcmp (attr, "layers")) {
+    PyObject *ret = PyTuple_New (data_layer_count (data));
+
+    DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
+      PyTuple_SetItem (ret, i, PyDiaLayer_New (layer));
+    });
+
+    return ret;
+  } else if (!strcmp (attr, "active_layer")) {
+    return PyDiaLayer_New (dia_diagram_data_get_active_layer (data));
+  } else if (!strcmp (attr, "paper")) {
+    return PyDiaPaperinfo_New (&data->paper);
+  } else if (!strcmp(attr, "selected")) {
+    PyObject *ret;
+    GList *tmp;
+    int i;
+
+    ret = PyTuple_New (g_list_length (self->data->selected));
+    for (i = 0, tmp = data->selected; tmp; i++, tmp = tmp->next) {
+      PyTuple_SetItem (ret, i, PyDiaObject_New ((DiaObject *) tmp->data));
     }
-    else if (!strcmp(attr, "layers")) {
-       guint i, len = data->layers->len;
-       PyObject *ret = PyTuple_New(len);
-
-       for (i = 0; i < len; i++)
-           PyTuple_SetItem(ret, i, PyDiaLayer_New(
-                       g_ptr_array_index(data->layers, i)));
-       return ret;
-    } else if (!strcmp(attr, "active_layer")) {
-       return PyDiaLayer_New(data->active_layer);
-    } else if (!strcmp(attr, "paper")) {
-        return PyDiaPaperinfo_New (&data->paper);
-    } else if (!strcmp(attr, "layers")) {
-       guint i, len = data->layers->len;
-       PyObject *ret = PyTuple_New(len);
-
-       for (i = 0; i < len; i++)
-           PyTuple_SetItem(ret, i, PyDiaLayer_New(
-                       g_ptr_array_index(self->data->layers, i)));
-       return ret;
-    } else if (!strcmp(attr, "active_layer")) {
-      return PyDiaLayer_New(data->active_layer);
-    } else if (!strcmp(attr, "selected")) {
-      PyObject *ret;
-      GList *tmp;
-      int i;
-
-      ret = PyTuple_New (g_list_length (self->data->selected));
-      for (i = 0, tmp = data->selected; tmp; i++, tmp = tmp->next) {
-        PyTuple_SetItem (ret, i, PyDiaObject_New ((DiaObject *) tmp->data));
-      }
-      return ret;
-    } else if (!strcmp(attr, "diagram")) {
-      if (DIA_IS_DIAGRAM (self->data)) {
-        return PyDiaDiagram_New (DIA_DIAGRAM (self->data));
-      }
-      Py_INCREF (Py_None);
-      return Py_None;
-    } else {
-      /* In the interactive case diagramdata is_a diagram */
-      if (DIA_IS_DIAGRAM (self->data)) {
-        Diagram *diagram = DIA_DIAGRAM (self->data);
-        if (diagram) { /* paranoid and helping scan-build */
-          if (!strcmp (attr, "grid_width")) {
-            return Py_BuildValue ("(dd)", diagram->grid.width_x, diagram->grid.width_y);
-          } else if (!strcmp (attr, "grid_visible")) {
-            return Py_BuildValue ("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
-          }
+    return ret;
+  } else if (!strcmp(attr, "diagram")) {
+    if (DIA_IS_DIAGRAM (self->data)) {
+      return PyDiaDiagram_New (DIA_DIAGRAM (self->data));
+    }
+    Py_INCREF (Py_None);
+    return Py_None;
+  } else {
+    /* In the interactive case diagramdata is_a diagram */
+    if (DIA_IS_DIAGRAM (self->data)) {
+      Diagram *diagram = DIA_DIAGRAM (self->data);
+      if (diagram) { /* paranoid and helping scan-build */
+        if (!strcmp (attr, "grid_width")) {
+          return Py_BuildValue ("(dd)", diagram->grid.width_x, diagram->grid.width_y);
+        } else if (!strcmp (attr, "grid_visible")) {
+          return Py_BuildValue ("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
         }
       }
     }
+  }
 
-    return Py_FindMethod(PyDiaDiagramData_Methods, (PyObject *)self, attr);
+  return Py_FindMethod (PyDiaDiagramData_Methods, (PyObject *) self, attr);
 }
 
+
 PyTypeObject PyDiaDiagramData_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
diff --git a/plug-ins/python/pydia-layer.c b/plug-ins/python/pydia-layer.c
index 76469202..20d0f088 100644
--- a/plug-ins/python/pydia-layer.c
+++ b/plug-ins/python/pydia-layer.c
@@ -210,8 +210,7 @@ PyDiaLayer_Render (PyDiaLayer *self, PyObject *args)
   PyObject* renderer;
   DiaRenderer *wrapper;
   DiaRectangle *update = NULL;
-  gboolean active = FALSE; /* could derive from layer->parent_diagram->active_layer
-          * but not sure if it's worth the effort. */
+  gboolean active = FALSE; /* could derive but not sure if it's worth the effort. */
 
   if (!PyArg_ParseTuple (args, "O:Layer.render", &renderer))
     return NULL;
diff --git a/plug-ins/svg/svg-import.c b/plug-ins/svg/svg-import.c
index a808cb97..93b700d7 100644
--- a/plug-ins/svg/svg-import.c
+++ b/plug-ins/svg/svg-import.c
@@ -1976,6 +1976,9 @@ import_shape_info (xmlNodePtr start_node, DiagramData *dia, DiaContext *ctx)
     } else if (!xmlStrcmp(node->name, (const xmlChar *)"can-parent")) {
     }
   }
+
+  g_clear_object (&layer);
+
   return TRUE;
 }
 
@@ -2130,7 +2133,6 @@ import_svg (xmlDocPtr doc, DiagramData *dia,
 
     if (groups_to_layers) {
       char *name = dia_object_get_meta (obj, "id");
-      /* new_layer() is taking ownership of the name */
       DiaLayer *layer = dia_layer_new (name, dia);
 
       g_clear_pointer (&name, g_free);
@@ -2138,10 +2140,13 @@ import_svg (xmlDocPtr doc, DiagramData *dia,
       /* keep the group for potential transformation */
       dia_layer_add_object (layer, obj);
       data_add_layer (dia, layer);
+
+      g_clear_object (&layer);
     } else {
+      DiaLayer *active = dia_diagram_data_get_active_layer (dia);
       /* Just as before: throw it in the active layer */
-      dia_layer_add_object (dia->active_layer, obj);
-      dia_layer_update_extents (dia->active_layer);
+      dia_layer_add_object (active, obj);
+      dia_layer_update_extents (active);
     }
   }
 
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index 764d297b..5163efed 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -1799,8 +1799,8 @@ export_vdx (DiagramData *data,
     dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
 
     /* First run through without drawing to setup tables */
-    for (i = 0; i < data->layers->len; i++) {
-      layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+    for (i = 0; i < data_layer_count (data); i++) {
+      layer = data_layer_get_nth (data, i);
       if (dia_layer_is_visible (layer)) {
         dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
       }
@@ -1817,8 +1817,8 @@ export_vdx (DiagramData *data,
 
     /* Now render */
 
-    for (i = 0; i < data->layers->len; i++) {
-      layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+    for (i = 0; i < data_layer_count (data); i++) {
+      layer = data_layer_get_nth (data, i);
       if (dia_layer_is_visible (layer)) {
         dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
       }
diff --git a/plug-ins/vdx/vdx-import.c b/plug-ins/vdx/vdx-import.c
index 519498ae..7d629862 100644
--- a/plug-ins/vdx/vdx-import.c
+++ b/plug-ins/vdx/vdx-import.c
@@ -2735,7 +2735,7 @@ vdx_parse_shape(xmlNodePtr Shape, struct vdx_PageSheet *PageSheet,
       if (theDoc->debug_comments)
           g_debug("Layer %d", dia_layer_num);
   }
-  diaLayer = DIA_LAYER (g_ptr_array_index (dia->layers, dia_layer_num));
+  diaLayer = data_layer_get_nth (dia, dia_layer_num);
 
   /* Draw the shape (or group) and get list of created objects */
   objects = vdx_plot_shape (&theShape, objects, 0, theDoc, ctx);
@@ -2753,80 +2753,91 @@ vdx_parse_shape(xmlNodePtr Shape, struct vdx_PageSheet *PageSheet,
   g_slist_free (objects);
 }
 
-/** Parse the pages of the VDX
- * @param PageSheet the PageSheet
- * @param theDoc the document
- * @param dia the growing diagram
- * @bug This doesn't handle multi-page diagrams very well
- */
 
+/**
+ * vdx_setup_layers:
+ * @PageSheet: the PageSheet
+ * @theDoc: the document
+ * @dia: the growing diagram
+ *
+ * Parse the pages of the VDX
+ *
+ * Bug: This doesn't handle multi-page diagrams very well
+ */
 static void
-vdx_setup_layers(struct vdx_PageSheet* PageSheet, VDXDocument* theDoc,
-                 DiagramData *dia)
+vdx_setup_layers (struct vdx_PageSheet *PageSheet,
+                  VDXDocument          *theDoc,
+                  DiagramData          *dia)
 {
-    GSList *child = NULL;
-    GSList *layernames = NULL;
-    GSList *layername = NULL;
-    struct vdx_any* Any;
-    struct vdx_Layer *theLayer;
-    DiaLayer *diaLayer = 0;
-    unsigned int found_layer, page_layer;
-    gboolean found;
-
-    /* What layers are on this page? */
+  GSList *child = NULL;
+  GSList *layernames = NULL;
+  GSList *layername = NULL;
+  struct vdx_any* Any;
+  struct vdx_Layer *theLayer;
+  DiaLayer *diaLayer = 0;
+  unsigned int found_layer, page_layer;
+  gboolean found;
+
+  /* What layers are on this page? */
+
+  if (!PageSheet) {
+    g_debug ("vdx_setup_layers() called with PageSheet=0");
+    return;
+  }
 
-    if (!PageSheet)
-    {
-        g_debug("vdx_setup_layers() called with PageSheet=0");
-        return;
+  for (child = PageSheet->any.children; child; child = child->next) {
+    if (!child || !child->data) {
+      continue;
     }
 
-    for (child = PageSheet->any.children; child; child = child->next)
-    {
-        if (!child || !child->data) continue;
-        Any = (struct vdx_any *)(child->data);
-        if (Any->type != vdx_types_Layer) continue;
-        theLayer = (struct vdx_Layer *)child->data;
-        layernames = g_slist_prepend(layernames, theLayer->Name);
+    Any = (struct vdx_any *) (child->data);
+    if (Any->type != vdx_types_Layer) {
+      continue;
     }
 
-    /* Add any missing layers to Dia's list
-       Must be back to front
-       Also construct translation table for this page's layers */
+    theLayer = (struct vdx_Layer *) child->data;
+    layernames = g_slist_prepend (layernames, theLayer->Name);
+  }
 
-    if (theDoc->PageLayers) g_array_free(theDoc->PageLayers, TRUE);
-    theDoc->PageLayers = g_array_new(FALSE, TRUE, sizeof (unsigned int));
+  /* Add any missing layers to Dia's list
+     Must be back to front
+     Also construct translation table for this page's layers */
 
-    if (!theDoc->LayerNames)
-        theDoc->LayerNames = g_array_new(FALSE, TRUE, sizeof (char *));
+  if (theDoc->PageLayers) {
+    g_array_free (theDoc->PageLayers, TRUE);
+  }
+  theDoc->PageLayers = g_array_new (FALSE, TRUE, sizeof (unsigned int));
 
-    page_layer = 0;
-    for (layername = layernames; layername; layername = layername->next)
-    {
-        found = FALSE;
-        for (found_layer = 0; found_layer < theDoc->LayerNames->len;
-             found_layer++)
-        {
-            if (layername->data &&
-                g_array_index(theDoc->LayerNames, char *, found_layer) &&
-                !strcmp((char *)layername->data,
-                        g_array_index(theDoc->LayerNames, char *,
-                                      found_layer)))
-            {
-                found = TRUE;
-                break;
-            }
-        }
-        if (!found)
-        {
-            g_array_append_val(theDoc->LayerNames, layername->data);
-            diaLayer = dia_layer_new (((char*) layername->data), dia);
-            data_add_layer (dia, diaLayer);
-        }
-        page_layer++;
-        g_array_prepend_val(theDoc->PageLayers, page_layer);
+  if (!theDoc->LayerNames) {
+    theDoc->LayerNames = g_array_new(FALSE, TRUE, sizeof (char *));
+  }
+
+  page_layer = 0;
+  for (layername = layernames; layername; layername = layername->next) {
+    found = FALSE;
+    for (found_layer = 0; found_layer < theDoc->LayerNames->len; found_layer++) {
+      if (layername->data &&
+          g_array_index (theDoc->LayerNames, char *, found_layer) &&
+          !strcmp ((char *) layername->data,
+                   g_array_index (theDoc->LayerNames, char *, found_layer)))
+      {
+        found = TRUE;
+        break;
+      }
     }
-    data_set_active_layer(dia, diaLayer);
+
+    if (!found) {
+      g_array_append_val (theDoc->LayerNames, layername->data);
+      g_clear_object (&diaLayer);
+      diaLayer = dia_layer_new (((char*) layername->data), dia);
+      data_add_layer (dia, diaLayer);
+    }
+    page_layer++;
+    g_array_prepend_val (theDoc->PageLayers, page_layer);
+  }
+
+  data_set_active_layer (dia, diaLayer);
+  g_clear_object (&diaLayer);
 }
 
 /** Parse the pages of the VDX
diff --git a/plug-ins/wpg/wpg-import.c b/plug-ins/wpg/wpg-import.c
index f0937579..26a09235 100644
--- a/plug-ins/wpg/wpg-import.c
+++ b/plug-ins/wpg/wpg-import.c
@@ -681,7 +681,7 @@ import_data (const gchar *filename, DiagramData *dia, DiaContext *ctx, void* use
     {
       DiaObject *objs = dia_import_renderer_get_objects (DIA_RENDERER(ren));
       if (objs) {
-        dia_layer_add_object (dia->active_layer, objs);
+        dia_layer_add_object (dia_diagram_data_get_active_layer (dia), objs);
       } else {
         dia_context_add_message (ctx, _("Empty WPG file?"));
         bRet = FALSE;
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index 69408d3a..eaab9183 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -1179,14 +1179,14 @@ draw_object (DiaRenderer *self,
 
 
 static gboolean
-export_fig(DiagramData *data, DiaContext *ctx,
-          const gchar *filename, const gchar *diafilename,
-          void* user_data)
+export_fig (DiagramData *data,
+            DiaContext  *ctx,
+            const char  *filename,
+            const char  *diafilename,
+            void        *user_data)
 {
   FILE *file;
   XfigRenderer *renderer;
-  int i;
-  DiaLayer *layer;
   gchar d_buf[DTOSTR_BUF_SIZE];
 
   file = g_fopen(filename, "w");
@@ -1199,7 +1199,7 @@ export_fig(DiagramData *data, DiaContext *ctx,
     return FALSE;
   }
 
-  renderer = g_object_new(XFIG_TYPE_RENDERER, NULL);
+  renderer = g_object_new (XFIG_TYPE_RENDERER, NULL);
 
   renderer->file = file;
 
@@ -1217,13 +1217,12 @@ export_fig(DiagramData *data, DiaContext *ctx,
 
   dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
 
-  for (i = 0; i < data->layers->len; i++) {
-    layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     if (dia_layer_is_visible (layer)) {
       dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
       renderer->depth++;
     }
-  }
+  });
 
   dia_renderer_end_render (DIA_RENDERER (renderer));
 
@@ -1231,13 +1230,12 @@ export_fig(DiagramData *data, DiaContext *ctx,
 
   dia_renderer_begin_render (DIA_RENDERER (renderer), NULL);
 
-  for (i=0; i<data->layers->len; i++) {
-    layer = DIA_LAYER (g_ptr_array_index (data->layers, i));
+  DIA_FOR_LAYER_IN_DIAGRAM (data, layer, i, {
     if (dia_layer_is_visible (layer)) {
       dia_layer_render (layer, DIA_RENDERER (renderer), NULL, NULL, data, 0);
       renderer->depth++;
     }
-  }
+  });
 
   dia_renderer_end_render (DIA_RENDERER (renderer));
 
diff --git a/plug-ins/xfig/xfig-import.c b/plug-ins/xfig/xfig-import.c
index 308ad992..75af448e 100644
--- a/plug-ins/xfig/xfig-import.c
+++ b/plug-ins/xfig/xfig-import.c
@@ -1328,32 +1328,38 @@ import_fig(const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user_
        return FALSE;
     }
 
-    if (!fig_read_meta_data(figfile, dia, ctx)) {
-       fclose(figfile);
-       return FALSE;
-    }
+  if (!fig_read_meta_data (figfile, dia, ctx)) {
+    fclose (figfile);
+    return FALSE;
+  }
 
-    compound_stack = NULL;
+  compound_stack = NULL;
 
-    do {
-       if (!skip_comments(figfile)) {
-           if (!feof(figfile)) {
-               dia_context_add_message_with_errno(ctx, errno, _("Error reading Fig file."));
-           } else {
-               break;
-           }
-       }
-       if (! fig_read_object(figfile, ctx)) {
-           fclose(figfile);
-           break;
-       }
-    } while (TRUE);
+  do {
+    if (!skip_comments (figfile)) {
+      if (!feof (figfile)) {
+        dia_context_add_message_with_errno (ctx,
+                                            errno,
+                                            _("Error reading Fig file."));
+      } else {
+        break;
+      }
+    }
+
+    if (!fig_read_object (figfile, ctx)) {
+      fclose (figfile);
+      break;
+    }
+  } while (TRUE);
 
   /* Now we can reorder for the depth fields */
   for (i = 0; i < FIG_MAX_DEPTHS; i++) {
-    if (depths[i] != NULL)
-      dia_layer_add_objects_first (dia->active_layer, depths[i]);
+    if (depths[i] != NULL) {
+      dia_layer_add_objects_first (dia_diagram_data_get_active_layer (dia),
+                                   depths[i]);
+    }
   }
+
   return TRUE;
 }
 


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