summaryrefslogtreecommitdiff
path: root/mozilla-1631061.patch
diff options
context:
space:
mode:
Diffstat (limited to 'mozilla-1631061.patch')
-rw-r--r--mozilla-1631061.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/mozilla-1631061.patch b/mozilla-1631061.patch
new file mode 100644
index 0000000..acd1c5a
--- /dev/null
+++ b/mozilla-1631061.patch
@@ -0,0 +1,158 @@
+changeset: 563258:ed4b271af277
+tag: tip
+parent: 563255:2c9db4cd3d89
+user: stransky <stransky@redhat.com>
+date: Tue Dec 22 11:03:28 2020 +0100
+files: widget/gtk/nsClipboardWayland.cpp widget/gtk/nsClipboardWayland.h
+description:
+Bug 1631061 [Wayland] Remove fast track clipboard and always ask compositor for clipboard data, r?rmader
+
+Differential Revision: https://phabricator.services.mozilla.com/D100317
+
+
+diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp
+--- a/widget/gtk/nsClipboardWayland.cpp
++++ b/widget/gtk/nsClipboardWayland.cpp
+@@ -749,7 +749,6 @@ nsRetrievalContextWayland::nsRetrievalCo
+ mClipboardOffer(nullptr),
+ mPrimaryOffer(nullptr),
+ mDragContext(nullptr),
+- mClipboardRequestNumber(0),
+ mClipboardData(nullptr),
+ mClipboardDataLength(0) {
+ wl_data_device* dataDevice = wl_data_device_manager_get_data_device(
+@@ -807,42 +806,6 @@ GdkAtom* nsRetrievalContextWayland::GetT
+ return nullptr;
+ }
+
+-struct FastTrackClipboard {
+- FastTrackClipboard(int aClipboardRequestNumber,
+- nsRetrievalContextWayland* aRetrievalContex)
+- : mClipboardRequestNumber(aClipboardRequestNumber),
+- mRetrievalContex(aRetrievalContex) {}
+-
+- int mClipboardRequestNumber;
+- nsRetrievalContextWayland* mRetrievalContex;
+-};
+-
+-static void wayland_clipboard_contents_received(
+- GtkClipboard* clipboard, GtkSelectionData* selection_data, gpointer data) {
+- LOGCLIP(("wayland_clipboard_contents_received() callback\n"));
+- FastTrackClipboard* fastTrack = static_cast<FastTrackClipboard*>(data);
+- fastTrack->mRetrievalContex->TransferFastTrackClipboard(
+- fastTrack->mClipboardRequestNumber, selection_data);
+- delete fastTrack;
+-}
+-
+-void nsRetrievalContextWayland::TransferFastTrackClipboard(
+- int aClipboardRequestNumber, GtkSelectionData* aSelectionData) {
+- if (mClipboardRequestNumber == aClipboardRequestNumber) {
+- int dataLength = gtk_selection_data_get_length(aSelectionData);
+- if (dataLength > 0) {
+- mClipboardDataLength = dataLength;
+- mClipboardData = reinterpret_cast<char*>(
+- g_malloc(sizeof(char) * (mClipboardDataLength + 1)));
+- memcpy(mClipboardData, gtk_selection_data_get_data(aSelectionData),
+- sizeof(char) * mClipboardDataLength);
+- mClipboardData[mClipboardDataLength] = '\0';
+- }
+- } else {
+- NS_WARNING("Received obsoleted clipboard data!");
+- }
+-}
+-
+ const char* nsRetrievalContextWayland::GetClipboardData(
+ const char* aMimeType, int32_t aWhichClipboard, uint32_t* aContentLength) {
+ NS_ASSERTION(mClipboardData == nullptr && mClipboardDataLength == 0,
+@@ -851,33 +814,20 @@ const char* nsRetrievalContextWayland::G
+ LOGCLIP(("nsRetrievalContextWayland::GetClipboardData [%p] mime %s\n", this,
+ aMimeType));
+
+- /* If actual clipboard data is owned by us we don't need to go
+- * through Wayland but we ask Gtk+ to directly call data
+- * getter callback nsClipboard::SelectionGetEvent().
+- * see gtk_selection_convert() at gtk+/gtkselection.c.
+- */
+- GdkAtom selection = GetSelectionAtom(aWhichClipboard);
+- if (gdk_selection_owner_get(selection)) {
+- LOGCLIP((" Internal clipboard content\n"));
+- mClipboardRequestNumber++;
+- gtk_clipboard_request_contents(
+- gtk_clipboard_get(selection), gdk_atom_intern(aMimeType, FALSE),
+- wayland_clipboard_contents_received,
+- new FastTrackClipboard(mClipboardRequestNumber, this));
++ const auto& dataOffer =
++ (GetSelectionAtom(aWhichClipboard) == GDK_SELECTION_PRIMARY)
++ ? mPrimaryOffer
++ : mClipboardOffer;
++ if (!dataOffer) {
++ // Something went wrong. We're requested to provide clipboard data
++ // but we haven't got any from wayland.
++ NS_WARNING("Requested data without valid DataOffer!");
++ if (mClipboardData) {
++ ReleaseClipboardData(mClipboardData);
++ }
+ } else {
+- LOGCLIP((" Remote clipboard content\n"));
+- const auto& dataOffer =
+- (selection == GDK_SELECTION_PRIMARY) ? mPrimaryOffer : mClipboardOffer;
+- if (!dataOffer) {
+- // Something went wrong. We're requested to provide clipboard data
+- // but we haven't got any from wayland.
+- NS_WARNING("Requested data without valid DataOffer!");
+- mClipboardData = nullptr;
+- mClipboardDataLength = 0;
+- } else {
+- mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
+- &mClipboardDataLength);
+- }
++ mClipboardData = dataOffer->GetData(mDisplay->GetDisplay(), aMimeType,
++ &mClipboardDataLength);
+ }
+
+ *aContentLength = mClipboardDataLength;
+@@ -908,8 +858,10 @@ void nsRetrievalContextWayland::ReleaseC
+
+ NS_ASSERTION(aClipboardData == mClipboardData,
+ "Releasing unknown clipboard data!");
+- g_free((void*)aClipboardData);
+
+- mClipboardData = nullptr;
+- mClipboardDataLength = 0;
++ if (mClipboardData) {
++ g_free((void*)aClipboardData);
++ mClipboardData = nullptr;
++ mClipboardDataLength = 0;
++ }
+ }
+diff --git a/widget/gtk/nsClipboardWayland.h b/widget/gtk/nsClipboardWayland.h
+--- a/widget/gtk/nsClipboardWayland.h
++++ b/widget/gtk/nsClipboardWayland.h
+@@ -16,8 +16,6 @@
+ #include "nsClipboard.h"
+ #include "nsWaylandDisplay.h"
+
+-struct FastTrackClipboard;
+-
+ class DataOffer {
+ public:
+ void AddMIMEType(const char* aMimeType);
+@@ -134,9 +132,6 @@ class nsRetrievalContextWayland : public
+
+ void ClearDragAndDropDataOffer();
+
+- void TransferFastTrackClipboard(int aClipboardRequestNumber,
+- GtkSelectionData* aSelectionData);
+-
+ virtual ~nsRetrievalContextWayland() override;
+
+ private:
+@@ -149,7 +144,6 @@ class nsRetrievalContextWayland : public
+ mozilla::UniquePtr<DataOffer> mPrimaryOffer;
+ RefPtr<nsWaylandDragContext> mDragContext;
+
+- int mClipboardRequestNumber;
+ char* mClipboardData;
+ uint32_t mClipboardDataLength;
+
+
bgstack15