From 311c1be9edd5e8a0f6d3e2ac4d42ca8d96d9c855 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 23 Dec 2008 12:05:06 +0000 Subject: [PATCH] Added pseudo-asynchronous clipboard implemenation to all ports excepts for GTK+ git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57510 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/clipbrd.h | 3 +++ samples/clipboard/clipboard.cpp | 21 ++++++++++++++++++++- src/common/clipcmn.cpp | 23 +++++++++++++++++++++++ src/gtk/clipbrd.cpp | 1 + 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/include/wx/clipbrd.h b/include/wx/clipbrd.h index e3c9c41..d3c90df 100644 --- a/include/wx/clipbrd.h +++ b/include/wx/clipbrd.h @@ -60,6 +60,9 @@ public: // ask if data in correct format is available virtual bool IsSupported( const wxDataFormat& format ) = 0; + // ask if data in correct format is available + virtual bool IsSupportedAsync( wxEvtHandler *sink ); + // fill data with data on the clipboard (if available) virtual bool GetData( wxDataObject& data ) = 0; diff --git a/samples/clipboard/clipboard.cpp b/samples/clipboard/clipboard.cpp index 3a39b22..6a20dea 100644 --- a/samples/clipboard/clipboard.cpp +++ b/samples/clipboard/clipboard.cpp @@ -26,18 +26,23 @@ #include "../sample.xpm" #endif + +#define USE_ASYNCHRONOUS_CLIPBOARD_REQUEST 0 + class MyApp : public wxApp { public: virtual bool OnInit(); }; +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST enum AsyncRequestState { Idle, Waiting, Finished }; +#endif class MyFrame : public wxFrame { @@ -48,12 +53,16 @@ public: void OnAbout(wxCommandEvent&event); void OnWriteClipboardContents(wxCommandEvent&event); void OnUpdateUI(wxUpdateUIEvent&event); +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST void OnClipboardChange(wxClipboardEvent&event); +#endif private: wxTextCtrl *m_textctrl; +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST AsyncRequestState m_request; bool m_clipboardSupportsText; +#endif DECLARE_EVENT_TABLE() }; @@ -71,7 +80,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_About, MyFrame::OnAbout) EVT_BUTTON(ID_Write, MyFrame::OnWriteClipboardContents) EVT_UPDATE_UI(ID_Write, MyFrame::OnUpdateUI) +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST EVT_CLIPBOARD_CHANGED(MyFrame::OnClipboardChange) +#endif END_EVENT_TABLE() IMPLEMENT_APP(MyApp) @@ -93,8 +104,10 @@ MyFrame::MyFrame(const wxString& title) // set the frame icon SetIcon(wxICON(sample)); +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST m_request = Idle; m_clipboardSupportsText = false; +#endif #if wxUSE_MENUS // create a menu bar @@ -125,7 +138,7 @@ MyFrame::MyFrame(const wxString& title) panel->SetSizer( main_sizer ); } -void MyFrame::OnWriteClipboardContents(wxCommandEvent& event) +void MyFrame::OnWriteClipboardContents(wxCommandEvent& WXUNUSED(event)) { if (wxTheClipboard->Open()) { @@ -141,14 +154,17 @@ void MyFrame::OnWriteClipboardContents(wxCommandEvent& event) } } +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST void MyFrame::OnClipboardChange(wxClipboardEvent&event) { m_clipboardSupportsText = event.SupportsFormat( wxDF_UNICODETEXT ); m_request = Finished; } +#endif void MyFrame::OnUpdateUI(wxUpdateUIEvent&event) { +#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST if (m_request == Idle) { wxTheClipboard->IsSupportedAsync( this ); @@ -164,6 +180,9 @@ void MyFrame::OnUpdateUI(wxUpdateUIEvent&event) event.Enable( m_clipboardSupportsText ); m_request = Idle; } +#else + event.Enable( wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) ); +#endif } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) diff --git a/src/common/clipcmn.cpp b/src/common/clipcmn.cpp index 09a62dc..f813478 100644 --- a/src/common/clipcmn.cpp +++ b/src/common/clipcmn.cpp @@ -43,10 +43,20 @@ DEFINE_EVENT_TYPE(wxEVT_CLIPBOARD_CHANGED) bool wxClipboardEvent::SupportsFormat( const wxDataFormat &format ) const { +#ifdef __WXGTK20__ + // GTK has an asynchronnous API which reports + // the supported formats one by one. + // We may have to add X11 and Motif later. wxVector::size_type n; for (n = 0; n < m_formats.size(); n++) { if (m_formats[n] == format) return true; } return false; +#else + // All other ports just query the clipboard directly + // from here + wxClipboard* clipboard = (wxClipboard*) GetEventObject(); + return clipboard->IsSupported( format ); +#endif } void wxClipboardEvent::AddFormat( const wxDataFormat &format ) @@ -69,6 +79,19 @@ static wxClipboard *gs_clipboard = NULL; return gs_clipboard; } +bool wxClipboardBase::IsSupportedAsync( wxEvtHandler *sink ) +{ + // We just imitate an asynchronous API on most platforms. + // This method is overridden uner GTK. + wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED); + event->SetEventObject( this ); + + sink->QueueEvent( event ); + + return true; +} + + // ---------------------------------------------------------------------------- // wxClipboardModule: module responsible for destroying the global clipboard // object diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 24b9da8..55a2ba6 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -362,6 +362,7 @@ async_targets_selection_received( GtkWidget *WXUNUSED(widget), return; wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED); + event->SetEventObject( clipboard ); if ( !selection_data || selection_data->length <= 0 ) { -- 2.7.4