add purposeplugin for kde

This commit is contained in:
2026-08-13 20:08:24 +02:00
parent acc859919e
commit 5bef759fae
8 changed files with 244 additions and 3 deletions

View File

@@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.16)
project(f0ckmpurposeplugin)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
find_package(ECM REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
find_package(Qt6 REQUIRED COMPONENTS Core Gui)
find_package(KF6 REQUIRED COMPONENTS Purpose CoreAddons)
kcoreaddons_add_plugin(f0ckmpurposeplugin
SOURCES f0ckmplugin.cpp
INSTALL_NAMESPACE "kf6/purpose"
)
target_link_libraries(f0ckmpurposeplugin
PRIVATE
Qt6::Core
KF6::Purpose
KF6::CoreAddons
)

69
purpose_plugin/build_plugin.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
OUTPUT_TARGET="${1:-$SCRIPT_DIR}"
mkdir -p "$OUTPUT_TARGET"
OUTPUT_DIR="$(cd "$OUTPUT_TARGET" && pwd)"
MOC_BIN=""
for candidate in /usr/libexec/qt6/moc /usr/lib64/qt6/libexec/moc moc-qt6 moc; do
if command -v "$candidate" &>/dev/null; then
MOC_BIN="$candidate"
break
elif [ -x "$candidate" ]; then
MOC_BIN="$candidate"
break
fi
done
if [ -z "$MOC_BIN" ]; then
echo "Warning: Qt6 moc compiler not found. Skipping Purpose plugin compilation."
exit 0
fi
# Detect header search paths
INC_ARGS=()
if [ -d "/usr/include/KF6/Purpose" ]; then
INC_ARGS+=("-I/usr/include/KF6/Purpose" "-I/usr/include/KF6/KCoreAddons" "-I/usr/include/KF6")
elif [ -d "/tmp/purpose_devel/usr/include/KF6/Purpose" ]; then
INC_ARGS+=("-I/tmp/purpose_devel/usr/include/KF6/Purpose" "-I/tmp/purpose_devel/usr/include/KF6/KCoreAddons" "-I/tmp/purpose_devel/usr/include/KF6")
fi
if [ -d "/usr/include/qt6" ]; then
INC_ARGS+=("-I/usr/include/qt6" "-I/usr/include/qt6/QtCore" "-I/usr/include/qt6/QtGui")
fi
if [ ${#INC_ARGS[@]} -eq 0 ]; then
echo "Warning: KF6 Purpose headers not found. Skipping Purpose plugin compilation."
exit 0
fi
LIB_ARGS=()
if [ -f "/usr/lib64/libKF6Purpose.so.6" ]; then
LIB_ARGS+=("/usr/lib64/libKF6Purpose.so.6")
elif [ -f "/usr/lib/libKF6Purpose.so.6" ]; then
LIB_ARGS+=("/usr/lib/libKF6Purpose.so.6")
fi
if [ -f "/usr/lib64/libKF6CoreAddons.so.6" ]; then
LIB_ARGS+=("/usr/lib64/libKF6CoreAddons.so.6")
elif [ -f "/usr/lib/libKF6CoreAddons.so.6" ]; then
LIB_ARGS+=("/usr/lib/libKF6CoreAddons.so.6")
fi
BUILD_DIR="$(mktemp -d)"
trap 'rm -rf "$BUILD_DIR"' EXIT
cp "$SCRIPT_DIR/f0ckmplugin.cpp" "$SCRIPT_DIR/f0ckmplugin.json" "$BUILD_DIR/"
pushd "$BUILD_DIR" >/dev/null
"$MOC_BIN" "${INC_ARGS[@]}" f0ckmplugin.cpp -o f0ckmplugin.moc
g++ -shared -fPIC -O2 f0ckmplugin.cpp \
"${INC_ARGS[@]}" \
"${LIB_ARGS[@]}" \
-lQt6Core \
-o "$OUTPUT_DIR/f0ckmpurposeplugin.so"
popd >/dev/null
echo "Successfully built f0ckmpurposeplugin.so at $OUTPUT_DIR/f0ckmpurposeplugin.so"

View File

@@ -0,0 +1,65 @@
#include <purpose/pluginbase.h>
#include <purpose/job.h>
#include <KPluginFactory>
#include <QProcess>
#include <QJsonObject>
#include <QJsonArray>
#include <QUrl>
#include <QDir>
#include <QStandardPaths>
#include <QDebug>
class F0ckmJob : public Purpose::Job
{
Q_OBJECT
public:
explicit F0ckmJob(QObject *parent = nullptr) : Purpose::Job(parent) {}
void start() override {
QJsonObject d = data();
QJsonArray urls = d.value(QStringLiteral("urls")).toArray();
QStringList args;
args << QStringLiteral("--upload");
for (const QJsonValue &val : urls) {
QUrl url(val.toString());
if (url.isLocalFile()) {
args << url.toLocalFile();
} else {
args << val.toString();
}
}
QString execPath = QStandardPaths::findExecutable(QStringLiteral("f0ckm-uploader-gui"));
if (execPath.isEmpty()) {
execPath = QDir::homePath() + QStringLiteral("/.local/bin/f0ckm-uploader-gui");
}
bool ok = QProcess::startDetached(execPath, args);
if (!ok) {
setError(1);
setErrorText(QStringLiteral("Failed to launch f0ckm-uploader-gui"));
}
emitResult();
}
};
class F0ckmPlugin : public Purpose::PluginBase
{
Q_OBJECT
public:
explicit F0ckmPlugin(QObject *parent = nullptr, const QVariantList &args = QVariantList())
: Purpose::PluginBase(parent)
{
Q_UNUSED(args);
}
Purpose::Job *createJob() const override {
return new F0ckmJob();
}
};
K_PLUGIN_CLASS_WITH_JSON(F0ckmPlugin, "f0ckmplugin.json")
#include "f0ckmplugin.moc"

View File

@@ -0,0 +1,30 @@
{
"KPlugin": {
"Name": "Upload to f0ckm",
"Description": "Upload images or videos to f0ckm",
"Icon": "f0ckm-uploader",
"Category": "Utilities"
},
"X-Purpose-PluginTypes": [
"Export"
],
"X-Purpose-Constraints": [
[
"mimeType:image/jpeg",
"mimeType:image/png",
"mimeType:image/gif",
"mimeType:image/webp",
"mimeType:image/bmp",
"mimeType:image/svg+xml",
"mimeType:image/tiff",
"mimeType:image/x-xcf",
"mimeType:video/mp4",
"mimeType:video/webm",
"mimeType:video/x-matroska",
"mimeType:video/quicktime",
"mimeType:video/x-msvideo",
"mimeType:video/mpeg"
]
],
"X-Purpose-ActionDisplay": "Upload to f0ckm"
}