From 62490e9ea7b3675a8d703433b7f0f480476d5d27 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 20 Jul 2012 11:55:00 +0000 Subject: [PATCH] Use text/uri-list instead of x-moz-url in wxGTK wxURLDataObject. The standard exchange format for URLs is text/uri-list and not the deprecated and Firefox-specific x-moz-url, support for which was moreover implemented incorrectly anyhow. Also add an example of copying URLs to the dnd sample. See https://developer.mozilla.org/En/DragDrop/Recommended_Drag_Types for more information. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72159 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + samples/dnd/dnd.cpp | 25 +++++++++++++++++++++++++ src/gtk/dataobj.cpp | 27 ++++----------------------- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 003df61d6d..9fda726f5e 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -535,6 +535,7 @@ All (GUI): wxGTK: - Allow building wxGTK3 with Broadway backend (Kolya Kosenko). +- Improve drag-and-drop of URLs. wxMSW: diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 62b65b9d9e..9066221812 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -227,6 +227,7 @@ public: #endif // wxUSE_METAFILE void OnCopyFiles(wxCommandEvent& event); + void OnCopyURL(wxCommandEvent& event); void OnUsePrimary(wxCommandEvent& event); @@ -816,6 +817,7 @@ enum Menu_PasteBitmap, Menu_PasteMFile, Menu_CopyFiles, + Menu_CopyURL, Menu_UsePrimary, Menu_Shape_New = 500, Menu_Shape_Edit, @@ -844,6 +846,7 @@ BEGIN_EVENT_TABLE(DnDFrame, wxFrame) EVT_MENU(Menu_PasteMFile, DnDFrame::OnPasteMetafile) #endif // wxUSE_METAFILE EVT_MENU(Menu_CopyFiles, DnDFrame::OnCopyFiles) + EVT_MENU(Menu_CopyURL, DnDFrame::OnCopyURL) EVT_MENU(Menu_UsePrimary, DnDFrame::OnUsePrimary) EVT_UPDATE_UI(Menu_DragMoveDef, DnDFrame::OnUpdateUIMoveByDefault) @@ -974,6 +977,7 @@ DnDFrame::DnDFrame() #endif // wxUSE_METAFILE clip_menu->AppendSeparator(); clip_menu->Append(Menu_CopyFiles, wxT("Copy &files\tCtrl-F")); + clip_menu->Append(Menu_CopyURL, wxT("Copy &URL\tCtrl-U")); clip_menu->AppendSeparator(); clip_menu->AppendCheckItem(Menu_UsePrimary, wxT("Use &primary selection\tCtrl-P")); @@ -1485,6 +1489,27 @@ void DnDFrame::OnCopyFiles(wxCommandEvent& WXUNUSED(event)) #endif // MSW/!MSW } +void DnDFrame::OnCopyURL(wxCommandEvent& WXUNUSED(event)) +{ + // Just hard code it for now, we could ask the user but the point here is + // to test copying URLs, it doesn't really matter what it is. + const wxString url("http://www.wxwidgets.org/"); + + wxClipboardLocker locker; + if ( !!locker && wxTheClipboard->AddData(new wxURLDataObject(url)) ) + { + wxLogStatus(this, "Copied URL \"%s\" to %s.", + url, + GetMenuBar()->IsChecked(Menu_UsePrimary) + ? "primary selection" + : "clipboard"); + } + else + { + wxLogError("Failed to copy URL."); + } +} + // --------------------------------------------------------------------------- // text clipboard // --------------------------------------------------------------------------- diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index c742b77f15..55c81cfc77 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -421,45 +421,26 @@ void wxBitmapDataObject::DoConvertToPng() // ---------------------------------------------------------------------------- wxURLDataObject::wxURLDataObject(const wxString& url) : - wxDataObjectSimple( wxDataFormat( gdk_atom_intern("text/x-moz-url",FALSE) ) ) + wxDataObjectSimple( wxDataFormat( g_fileAtom ) ) { m_url = url; } size_t wxURLDataObject::GetDataSize() const { - if (m_url.empty()) - return 0; - - return 2*m_url.Len()+2; + return strlen(m_url.utf8_str()) + 1; } 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() ); + strcpy(static_cast(buf), m_url.utf8_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 ); + m_url = wxString::FromUTF8(static_cast(buf), len); return true; } -- 2.47.2