mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-16 23:24:16 +00:00
text: Handle 'inverted' selections
We must handle selection_bound > cursor in various places. This was lost in the big entry refactoring. Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1792
This commit is contained in:
parent
fb4ffa468c
commit
8bae5348f9
@ -361,6 +361,7 @@ static void gtk_text_insert_text (GtkText *self,
|
|||||||
static void gtk_text_delete_text (GtkText *self,
|
static void gtk_text_delete_text (GtkText *self,
|
||||||
int start_pos,
|
int start_pos,
|
||||||
int end_pos);
|
int end_pos);
|
||||||
|
static void gtk_text_delete_selection (GtkText *self);
|
||||||
static void gtk_text_set_selection_bounds (GtkText *self,
|
static void gtk_text_set_selection_bounds (GtkText *self,
|
||||||
int start,
|
int start,
|
||||||
int end);
|
int end);
|
||||||
@ -3091,6 +3092,17 @@ gtk_text_delete_text (GtkText *self,
|
|||||||
gtk_widget_queue_resize (GTK_WIDGET (self));
|
gtk_widget_queue_resize (GTK_WIDGET (self));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_text_delete_selection (GtkText *self)
|
||||||
|
{
|
||||||
|
GtkTextPrivate *priv = gtk_text_get_instance_private (self);
|
||||||
|
|
||||||
|
int start_pos = MIN (priv->selection_bound, priv->current_pos);
|
||||||
|
int end_pos = MAX (priv->selection_bound, priv->current_pos);
|
||||||
|
|
||||||
|
gtk_text_delete_text (self, start_pos, end_pos);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_text_set_selection_bounds (GtkText *self,
|
gtk_text_set_selection_bounds (GtkText *self,
|
||||||
int start,
|
int start,
|
||||||
@ -3560,7 +3572,7 @@ gtk_text_delete_from_cursor (GtkText *self,
|
|||||||
|
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
{
|
{
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3646,7 +3658,7 @@ gtk_text_backspace (GtkText *self)
|
|||||||
|
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
{
|
{
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3737,7 +3749,7 @@ gtk_text_cut_clipboard (GtkText *self)
|
|||||||
if (priv->editable)
|
if (priv->editable)
|
||||||
{
|
{
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -3786,7 +3798,7 @@ gtk_text_delete_cb (GtkText *self)
|
|||||||
if (priv->editable)
|
if (priv->editable)
|
||||||
{
|
{
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3958,7 +3970,7 @@ gtk_text_enter_text (GtkText *self,
|
|||||||
priv->need_im_reset = FALSE;
|
priv->need_im_reset = FALSE;
|
||||||
|
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (priv->overwrite_mode)
|
if (priv->overwrite_mode)
|
||||||
@ -4988,7 +5000,7 @@ paste_received (GObject *clipboard,
|
|||||||
|
|
||||||
begin_change (self);
|
begin_change (self);
|
||||||
if (priv->selection_bound != priv->current_pos)
|
if (priv->selection_bound != priv->current_pos)
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
|
|
||||||
pos = priv->current_pos;
|
pos = priv->current_pos;
|
||||||
gtk_text_insert_text (self, text, length, &pos);
|
gtk_text_insert_text (self, text, length, &pos);
|
||||||
@ -6106,8 +6118,8 @@ gtk_text_drag_data_received (GtkWidget *widget,
|
|||||||
{
|
{
|
||||||
/* Replacing selection */
|
/* Replacing selection */
|
||||||
begin_change (self);
|
begin_change (self);
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
pos = priv->selection_bound;
|
pos = MIN (priv->selection_bound, priv->current_pos);
|
||||||
gtk_text_insert_text (self, str, length, &pos);
|
gtk_text_insert_text (self, str, length, &pos);
|
||||||
end_change (self);
|
end_change (self);
|
||||||
}
|
}
|
||||||
@ -6150,7 +6162,7 @@ gtk_text_drag_data_delete (GtkWidget *widget,
|
|||||||
|
|
||||||
if (priv->editable &&
|
if (priv->editable &&
|
||||||
priv->selection_bound != priv->current_pos)
|
priv->selection_bound != priv->current_pos)
|
||||||
gtk_text_delete_text (self, priv->selection_bound, priv->current_pos);
|
gtk_text_delete_selection (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We display the cursor when
|
/* We display the cursor when
|
||||||
|
Loading…
Reference in New Issue
Block a user