1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=4:tabstop=4:
3  */
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 
8 #ifndef __nsClipboardX11_h_
9 #define __nsClipboardX11_h_
10 
11 #include <gtk/gtk.h>
12 
13 class nsRetrievalContextX11 : public nsRetrievalContext {
14  public:
15   enum State { INITIAL, COMPLETED, TIMED_OUT };
16 
17   virtual const char* GetClipboardData(const char* aMimeType,
18                                        int32_t aWhichClipboard,
19                                        uint32_t* aContentLength) override;
20   virtual const char* GetClipboardText(int32_t aWhichClipboard) override;
21   virtual void ReleaseClipboardData(const char* aClipboardData) override;
22 
23   virtual GdkAtom* GetTargets(int32_t aWhichClipboard,
24                               int* aTargetNums) override;
25 
26   virtual bool HasSelectionSupport(void) override;
27 
28   // Call this when data or text has been retrieved.
29   void Complete(ClipboardDataType aDataType, const void* aData,
30                 int aDataRequestNumber);
31 
32   nsRetrievalContextX11();
33 
34  private:
35   bool WaitForClipboardData(ClipboardDataType aDataType,
36                             GtkClipboard* clipboard,
37                             const char* aMimeType = nullptr);
38 
39   /**
40    * Spins X event loop until timing out or being completed. Returns
41    * null if we time out, otherwise returns the completed data (passing
42    * ownership to caller).
43    */
44   bool WaitForX11Content();
45 
46   State mState;
47   int mClipboardRequestNumber;
48   void* mClipboardData;
49   uint32_t mClipboardDataLength;
50   GdkAtom mTargetMIMEType;
51 };
52 
53 class ClipboardRequestHandler {
54  public:
ClipboardRequestHandler(nsRetrievalContextX11 * aContext,ClipboardDataType aDataType,int aDataRequestNumber)55   ClipboardRequestHandler(nsRetrievalContextX11* aContext,
56                           ClipboardDataType aDataType, int aDataRequestNumber)
57       : mContext(aContext),
58         mDataRequestNumber(aDataRequestNumber),
59         mDataType(aDataType) {}
60 
Complete(const void * aData)61   void Complete(const void* aData) {
62     mContext->Complete(mDataType, aData, mDataRequestNumber);
63   }
64 
65  private:
66   nsRetrievalContextX11* mContext;
67   int mDataRequestNumber;
68   ClipboardDataType mDataType;
69 };
70 
71 #endif /* __nsClipboardX11_h_ */
72