diff options
author | Havoc Pennington <hp@redhat.com> | 2000-07-25 23:59:38 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-07-25 23:59:38 +0000 |
commit | a4762fbff4739fbf0373c5528eb3a9855aa9299b (patch) | |
tree | 3fc0969e7a0a0761da5c5d92920ee04b07c5f528 /gtk/gtktexttagtable.c | |
parent | f56297c5346cddb72b383161bbde9168824acb94 (diff) | |
download | gdk-pixbuf-a4762fbff4739fbf0373c5528eb3a9855aa9299b.tar.gz |
update to reflect text widget changes.
2000-07-25 Havoc Pennington <hp@redhat.com>
* gtk/testtext.c, gtk/testtextbuffer.c: update to reflect text
widget changes.
* gtk/gtktextview.h: To be consistent with usage of "line"
throughout the API to mean "newline-terminated thingy", change
MOVEMENT_LINE to be MOVEMENT_WRAPPED_LINE, and MOVEMENT_PARAGRAPH
to MOVEMENT_LINE.
(GtkTextView): Add flags for default editability, and whether to
show the cursor. Add functions to get/set that. Add
(gtk_text_view_get_iter_location): new function
* gtk/gtktexttypes.h: Move GtkTextLine typedef from here to
gtktextlayout.h
(g_convert): Add g_convert temporarily, will go in glib in a bit
* gtk/gtktexttagtable.h: include gtktexttag.h, and define
GtkTextTagTableForeach instead of brokenly using GHFunc.
Change gtk_text_tag_table_foreach() so it doesn't use GHFunc.
* gtk/gtktexttagprivate.h: Remove GtkTextStyleValues from here,
moved to public header.
* gtk/gtktexttag.h: Rename the "elide" attribute of tags to
"invisible", since "elide" was a bad name.
(gtk_text_tag_get_priority): Added
(GtkTextStyleValues): put this in public header, along with
functions to use it.
* gtk/gtktextmarkprivate.h: Include more headers, since we no
longer include gtktextbtree.h.
* gtk/gtktextmark.h: Add gtk_text_mark_ref, gtk_text_mark_unref,
gtk_text_mark_deleted
* gtk/gtktextlayout.h: Don't include the "really private" headers,
only buffer/iter. Forward declare GtkTextLIne and GtkTextLineData
to make this possible. Now we only need to install
gtktextlayout.h, not gtktextbtree.h and gtktext*private.h.
(However the Makefile.am isn't changed yet because of the
logistics of merging gtk-hp-patches piecemeal)
* gtk/gtktextiterprivate.h: include btree header, so it compiles;
rename gtk_text_iter_get_line to gtk_text_iter_get_text_line since
gtk_text_iter_get_line is now used in the public API for a
different purpose.
* gtk/gtktextiter.h: Clean up function names to be more
consistent. Always call char offset "offset" and byte index
"index". A "line" is always a line number.
(gtk_text_iter_is_last): new function, more efficient than
the existing way to check
(gtk_text_iter_is_first): new function, also more efficient
(gtk_text_iter_up_lines, gtk_text_iter_down_lines): Remove these
(gtk_text_iter_next_char, gtk_text_iter_prev_char): Renamed from
gtk_text_iter_forward_char, etc.
(gtk_text_iter_forward_to_tag_toggle): Renamed from
forward_find_tag_toggle, since this isn't a linear search
(GtkTextCharPredicate): rename from GtkTextViewCharPredicate
(gtk_text_iter_forward_search, gtk_text_iter_backward_search):
New functions, search for a buffer substring.
* gtk/gtktextbuffer.h: Add fields to store whether a paste is
interactive and default editable (since we need to store that info
until we receive the selection data).
Remove all the _at_char and at_line etc. versions of functions;
only have iterator versions.
Add _interactive() versions of functions, that consider the
editability of text. (FIXME add interactive flag to the
insert/delete signals per Darin's suggestion)
(gtk_text_buffer_get_tag_table): new function, demand-creates the
tag table if necessary
Remove declaration of gtk_text_buffer_get_iter_from_string
(_gtk_text_buffer_get_btree): private/internal function, added.
* gtk/gtktextbtree.h: Remove forward decl of GtkTextLineData.
(gtk_text_line_is_last): new function
Diffstat (limited to 'gtk/gtktexttagtable.c')
-rw-r--r-- | gtk/gtktexttagtable.c | 85 |
1 files changed, 60 insertions, 25 deletions
diff --git a/gtk/gtktexttagtable.c b/gtk/gtktexttagtable.c index b204c61b8..f79b34bfa 100644 --- a/gtk/gtktexttagtable.c +++ b/gtk/gtktexttagtable.c @@ -126,14 +126,23 @@ gtk_text_tag_table_destroy (GtkObject *object) } static void +foreach_unref (GtkTextTag *tag, gpointer data) +{ + g_object_unref (G_OBJECT (tag)); +} + +static void gtk_text_tag_table_finalize (GObject *object) { GtkTextTagTable *table; table = GTK_TEXT_TAG_TABLE(object); - g_hash_table_destroy(table->hash); + gtk_text_tag_table_foreach (table, foreach_unref, NULL); + g_hash_table_destroy(table->hash); + g_slist_free (table->anonymous); + (* G_OBJECT_CLASS(parent_class)->finalize) (object); } @@ -174,14 +183,23 @@ gtk_text_tag_table_add(GtkTextTagTable *table, GtkTextTag *tag) { guint size; - g_return_if_fail(GTK_IS_TEXT_TAG_TABLE(table)); - g_return_if_fail(GTK_IS_OBJECT(tag)); - g_return_if_fail(g_hash_table_lookup(table->hash, tag->name) == NULL); + g_return_if_fail(GTK_IS_TEXT_TAG_TABLE (table)); + g_return_if_fail(GTK_IS_TEXT_TAG (tag)); + g_return_if_fail(tag->name == NULL || + g_hash_table_lookup(table->hash, tag->name) == NULL); g_return_if_fail(tag->table == NULL); - + gtk_object_ref(GTK_OBJECT(tag)); gtk_object_sink(GTK_OBJECT(tag)); - g_hash_table_insert(table->hash, tag->name, tag); + + if (tag->name) + g_hash_table_insert(table->hash, tag->name, tag); + else + { + table->anonymous = g_slist_prepend (table->anonymous, tag); + table->anon_count += 1; + } + tag->table = table; /* We get the highest tag priority, as the most-recently-added @@ -204,19 +222,11 @@ gtk_text_tag_table_lookup(GtkTextTagTable *table, const gchar *name) } void -gtk_text_tag_table_remove(GtkTextTagTable *table, const gchar *name) +gtk_text_tag_table_remove(GtkTextTagTable *table, GtkTextTag *tag) { - GtkTextTag *tag; - - g_return_if_fail(GTK_IS_TEXT_TAG_TABLE(table)); - g_return_if_fail(name != NULL); - - tag = g_hash_table_lookup(table->hash, name); - - if (tag == NULL) - return; - - g_return_if_fail(tag->table == table); + g_return_if_fail (GTK_IS_TEXT_TAG_TABLE(table)); + g_return_if_fail (GTK_IS_TEXT_TAG (tag)); + g_return_if_fail (tag->table == table); /* Set ourselves to the highest priority; this means when we're removed, there won't be any gaps in the @@ -224,23 +234,48 @@ gtk_text_tag_table_remove(GtkTextTagTable *table, const gchar *name) gtk_text_tag_set_priority(tag, gtk_text_tag_table_size(table) - 1); tag->table = NULL; - - g_hash_table_remove(table->hash, name); + if (tag->name) + g_hash_table_remove(table->hash, tag->name); + else + { + table->anonymous = g_slist_remove (table->anonymous, tag); + table->anon_count -= 1; + } + gtk_signal_emit(GTK_OBJECT(table), signals[TAG_REMOVED], tag); gtk_object_unref(GTK_OBJECT(tag)); } +struct ForeachData +{ + GtkTextTagTableForeach func; + gpointer data; +}; + +static void +hash_foreach (gpointer key, gpointer value, gpointer data) +{ + struct ForeachData *fd = data; + + (* fd->func) (value, fd->data); +} + void -gtk_text_tag_table_foreach(GtkTextTagTable *table, - GHFunc func, - gpointer data) +gtk_text_tag_table_foreach(GtkTextTagTable *table, + GtkTextTagTableForeach func, + gpointer data) { + struct ForeachData d; + g_return_if_fail(GTK_IS_TEXT_TAG_TABLE(table)); g_return_if_fail(func != NULL); - g_hash_table_foreach(table->hash, func, data); + d.func = func; + d.data = data; + + g_hash_table_foreach(table->hash, hash_foreach, &d); } guint @@ -248,5 +283,5 @@ gtk_text_tag_table_size(GtkTextTagTable *table) { g_return_val_if_fail(GTK_IS_TEXT_TAG_TABLE(table), 0); - return g_hash_table_size(table->hash); + return g_hash_table_size(table->hash) + table->anon_count; } |