- wxCHECK_MSG( m_open, FALSE, "clipboard not open" );
-
- wxCHECK_MSG( data, FALSE, "data is invalid" );
-
- /* if clipboard has been cleared before, create new data broker */
-
- if (!m_dataBroker) m_dataBroker = new wxDataBroker();
-
- /* add new data to list of offered data objects */
-
- m_dataBroker->Add( data );
-
- /* get native format id of new data object */
-
- GdkAtom format = data->GetFormat().GetAtom();
-
- wxCHECK_MSG( format, FALSE, "data has invalid format" );
-
- /* This should happen automatically, but to be on the safe side */
-
- m_ownsClipboard = FALSE;
- m_ownsPrimarySelection = FALSE;
-
- /* Add handlers if someone requests data */
-
-
-#if (GTK_MINOR_VERSION > 0)
-
- gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget),
- GDK_SELECTION_PRIMARY,
- format,
- 0 ); /* what is info ? */
-
- gtk_selection_add_target( GTK_WIDGET(m_clipboardWidget),
- g_clipboardAtom,
- format,
- 0 ); /* what is info ? */
-
- gtk_signal_connect( GTK_OBJECT(m_clipboardWidget),
- "selection_get",
- GTK_SIGNAL_FUNC(selection_handler),
- (gpointer) NULL );
-
-#else
-
- gtk_selection_add_handler( m_clipboardWidget,
- g_clipboardAtom,
- format,
- selection_handler,
- (gpointer) NULL );
-
- gtk_selection_add_handler( m_clipboardWidget,
- GDK_SELECTION_PRIMARY,
- format,
- selection_handler,
- (gpointer) NULL );
-#endif
-
- /* Tell the world we offer clipboard data */
-
- if (!gtk_selection_owner_set( m_clipboardWidget,
- g_clipboardAtom,
- GDK_CURRENT_TIME ))
+ wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
+
+ wxCHECK_MSG( data, false, wxT("data is invalid") );
+
+ // we can only store one wxDataObject so clear the old one
+ Clear();
+
+ Data() = data;
+
+ // get formats from wxDataObjects
+ const size_t count = data->GetFormatCount();
+ wxDataFormatArray formats(new wxDataFormat[count]);
+ data->GetAllFormats(formats.get());
+
+ // always provide TIMESTAMP as a target, see comments in selection_handler
+ // for explanation
+ AddSupportedTarget(g_timestampAtom);
+
+ for ( size_t i = 0; i < count; i++ )