textview: Don't scroll for pastes in another view
authorMatthias Clasen <mclasen@redhat.com>
Mon, 14 May 2018 12:03:34 +0000 (13:03 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 14 May 2018 12:03:34 +0000 (13:03 +0100)
GtkTextView scrolls to the insertion point when the text
buffer signals a paste is done. This is wrong when there
are multiple views on the same buffer, and the paste
happened in another view.

To fix this, flip the handling of the scroll_after_paste
boolean to only be TRUE if we know that we want to scroll.

gtk/gtktextview.c

index 6d6a72dcee48e1f1160c42df1ac0e5297c3f79ea..1992d4c3b98f98f4890c49f10eb45d9519641e6a 100644 (file)
@@ -1639,7 +1639,7 @@ gtk_text_view_init (GtkTextView *text_view)
   priv->tabs = NULL;
   priv->editable = TRUE;
 
-  priv->scroll_after_paste = TRUE;
+  priv->scroll_after_paste = FALSE;
 
   gtk_drag_dest_set (widget, 0, NULL,
                      GDK_ACTION_COPY | GDK_ACTION_MOVE);
@@ -5116,10 +5116,6 @@ gtk_text_view_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
   else if (button == GDK_BUTTON_MIDDLE &&
            get_middle_click_paste (text_view))
     {
-      /* We do not want to scroll back to the insert iter when we paste
-         with the middle button */
-      priv->scroll_after_paste = FALSE;
-
       get_iter_from_gesture (text_view, GTK_GESTURE (gesture),
                              &iter, NULL, NULL);
       gtk_text_buffer_paste_clipboard (get_buffer (text_view),
@@ -6599,6 +6595,8 @@ gtk_text_view_paste_clipboard (GtkTextView *text_view)
 {
   GdkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view));
   
+  text_view->priv->scroll_after_paste = TRUE;
+
   gtk_text_buffer_paste_clipboard (get_buffer (text_view),
                                   clipboard,
                                   NULL,
@@ -6621,7 +6619,7 @@ gtk_text_view_paste_done_handler (GtkTextBuffer *buffer,
       gtk_text_view_scroll_mark_onscreen (text_view, gtk_text_buffer_get_insert (buffer));
     }
 
-  priv->scroll_after_paste = TRUE;
+  priv->scroll_after_paste = FALSE;
 }
 
 static void