
		public static Hashtable clipboard_objects = new Hashtable ();
		private static uint clipboard_object_next_id = 0;

		[DllImport("libgtk-win32-2.0-0.dll")]
		static extern bool gtk_clipboard_set_with_data(IntPtr raw, IntPtr targets, int n_targets, GtkSharp.GtkClipboardGetFuncNative get_func, GtkSharp.GtkClipboardClearFuncNative clear_func, uint id);

		[DllImport("gtksharpglue")]
		static extern IntPtr gtksharp_clipboard_target_list_add (IntPtr list, string name, uint flags, uint info);

		[DllImport("gtksharpglue")]
		static extern IntPtr gtksharp_clipboard_target_list_to_array (IntPtr list);

		[DllImport("gtksharpglue")]
		static extern void gtksharp_clipboard_target_array_free (IntPtr targets);

		[DllImport("gtksharpglue")]
		static extern void gtksharp_clipboard_target_list_free (IntPtr list);

		GtkSharp.GtkClipboardGetFuncWrapper get_func_wrapper;
		GtkSharp.GtkClipboardClearFuncWrapper clear_func_wrapper;

		public bool Set (Gtk.TargetEntry[] targets,
				 Gtk.ClipboardGetFunc get_func,
				 Gtk.ClipboardClearFunc clear_func,
				 object data)
		{
			uint this_id;

			lock (clipboard_objects) {
				this_id = clipboard_object_next_id++;
				clipboard_objects[this_id] = data;
			}

			get_func_wrapper = new GtkSharp.GtkClipboardGetFuncWrapper (get_func);
			clear_func_wrapper = new GtkSharp.GtkClipboardClearFuncWrapper (clear_func);

			IntPtr list = IntPtr.Zero;

			foreach (Gtk.TargetEntry t in targets) {
				list = gtksharp_clipboard_target_list_add (list, t.target, t.flags, t.info);
			}

			IntPtr array = gtksharp_clipboard_target_list_to_array (list);

			bool ret = gtk_clipboard_set_with_data (Handle, array, targets.Length, get_func_wrapper.NativeDelegate, clear_func_wrapper.NativeDelegate, this_id);

			gtksharp_clipboard_target_array_free (array);
			gtksharp_clipboard_target_list_free (list);

			return ret;
		}

