1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
#ifndef GTK_TEXT_SEGMENT_H
#define GTK_TEXT_SEGMENT_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*
* 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) */
#include <gtk/gtktexttag.h>
#include <gtk/gtktextiter.h>
#include <gtk/gtktextmarkprivate.h>
#include <gtk/gtktextchild.h>
/* Information a BTree stores about a tag. */
typedef struct _GtkTextTagInfo GtkTextTagInfo;
struct _GtkTextTagInfo {
GtkTextTag *tag;
GtkTextBTreeNode *tag_root; /* highest-level node containing the tag */
gint 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 */
typedef GtkTextLineSegment *(* GtkTextLineSegmentSplitFunc) (GtkTextLineSegment *segPtr,
int index);
typedef gboolean (* GtkTextViewSegDeleteFunc) (GtkTextLineSegment *segPtr,
GtkTextLine *line,
gboolean treeGone);
typedef GtkTextLineSegment *(* GtkTextViewSegCleanupFunc) (GtkTextLineSegment *segPtr,
GtkTextLine *line);
typedef void (* GtkTextLineSegmentLineChangeFunc) (GtkTextLineSegment *segPtr,
GtkTextLine *line);
typedef void (* GtkTextViewSegCheckFunc) (GtkTextLineSegment *segPtr,
GtkTextLine *line);
struct _GtkTextLineSegmentClass {
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. */
GtkTextLineSegmentSplitFunc splitFunc; /* Procedure to split large segment
* into two smaller ones. */
GtkTextViewSegDeleteFunc deleteFunc; /* Procedure to call to delete
* segment. */
GtkTextViewSegCleanupFunc 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). */
GtkTextLineSegmentLineChangeFunc 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. */
GtkTextViewSegCheckFunc checkFunc; /* Called during consistency checks
* to check internal consistency of
* segment. */
};
/*
* The data structure below defines line segments.
*/
struct _GtkTextLineSegment {
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. */
GtkTextPixmap pixmap; /* Child pixmap */
#if 0
GtkTextChild child; /* child widget */
#endif
} body;
};
GtkTextLineSegment *gtk_text_line_segment_split(const GtkTextIter *iter);
GtkTextLineSegment *char_segment_new(const gchar *text, guint len);
GtkTextLineSegment *char_segment_new_from_two_strings(const gchar *text1, guint len1,
const gchar *text2, guint len2);
GtkTextLineSegment *toggle_segment_new(GtkTextTagInfo *info, gboolean on);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif
|