From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- widget/gtk/nsClipboardWayland.cpp | 75 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 widget/gtk/nsClipboardWayland.cpp (limited to 'widget/gtk/nsClipboardWayland.cpp') diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp new file mode 100644 index 0000000000..d179f242dd --- /dev/null +++ b/widget/gtk/nsClipboardWayland.cpp @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:expandtab:shiftwidth=2:tabstop=2: + */ +/* 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/. */ + +#include "nsClipboardWayland.h" + +#include "AsyncGtkClipboardRequest.h" +#include "mozilla/TimeStamp.h" +#include "mozilla/ScopeExit.h" +#include "prtime.h" + +#include +#include +#include + +using namespace mozilla; + +nsRetrievalContextWayland::nsRetrievalContextWayland() = default; + +ClipboardTargets nsRetrievalContextWayland::GetTargetsImpl( + int32_t aWhichClipboard) { + LOGCLIP("nsRetrievalContextWayland::GetTargetsImpl()\n"); + + return WaitForClipboardData(ClipboardDataType::Targets, aWhichClipboard) + .ExtractTargets(); +} + +ClipboardData nsRetrievalContextWayland::GetClipboardData( + const char* aMimeType, int32_t aWhichClipboard) { + LOGCLIP("nsRetrievalContextWayland::GetClipboardData() mime %s\n", aMimeType); + + return WaitForClipboardData(ClipboardDataType::Data, aWhichClipboard, + aMimeType); +} + +GUniquePtr nsRetrievalContextWayland::GetClipboardText( + int32_t aWhichClipboard) { + GdkAtom selection = GetSelectionAtom(aWhichClipboard); + + LOGCLIP("nsRetrievalContextWayland::GetClipboardText(), clipboard %s\n", + (selection == GDK_SELECTION_PRIMARY) ? "Primary" : "Selection"); + + return WaitForClipboardData(ClipboardDataType::Text, aWhichClipboard) + .ExtractText(); +} + +ClipboardData nsRetrievalContextWayland::WaitForClipboardData( + ClipboardDataType aDataType, int32_t aWhichClipboard, + const char* aMimeType) { + LOGCLIP("nsRetrievalContextWayland::WaitForClipboardData, MIME %s\n", + aMimeType); + + AsyncGtkClipboardRequest request(aDataType, aWhichClipboard, aMimeType); + int iteration = 1; + + PRTime entryTime = PR_Now(); + while (!request.HasCompleted()) { + if (iteration++ > kClipboardFastIterationNum) { + /* sleep for 10 ms/iteration */ + PR_Sleep(PR_MillisecondsToInterval(10)); + if (PR_Now() - entryTime > kClipboardTimeout) { + LOGCLIP(" failed to get async clipboard data in time limit\n"); + break; + } + } + LOGCLIP("doing iteration %d msec %ld ...\n", (iteration - 1), + (long)((PR_Now() - entryTime) / 1000)); + gtk_main_iteration(); + } + + return request.TakeResult(); +} -- cgit v1.2.3