text: Fixes for selection bound

The commit ecbb7ce41a1a759e246fce07f146b8bed5e3d730 exposed some issues
when positioning the cursor with the mouse pointer: the selection is
not moved along with the cursor when inserting a single character or a
string.

Also, some freeze_notify() are called too early, leading to decoupling
from their respective thaw_notify().

http://bugzilla.openedhand.com/show_bug.cgi?id=1955
This commit is contained in:
Emmanuele Bassi 2010-02-02 17:07:22 +00:00
parent 5bec49aea9
commit 301863d43b

View File

@ -873,9 +873,7 @@ clutter_text_set_text_internal (ClutterText *self,
} }
if (priv->n_bytes == 0) if (priv->n_bytes == 0)
{ clutter_text_set_positions (self, -1, -1);
clutter_text_set_positions (self, -1, -1);
}
clutter_text_dirty_cache (self); clutter_text_dirty_cache (self);
@ -1578,9 +1576,7 @@ clutter_text_motion (ClutterActor *actor,
if (priv->selectable) if (priv->selectable)
clutter_text_set_cursor_position (self, offset); clutter_text_set_cursor_position (self, offset);
else else
{ clutter_text_set_positions (self, offset, offset);
clutter_text_set_positions (self, offset, offset);
}
return TRUE; return TRUE;
} }
@ -1989,10 +1985,9 @@ clutter_text_real_move_up (ClutterText *self,
PangoLayout *layout; PangoLayout *layout;
gint line_no; gint line_no;
gint index_, trailing; gint index_, trailing;
gint pos;
gint x; gint x;
g_object_freeze_notify (G_OBJECT (self));
layout = clutter_text_get_layout (self); layout = clutter_text_get_layout (self);
if (priv->position == 0) if (priv->position == 0)
@ -2017,11 +2012,10 @@ clutter_text_real_move_up (ClutterText *self,
pango_layout_line_x_to_index (layout_line, x, &index_, &trailing); pango_layout_line_x_to_index (layout_line, x, &index_, &trailing);
{ g_object_freeze_notify (G_OBJECT (self));
gint pos = bytes_to_offset (priv->text, index_);
clutter_text_set_cursor_position (self, pos + trailing); pos = bytes_to_offset (priv->text, index_);
} clutter_text_set_cursor_position (self, pos + trailing);
/* Store the target x position to avoid drifting left and right when /* Store the target x position to avoid drifting left and right when
moving the cursor up and down */ moving the cursor up and down */
@ -2047,8 +2041,7 @@ clutter_text_real_move_down (ClutterText *self,
gint line_no; gint line_no;
gint index_, trailing; gint index_, trailing;
gint x; gint x;
gint pos;
g_object_freeze_notify (G_OBJECT (self));
layout = clutter_text_get_layout (self); layout = clutter_text_get_layout (self);
@ -2070,11 +2063,10 @@ clutter_text_real_move_down (ClutterText *self,
pango_layout_line_x_to_index (layout_line, x, &index_, &trailing); pango_layout_line_x_to_index (layout_line, x, &index_, &trailing);
{ g_object_freeze_notify (G_OBJECT (self));
gint pos = bytes_to_offset (priv->text, index_);
clutter_text_set_cursor_position (self, pos + trailing); pos = bytes_to_offset (priv->text, index_);
} clutter_text_set_cursor_position (self, pos + trailing);
/* Store the target x position to avoid drifting left and right when /* Store the target x position to avoid drifting left and right when
moving the cursor up and down */ moving the cursor up and down */
@ -4377,9 +4369,9 @@ clutter_text_insert_unichar (ClutterText *self,
clutter_text_set_text_internal (self, new->str); clutter_text_set_text_internal (self, new->str);
if (priv->position >= 0) if (priv->position >= 0)
{ clutter_text_set_positions (self,
clutter_text_set_positions (self, priv->position + 1, priv->position); priv->position + 1,
} priv->position + 1);
g_string_free (new, TRUE); g_string_free (new, TRUE);
} }
@ -4419,15 +4411,17 @@ clutter_text_insert_text (ClutterText *self,
new = g_string_insert (new, pos_bytes, text); new = g_string_insert (new, pos_bytes, text);
g_signal_emit (self, text_signals[INSERT_TEXT], 0, g_signal_emit (self, text_signals[INSERT_TEXT], 0,
text, g_utf8_strlen (text, -1), &position); text,
g_utf8_strlen (text, -1),
&position);
clutter_text_set_text_internal (self, new->str); clutter_text_set_text_internal (self, new->str);
if (position >= 0 && priv->position >= position) if (position >= 0 && priv->position >= position)
{ {
clutter_text_set_positions (self, gint new_pos = priv->position + g_utf8_strlen (text, -1);
priv->position + g_utf8_strlen (text, -1),
priv->position); clutter_text_set_positions (self, new_pos, new_pos);
} }
g_string_free (new, TRUE); g_string_free (new, TRUE);