[gtksourceview/wip/public-region] region: turn it into a GObject class



commit 6ed032e30eaac48f9ca82395d349a0e37b50e480
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sat Apr 2 14:03:38 2016 +0200

    region: turn it into a GObject class
    
    To have reference counting, mainly. And the goal is to publicize
    GtkSourceRegion, so it's better if it's a GObject.

 gtksourceview/gtksourceregion.c |  155 +++++++++++++++++++++++++++++---------
 gtksourceview/gtksourceregion.h |   22 ++++--
 2 files changed, 134 insertions(+), 43 deletions(-)
---
diff --git a/gtksourceview/gtksourceregion.c b/gtksourceview/gtksourceregion.c
index 345e357..7f3eec6 100644
--- a/gtksourceview/gtksourceregion.c
+++ b/gtksourceview/gtksourceregion.c
@@ -1,5 +1,5 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- * gtksourceregion.h - GtkTextMark based region utility functions
+ * gtksourceregion.c - GtkTextMark-based region utility
  * This file is part of GtkSourceView
  *
  * Copyright (C) 2002 Gustavo Giráldez <gustavo giraldez gmx net>
@@ -33,20 +33,31 @@
 #define DEBUG(x)
 #endif
 
-typedef struct _Subregion
-{
-       GtkTextMark *start;
-       GtkTextMark *end;
-} Subregion;
+typedef struct _GtkSourceRegionPrivate GtkSourceRegionPrivate;
+typedef struct _Subregion Subregion;
+typedef struct _GtkSourceRegionIterReal GtkSourceRegionIterReal;
 
 struct _GtkSourceRegion
 {
+       GObject parent;
+};
+
+struct _GtkSourceRegionPrivate
+{
+       /* Weak pointer to the buffer. */
        GtkTextBuffer *buffer;
-       GList         *subregions;
-       guint32        timestamp;
+
+       /* List of sorted 'Subregion*' */
+       GList *subregions;
+
+       guint32 timestamp;
 };
 
-typedef struct _GtkSourceRegionIterReal GtkSourceRegionIterReal;
+struct _Subregion
+{
+       GtkTextMark *start;
+       GtkTextMark *end;
+};
 
 struct _GtkSourceRegionIterReal
 {
@@ -55,6 +66,17 @@ struct _GtkSourceRegionIterReal
        GList *subregions;
 };
 
+enum
+{
+       PROP_0,
+       PROP_BUFFER,
+       LAST_PROP
+};
+
+static GParamSpec *properties[LAST_PROP];
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkSourceRegion, gtk_source_region, G_TYPE_OBJECT)
+
 /* Find and return a subregion node which contains the given text
  * iter.  If left_side is TRUE, return the subregion which contains
  * the text iter or which is the leftmost; else return the rightmost
@@ -70,8 +92,7 @@ find_nearest_subregion (GtkSourceRegion   *region,
        GList *retval;
        GList *l;
 
-       g_return_val_if_fail (region != NULL, NULL);
-       g_return_val_if_fail (iter != NULL, NULL);
+       g_assert (iter != NULL);
 
        if (begin == NULL)
        {
@@ -122,53 +143,113 @@ find_nearest_subregion (GtkSourceRegion   *region,
        return retval;
 }
 
-GtkSourceRegion *
-gtk_source_region_new (GtkTextBuffer *buffer)
+static void
+gtk_source_region_get_property (GObject    *object,
+                               guint       prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
 {
-       GtkSourceRegion *region;
+       GtkSourceRegion *region = GTK_SOURCE_REGION (object);
 
-       g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
+       switch (prop_id)
+       {
+               case PROP_BUFFER:
+                       g_value_set_object (value, gtk_source_region_get_buffer (region));
+                       break;
 
-       region = g_slice_new (GtkSourceRegion);
-       region->subregions = NULL;
-       region->timestamp = 0;
-       region->buffer = buffer;
+               default:
+                       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                       break;
+       }
+}
 
-       g_object_add_weak_pointer (G_OBJECT (buffer),
-                                  (gpointer *)&region->buffer);
+static void
+gtk_source_region_set_property (GObject      *object,
+                               guint         prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+       GtkSourceRegionPrivate *priv = gtk_source_region_get_instance_private (GTK_SOURCE_REGION (object));
 
-       return region;
+       switch (prop_id)
+       {
+               case PROP_BUFFER:
+                       g_assert (priv->buffer == NULL);
+                       priv->buffer = g_value_get_object (value);
+                       g_object_add_weak_pointer (G_OBJECT (buffer),
+                                                  (gpointer *) &priv->buffer);
+                       break;
+
+               default:
+                       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                       break;
+       }
 }
 
-void
-gtk_source_region_destroy (GtkSourceRegion *region)
+static void
+gtk_source_region_dispose (GObject *object)
 {
-       g_return_if_fail (region != NULL);
+       GtkSourceRegionPrivate *priv = gtk_source_region_get_instance_private (GTK_SOURCE_REGION (object));
 
-       while (region->subregions)
+       while (priv->subregions != NULL)
        {
-               Subregion *sr = region->subregions->data;
+               Subregion *sr = priv->subregions->data;
 
-               if (region->buffer != NULL)
+               if (priv->buffer != NULL)
                {
-                       gtk_text_buffer_delete_mark (region->buffer, sr->start);
-                       gtk_text_buffer_delete_mark (region->buffer, sr->end);
+                       gtk_text_buffer_delete_mark (priv->buffer, sr->start);
+                       gtk_text_buffer_delete_mark (priv->buffer, sr->end);
                }
 
                g_slice_free (Subregion, sr);
-               region->subregions = g_list_delete_link (region->subregions,
-                                                        region->subregions);
+               priv->subregions = g_list_delete_link (priv->subregions, priv->subregions);
        }
 
-       if (region->buffer != NULL)
+       if (priv->buffer != NULL)
        {
-               g_object_remove_weak_pointer (G_OBJECT (region->buffer),
-                                             (gpointer *)&region->buffer);
+               g_object_remove_weak_pointer (G_OBJECT (priv->buffer),
+                                             (gpointer *) &priv->buffer);
 
-               region->buffer = NULL;
+               priv->buffer = NULL;
        }
 
-       g_slice_free (GtkSourceRegion, region);
+       G_OBJECT_CLASS (gtk_source_region_parent_class)->dispose (object);
+}
+
+static void
+gtk_source_region_class_init (GtkSourceRegionClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+       object_class->get_property = gtk_source_region_get_property;
+       object_class->set_property = gtk_source_region_set_property;
+       object_class->dispose = gtk_source_region_dispose;
+
+       properties[PROP_BUFFER] =
+               g_param_spec_object ("buffer",
+                                    "Buffer",
+                                    "",
+                                    GTK_TYPE_TEXT_BUFFER,
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_CONSTRUCT_ONLY |
+                                    G_PARAM_STATIC_STRINGS);
+
+       g_object_class_install_properties (object_class, LAST_PROP, properties);
+}
+
+static void
+gtk_source_region_init (GtkSourceRegion *region)
+{
+}
+
+GtkSourceRegion *
+gtk_source_region_new (GtkTextBuffer *buffer)
+{
+       g_return_val_if_fail (GTK_IS_TEXT_BUFFER (buffer), NULL);
+
+       return g_object_new (GTK_SOURCE_TYPE_REGION,
+                            "buffer", buffer,
+                            NULL);
 }
 
 GtkTextBuffer *
diff --git a/gtksourceview/gtksourceregion.h b/gtksourceview/gtksourceregion.h
index 4d73727..ae78d59 100644
--- a/gtksourceview/gtksourceregion.h
+++ b/gtksourceview/gtksourceregion.h
@@ -1,5 +1,5 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
- * gtksourceregion.h - GtkTextMark based region utility functions
+ * gtksourceregion.h - GtkTextMark-based region utility
  * This file is part of GtkSourceView
  *
  * Copyright (C) 2002 Gustavo Giráldez <gustavo giraldez gmx net>
@@ -28,9 +28,22 @@
 
 G_BEGIN_DECLS
 
-typedef struct _GtkSourceRegion                GtkSourceRegion;
-typedef struct _GtkSourceRegionIter    GtkSourceRegionIter;
+#define GTK_SOURCE_TYPE_REGION (gtk_source_region_get_type ())
 
+GTK_SOURCE_INTERNAL
+G_DECLARE_DERIVABLE_TYPE (GtkSourceRegion, gtk_source_region,
+                         GTK_SOURCE, REGION,
+                         GObject)
+
+struct _GtkSourceRegionClass
+{
+       GObjectClass parent_class;
+
+       /* Padding for future expansion */
+       gpointer padding[8];
+};
+
+typedef struct _GtkSourceRegionIter GtkSourceRegionIter;
 struct _GtkSourceRegionIter
 {
        /* GtkSourceRegionIter is an opaque datatype; ignore all these fields.
@@ -47,9 +60,6 @@ GTK_SOURCE_INTERNAL
 GtkSourceRegion *      gtk_source_region_new                   (GtkTextBuffer *buffer);
 
 GTK_SOURCE_INTERNAL
-void                   gtk_source_region_destroy               (GtkSourceRegion *region);
-
-GTK_SOURCE_INTERNAL
 GtkTextBuffer *                gtk_source_region_get_buffer            (GtkSourceRegion *region);
 
 GTK_SOURCE_INTERNAL


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