Skip to content

Commit f4cde19

Browse files
authored
Fix the known issue of saving JPEG to clipboard on macOS (flameshot-org#3724)
1 parent 7236570 commit f4cde19

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/config/generalconf.cpp

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

632-
#if defined(Q_OS_MACOS)
633-
// FIXME - temporary fix to disable option for MacOS
634-
m_useJpgForClipboard->hide();
635-
#endif
636632
connect(m_useJpgForClipboard,
637633
&QCheckBox::clicked,
638634
this,

src/utils/screenshotsaver.cpp

Lines changed: 50 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 <QByteArray>
14+
#include <QDebug>
15+
#include <QImageWriter>
16+
#include <QPixmap>
17+
#include <QProcess>
18+
#include <QTemporaryFile>
19+
1320
#if USE_WAYLAND_CLIPBOARD
1421
#include <KSystemClipboard>
1522
#endif
@@ -101,6 +108,45 @@ QString ShowSaveFileDialog(const QString& title, const QString& directory)
101108
}
102109
}
103110

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

0 commit comments

Comments
 (0)