summaryrefslogtreecommitdiff
path: root/gtk/gtktextchild.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@pobox.com>2000-10-02 14:29:24 +0000
committerHavoc Pennington <hp@src.gnome.org>2000-10-02 14:29:24 +0000
commit8ebf77d13be575f37bb5ef34b79bf1d68a7ead77 (patch)
tree5a47b4ede579fb38f2179c621ff308a7248abdf1 /gtk/gtktextchild.c
parent632fda6f0bd578006226b29badcfb63729f5eba2 (diff)
downloadgtk+-8ebf77d13be575f37bb5ef34b79bf1d68a7ead77.tar.gz
text_window_* weren't static and should have been. Start work on child
2000-10-02 Havoc Pennington <hp@pobox.com> * gtk/gtktextview.c: text_window_* weren't static and should have been. Start work on child widgets; not yet complete, syncing to office computer. * gtk/gtktextchild.h: change this to contain a public interface, starting work on child interfaces. * gtk/gtktextchildprivate.h: move private interfaces here * gtk/Makefile.am: update to reflect gtktextchildprivate.h * gtk/gtktextview.h, gtk/gtktextview.c, gtk/gtktextbuffer.h, gtk/gtktextbuffer.c, gtk/gtktextiter.h, gtk/gtk/textiter.c, gtk/gtktextmark.c: copyright notices * gtk/gtktextmarkprivate.h: reformat, and put _ in front of internal functions * gtk/gtktextchild.c (_pixbuf_segment_new): put _ in front of internal function * gtk/gtktextlayout.c (gtk_text_layout_get_line_display): Reformatting
Diffstat (limited to 'gtk/gtktextchild.c')
-rw-r--r--gtk/gtktextchild.c210
1 files changed, 194 insertions, 16 deletions
diff --git a/gtk/gtktextchild.c b/gtk/gtktextchild.c
index cde111384d..88e021b202 100644
--- a/gtk/gtktextchild.c
+++ b/gtk/gtktextchild.c
@@ -1,5 +1,4 @@
/* gtktextchild.c - child pixmaps and widgets
- *
*
* Copyright (c) 1994 The Regents of the University of California.
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
@@ -89,7 +88,7 @@ pixbuf_segment_check_func(GtkTextLineSegment *seg,
GtkTextLineSegmentClass gtk_text_pixbuf_type = {
"pixbuf", /* name */
- 0, /* leftGravity */
+ FALSE, /* leftGravity */
NULL, /* splitFunc */
pixbuf_segment_delete_func, /* deleteFunc */
pixbuf_segment_cleanup_func, /* cleanupFunc */
@@ -98,27 +97,15 @@ GtkTextLineSegmentClass gtk_text_pixbuf_type = {
};
-#if 0
-GtkTextLineSegmentClass gtk_text_view_child_type = {
- "child-widget", /* name */
- 0, /* leftGravity */
- child_segment_split_func, /* splitFunc */
- child_segment_delete_func, /* deleteFunc */
- child_segment_cleanup_func, /* cleanupFunc */
- NULL, /* lineChangeFunc */
- child_segment_check_func /* checkFunc */
-};
-#endif
-
#define PIXBUF_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET(GtkTextLineSegment, body) \
+ sizeof(GtkTextPixbuf)))
GtkTextLineSegment *
-gtk_text_pixbuf_segment_new (GdkPixbuf *pixbuf)
+_pixbuf_segment_new (GdkPixbuf *pixbuf)
{
GtkTextLineSegment *seg;
- seg = g_malloc(PIXBUF_SEG_SIZE);
+ seg = g_malloc (PIXBUF_SEG_SIZE);
seg->type = &gtk_text_pixbuf_type;
@@ -134,3 +121,194 @@ gtk_text_pixbuf_segment_new (GdkPixbuf *pixbuf)
return seg;
}
+
+
+static GtkTextLineSegment *
+child_segment_cleanup_func (GtkTextLineSegment *seg,
+ GtkTextLine *line)
+{
+ seg->body.child.line = line;
+
+ return seg;
+}
+
+static int
+child_segment_delete_func (GtkTextLineSegment *seg,
+ GtkTextLine *line,
+ gboolean tree_gone)
+{
+ _widget_segment_unref (seg);
+
+ return 0;
+}
+
+static void
+child_segment_check_func (GtkTextLineSegment *seg,
+ GtkTextLine *line)
+{
+ if (seg->next == NULL)
+ g_error("child segment is the last segment in a line");
+
+ if (seg->byte_count != 3)
+ g_error("child segment has byte count of %d", seg->byte_count);
+
+ if (seg->char_count != 1)
+ g_error("child segment has char count of %d", seg->char_count);
+}
+
+GtkTextLineSegmentClass gtk_text_child_type = {
+ "child-widget", /* name */
+ FALSE, /* leftGravity */
+ NULL, /* splitFunc */
+ child_segment_delete_func, /* deleteFunc */
+ child_segment_cleanup_func, /* cleanupFunc */
+ NULL, /* lineChangeFunc */
+ child_segment_check_func /* checkFunc */
+};
+
+#define WIDGET_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
+ + sizeof(GtkTextChildBody)))
+
+GtkTextLineSegment *
+_widget_segment_new (void)
+{
+ GtkTextLineSegment *seg;
+
+ seg = g_malloc (WIDGET_SEG_SIZE);
+
+ seg->type = &gtk_text_child_type;
+
+ seg->next = NULL;
+
+ seg->byte_count = 3; /* We convert to the 0xFFFD "unknown character",
+ * a 3-byte sequence in UTF-8
+ */
+ seg->char_count = 1;
+
+ seg->body.child.ref_count = 1;
+ seg->body.child.widgets = NULL;
+ seg->body.child.tree = NULL;
+ seg->body.child.line = NULL;
+
+ return seg;
+}
+
+void
+_widget_segment_add (GtkTextLineSegment *widget_segment,
+ GtkWidget *child)
+{
+ g_assert (widget_segment->type = &gtk_text_child_type);
+
+ widget_segment->body.child.widgets =
+ g_slist_prepend (widget_segment->body.child.widgets,
+ child);
+
+ g_object_ref (G_OBJECT (child));
+}
+
+void
+_widget_segment_remove (GtkTextLineSegment *widget_segment,
+ GtkWidget *child)
+{
+ g_assert (widget_segment->type = &gtk_text_child_type);
+
+ widget_segment->body.child.widgets =
+ g_slist_remove (widget_segment->body.child.widgets,
+ child);
+
+ g_object_unref (G_OBJECT (child));
+}
+
+void
+_widget_segment_ref (GtkTextLineSegment *widget_segment)
+{
+ g_assert (widget_segment->type = &gtk_text_child_type);
+
+ widget_segment->body.child.ref_count += 1;
+}
+
+void
+_widget_segment_unref (GtkTextLineSegment *widget_segment)
+{
+ g_assert (widget_segment->type = &gtk_text_child_type);
+
+ widget_segment->body.child.ref_count -= 1;
+
+ if (widget_segment->body.child.ref_count == 0)
+ {
+ GSList *tmp_list;
+
+ if (widget_segment->body.child.tree == NULL)
+ g_warning ("widget segment destroyed while still in btree");
+
+ tmp_list = widget_segment->body.child.widgets;
+ while (tmp_list)
+ {
+ g_object_unref (G_OBJECT (tmp_list->data));
+
+ tmp_list = g_slist_next (tmp_list);
+ }
+
+ g_slist_free (widget_segment->body.child.widgets);
+
+ g_free (widget_segment);
+ }
+}
+
+void
+gtk_text_child_anchor_ref (GtkTextChildAnchor *anchor)
+{
+ GtkTextLineSegment *seg = (GtkTextLineSegment *) anchor;
+
+ g_return_if_fail (seg->type = &gtk_text_child_type);
+ g_return_if_fail (seg->body.child.ref_count > 0);
+
+ _widget_segment_ref (seg);
+}
+
+void
+gtk_text_child_anchor_unref (GtkTextChildAnchor *anchor)
+{
+ GtkTextLineSegment *seg = (GtkTextLineSegment *) anchor;
+
+ g_return_if_fail (seg->type = &gtk_text_child_type);
+ g_return_if_fail (seg->body.child.ref_count > 0);
+
+ _widget_segment_unref (seg);
+}
+
+GList*
+gtk_text_child_anchor_get_widgets (GtkTextChildAnchor *anchor)
+{
+ GtkTextLineSegment *seg = (GtkTextLineSegment *) anchor;
+ GList *list = NULL;
+ GSList *iter;
+
+ g_return_val_if_fail (seg->type = &gtk_text_child_type, NULL);
+
+ iter = seg->body.child.widgets;
+ while (iter != NULL)
+ {
+ list = g_list_prepend (list, iter->data);
+
+ iter = g_slist_next (iter);
+ }
+
+ /* Order is not relevant, so we don't need to reverse the list
+ * again.
+ */
+ return list;
+}
+
+gboolean
+gtk_text_child_anchor_get_deleted (GtkTextChildAnchor *anchor)
+{
+ GtkTextLineSegment *seg = (GtkTextLineSegment *) anchor;
+
+ g_return_val_if_fail (seg->type = &gtk_text_child_type, TRUE);
+
+ return seg->body.child.tree == NULL;
+}
+
+
+