]> git.saurik.com Git - wxWidgets.git/commitdiff
Added pseudo-asynchronous clipboard implemenation to all ports excepts for GTK+
authorRobert Roebling <robert@roebling.de>
Tue, 23 Dec 2008 12:05:06 +0000 (12:05 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 23 Dec 2008 12:05:06 +0000 (12:05 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57510 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/clipbrd.h
samples/clipboard/clipboard.cpp
src/common/clipcmn.cpp
src/gtk/clipbrd.cpp

index e3c9c41556f81c31963b8d12b3aba73883f8b952..d3c90df714f18e1472c10e1cb61324923649adc0 100644 (file)
@@ -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;
 
index 3a39b222188f67fb39de1fa9993c608c49d41d95..6a20dea42ca1eed5919062179091b2ef2f5caaa7 100644 (file)
     #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))
index 09a62dc49664e49fb3dfef7d0cb7352f0d324e1a..f8134784e04fcd562e511b8756fdcc7effe563e4 100644 (file)
@@ -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<wxDataFormat>::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
index 24b9da8278a1277329ed3d3a99e65230598bbe8a..55a2ba66c610ffaf267ce703a8540dc7356eb96a 100644 (file)
@@ -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 )
     {