firefox/mozilla-1631061.patch

159 lines
5.9 KiB
Diff
Raw Normal View History

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;