summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtktextbuffer.c49
1 files changed, 19 insertions, 30 deletions
diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c
index c11308089d..de91b756b3 100644
--- a/gtk/gtktextbuffer.c
+++ b/gtk/gtktextbuffer.c
@@ -3319,27 +3319,11 @@ pre_paste_prep (ClipboardRequest *request_data,
get_paste_point (buffer, insert_point, TRUE);
- /* If we're going to replace the selection, we insert before it to
- * avoid messing it up, then we delete the selection after inserting.
- */
if (request_data->replace_selection)
{
GtkTextIter start, end;
if (gtk_text_buffer_get_selection_bounds (buffer, &start, &end))
- *insert_point = start;
- }
-}
-
-static void
-post_paste_cleanup (ClipboardRequest *request_data)
-{
- if (request_data->replace_selection)
- {
- GtkTextIter start, end;
-
- if (gtk_text_buffer_get_selection_bounds (request_data->buffer,
- &start, &end))
{
if (request_data->interactive)
gtk_text_buffer_delete_interactive (request_data->buffer,
@@ -3348,6 +3332,8 @@ post_paste_cleanup (ClipboardRequest *request_data)
request_data->default_editable);
else
gtk_text_buffer_delete (request_data->buffer, &start, &end);
+
+ *insert_point = start;
}
}
}
@@ -3392,8 +3378,6 @@ clipboard_text_received (GtkClipboard *clipboard,
gtk_text_buffer_insert (buffer, &insert_point,
str, -1);
- post_paste_cleanup (request_data);
-
if (request_data->interactive)
gtk_text_buffer_end_user_action (buffer);
@@ -3493,11 +3477,11 @@ clipboard_rich_text_received (GtkClipboard *clipboard,
if (text != NULL && length > 0)
{
- pre_paste_prep (request_data, &insert_point);
-
if (request_data->interactive)
gtk_text_buffer_begin_user_action (request_data->buffer);
+ pre_paste_prep (request_data, &insert_point);
+
if (!request_data->interactive ||
gtk_text_iter_can_insert (&insert_point,
request_data->default_editable))
@@ -3522,10 +3506,7 @@ clipboard_rich_text_received (GtkClipboard *clipboard,
emit_paste_done (request_data->buffer, clipboard);
if (retval)
- {
- post_paste_cleanup (request_data);
- return;
- }
+ return;
}
/* Request the text selection instead */
@@ -3543,15 +3524,24 @@ paste_from_buffer (GtkClipboard *clipboard,
{
GtkTextIter insert_point;
GtkTextBuffer *buffer = request_data->buffer;
-
+
/* We're about to emit a bunch of signals, so be safe */
g_object_ref (src_buffer);
-
- pre_paste_prep (request_data, &insert_point);
-
+
+ /* Replacing the selection with itself */
+ if (request_data->replace_selection &&
+ buffer == src_buffer)
+ {
+ /* Clear the paste point if needed */
+ get_paste_point (buffer, &insert_point, TRUE);
+ goto done;
+ }
+
if (request_data->interactive)
gtk_text_buffer_begin_user_action (buffer);
+ pre_paste_prep (request_data, &insert_point);
+
if (!gtk_text_iter_equal (start, end))
{
if (!request_data->interactive ||
@@ -3564,11 +3554,10 @@ paste_from_buffer (GtkClipboard *clipboard,
request_data->interactive);
}
- post_paste_cleanup (request_data);
-
if (request_data->interactive)
gtk_text_buffer_end_user_action (buffer);
+done:
emit_paste_done (buffer, clipboard);
g_object_unref (src_buffer);