diff options
author | Havoc Pennington <hp@pobox.com> | 2000-10-02 14:29:24 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-10-02 14:29:24 +0000 |
commit | 8ebf77d13be575f37bb5ef34b79bf1d68a7ead77 (patch) | |
tree | 5a47b4ede579fb38f2179c621ff308a7248abdf1 /gtk/gtktextchild.c | |
parent | 632fda6f0bd578006226b29badcfb63729f5eba2 (diff) | |
download | gtk+-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.c | 210 |
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 = >k_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 = >k_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 = >k_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 = >k_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 = >k_text_child_type); + + widget_segment->body.child.ref_count += 1; +} + +void +_widget_segment_unref (GtkTextLineSegment *widget_segment) +{ + g_assert (widget_segment->type = >k_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 = >k_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 = >k_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 = >k_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 = >k_text_child_type, TRUE); + + return seg->body.child.tree == NULL; +} + + + |