summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-01-07 03:15:48 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-01-07 03:15:48 +0000
commit46a7aaac765df8c87937c9bef6207abcf96cf2f3 (patch)
treeae6dabd35e4898edd428dc0e25d6a3058bd5a0f6
parent9dccdd1008db6896fec57c774a3bb1d45dd41b45 (diff)
parente14d6fe9d5398b0e0edc82ffece1f1726445758a (diff)
downloadgtk+-46a7aaac765df8c87937c9bef6207abcf96cf2f3.tar.gz
Merge branch 'wip/chergert/fix-textview-dnd-move-same-view' into 'main'
textview: remove drag selection after dnd move action See merge request GNOME/gtk!4346
-rw-r--r--gtk/gtktextview.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 00b361f8a2..5f8bb14ffb 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -231,8 +231,13 @@ struct _GtkTextViewPrivate
guint first_validate_idle; /* Idle to revalidate onscreen portion, runs before resize */
guint incremental_validate_idle; /* Idle to revalidate offscreen portions, runs after redraw */
+ /* Mark for drop target */
GtkTextMark *dnd_mark;
+ /* Mark for selection of drag source */
+ GtkTextMark *dnd_drag_begin_mark;
+ GtkTextMark *dnd_drag_end_mark;
+
GtkIMContext *im_context;
GtkWidget *popup_menu;
GMenuModel *extra_menu;
@@ -8056,8 +8061,26 @@ static void
dnd_finished_cb (GdkDrag *drag,
GtkTextView *self)
{
- if (gdk_drag_get_selected_action (drag) == GDK_ACTION_MOVE)
- gtk_text_buffer_delete_selection (self->priv->buffer, TRUE, self->priv->editable);
+ GtkTextBuffer *buffer = self->priv->buffer;
+
+ if (self->priv->dnd_drag_begin_mark)
+ {
+ if (gdk_drag_get_selected_action (drag) == GDK_ACTION_MOVE)
+ {
+ {
+ GtkTextIter begin, end;
+
+ gtk_text_buffer_get_iter_at_mark (buffer, &begin, self->priv->dnd_drag_begin_mark);
+ gtk_text_buffer_get_iter_at_mark (buffer, &end, self->priv->dnd_drag_end_mark);
+ gtk_text_buffer_delete (buffer, &begin, &end);
+ }
+ }
+
+ gtk_text_buffer_delete_mark (buffer, self->priv->dnd_drag_begin_mark);
+ gtk_text_buffer_delete_mark (buffer, self->priv->dnd_drag_end_mark);
+ self->priv->dnd_drag_begin_mark = NULL;
+ self->priv->dnd_drag_end_mark = NULL;
+ }
self->priv->drag = NULL;
}
@@ -8067,6 +8090,16 @@ dnd_cancel_cb (GdkDrag *drag,
GdkDragCancelReason reason,
GtkTextView *self)
{
+ GtkTextBuffer *buffer = self->priv->buffer;
+
+ if (self->priv->dnd_drag_begin_mark)
+ {
+ gtk_text_buffer_delete_mark (buffer, self->priv->dnd_drag_begin_mark);
+ gtk_text_buffer_delete_mark (buffer, self->priv->dnd_drag_end_mark);
+ self->priv->dnd_drag_begin_mark = NULL;
+ self->priv->dnd_drag_end_mark = NULL;
+ }
+
self->priv->drag = NULL;
}
@@ -8108,6 +8141,9 @@ gtk_text_view_start_selection_dnd (GtkTextView *text_view,
paintable = gtk_text_util_create_rich_drag_icon (widget, buffer, &start, &end);
gtk_drag_icon_set_from_paintable (drag, paintable, 0, 0);
g_object_unref (paintable);
+
+ text_view->priv->dnd_drag_begin_mark = gtk_text_buffer_create_mark (buffer, NULL, &start, TRUE);
+ text_view->priv->dnd_drag_end_mark = gtk_text_buffer_create_mark (buffer, NULL, &end, TRUE);
}
text_view->priv->drag = drag;