diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:44:51 +0000 |
commit | 9e3c08db40b8916968b9f30096c7be3f00ce9647 (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /widget/gtk/nsClipboardWayland.cpp | |
parent | Initial commit. (diff) | |
download | thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.tar.xz thunderbird-9e3c08db40b8916968b9f30096c7be3f00ce9647.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'widget/gtk/nsClipboardWayland.cpp')
-rw-r--r-- | widget/gtk/nsClipboardWayland.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
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 <gtk/gtk.h> +#include <stdlib.h> +#include <string.h> + +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<char> 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(); +} |