summaryrefslogtreecommitdiff
path: root/gtk/gtktexttagtable.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2000-07-25 23:59:38 +0000
committerHavoc Pennington <hp@src.gnome.org>2000-07-25 23:59:38 +0000
commita4762fbff4739fbf0373c5528eb3a9855aa9299b (patch)
tree3fc0969e7a0a0761da5c5d92920ee04b07c5f528 /gtk/gtktexttagtable.c
parentf56297c5346cddb72b383161bbde9168824acb94 (diff)
downloadgdk-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.c85
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;
}