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