diff options
Diffstat (limited to 'mozilla-1631061.patch')
-rw-r--r-- | mozilla-1631061.patch | 158 |
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; + + |