diff options
Diffstat (limited to '')
-rw-r--r-- | widget/gtk/nsClipboardX11.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/widget/gtk/nsClipboardX11.h b/widget/gtk/nsClipboardX11.h new file mode 100644 index 0000000000..2363111f74 --- /dev/null +++ b/widget/gtk/nsClipboardX11.h @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: + */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef __nsClipboardX11_h_ +#define __nsClipboardX11_h_ + +#include <gtk/gtk.h> + +enum ClipboardDataType { CLIPBOARD_DATA, CLIPBOARD_TEXT, CLIPBOARD_TARGETS }; + +class nsRetrievalContextX11 : public nsRetrievalContext { + public: + enum State { INITIAL, COMPLETED, TIMED_OUT }; + + virtual const char* GetClipboardData(const char* aMimeType, + int32_t aWhichClipboard, + uint32_t* aContentLength) override; + virtual const char* GetClipboardText(int32_t aWhichClipboard) override; + virtual void ReleaseClipboardData(const char* aClipboardData) override; + + virtual GdkAtom* GetTargets(int32_t aWhichClipboard, + int* aTargetNums) override; + + virtual bool HasSelectionSupport(void) override; + + // Call this when data or text has been retrieved. + void Complete(ClipboardDataType aDataType, const void* aData, + int aDataRequestNumber); + + nsRetrievalContextX11(); + + private: + bool WaitForClipboardData(ClipboardDataType aDataType, + GtkClipboard* clipboard, + const char* aMimeType = nullptr); + + /** + * Spins X event loop until timing out or being completed. Returns + * null if we time out, otherwise returns the completed data (passing + * ownership to caller). + */ + bool WaitForX11Content(); + + State mState; + int mClipboardRequestNumber; + void* mClipboardData; + uint32_t mClipboardDataLength; + GdkAtom mTargetMIMEType; +}; + +class ClipboardRequestHandler { + public: + ClipboardRequestHandler(nsRetrievalContextX11* aContext, + ClipboardDataType aDataType, int aDataRequestNumber) + : mContext(aContext), + mDataRequestNumber(aDataRequestNumber), + mDataType(aDataType) {} + + void Complete(const void* aData) { + mContext->Complete(mDataType, aData, mDataRequestNumber); + } + + private: + nsRetrievalContextX11* mContext; + int mDataRequestNumber; + ClipboardDataType mDataType; +}; + +#endif /* __nsClipboardX11_h_ */ |