We free things from the text property MemChunk, so it needs to be

Wed Jul 15 17:44:47 1998  Owen Taylor  <otaylor@redhat.com>

	* gtk/gtktext.c (new_text_property): We free things from
	the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.

	* Fix up line start cache when splitting a property
	during an insert.
This commit is contained in:
Owen Taylor 1998-07-21 19:31:38 +00:00 committed by Owen Taylor
parent 8cf49d7c10
commit b4c814e272
8 changed files with 104 additions and 7 deletions

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -1,3 +1,11 @@
Wed Jul 15 17:44:47 1998 Owen Taylor <otaylor@redhat.com>
* gtk/gtktext.c (new_text_property): We free things from
the text property MemChunk, so it needs to be G_ALLOC_AND_FREE.
* Fix up line start cache when splitting a property
during an insert.
1998-07-20 Raph Levien <raph@acm.org>
* gdk/gdkrgb.c: More cleanups in the config process.

View File

@ -2457,12 +2457,31 @@ delete_expose (GtkText* text, guint nchars, guint old_lines, guint old_pixels)
static void
correct_cache_insert (GtkText* text, gint nchars)
{
GList* cache = text->current_line->next;
GList *cache;
GtkPropertyMark *start;
GtkPropertyMark *end;
/* If we split a property exactly at the beginning of the
* line, we have to correct here, or fetch_lines will
* fetch junk.
*/
start = &CACHE_DATA(text->current_line).start;
if (start->offset == MARK_CURRENT_PROPERTY (start)->length)
SET_PROPERTY_MARK (start, start->property->next, 0);
/* Now correct the offsets, and check for start or end marks that
* are after the point, yet point to a property before the point's
* property. This indicates that they are meant to point to the
* second half of a property we split in insert_text_property(), so
* we fix them up that way.
*/
cache = text->current_line->next;
for (; cache; cache = cache->next)
{
GtkPropertyMark *start = &CACHE_DATA(cache).start;
GtkPropertyMark *end = &CACHE_DATA(cache).end;
start = &CACHE_DATA(cache).start;
end = &CACHE_DATA(cache).end;
if (LAST_INDEX (text, text->point) &&
start->index == text->point.index)
@ -2472,7 +2491,16 @@ correct_cache_insert (GtkText* text, gint nchars)
if (start->property == text->point.property)
move_mark_n(start, nchars);
else
start->index += nchars;
{
if (start->property->next &&
(start->property->next->next == text->point.property))
{
g_assert (start->offset >= MARK_CURRENT_PROPERTY (start)->length);
start->offset -= MARK_CURRENT_PROPERTY (start)->length;
start->property = text->point.property;
}
start->index += nchars;
}
}
if (LAST_INDEX (text, text->point) &&
@ -2482,8 +2510,17 @@ correct_cache_insert (GtkText* text, gint nchars)
{
if (end->property == text->point.property)
move_mark_n(end, nchars);
else
end->index += nchars;
else
{
if (end->property->next &&
(end->property->next->next == text->point.property))
{
g_assert (end->offset >= MARK_CURRENT_PROPERTY (end)->length);
end->offset -= MARK_CURRENT_PROPERTY (end)->length;
end->property = text->point.property;
}
end->index += nchars;
}
}
/*TEXT_ASSERT_MARK(text, start, "start");*/
@ -2635,7 +2672,7 @@ new_text_property (GdkFont* font, GdkColor* fore, GdkColor* back, guint length)
text_property_chunk = g_mem_chunk_new ("text property mem chunk",
sizeof(TextProperty),
1024*sizeof(TextProperty),
G_ALLOC_ONLY);
G_ALLOC_AND_FREE);
}
prop = g_chunk_new(TextProperty, text_property_chunk);
@ -2768,6 +2805,10 @@ insert_text_property (GtkText* text, GdkFont* font,
}
else
{
/* The following will screw up the line_start cache,
* we'll fix it up in correct_cache_insert
*/
/* In the middle of forward_prop, if properties are equal,
* just add to its length, else split it into two and splice
* in a new one. */