Issue #1441 - Copy paste issue, internal clipboard blocks global clipboard

Never return an internal image/buffer/svg/curve from any
gimp_clipboard function if we are not the owner of the display's
clipboard. The clipboard is supposed to be a global thing, and we must
only offer to ourselves what would be pasted in any other app.
This commit is contained in:
Michael Natterer 2018-06-08 11:36:53 +02:00
parent 5c17d2a43b
commit 7d3a129ddd
1 changed files with 113 additions and 75 deletions

View File

@ -244,11 +244,15 @@ gimp_clipboard_has_image (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_image (gimp) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
return TRUE;
if (gimp_clipboard_wait_for_image (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -279,11 +283,15 @@ gimp_clipboard_has_buffer (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_buffer (gimp) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
return TRUE;
if (gimp_clipboard_wait_for_buffer (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -312,11 +320,15 @@ gimp_clipboard_has_svg (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_svg (gimp) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
return TRUE;
if (gimp_clipboard_wait_for_svg (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -345,11 +357,15 @@ gimp_clipboard_has_curve (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_curve (gimp) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
return TRUE;
if (gimp_clipboard_wait_for_curve (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -402,7 +418,6 @@ gimp_clipboard_get_image (Gimp *gimp)
{
GimpClipboard *gimp_clip;
GtkClipboard *clipboard;
GdkAtom atom;
GimpImage *image = NULL;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
@ -410,24 +425,30 @@ gimp_clipboard_get_image (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_image (gimp)) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GtkSelectionData *data;
GdkAtom atom = gimp_clipboard_wait_for_image (gimp);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
if (atom != GDK_NONE)
{
image = gimp_selection_data_get_xcf (data, gimp);
GtkSelectionData *data;
gtk_selection_data_free (data);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
{
image = gimp_selection_data_get_xcf (data, gimp);
gtk_selection_data_free (data);
}
gimp_unset_busy (gimp);
}
gimp_unset_busy (gimp);
return image;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -456,7 +477,6 @@ gimp_clipboard_get_buffer (Gimp *gimp)
{
GimpClipboard *gimp_clip;
GtkClipboard *clipboard;
GdkAtom atom;
GimpBuffer *buffer = NULL;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
@ -464,31 +484,37 @@ gimp_clipboard_get_buffer (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_buffer (gimp)) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GtkSelectionData *data;
GdkAtom atom = gimp_clipboard_wait_for_buffer (gimp);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
if (atom != GDK_NONE)
{
GdkPixbuf *pixbuf = gtk_selection_data_get_pixbuf (data);
GtkSelectionData *data;
gtk_selection_data_free (data);
gimp_set_busy (gimp);
if (pixbuf)
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
{
buffer = gimp_buffer_new_from_pixbuf (pixbuf, _("Clipboard"),
0, 0);
g_object_unref (pixbuf);
GdkPixbuf *pixbuf = gtk_selection_data_get_pixbuf (data);
gtk_selection_data_free (data);
if (pixbuf)
{
buffer = gimp_buffer_new_from_pixbuf (pixbuf, _("Clipboard"),
0, 0);
g_object_unref (pixbuf);
}
}
gimp_unset_busy (gimp);
}
gimp_unset_busy (gimp);
return buffer;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -518,38 +544,45 @@ gimp_clipboard_get_svg (Gimp *gimp,
{
GimpClipboard *gimp_clip;
GtkClipboard *clipboard;
GdkAtom atom;
gchar *svg = NULL;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (svg_length != NULL, NULL);
*svg_length = 0;
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_svg (gimp)) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GtkSelectionData *data;
GdkAtom atom = gimp_clipboard_wait_for_svg (gimp);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
if (atom != GDK_NONE)
{
const guchar *stream;
GtkSelectionData *data;
stream = gimp_selection_data_get_stream (data, svg_length);
gimp_set_busy (gimp);
if (stream)
svg = g_memdup (stream, *svg_length);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
gtk_selection_data_free (data);
if (data)
{
const guchar *stream;
stream = gimp_selection_data_get_stream (data, svg_length);
if (stream)
svg = g_memdup (stream, *svg_length);
gtk_selection_data_free (data);
}
gimp_unset_busy (gimp);
}
gimp_unset_busy (gimp);
return svg;
}
gimp_clip = gimp_clipboard_get (gimp);
@ -580,7 +613,6 @@ gimp_clipboard_get_curve (Gimp *gimp)
{
GimpClipboard *gimp_clip;
GtkClipboard *clipboard;
GdkAtom atom;
GimpCurve *curve = NULL;
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
@ -588,24 +620,30 @@ gimp_clipboard_get_curve (Gimp *gimp)
clipboard = gtk_clipboard_get_for_display (gdk_display_get_default (),
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_curve (gimp)) != GDK_NONE)
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GtkSelectionData *data;
GdkAtom atom = gimp_clipboard_wait_for_curve (gimp);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
if (atom != GDK_NONE)
{
curve = gimp_selection_data_get_curve (data);
GtkSelectionData *data;
gtk_selection_data_free (data);
gimp_set_busy (gimp);
data = gtk_clipboard_wait_for_contents (clipboard, atom);
if (data)
{
curve = gimp_selection_data_get_curve (data);
gtk_selection_data_free (data);
}
gimp_unset_busy (gimp);
}
gimp_unset_busy (gimp);
return curve;
}
gimp_clip = gimp_clipboard_get (gimp);