X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5efeac9fd2944c53fdff10ce3c2bb316346ab371..ea412ac4eb9f19e3c28dfa32aa9099a81ac7c74c:/src/gtk/clipbrd.cpp diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 96d6da0c0f..56fa9e1eb8 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -32,6 +32,7 @@ #include "wx/scopedarray.h" #include "wx/scopeguard.h" +#include "wx/evtloop.h" #include "wx/gtk/private.h" @@ -52,7 +53,7 @@ extern GdkAtom g_altTextAtom; // the trace mask we use with wxLogTrace() - call // wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here // (there will be a *lot* of them!) -#define TRACE_CLIPBOARD _T("clipboard") +#define TRACE_CLIPBOARD wxT("clipboard") // ---------------------------------------------------------------------------- // wxClipboardSync: used to perform clipboard operations synchronously @@ -68,14 +69,18 @@ class wxClipboardSync public: wxClipboardSync(wxClipboard& clipboard) { - wxASSERT_MSG( !ms_clipboard, _T("reentrancy in clipboard code") ); + wxASSERT_MSG( !ms_clipboard, wxT("reentrancy in clipboard code") ); ms_clipboard = &clipboard; } ~wxClipboardSync() { + // ensure that there is a running event loop: this might not be the + // case if we're called before the main event loop startup + wxEventLoopGuarantor ensureEventLoop; + while (ms_clipboard) - wxTheApp->YieldFor(wxEVT_CATEGORY_CLIPBOARD); + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_CLIPBOARD); } // this method must be called by GTK+ callbacks to indicate that we got the @@ -83,7 +88,7 @@ public: static void OnDone(wxClipboard * WXUNUSED_UNLESS_DEBUG(clipboard)) { wxASSERT_MSG( clipboard == ms_clipboard, - _T("got notification for alien clipboard") ); + wxT("got notification for alien clipboard") ); ms_clipboard = NULL; } @@ -102,7 +107,7 @@ public: private: static wxClipboard *ms_clipboard; - DECLARE_NO_COPY_CLASS(wxClipboardSync) + wxDECLARE_NO_COPY_CLASS(wxClipboardSync); }; wxClipboard *wxClipboardSync::ms_clipboard = NULL; @@ -137,20 +142,18 @@ targets_selection_received( GtkWidget *WXUNUSED(widget), if ( strcmp(wxGtkString(gdk_atom_name(type)), "TARGETS") != 0 ) { wxLogTrace( TRACE_CLIPBOARD, - _T("got unsupported clipboard target") ); + wxT("got unsupported clipboard target") ); return; } } -#ifdef __WXDEBUG__ // it's not really a format, of course, but we can reuse its GetId() method // to format this atom as string wxDataFormat clip(selection_data->selection); wxLogTrace( TRACE_CLIPBOARD, wxT("Received available formats for clipboard %s"), clip.GetId().c_str() ); -#endif // __WXDEBUG__ // the atoms we received, holding a list of targets (= formats) const GdkAtom * const atoms = (GdkAtom *)selection_data->data; @@ -275,23 +278,21 @@ selection_handler( GtkWidget *WXUNUSED(widget), (guchar*)&(timestamp), sizeof(timestamp)); wxLogTrace(TRACE_CLIPBOARD, - _T("Clipboard TIMESTAMP requested, returning timestamp=%u"), + wxT("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"), + 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(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 // __WXDEBUG__ if ( !data->IsSupportedFormat( format ) ) return; @@ -331,10 +332,10 @@ selection_handler( GtkWidget *WXUNUSED(widget), void wxClipboard::GTKOnSelectionReceived(const GtkSelectionData& sel) { - wxCHECK_RET( m_receivedData, _T("should be inside GetData()") ); + wxCHECK_RET( m_receivedData, wxT("should be inside GetData()") ); const wxDataFormat format(sel.target); - wxLogTrace(TRACE_CLIPBOARD, _T("Received selection %s"), + wxLogTrace(TRACE_CLIPBOARD, wxT("Received selection %s"), format.GetId().c_str()); if ( !m_receivedData->IsSupportedFormat(format) ) @@ -378,7 +379,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), if ( strcmp(wxGtkString(gdk_atom_name(type)), "TARGETS") != 0 ) { wxLogTrace( TRACE_CLIPBOARD, - _T("got unsupported clipboard target") ); + wxT("got unsupported clipboard target") ); clipboard->m_sink->QueueEvent( event ); clipboard->m_sink.Release(); @@ -386,14 +387,12 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), } } -#ifdef __WXDEBUG__ // it's not really a format, of course, but we can reuse its GetId() method // to format this atom as string wxDataFormat clip(selection_data->selection); wxLogTrace( TRACE_CLIPBOARD, wxT("Received available formats for clipboard %s"), clip.GetId().c_str() ); -#endif // __WXDEBUG__ // the atoms we received, holding a list of targets (= formats) const GdkAtom * const atoms = (GdkAtom *)selection_data->data; @@ -504,8 +503,8 @@ bool wxClipboard::SetSelectionOwner(bool set) if ( !rc ) { - wxLogTrace(TRACE_CLIPBOARD, _T("Failed to %sset selection owner"), - set ? _T("") : _T("un")); + wxLogTrace(TRACE_CLIPBOARD, wxT("Failed to %sset selection owner"), + set ? wxT("") : wxT("un")); } return rc; @@ -569,6 +568,8 @@ bool wxClipboard::DoIsSupported(const wxDataFormat& format) void wxClipboard::Clear() { + gtk_selection_clear_targets( m_clipboardWidget, GTKGetClipboardAtom() ); + if ( gdk_selection_owner_get(GTKGetClipboardAtom()) == m_clipboardWidget->window ) { @@ -673,10 +674,11 @@ bool wxClipboard::GetData( wxDataObject& data ) { wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); - // get all supported formats from wxDataObjects - const size_t count = data.GetFormatCount(); + // get all supported formats from wxDataObjects: notice that we are setting + // the object data, so we need them in "Set" direction + const size_t count = data.GetFormatCount(wxDataObject::Set); wxDataFormatArray formats(new wxDataFormat[count]); - data.GetAllFormats(formats.get()); + data.GetAllFormats(formats.get(), wxDataObject::Set); for ( size_t i = 0; i < count; i++ ) {