ユーザーがあるデータのコピーを要求したときに、コードがすべきなのはClipboardにどのターゲットが利用可能になるかを伝え、それからそのデータを取得するのに使われるコールバックメソッドを提供することです。この時点ではデータのコピーを保持しておき、クリップボードがペーストの要求に答えてコールバックメソッドを呼んだ時にそれを提供できるようにしておくべきでしょう。
このように:
Glib::RefPtr<Gtk::Clipboard> refClipboard = Gtk::Clipboard::get();
//Targets:
std::list<Gtk::TargetEntry> listTargets;
listTargets.push_back( Gtk::TargetEntry("example_custom_target") );
listTargets.push_back( Gtk::TargetEntry("UTF8_STRING") );
refClipboard->set( listTargets,
sigc::mem_fun(*this, &ExampleWindow::on_clipboard_get),
sigc::mem_fun(*this, &ExampleWindow::on_clipboard_clear) );
ユーザーがペーストを選んだとき、このコールバックは保持されたデータを提供します。例えば:
void ExampleWindow::on_clipboard_get(Gtk::SelectionData& selection_data, guint info)
{
const Glib::ustring target = selection_data.get_target();
if(target == "example_custom_target")
selection_data.set("example_custom_target", m_ClipboardStore);
}
章末の理想的(Ideal)な例では、ひとつ以上のクリップボードターゲットを提供しています。
明確にコールバックをすることで保持したデータのメモリを解放することができます。これはクリップボードのデータが別のものと置き換わったときに行われます。