summaryrefslogtreecommitdiff
path: root/gtk/gtktextsegmentprivate.h
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtktextsegmentprivate.h')
-rw-r--r--gtk/gtktextsegmentprivate.h172
1 files changed, 172 insertions, 0 deletions
diff --git a/gtk/gtktextsegmentprivate.h b/gtk/gtktextsegmentprivate.h
new file mode 100644
index 0000000000..7f59f28e99
--- /dev/null
+++ b/gtk/gtktextsegmentprivate.h
@@ -0,0 +1,172 @@
+/* GTK - The GIMP Toolkit
+ * gtktextsegment.h Copyright (C) 2000 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifndef __GTK_TEXT_SEGMENT_PRIVATE_H__
+#define __GTK_TEXT_SEGMENT_PRIVATE_H__
+
+#include <gtk/gtktexttag.h>
+#include <gtk/gtktextiter.h>
+#include <gtk/gtktextmarkprivate.h>
+#include <gtk/gtktextchild.h>
+#include <gtk/gtktextchildprivate.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Segments: each line is divided into one or more segments, where each
+ * segment is one of several things, such as a group of characters, a
+ * tag toggle, a mark, or an embedded widget. Each segment starts with
+ * a standard header followed by a body that varies from type to type.
+ */
+
+/* This header has the segment type, and two specific segments
+ (character and toggle segments) */
+
+/* Information a BTree stores about a tag. */
+typedef struct _GtkTextTagInfo GtkTextTagInfo;
+struct _GtkTextTagInfo {
+ GtkTextTag *tag;
+ GtkTextBTreeNode *tag_root; /* highest-level node containing the tag */
+ int toggle_count; /* total toggles of this tag below tag_root */
+};
+
+/* Body of a segment that toggles a tag on or off */
+struct _GtkTextToggleBody {
+ GtkTextTagInfo *info; /* Tag that starts or ends here. */
+ gboolean inNodeCounts; /* TRUE means this toggle has been
+ * accounted for in node toggle
+ * counts; FALSE means it hasn't, yet. */
+};
+
+
+/* Class struct for segments */
+
+/* Split seg at index, returning list of two new segments, and freeing seg */
+typedef GtkTextLineSegment* (*GtkTextSegSplitFunc) (GtkTextLineSegment *seg,
+ int index);
+
+/* Delete seg which is contained in line; if tree_gone, the tree is being
+ * freed in its entirety, which may matter for some reason (?)
+ * Return TRUE if the segment is not deleteable, e.g. a mark.
+ */
+typedef gboolean (*GtkTextSegDeleteFunc) (GtkTextLineSegment *seg,
+ GtkTextLine *line,
+ gboolean tree_gone);
+
+/* Called after segment structure of line changes, so segments can
+ * cleanup (e.g. merge with adjacent segments). Returns a segment list
+ * to replace the original segment list with. The line argument is
+ * the current line.
+ */
+typedef GtkTextLineSegment* (*GtkTextSegCleanupFunc) (GtkTextLineSegment *seg,
+ GtkTextLine *line);
+
+/* Called when a segment moves from one line to another. CleanupFunc is also
+ * called in that case, so many segments just use CleanupFunc, I'm not sure
+ * what’s up with that (this function may not be needed...)
+ */
+typedef void (*GtkTextSegLineChangeFunc) (GtkTextLineSegment *seg,
+ GtkTextLine *line);
+
+/* Called to do debug checks on the segment. */
+typedef void (*GtkTextSegCheckFunc) (GtkTextLineSegment *seg,
+ GtkTextLine *line);
+
+struct _GtkTextLineSegmentClass {
+ const char *name; /* Name of this kind of segment. */
+ gboolean leftGravity; /* If a segment has zero size (e.g. a
+ * mark or tag toggle), does it
+ * attach to character to its left
+ * or right? 1 means left, 0 means
+ * right. */
+ GtkTextSegSplitFunc splitFunc; /* Procedure to split large segment
+ * into two smaller ones. */
+ GtkTextSegDeleteFunc deleteFunc; /* Procedure to call to delete
+ * segment. */
+ GtkTextSegCleanupFunc cleanupFunc; /* After any change to a line, this
+ * procedure is invoked for all
+ * segments left in the line to
+ * perform any cleanup they wish
+ * (e.g. joining neighboring
+ * segments). */
+ GtkTextSegLineChangeFunc lineChangeFunc;
+ /* Invoked when a segment is about
+ * to be moved from its current line
+ * to an earlier line because of
+ * a deletion. The line is that
+ * for the segment's old line.
+ * CleanupFunc will be invoked after
+ * the deletion is finished. */
+
+ GtkTextSegCheckFunc checkFunc; /* Called during consistency checks
+ * to check internal consistency of
+ * segment. */
+};
+
+/*
+ * The data structure below defines line segments.
+ */
+
+struct _GtkTextLineSegment {
+ const GtkTextLineSegmentClass *type; /* Pointer to record describing
+ * segment's type. */
+ GtkTextLineSegment *next; /* Next in list of segments for this
+ * line, or NULL for end of list. */
+
+ int char_count; /* # of chars of index space occupied */
+
+ int byte_count; /* Size of this segment (# of bytes
+ * of index space it occupies). */
+ union {
+ char chars[4]; /* Characters that make up character
+ * info. Actual length varies to
+ * hold as many characters as needed.*/
+ GtkTextToggleBody toggle; /* Information about tag toggle. */
+ GtkTextMarkBody mark; /* Information about mark. */
+ GtkTextPaintable paintable; /* Child texture */
+ GtkTextChildBody child; /* Child widget */
+ } body;
+};
+
+
+GtkTextLineSegment *gtk_text_line_segment_split (const GtkTextIter *iter);
+
+GtkTextLineSegment *_gtk_char_segment_new (const char *text,
+ guint len);
+GtkTextLineSegment *_gtk_char_segment_new_from_two_strings (const char *text1,
+ guint len1,
+ guint chars1,
+ const char *text2,
+ guint len2,
+ guint chars2);
+GtkTextLineSegment *_gtk_toggle_segment_new (GtkTextTagInfo *info,
+ gboolean on);
+
+void _gtk_toggle_segment_free (GtkTextLineSegment *seg);
+
+G_END_DECLS
+
+#endif
+
+