mirror of
https://github.com/brl/mutter.git
synced 2025-02-23 08:24:09 +00:00
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:
parent
5bec49aea9
commit
301863d43b
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user