textiter: remove recursivity of find_by_log_attrs()
find_by_log_attrs() was a recursive function. It is replaced by an iteration. The already_moved_initially parameter was TRUE only for the recursive call, so the paramater is removed. There is also a small cleanup of the find_visible_by_log_attrs() (remove trailing spaces, fix indentation). There is still a part to optimize for a later commit. https://bugzilla.gnome.org/show_bug.cgi?id=629129
This commit is contained in:
@ -3096,35 +3096,42 @@ find_line_log_attrs (const GtkTextIter *iter,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME this function is very, very gratuitously slow */
|
|
||||||
static gboolean
|
static gboolean
|
||||||
find_by_log_attrs (GtkTextIter *iter,
|
find_by_log_attrs (GtkTextIter *iter,
|
||||||
FindLogAttrFunc func,
|
FindLogAttrFunc func,
|
||||||
gboolean forward,
|
gboolean forward)
|
||||||
gboolean already_moved_initially)
|
|
||||||
{
|
{
|
||||||
GtkTextIter orig;
|
GtkTextIter orig;
|
||||||
gint offset = 0;
|
gboolean already_moved_initially = FALSE;
|
||||||
gboolean found = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (iter != NULL, FALSE);
|
g_return_val_if_fail (iter != NULL, FALSE);
|
||||||
|
|
||||||
orig = *iter;
|
orig = *iter;
|
||||||
|
|
||||||
found = find_line_log_attrs (iter, func, &offset, already_moved_initially);
|
while (TRUE)
|
||||||
|
|
||||||
if (!found)
|
|
||||||
{
|
{
|
||||||
|
gint offset = 0;
|
||||||
|
gboolean found;
|
||||||
|
|
||||||
|
found = find_line_log_attrs (iter, func, &offset, already_moved_initially);
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
gtk_text_iter_set_line_offset (iter, offset);
|
||||||
|
|
||||||
|
return !gtk_text_iter_equal (iter, &orig) && !gtk_text_iter_is_end (iter);
|
||||||
|
}
|
||||||
|
|
||||||
if (forward)
|
if (forward)
|
||||||
{
|
{
|
||||||
if (gtk_text_iter_forward_line (iter))
|
if (!gtk_text_iter_forward_line (iter))
|
||||||
return find_by_log_attrs (iter, func, forward,
|
|
||||||
TRUE);
|
|
||||||
else
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
already_moved_initially = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* TODO optimize this part */
|
||||||
/* go to end of previous line. need to check that
|
/* go to end of previous line. need to check that
|
||||||
* line is > 0 because backward_line snaps to start of
|
* line is > 0 because backward_line snaps to start of
|
||||||
* line 0 if it's on line 0
|
* line 0 if it's on line 0
|
||||||
@ -3135,28 +3142,20 @@ find_by_log_attrs (GtkTextIter *iter,
|
|||||||
if (!gtk_text_iter_ends_line (iter))
|
if (!gtk_text_iter_ends_line (iter))
|
||||||
gtk_text_iter_forward_to_line_end (iter);
|
gtk_text_iter_forward_to_line_end (iter);
|
||||||
|
|
||||||
return find_by_log_attrs (iter, func, forward,
|
already_moved_initially = TRUE;
|
||||||
TRUE);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return FALSE;
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
gtk_text_iter_set_line_offset (iter, offset);
|
|
||||||
|
|
||||||
return
|
|
||||||
(already_moved_initially || !gtk_text_iter_equal (iter, &orig)) &&
|
|
||||||
!gtk_text_iter_is_end (iter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
find_visible_by_log_attrs (GtkTextIter *iter,
|
find_visible_by_log_attrs (GtkTextIter *iter,
|
||||||
FindLogAttrFunc func,
|
FindLogAttrFunc func,
|
||||||
gboolean forward,
|
gboolean forward)
|
||||||
gboolean already_moved_initially)
|
|
||||||
{
|
{
|
||||||
GtkTextIter pos;
|
GtkTextIter pos;
|
||||||
|
|
||||||
@ -3164,14 +3163,14 @@ find_visible_by_log_attrs (GtkTextIter *iter,
|
|||||||
|
|
||||||
pos = *iter;
|
pos = *iter;
|
||||||
|
|
||||||
while (find_by_log_attrs (&pos, func, forward, already_moved_initially))
|
while (find_by_log_attrs (&pos, func, forward))
|
||||||
{
|
{
|
||||||
if (!_gtk_text_btree_char_is_invisible (&pos))
|
if (!_gtk_text_btree_char_is_invisible (&pos))
|
||||||
{
|
{
|
||||||
*iter = pos;
|
*iter = pos;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -3225,7 +3224,7 @@ move_multiple_steps (GtkTextIter *iter,
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_forward_word_end (GtkTextIter *iter)
|
gtk_text_iter_forward_word_end (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_word_end_func, TRUE, FALSE);
|
return find_by_log_attrs (iter, find_word_end_func, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3243,7 +3242,7 @@ gtk_text_iter_forward_word_end (GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_backward_word_start (GtkTextIter *iter)
|
gtk_text_iter_backward_word_start (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_word_start_func, FALSE, FALSE);
|
return find_by_log_attrs (iter, find_word_start_func, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME a loop around a truly slow function means
|
/* FIXME a loop around a truly slow function means
|
||||||
@ -3303,7 +3302,7 @@ gtk_text_iter_backward_word_starts (GtkTextIter *iter,
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_forward_visible_word_end (GtkTextIter *iter)
|
gtk_text_iter_forward_visible_word_end (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_visible_by_log_attrs (iter, find_word_end_func, TRUE, FALSE);
|
return find_visible_by_log_attrs (iter, find_word_end_func, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3323,7 +3322,7 @@ gtk_text_iter_forward_visible_word_end (GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_backward_visible_word_start (GtkTextIter *iter)
|
gtk_text_iter_backward_visible_word_start (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_visible_by_log_attrs (iter, find_word_start_func, FALSE, FALSE);
|
return find_visible_by_log_attrs (iter, find_word_start_func, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3487,7 +3486,7 @@ gtk_text_iter_inside_sentence (const GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_forward_sentence_end (GtkTextIter *iter)
|
gtk_text_iter_forward_sentence_end (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_sentence_end_func, TRUE, FALSE);
|
return find_by_log_attrs (iter, find_sentence_end_func, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3505,7 +3504,7 @@ gtk_text_iter_forward_sentence_end (GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_backward_sentence_start (GtkTextIter *iter)
|
gtk_text_iter_backward_sentence_start (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_sentence_start_func, FALSE, FALSE);
|
return find_by_log_attrs (iter, find_sentence_start_func, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME a loop around a truly slow function means
|
/* FIXME a loop around a truly slow function means
|
||||||
@ -3620,7 +3619,7 @@ is_cursor_pos_func (const PangoLogAttr *attrs,
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_forward_cursor_position (GtkTextIter *iter)
|
gtk_text_iter_forward_cursor_position (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE);
|
return find_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3634,7 +3633,7 @@ gtk_text_iter_forward_cursor_position (GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_backward_cursor_position (GtkTextIter *iter)
|
gtk_text_iter_backward_cursor_position (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE);
|
return find_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3689,7 +3688,7 @@ gtk_text_iter_backward_cursor_positions (GtkTextIter *iter,
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter)
|
gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE, FALSE);
|
return find_visible_by_log_attrs (iter, find_forward_cursor_pos_func, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -3706,7 +3705,7 @@ gtk_text_iter_forward_visible_cursor_position (GtkTextIter *iter)
|
|||||||
gboolean
|
gboolean
|
||||||
gtk_text_iter_backward_visible_cursor_position (GtkTextIter *iter)
|
gtk_text_iter_backward_visible_cursor_position (GtkTextIter *iter)
|
||||||
{
|
{
|
||||||
return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE, FALSE);
|
return find_visible_by_log_attrs (iter, find_backward_cursor_pos_func, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user