changeset: 563258:ed4b271af277 tag: tip parent: 563255:2c9db4cd3d89 user: stransky 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(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( - 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 mPrimaryOffer; RefPtr mDragContext; - int mClipboardRequestNumber; char* mClipboardData; uint32_t mClipboardDataLength;