gtk/gtk/gtktextsegment.h
Sébastien Wilmet 983a03d5f8 GtkTextView: use GSlice to allocate GtkTextLineSegment's
Use GSlice to allocate all types of segments:
- char
- toggle
- mark
- pixbuf
- child widget

Char segments are a bit more complicated because the length of the text
is determined at run time and stored in the 'byte_count' field. If the
text is long, GSlice will call the system malloc() anyway, so it's
better to always use GSlice for GtkTextLineSegment.

Toggle segments are also freed in gtktextbtree.c, hence the function
_gtk_toggle_segment_free() (for a later commit it would be nice to
rename those functions with the _gtk_text prefix).

https://bugzilla.gnome.org/show_bug.cgi?id=727908
2014-04-13 14:04:12 -07:00

174 lines
7.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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_H__
#define __GTK_TEXT_SEGMENT_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 */
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 */
/* Split seg at index, returning list of two new segments, and freeing seg */
typedef GtkTextLineSegment* (*GtkTextSegSplitFunc) (GtkTextLineSegment *seg,
gint 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
* whats 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 {
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. */
GtkTextPixbuf pixbuf; /* Child pixbuf */
GtkTextChildBody child; /* Child widget */
} body;
};
GDK_AVAILABLE_IN_ALL
GtkTextLineSegment *gtk_text_line_segment_split (const GtkTextIter *iter);
GtkTextLineSegment *_gtk_char_segment_new (const gchar *text,
guint len);
GtkTextLineSegment *_gtk_char_segment_new_from_two_strings (const gchar *text1,
guint len1,
guint chars1,
const gchar *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