+extern "C" {
+static void
+async_targets_selection_received( GtkWidget *WXUNUSED(widget),
+ GtkSelectionData *selection_data,
+ guint32 WXUNUSED(time),
+ wxClipboard *clipboard )
+{
+ if ( !clipboard ) // Assert?
+ return;
+
+ if (!clipboard->m_sink)
+ return;
+
+ wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED);
+ event->SetEventObject( clipboard );
+
+ int selection_data_length = 0;
+ if (selection_data)
+ selection_data_length = gtk_selection_data_get_length(selection_data);
+
+ if (selection_data_length <= 0)
+ {
+ clipboard->m_sink->QueueEvent( event );
+ clipboard->m_sink.Release();
+ return;
+ }
+
+ // make sure we got the data in the correct form
+ GdkAtom type = gtk_selection_data_get_data_type(selection_data);
+ if ( type != GDK_SELECTION_TYPE_ATOM )
+ {
+ if ( strcmp(wxGtkString(gdk_atom_name(type)), "TARGETS") != 0 )
+ {
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("got unsupported clipboard target") );
+
+ clipboard->m_sink->QueueEvent( event );
+ clipboard->m_sink.Release();
+ return;
+ }
+ }
+
+ // it's not really a format, of course, but we can reuse its GetId() method
+ // to format this atom as string
+ wxDataFormat clip(gtk_selection_data_get_selection(selection_data));
+ wxLogTrace( TRACE_CLIPBOARD,
+ wxT("Received available formats for clipboard %s"),
+ clip.GetId().c_str() );
+
+ // the atoms we received, holding a list of targets (= formats)
+ const GdkAtom* const atoms = (GdkAtom*)gtk_selection_data_get_data(selection_data);
+ for (size_t i = 0; i < selection_data_length / sizeof(GdkAtom); i++)
+ {
+ const wxDataFormat format(atoms[i]);
+
+ wxLogTrace(TRACE_CLIPBOARD, wxT("\t%s"), format.GetId().c_str());
+
+ event->AddFormat( format );
+ }
+
+ clipboard->m_sink->QueueEvent( event );
+ clipboard->m_sink.Release();
+}
+}
+
+// ============================================================================
+// wxClipboard implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxClipboard ctor/dtor
+// ----------------------------------------------------------------------------
+