1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/gtk/clipbrd.h
3 // Purpose:     wxClipboard for wxGTK
4 // Author:      Robert Roebling, Vadim Zeitlin
5 // Copyright:   (c) 1998 Robert Roebling
6 //              (c) 2007 Vadim Zeitlin
7 // Licence:     wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 
10 #ifndef _WX_GTK_CLIPBOARD_H_
11 #define _WX_GTK_CLIPBOARD_H_
12 
13 // ----------------------------------------------------------------------------
14 // wxClipboard
15 // ----------------------------------------------------------------------------
16 
17 #include "wx/weakref.h"
18 
19 class WXDLLIMPEXP_CORE wxClipboard : public wxClipboardBase
20 {
21 public:
22     // there are several clipboards in X11 (and in GDK)
23     enum Kind
24     {
25         Primary,
26         Clipboard
27     };
28 
29     wxClipboard();
30     virtual ~wxClipboard();
31 
32     // open the clipboard before SetData() and GetData()
33     virtual bool Open();
34 
35     // close the clipboard after SetData() and GetData()
36     virtual void Close();
37 
38     // query whether the clipboard is opened
39     virtual bool IsOpened() const;
40 
41     // set the clipboard data. all other formats will be deleted.
42     virtual bool SetData( wxDataObject *data );
43 
44     // add to the clipboard data.
45     virtual bool AddData( wxDataObject *data );
46 
47     // ask if data in correct format is available
48     virtual bool IsSupported( const wxDataFormat& format );
49 
50     // ask if data in correct format is available
51     virtual bool IsSupportedAsync( wxEvtHandler *sink );
52 
53     // fill data with data on the clipboard (if available)
54     virtual bool GetData( wxDataObject& data );
55 
56     // clears wxTheClipboard and the system's clipboard if possible
57     virtual void Clear();
58 
59 
60 
61     // implementation from now on
62     // --------------------------
63 
64     // get our clipboard item (depending on m_usePrimary value)
65     GdkAtom GTKGetClipboardAtom() const;
66 
67     // get the data object currently being requested
68     wxDataObject *GTKGetDataObject( GdkAtom atom );
69 
70     // clear the data for the given clipboard kind
71     void GTKClearData(Kind kind);
72 
73     // called when selection data is received
74     void GTKOnSelectionReceived(const GtkSelectionData& sel);
75 
76     // called when available target information is received
77     bool GTKOnTargetReceived(const wxDataFormat& format);
78 
79 private:
80     // the data object for the specific selection
Data(Kind kind)81     wxDataObject *& Data(Kind kind)
82     {
83         return kind == Primary ? m_dataPrimary : m_dataClipboard;
84     }
85 
86     // the data object we're currently using
Data()87     wxDataObject *& Data()
88     {
89         return Data(m_usePrimary ? Primary : Clipboard);
90     }
91 
92 
93     // set or unset selection ownership
94     bool SetSelectionOwner(bool set = true);
95 
96     // add atom to the list of supported targets
97     void AddSupportedTarget(GdkAtom atom);
98 
99     // check if the given format is supported
100     bool DoIsSupported(const wxDataFormat& format);
101 
102 
103     // both of these pointers can be non-NULL simultaneously but we only use
104     // one of them at any moment depending on m_usePrimary value, use Data()
105     // (from inside) or GTKGetDataObject() (from outside) accessors
106     wxDataObject *m_dataPrimary,
107                  *m_dataClipboard;
108 
109     // this is used to temporarily hold the object passed to our GetData() so
110     // that GTK callbacks could access it
111     wxDataObject *m_receivedData;
112 
113     // used to pass information about the format we need from DoIsSupported()
114     // to GTKOnTargetReceived()
115     GdkAtom m_targetRequested;
116 
117     GtkWidget *m_clipboardWidget;  // for getting and offering data
118     GtkWidget *m_targetsWidget;    // for getting list of supported formats
119 
120     // ID of the connection to "selection_get" signal, initially 0.
121     unsigned long m_idSelectionGetHandler;
122 
123     bool m_open;
124     bool m_formatSupported;
125 
126 public:
127     // async stuff
128     wxEvtHandlerRef    m_sink;
129 private:
130     GtkWidget         *m_targetsWidgetAsync;  // for getting list of supported formats
131 
132     DECLARE_DYNAMIC_CLASS(wxClipboard)
133 };
134 
135 #endif // _WX_GTK_CLIPBOARD_H_
136