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

@ -245,12 +245,16 @@ gimp_clipboard_has_image (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_image (gimp) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
if (gimp_clipboard_wait_for_image (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
return (gimp_clip->image != NULL);
@ -280,12 +284,16 @@ gimp_clipboard_has_buffer (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_buffer (gimp) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
if (gimp_clipboard_wait_for_buffer (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
return (gimp_clip->buffer != NULL);
@ -313,12 +321,16 @@ gimp_clipboard_has_svg (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_svg (gimp) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
if (gimp_clipboard_wait_for_svg (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
return (gimp_clip->svg != NULL);
@ -346,12 +358,16 @@ gimp_clipboard_has_curve (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
gimp_clipboard_wait_for_curve (gimp) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
if (gimp_clipboard_wait_for_curve (gimp) != GDK_NONE)
{
return TRUE;
}
return FALSE;
}
gimp_clip = gimp_clipboard_get (gimp);
return (gimp_clip->curve != NULL);
@ -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);
@ -411,8 +426,11 @@ gimp_clipboard_get_image (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_image (gimp)) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GdkAtom atom = gimp_clipboard_wait_for_image (gimp);
if (atom != GDK_NONE)
{
GtkSelectionData *data;
@ -430,6 +448,9 @@ gimp_clipboard_get_image (Gimp *gimp)
gimp_unset_busy (gimp);
}
return image;
}
gimp_clip = gimp_clipboard_get (gimp);
if (! image && gimp_clip->image)
@ -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);
@ -465,8 +485,11 @@ gimp_clipboard_get_buffer (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_buffer (gimp)) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GdkAtom atom = gimp_clipboard_wait_for_buffer (gimp);
if (atom != GDK_NONE)
{
GtkSelectionData *data;
@ -491,6 +514,9 @@ gimp_clipboard_get_buffer (Gimp *gimp)
gimp_unset_busy (gimp);
}
return buffer;
}
gimp_clip = gimp_clipboard_get (gimp);
if (! buffer && gimp_clip->buffer)
@ -518,18 +544,22 @@ 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)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GdkAtom atom = gimp_clipboard_wait_for_svg (gimp);
if (atom != GDK_NONE)
{
GtkSelectionData *data;
@ -552,6 +582,9 @@ gimp_clipboard_get_svg (Gimp *gimp,
gimp_unset_busy (gimp);
}
return svg;
}
gimp_clip = gimp_clipboard_get (gimp);
if (! svg && gimp_clip->svg)
@ -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);
@ -589,8 +621,11 @@ gimp_clipboard_get_curve (Gimp *gimp)
GDK_SELECTION_CLIPBOARD);
if (clipboard &&
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp) &&
(atom = gimp_clipboard_wait_for_curve (gimp)) != GDK_NONE)
gtk_clipboard_get_owner (clipboard) != G_OBJECT (gimp))
{
GdkAtom atom = gimp_clipboard_wait_for_curve (gimp);
if (atom != GDK_NONE)
{
GtkSelectionData *data;
@ -608,6 +643,9 @@ gimp_clipboard_get_curve (Gimp *gimp)
gimp_unset_busy (gimp);
}
return curve;
}
gimp_clip = gimp_clipboard_get (gimp);
if (! curve && gimp_clip->curve)