* gnoemoe/widgets/gm-world-text-view.c:

Fixed blinking problem (closes: #6)
This commit is contained in:
Jesse van den Kieboom 2006-09-29 12:17:32 +00:00
parent 01ff8c9df0
commit e2d462cc96
1 changed files with 38 additions and 6 deletions

View File

@ -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) {