Browse Source

Wayland kde clipboard (#2305)

* working on wayland clipboard

* disabled wayland kde clipboard fix on snap until Kf5 tools are updated

* enable wayland clibboard on fedora

* drop fedora 34 and disable wayland clipboard on suse until it gets a new enough kf5
borgmanJeremy 3 years ago
parent
commit
00685369a0

+ 2 - 7
.github/workflows/Linux-pack.yml

@@ -303,13 +303,7 @@ jobs:
       fail-fast: false
       matrix:
         dist:
-          - {
-              name: fedora-34,
-              os: fedora,
-              symbol: 34,
-              arch: x86_64
-            }
-          - {
+         - {
               name: fedora-35,
               os: fedora,
               symbol: 35,
@@ -484,6 +478,7 @@ jobs:
             fcitx-frontend-qt5 \
             openssl \
             ca-certificates
+
       - name: Get go-appimage tool
       # Will not use linuxdeployqt anymore, because it suopprts currently still-supported mainstream distribution,
       # which is glibc 2.23. For more information, please see https://github.com/probonopd/linuxdeployqt/issues/340.

+ 2 - 0
CMakeLists.txt

@@ -67,6 +67,7 @@ option(USE_MONOCHROME_ICON "Build using monochrome icon as default" OFF)
 option(GENERATE_TS "Regenerate translation source files" OFF)
 option(USE_EXTERNAL_SINGLEAPPLICATION "Use external QtSingleApplication library" OFF)
 option(USE_LAUNCHER_ABSOLUTE_PATH "Use absolute path for the desktop launcher" ON)
+option(USE_WAYLAND_CLIPBOARD "USE KF Gui Wayland Clipboard" OFF)
 
 include(cmake/StandardProjectSettings.cmake)
 
@@ -108,6 +109,7 @@ option(BUILD_STATIC_LIBS ON)
 option(BUILD_SHARED_LIBS OFF)
 add_subdirectory(external/Qt-Color-Widgets EXCLUDE_FROM_ALL) 
 
+
 if (APPLE)
   add_subdirectory(external/QHotkey)
 endif()

+ 4 - 3
packaging/flatpak/org.flameshot.Flameshot.yml

@@ -1,6 +1,6 @@
 app-id: org.flameshot.Flameshot
 runtime: org.kde.Platform
-runtime-version: '5.15'
+runtime-version: '5.15-21.08'
 sdk: org.kde.Sdk
 command: flameshot
 finish-args:
@@ -26,8 +26,9 @@ modules:
   - name: flameshot
     buildsystem: cmake-ninja
     config-opts:
-      - -DCMAKE_BUILD_TYPE=Release
+      - -DCMAKE_BUILD_TYPE=Release 
+      - -DUSE_WAYLAND_CLIPBOARD=1
     sources:
       - type: git
         url: https://github.com/flameshot-org/flameshot.git
-        branch: master
+        branch: master

+ 7 - 1
packaging/rpm/flameshot.spec

@@ -34,6 +34,9 @@ BuildRequires: ninja-build
 BuildRequires: desktop-file-utils
 
 BuildRequires: cmake(Qt5Core) >= 5.9.0
+%if %{is_rhel_or_fedora}
+BuildRequires: cmake(KF5GuiAddons) >= 5.89.0
+%endif
 BuildRequires: cmake(Qt5DBus) >= 5.9.0
 BuildRequires: cmake(Qt5Gui) >= 5.9.0
 BuildRequires: cmake(Qt5LinguistTools) >= 5.9.0
@@ -78,7 +81,10 @@ Features:
 %cmake -DCMAKE_BUILD_TYPE=Release
 %endif
 %if %{is_rhel_or_fedora}
-%cmake -G Ninja -DCMAKE_BUILD_TYPE=Release
+	
+%cmake -G Ninja \
+    -DCMAKE_BUILD_TYPE=Release \
+    -DUSE_WAYLAND_CLIPBOARD:BOOL=ON \
 %endif
 %cmake_build
 

+ 3 - 0
snapcraft.yaml

@@ -46,6 +46,9 @@ parts:
       - kde-frameworks-5-qt-5-15-core20
     source: https://github.com/flameshot-org/flameshot.git
     plugin: cmake
+      # This cannot be enabled until the KF5 toolkit in the snap is updated
+      #cmake-parameters:
+      #  - -DUSE_WAYLAND_CLIPBOARD=1
     source-type: git
     override-pull: |
       snapcraftctl pull

+ 10 - 0
src/CMakeLists.txt

@@ -10,6 +10,10 @@ find_package(
         DBus
         LinguistTools)
 
+if (USE_WAYLAND_CLIPBOARD)
+    find_package(KF5GuiAddons)
+endif()
+
 set(CMAKE_AUTOMOC ON)
 set(CMAKE_AUTORCC ON)
 set(CMAKE_AUTOUIC ON)
@@ -190,8 +194,14 @@ target_link_libraries(
         Qt5::Widgets
         ${QTSINGLEAPPLICATION_LIBRARY}
         QtColorWidgets
+
 )
 
+if (USE_WAYLAND_CLIPBOARD)
+  target_compile_definitions(flameshot PRIVATE USE_WAYLAND_CLIPBOARD=1)
+  target_link_libraries(flameshot KF5::GuiAddons)
+endif()
+
 if (APPLE)
     set(MACOSX_BUNDLE_IDENTIFIER "org.flameshot")
     set_target_properties(

+ 21 - 5
src/utils/screenshotsaver.cpp

@@ -9,6 +9,11 @@
 #include "src/utils/filenamehandler.h"
 #include "src/utils/globalvalues.h"
 #include "utils/desktopinfo.h"
+
+#if USE_WAYLAND_CLIPBOARD
+#include <KSystemClipboard>
+#endif
+
 #include <QApplication>
 #include <QBuffer>
 #include <QClipboard>
@@ -33,15 +38,26 @@ void ScreenshotSaver::saveToClipboardMime(const QPixmap& capture,
     QImageWriter imageWriter{ &buffer, imageType.toUpper().toUtf8() };
     imageWriter.write(capture.toImage());
 
-    QPixmap pngPixmap;
+    QPixmap formattedPixmap;
     bool isLoaded =
-      pngPixmap.loadFromData(reinterpret_cast<uchar*>(array.data()),
-                             array.size(),
-                             imageType.toUpper().toUtf8());
+      formattedPixmap.loadFromData(reinterpret_cast<uchar*>(array.data()),
+                                   array.size(),
+                                   imageType.toUpper().toUtf8());
     if (isLoaded) {
-        QMimeData* mimeData = new QMimeData;
+
+        auto mimeData = new QMimeData();
+
+#ifdef USE_WAYLAND_CLIPBOARD
+        mimeData->setImageData(formattedPixmap.toImage());
+        mimeData->setData(QStringLiteral("x-kde-force-image-copy"),
+                          QByteArray());
+        KSystemClipboard::instance()->setMimeData(mimeData,
+                                                  QClipboard::Clipboard);
+#else
         mimeData->setData("image/" + imageType, array);
         QApplication::clipboard()->setMimeData(mimeData);
+#endif
+
     } else {
         AbstractLogger::error()
           << QObject::tr("Error while saving to clipboard");