X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d48b06bd9039597545de9a862501d57c5f9ec1ea..e5dcae09e6c207688b41c8b744764d32b7b39a46:/src/gtk/clipbrd.cpp?ds=sidebyside diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index a6f6718be1..7fe76b4e66 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -24,6 +24,7 @@ #include "wx/clipbrd.h" #ifndef WX_PRECOMP + #include "wx/app.h" #include "wx/log.h" #include "wx/utils.h" #include "wx/dataobj.h" @@ -31,6 +32,7 @@ #include "wx/scopedarray.h" #include "wx/scopeguard.h" +#include "wx/evtloop.h" #include "wx/gtk/private.h" @@ -51,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 @@ -67,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 @@ -82,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; } @@ -101,7 +107,7 @@ public: private: static wxClipboard *ms_clipboard; - DECLARE_NO_COPY_CLASS(wxClipboardSync) + wxDECLARE_NO_COPY_CLASS(wxClipboardSync); }; wxClipboard *wxClipboardSync::ms_clipboard = NULL; @@ -136,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; @@ -274,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; @@ -330,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) ) @@ -377,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(); @@ -385,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; @@ -485,11 +485,7 @@ GdkAtom wxClipboard::GTKGetClipboardAtom() const void wxClipboard::GTKClearData(Kind kind) { wxDataObject *&data = Data(kind); - if ( data ) - { - delete data; - data = NULL; - } + wxDELETE(data); } bool wxClipboard::SetSelectionOwner(bool set) @@ -503,8 +499,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; @@ -568,6 +564,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 ) { @@ -672,10 +670,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++ ) {