diff options
author | Praveen Innamuri <pinnamuri> | 2010-01-11 19:58:29 +0000 |
---|---|---|
committer | Praveen Innamuri <pinnamuri> | 2010-01-11 19:58:29 +0000 |
commit | 4d31b031f22f671d3489ec4b4439aa6b6fd64fd2 (patch) | |
tree | 28b8a32d96d7cbfaf7b7617756007d3a1e9fc2a5 | |
parent | 0e7c8114dcba88700a100accc611254714e88137 (diff) | |
download | eclipse.platform.swt-4d31b031f22f671d3489ec4b4439aa6b6fd64fd2.tar.gz eclipse.platform.swt-4d31b031f22f671d3489ec4b4439aa6b6fd64fd2.tar.xz eclipse.platform.swt-4d31b031f22f671d3489ec4b4439aa6b6fd64fd2.zip |
153809 - [Clipboard] Copy / Cut on Linux is very flakey with 3.2
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/ClipboardProxy.java | 18 | ||||
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java | 17 |
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); |