static void targets_selection_received( GtkWidget *WXUNUSED(widget), GtkSelectionData *selection_data, guint32 WXUNUSED(time), wxClipboard *clipboard ) { if ( wxTheClipboard && selection_data->length > 0 ) { // make sure we got the data in the correct form GdkAtom type = selection_data->type; if ( type != GDK_SELECTION_TYPE_ATOM ) { if ( strcmp(wxGtkString(gdk_atom_name(type)), "TARGETS") ) { wxLogTrace( TRACE_CLIPBOARD, _T("got unsupported clipboard target") ); clipboard->m_waiting = false; return; } } #ifdef __WXDEBUG__ wxDataFormat clip( selection_data->selection ); wxLogTrace( TRACE_CLIPBOARD, wxT("selection received for targets, clipboard %s"), clip.GetId().c_str() ); #endif // __WXDEBUG__ // the atoms we received, holding a list of targets (= formats) GdkAtom *atoms = (GdkAtom *)selection_data->data; for (unsigned int i=0; i<selection_data->length/sizeof(GdkAtom); i++) { wxDataFormat format( atoms[i] ); wxLogTrace( TRACE_CLIPBOARD, wxT("selection received for targets, format %s"), format.GetId().c_str() ); // printf( "format %s requested %s\n", // gdk_atom_name( atoms[i] ), // gdk_atom_name( clipboard->m_targetRequested ) ); if (format == clipboard->m_targetRequested) { clipboard->m_waiting = false; clipboard->m_formatSupported = true; return; } } } clipboard->m_waiting = false; }
static void targets_selection_received( GtkWidget *WXUNUSED(widget), GtkSelectionData *selection_data, guint32 WXUNUSED(time), wxClipboard *clipboard ) { if ( !clipboard ) return; wxON_BLOCK_EXIT1(wxClipboardSync::OnDone, clipboard); if (!selection_data) return; const int selection_data_length = gtk_selection_data_get_length(selection_data); if (selection_data_length <= 0) 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") ); 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()); if ( clipboard->GTKOnTargetReceived(format) ) return; } }
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(); }
static void selection_handler( GtkWidget *WXUNUSED(widget), GtkSelectionData *selection_data, guint WXUNUSED(info), guint WXUNUSED(time), gpointer signal_data ) { wxClipboard * const clipboard = wxTheClipboard; if ( !clipboard ) return; wxDataObject * const data = clipboard->GTKGetDataObject( gtk_selection_data_get_selection(selection_data)); if ( !data ) return; // ICCCM says that TIMESTAMP is a required atom. // In particular, it satisfies Klipper, which polls // TIMESTAMP to see if the clipboards content has changed. // It shall return the time which was used to set the data. if (gtk_selection_data_get_target(selection_data) == g_timestampAtom) { guint timestamp = GPOINTER_TO_UINT (signal_data); gtk_selection_data_set(selection_data, GDK_SELECTION_TYPE_INTEGER, 32, (guchar*)&(timestamp), sizeof(timestamp)); wxLogTrace(TRACE_CLIPBOARD, wxT("Clipboard TIMESTAMP requested, returning timestamp=%u"), timestamp); return; } wxDataFormat format(gtk_selection_data_get_target(selection_data)); wxLogTrace(TRACE_CLIPBOARD, wxT("clipboard data in format %s, GtkSelectionData is target=%s type=%s selection=%s timestamp=%u"), format.GetId().c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(gtk_selection_data_get_target(selection_data)))).c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(gtk_selection_data_get_data_type(selection_data)))).c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(gtk_selection_data_get_selection(selection_data)))).c_str(), GPOINTER_TO_UINT( signal_data ) ); if ( !data->IsSupportedFormat( format ) ) return; int size = data->GetDataSize( format ); if ( !size ) return; wxCharBuffer buf(size - 1); // it adds 1 internally (for NUL) // text data must be returned in UTF8 if format is wxDF_UNICODETEXT if ( !data->GetDataHere(format, buf.data()) ) return; // use UTF8_STRING format if requested in Unicode build but just plain // STRING one in ANSI or if explicitly asked in Unicode #if wxUSE_UNICODE if (format == wxDataFormat(wxDF_UNICODETEXT)) { gtk_selection_data_set_text( selection_data, (const gchar*)buf.data(), size ); } else #endif // wxUSE_UNICODE { gtk_selection_data_set( selection_data, format.GetFormatId(), 8*sizeof(gchar), (const guchar*)buf.data(), size ); } }
static void selection_handler( GtkWidget *WXUNUSED(widget), GtkSelectionData *selection_data, guint WXUNUSED(info), guint WXUNUSED(time), gpointer signal_data ) { if (!wxTheClipboard) return; if (!wxTheClipboard->m_data) return; wxDataObject *data = wxTheClipboard->m_data; // ICCCM says that TIMESTAMP is a required atom. // In particular, it satisfies Klipper, which polls // TIMESTAMP to see if the clipboards content has changed. // It shall return the time which was used to set the data. if (selection_data->target == g_timestampAtom) { guint timestamp = GPOINTER_TO_UINT (signal_data); gtk_selection_data_set(selection_data, GDK_SELECTION_TYPE_INTEGER, 32, (guchar*)&(timestamp), sizeof(timestamp)); wxLogTrace(TRACE_CLIPBOARD, _T("Clipboard TIMESTAMP requested, returning timestamp=%u"), timestamp); return; } wxDataFormat format( selection_data->target ); #ifdef __WXDEBUG__ wxLogTrace(TRACE_CLIPBOARD, _T("clipboard data in format %s, GtkSelectionData is target=%s type=%s selection=%s timestamp=%u"), format.GetId().c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(selection_data->target))).c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(selection_data->type))).c_str(), wxString::FromAscii(wxGtkString(gdk_atom_name(selection_data->selection))).c_str(), GPOINTER_TO_UINT( signal_data ) ); #endif if (!data->IsSupportedFormat( format )) return; int size = data->GetDataSize( format ); if (size == 0) return; void *d = malloc(size); // Text data will be in UTF8 in Unicode mode. data->GetDataHere( selection_data->target, d ); // NB: GTK+ requires special treatment of UTF8_STRING data, the text // would show as UTF-8 data interpreted as latin1 (?) in other // GTK+ apps if we used gtk_selection_data_set() if (format == wxDataFormat(wxDF_UNICODETEXT)) { gtk_selection_data_set_text( selection_data, (const gchar*)d, size ); } else { gtk_selection_data_set( selection_data, GDK_SELECTION_TYPE_STRING, 8*sizeof(gchar), (unsigned char*) d, size ); } free(d); }