X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4161a2a08e622ba55f66610e26892f5fda37e6f..726cc8697cd44a41b43257f05ca8cdd42b71a711:/src/gtk/dataobj.cpp diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index fa6d1cc5db..dbe0952d50 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -81,10 +81,13 @@ void wxDataFormat::SetType( wxDataFormatId type ) m_format = g_textAtom; else if (m_type == wxDF_TEXT) m_format = g_altTextAtom; -#else - if (m_type == wxDF_TEXT || m_type == wxDF_UNICODETEXT) +#else // !wxUSE_UNICODE + // notice that we don't map wxDF_UNICODETEXT to g_textAtom here, this + // would lead the code elsewhere to treat data objects with this format as + // containing UTF-8 data which is not true + if (m_type == wxDF_TEXT) m_format = g_textAtom; -#endif +#endif // wxUSE_UNICODE/!wxUSE_UNICODE else if (m_type == wxDF_BITMAP) m_format = g_pngAtom; @@ -143,18 +146,20 @@ void wxDataFormat::PrepareFormats() { // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the // atoms STRING and file:ALL as the old code was, but normal X apps - // use STRING for text selection when transfering the data via + // use STRING for text selection when transferring the data via // clipboard, for example, so do use STRING for now (GNOME apps will // probably support STRING as well for compatibility anyhow), but use // text/uri-list for file dnd because compatibility is not important // here (with whom?) 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 + } if (!g_pngAtom) g_pngAtom = gdk_atom_intern( "image/png", FALSE ); if (!g_fileAtom) @@ -204,7 +209,8 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, Direction dir) // wxTextDataObject // ---------------------------------------------------------------------------- -#if defined(__WXGTK20__) && wxUSE_UNICODE +#if wxUSE_UNICODE + void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction WXUNUSED(dir)) const @@ -212,7 +218,8 @@ wxTextDataObject::GetAllFormats(wxDataFormat *formats, *formats++ = GetPreferredFormat(); *formats = g_altTextAtom; } -#endif + +#endif // wxUSE_UNICODE // ---------------------------------------------------------------------------- // wxFileDataObject @@ -254,7 +261,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) // (filenames prefixed by "file:") delimited by "\r\n". size includes // the trailing zero (in theory, not for Nautilus in early GNOME // versions). - + m_filenames.Empty(); const gchar *nexttemp = (const gchar*) buf; @@ -272,7 +279,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) nexttemp = temp+len; break; } - + return true; } if (temp[len] == '\r') @@ -285,17 +292,17 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) } len++; } - + if (len == 0) break; - + // required to give it a trailing zero gchar *uri = g_strndup( temp, len ); - + gchar *fn = g_filename_from_uri( uri, NULL, NULL ); - + g_free( uri ); - + if (fn) { AddFile( wxConvFileName->cMB2WX( fn ) ); @@ -400,4 +407,53 @@ void wxBitmapDataObject::DoConvertToPng() image.SaveFile(mstream, wxBITMAP_TYPE_PNG); } +// ---------------------------------------------------------------------------- +// wxURLDataObject +// ---------------------------------------------------------------------------- + +wxURLDataObject::wxURLDataObject(const wxString& url) : + wxDataObjectSimple( wxDataFormat( gdk_atom_intern("text/x-moz-url",FALSE) ) ) +{ + m_url = url; +} + +size_t wxURLDataObject::GetDataSize() const +{ + if (m_url.empty()) + return 0; + + return 2*m_url.Len()+2; +} + +bool wxURLDataObject::GetDataHere(void *buf) const +{ + if (m_url.empty()) + return false; + + wxCSConv conv( "UCS2" ); + conv.FromWChar( (char*) buf, 2*m_url.Len()+2, m_url.wc_str() ); + + return true; +} + + // copy data from buffer to our data +bool wxURLDataObject::SetData(size_t len, const void *buf) +{ + if (len == 0) + { + m_url = wxEmptyString; + return false; + } + + wxCSConv conv( "UCS2" ); + wxWCharBuffer res = conv.cMB2WC( (const char*) buf ); + m_url = res; + int pos = m_url.Find( '\n' ); + if (pos != wxNOT_FOUND) + m_url.Remove( pos, m_url.Len() - pos ); + + return true; +} + + #endif // wxUSE_DATAOBJ