X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fb35ade9b6e001eba8c70500d1cdbb8de0ebc20..2091f5e71a1d04cf9277565121725f764d466a06:/src/gtk/dataobj.cpp diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index ca8fb4dbd6..e99e21ba01 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -7,16 +7,19 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation "dataobj.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/dataobj.h" + +#if wxUSE_DATAOBJ + #include "wx/app.h" #include "wx/debug.h" #include "wx/mstream.h" #include "wx/image.h" #include "wx/log.h" +#include "wx/uri.h" #include @@ -25,6 +28,7 @@ //------------------------------------------------------------------------- GdkAtom g_textAtom = 0; +GdkAtom g_altTextAtom = 0; GdkAtom g_pngAtom = 0; GdkAtom g_fileAtom = 0; @@ -74,13 +78,17 @@ void wxDataFormat::SetType( wxDataFormatId type ) { PrepareFormats(); - if (type == wxDF_UNICODETEXT) - type = wxDF_TEXT; - m_type = type; - if (m_type == wxDF_TEXT) +#if wxUSE_UNICODE + if (m_type == wxDF_UNICODETEXT) + m_format = g_textAtom; + else if (m_type == wxDF_TEXT) + m_format = g_altTextAtom; +#else + if (m_type == wxDF_TEXT || m_type == wxDF_UNICODETEXT) m_format = g_textAtom; +#endif else if (m_type == wxDF_BITMAP) m_format = g_pngAtom; @@ -110,6 +118,13 @@ void wxDataFormat::SetId( NativeFormat format ) m_format = format; if (m_format == g_textAtom) +#if wxUSE_UNICODE + m_type = wxDF_UNICODETEXT; +#else + m_type = wxDF_TEXT; +#endif + else + if (m_format == g_altTextAtom) m_type = wxDF_TEXT; else if (m_format == g_pngAtom) @@ -141,6 +156,7 @@ void wxDataFormat::PrepareFormats() if (!g_textAtom) #if wxUSE_UNICODE g_textAtom = gdk_atom_intern( "UTF8_STRING", FALSE ); + g_altTextAtom = gdk_atom_intern( "STRING", FALSE ); #else g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE ); #endif @@ -158,6 +174,11 @@ wxDataObject::wxDataObject() { } +wxDataObject::~wxDataObject() +{ + // dtor is empty but needed for Darwin and AIX -- otherwise it doesn't link +} + bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, Direction dir) const { size_t nFormatCount = GetFormatCount(dir); @@ -184,6 +205,18 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, Direction dir) } } +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && wxUSE_UNICODE +void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir) const +{ + *formats++ = GetPreferredFormat(); + *formats = g_altTextAtom; +} +#endif + // ---------------------------------------------------------------------------- // wxFileDataObject // ---------------------------------------------------------------------------- @@ -194,8 +227,9 @@ bool wxFileDataObject::GetDataHere(void *buf) const for (size_t i = 0; i < m_filenames.GetCount(); i++) { + filenames += wxT("file:"); filenames += m_filenames[i]; - filenames += (wxChar) 0; + filenames += wxT("\r\n"); } memcpy( buf, filenames.mbc_str(), filenames.Len() + 1 ); @@ -209,8 +243,9 @@ size_t wxFileDataObject::GetDataSize() const for (size_t i = 0; i < m_filenames.GetCount(); i++) { + // This is junk in UTF-8 res += m_filenames[i].Len(); - res += 1; + res += 5 + 2; // "file:" (5) + "\r\n" (2) } return res + 1; @@ -218,28 +253,10 @@ size_t wxFileDataObject::GetDataSize() const bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) { - // VZ: old format -#if 0 - // filenames are stores as a string with #0 as deliminators - const char *filenames = (const char*) buf; - size_t pos = 0; - for(;;) - { - if (filenames[0] == 0) - break; - if (pos >= size) - break; - wxString file( filenames ); // this returns the first file - AddFile( file ); - pos += file.Len()+1; - filenames += file.Len()+1; - } -#else // 1 m_filenames.Empty(); - // the text/uri-list format is a sequence of URIs (filenames prefixed by - // "file:" as far as I see) delimited by "\r\n" of total length size - // (I wonder what happens if the file has '\n' in its filename??) + // we get data in the text/uri-list format, i.e. as a sequence of URIs + // (filenames prefixed by "file:") delimited by "\r\n" wxString filename; for ( const char *p = (const char *)buf; ; p++ ) { @@ -260,7 +277,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) lenPrefix += 2; } - AddFile(filename.c_str() + lenPrefix); + AddFile(wxURI::Unescape(filename.c_str() + lenPrefix)); filename.Empty(); } else @@ -280,7 +297,6 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) filename += *p; } } -#endif // 0/1 return TRUE; } @@ -379,4 +395,4 @@ void wxBitmapDataObject::DoConvertToPng() image.SaveFile(mstream, wxBITMAP_TYPE_PNG); } - +#endif // wxUSE_DATAOBJ