Skip to content

Commit 008e456

Browse files
FaraSysAriandrFara
authored
Fix the known issue of saving JPEG to clipboard on macOS (#2)
* fix issue with saving JPEG on macOS to clipboard * don't hide useJpgForClipboard from macOS GUI configuration --------- Co-authored-by: Oleksandr Honcharov <[email protected]> Co-authored-by: Fara <[email protected]>
1 parent 160f2df commit 008e456

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

src/config/generalconf.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -614,10 +614,6 @@ void GeneralConf::initUseJpgForClipboard()
614614
tr("Use lossy JPG format for clipboard (lossless PNG default)"));
615615
m_scrollAreaLayout->addWidget(m_useJpgForClipboard);
616616

617-
#if defined(Q_OS_MACOS)
618-
// FIXME - temporary fix to disable option for MacOS
619-
m_useJpgForClipboard->hide();
620-
#endif
621617
connect(m_useJpgForClipboard,
622618
&QCheckBox::clicked,
623619
this,

src/utils/screenshotsaver.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
#include "src/utils/globalvalues.h"
1111
#include "utils/desktopinfo.h"
1212

13+
#include <QTemporaryFile>
14+
#include <QImageWriter>
15+
#include <QPixmap>
16+
#include <QByteArray>
17+
#include <QProcess>
18+
#include <QDebug>
19+
1320
#if USE_WAYLAND_CLIPBOARD
1421
#include <KSystemClipboard>
1522
#endif
@@ -101,6 +108,42 @@ QString ShowSaveFileDialog(const QString& title, const QString& directory)
101108
}
102109
}
103110

111+
void saveJpegToClipboardMacOS(const QPixmap& capture) {
112+
// Convert QPixmap to JPEG data
113+
QByteArray jpegData;
114+
QBuffer buffer(&jpegData);
115+
buffer.open(QIODevice::WriteOnly);
116+
117+
QImageWriter imageWriter(&buffer, "jpeg");
118+
imageWriter.setQuality(ConfigHandler().jpegQuality()); // Set JPEG quality to whatever is in settings
119+
if (!imageWriter.write(capture.toImage())) {
120+
qWarning() << "Failed to write image to JPEG format.";
121+
return;
122+
}
123+
124+
// Save JPEG data to a temporary file
125+
QTemporaryFile tempFile;
126+
if (!tempFile.open()) {
127+
qWarning() << "Failed to open temporary file for writing.";
128+
return;
129+
}
130+
tempFile.write(jpegData);
131+
tempFile.close();
132+
133+
// Use osascript to copy the contents of the file to clipboard
134+
QProcess process;
135+
QString script = QString(
136+
"set the clipboard to (read (POSIX file \"%1\") as «class PNGf»)"
137+
).arg(tempFile.fileName());
138+
process.start("osascript", QStringList() << "-e" << script);
139+
if (!process.waitForFinished()) {
140+
qWarning() << "Failed to execute AppleScript.";
141+
}
142+
143+
// Clean up
144+
tempFile.remove();
145+
}
146+
104147
void saveToClipboardMime(const QPixmap& capture, const QString& imageType)
105148
{
106149
QByteArray array;
@@ -152,8 +195,11 @@ void saveToClipboard(const QPixmap& capture)
152195
AbstractLogger() << QObject::tr("Capture saved to clipboard.");
153196
}
154197
if (ConfigHandler().useJpgForClipboard()) {
155-
// FIXME - it doesn't work on MacOS
198+
#ifdef Q_OS_MAC
199+
saveJpegToClipboardMacOS(capture);
200+
#else
156201
saveToClipboardMime(capture, "jpeg");
202+
#endif
157203
} else {
158204
// Need to send message before copying to clipboard
159205
#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX)

0 commit comments

Comments
 (0)