From e2d462cc96c00323227c8c598552679b401defa9 Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Fri, 29 Sep 2006 12:17:32 +0000 Subject: [PATCH] * gnoemoe/widgets/gm-world-text-view.c: Fixed blinking problem (closes: #6) --- gnoemoe/widgets/gm-world-text-view.c | 44 ++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/gnoemoe/widgets/gm-world-text-view.c b/gnoemoe/widgets/gm-world-text-view.c index 5217d89..fb6b55d 100644 --- a/gnoemoe/widgets/gm-world-text-view.c +++ b/gnoemoe/widgets/gm-world-text-view.c @@ -65,7 +65,7 @@ typedef struct _BlinkInfo { guint timeout; GmWorldTextView *view; - gint offset; + GtkTextMark *begin; } BlinkInfo; static void blink_info_free(BlinkInfo *info); @@ -237,6 +237,10 @@ gm_world_text_view_init(GmWorldTextView *view) { /* Private functions */ static void blink_info_free(BlinkInfo *info) { + if (!gtk_text_mark_get_deleted(info->begin)) + gtk_text_buffer_delete_mark(GM_WORLD_TEXT_VIEW_BUFFER(info->view), info->begin); + + g_object_unref(info->begin); g_object_unref(info->text); g_free(info->fill); g_free(info); @@ -513,15 +517,43 @@ gm_world_text_view_update_color_tag(GmWorldTextView *view, const gchar *name, } } +static void +gm_world_text_view_remove_blinkers(GmWorldTextView *view, GtkTextIter *start, + GtkTextIter *end) { + GtkTextIter blink; + BlinkInfo *info; + GSList *item, *list; + GtkTextBuffer *buffer; + + list = g_slist_copy(view->priv->blinkers); + buffer = GM_WORLD_TEXT_VIEW_BUFFER(view); + + for (item = list; item; item = item->next) { + info = (BlinkInfo *)(item->data); + + gtk_text_buffer_get_iter_at_mark(buffer, &blink, info->begin); + + if (gtk_text_iter_in_range(&blink, start, end)) + view->priv->blinkers = g_slist_remove(view->priv->blinkers, info); + } + + g_slist_free(list); +} + static void gm_world_text_view_check_buffer_size(GmWorldTextView *view) { GtkTextBuffer *buf = GM_WORLD_TEXT_VIEW_BUFFER(view); GtkTextIter start, end; - int d = gtk_text_buffer_get_line_count(buf) - view->priv->max_lines; + + gint d = gtk_text_buffer_get_line_count(buf) - view->priv->max_lines; - if (d > 0) { - gtk_text_buffer_get_iter_at_line(buf, &start, 0); + if (d > 0) { + gtk_text_buffer_get_iter_at_line(buf, &start, 0); gtk_text_buffer_get_iter_at_line(buf, &end, d); + + /* Remove any blinkers in the line */ + gm_world_text_view_remove_blinkers(view, &start, &end); + gtk_text_buffer_delete(buf, &start, &end); } } @@ -694,7 +726,7 @@ gm_world_text_view_blinker_iters(BlinkInfo *info, GtkTextIter *start, tag = info->view->priv->tag_blink_fast; } - gtk_text_buffer_get_iter_at_offset(buffer, start, info->offset); + gtk_text_buffer_get_iter_at_mark(buffer, start, info->begin); if (end != NULL) { *end = *start; @@ -1017,7 +1049,7 @@ gm_world_text_view_insert_text(GmWorldTextView *view, const gchar *text, if (insert_info->blink) { info = g_new0(BlinkInfo, 1); info->blink = insert_info->blink; - info->offset = gtk_text_iter_get_offset(&start_iter); + info->begin = g_object_ref(gtk_text_buffer_create_mark(tb, NULL, &start_iter, TRUE)); info->view = view; if (insert_info->blink == 1) {