* 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;
|
guint timeout;
|
||||||
GmWorldTextView *view;
|
GmWorldTextView *view;
|
||||||
gint offset;
|
GtkTextMark *begin;
|
||||||
} BlinkInfo;
|
} BlinkInfo;
|
||||||
|
|
||||||
static void blink_info_free(BlinkInfo *info);
|
static void blink_info_free(BlinkInfo *info);
|
||||||
|
@ -237,6 +237,10 @@ gm_world_text_view_init(GmWorldTextView *view) {
|
||||||
/* Private functions */
|
/* Private functions */
|
||||||
static void
|
static void
|
||||||
blink_info_free(BlinkInfo *info) {
|
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_object_unref(info->text);
|
||||||
g_free(info->fill);
|
g_free(info->fill);
|
||||||
g_free(info);
|
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
|
static void
|
||||||
gm_world_text_view_check_buffer_size(GmWorldTextView *view) {
|
gm_world_text_view_check_buffer_size(GmWorldTextView *view) {
|
||||||
GtkTextBuffer *buf = GM_WORLD_TEXT_VIEW_BUFFER(view);
|
GtkTextBuffer *buf = GM_WORLD_TEXT_VIEW_BUFFER(view);
|
||||||
GtkTextIter start, end;
|
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) {
|
if (d > 0) {
|
||||||
gtk_text_buffer_get_iter_at_line(buf, &start, 0);
|
gtk_text_buffer_get_iter_at_line(buf, &start, 0);
|
||||||
gtk_text_buffer_get_iter_at_line(buf, &end, d);
|
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);
|
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;
|
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) {
|
if (end != NULL) {
|
||||||
*end = *start;
|
*end = *start;
|
||||||
|
@ -1017,7 +1049,7 @@ gm_world_text_view_insert_text(GmWorldTextView *view, const gchar *text,
|
||||||
if (insert_info->blink) {
|
if (insert_info->blink) {
|
||||||
info = g_new0(BlinkInfo, 1);
|
info = g_new0(BlinkInfo, 1);
|
||||||
info->blink = insert_info->blink;
|
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;
|
info->view = view;
|
||||||
|
|
||||||
if (insert_info->blink == 1) {
|
if (insert_info->blink == 1) {
|
||||||
|
|
Reference in New Issue