* gnoemoe/widgets/gm-world-text-view.c:
Fixed blinking problem (closes: #6)
This commit is contained in:
parent
01ff8c9df0
commit
e2d462cc96
|
@ -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) {
|
||||
|
|
Reference in New Issue