summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java18
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java17
2 files changed, 31 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java
index 6e122cc0ed..69e121b97b 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java
@@ -37,6 +37,7 @@ class ClipboardProxy {
Callback clearFunc;
static String ID = "CLIPBOARD PROXY OBJECT"; //$NON-NLS-1$
+ static int /*long*/ clipboardOwner = OS.gtk_window_new(0);
static ClipboardProxy _getInstance(final Display display) {
ClipboardProxy proxy = (ClipboardProxy) display.getData(ID);
@@ -98,6 +99,7 @@ void dispose () {
clipboardDataTypes = null;
primaryClipboardData = null;
primaryClipboardDataTypes = null;
+ clipboardOwner = 0;
}
/**
@@ -158,23 +160,31 @@ boolean setData(Clipboard owner, Object[] data, Transfer[] dataTypes, int clipbo
offset += GtkTargetEntry.sizeof;
}
if ((clipboards & DND.CLIPBOARD) != 0) {
- if (activeClipboard != null) OS.gtk_clipboard_clear(Clipboard.GTKCLIPBOARD);
clipboardData = data;
clipboardDataTypes = dataTypes;
int /*long*/ getFuncProc = getFunc.getAddress();
int /*long*/ clearFuncProc = clearFunc.getAddress();
- if (!OS.gtk_clipboard_set_with_data(Clipboard.GTKCLIPBOARD, pTargetsList, entries.length, getFuncProc, clearFuncProc, 0)) {
+ /*
+ * Feature in GTK. When the contents are set again, clipboard_set_with_data()
+ * invokes clearFunc and then, getFunc is not sequentially called.
+ * If we clear the content before calling set_with_data(), then there is a fair
+ * chance for other apps like Klipper to claim the ownership of the clipboard.
+ * The fix is to make sure that the content is not cleared before the data is
+ * set again. GTK does not invoke clearFunc for clipboard_set_with_owner()
+ * though we set the data again. So, this API has to be used whenever we
+ * are setting the contents.
+ */
+ if (!OS.gtk_clipboard_set_with_owner (Clipboard.GTKCLIPBOARD, pTargetsList, entries.length, getFuncProc, clearFuncProc, clipboardOwner)) {
return false;
}
activeClipboard = owner;
}
if ((clipboards & DND.SELECTION_CLIPBOARD) != 0) {
- if (activePrimaryClipboard != null) OS.gtk_clipboard_clear(Clipboard.GTKPRIMARYCLIPBOARD);
primaryClipboardData = data;
primaryClipboardDataTypes = dataTypes;
int /*long*/ getFuncProc = getFunc.getAddress();
int /*long*/ clearFuncProc = clearFunc.getAddress();
- if (!OS.gtk_clipboard_set_with_data(Clipboard.GTKPRIMARYCLIPBOARD, pTargetsList, entries.length, getFuncProc, clearFuncProc, 0)) {
+ if (!OS.gtk_clipboard_set_with_owner (Clipboard.GTKPRIMARYCLIPBOARD, pTargetsList, entries.length, getFuncProc, clearFuncProc, clipboardOwner)) {
return false;
}
activePrimaryClipboard = owner;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
index 65890e7565..b0ba038fb4 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
@@ -5833,6 +5833,23 @@ public static final boolean gtk_clipboard_set_with_data(int /*long*/ clipboard,
}
/**
* @param clipboard cast=(GtkClipboard *)
+ * @param target cast=(const GtkTargetEntry *)
+ * @param n_targets cast=(guint)
+ * @param get_func cast=(GtkClipboardGetFunc)
+ * @param clear_func cast=(GtkClipboardClearFunc)
+ * @param user_data cast=(GObject *)
+ */
+public static final native boolean _gtk_clipboard_set_with_owner(int /*long*/ clipboard, int /*long*/ target, int n_targets, int /*long*/ get_func, int /*long*/ clear_func, int /*long*/ user_data);
+public static final boolean gtk_clipboard_set_with_owner(int /*long*/ clipboard, int /*long*/ target, int n_targets, int /*long*/ get_func, int /*long*/ clear_func, int /*long*/ user_data) {
+ lock.lock();
+ try {
+ return _gtk_clipboard_set_with_owner(clipboard, target, n_targets, get_func, clear_func, user_data);
+ } finally {
+ lock.unlock();
+ }
+}
+/**
+ * @param clipboard cast=(GtkClipboard *)
* @param target cast=(GdkAtom)
*/
public static final native int /*long*/ _gtk_clipboard_wait_for_contents(int /*long*/ clipboard, int /*long*/ target);