[gtksourceview/wip/public-region] region: turn it into a GObject class
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/public-region] region: turn it into a GObject class
- Date: Sat, 2 Apr 2016 12:33:24 +0000 (UTC)
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 *)®ion->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 *)®ion->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]