diff --git a/README.md b/README.md index dec5d32..7600734 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,29 @@ A modern, high-contrast **KDE Plasma System Tray Uploader** and desktop integrat Ensure the following system dependencies are installed: -| Dependency | Purpose | Recommended Package (Fedora / Arch / Ubuntu) | -| :---------------------- | :------------------------- | :------------------------------------------- | -| **Python 3.9+** | Execution Runtime | `python3` | -| **PySide6** | GUI Framework & IPC | `python3-pyside6` or `pip install PySide6` | -| **Spectacle** | Region Screenshot Capture | `spectacle` (KDE Utility) | -| **ffmpeg** _(Optional)_ | Video Thumbnail Generation | `ffmpeg` | -| **libnotify** | Desktop Notifications | `libnotify` (`notify-send`) | +| Dependency | Purpose | Recommended Package (Arch / Fedora / Ubuntu) | +| :---------------------------------- | :---------------------------------- | :------------------------------------------- | +| **Python 3.9+** | Execution Runtime | `python` / `python3` | +| **PySide6** | GUI Framework & IPC | `python-pyside6` / `python3-pyside6` | +| **Spectacle** | Region Screenshot Capture | `spectacle` (KDE Utility) | +| **ffmpeg** _(Optional)_ | Video Thumbnail Generation | `ffmpeg` | +| **libnotify** | Desktop Notifications | `libnotify` (`notify-send`) | +| **Qt6 & KF6 Purpose** _(Optional)_ | Gwenview / Share Menu C++ Plugin | `qt6-base kf6-purpose kf6-kcoreaddons` | + +### Install Dependencies via Package Manager + +- **Arch Linux / Manjaro**: + ```bash + sudo pacman -S python-pyside6 spectacle ffmpeg qt6-base kf6-purpose kf6-kcoreaddons + ``` +- **Fedora**: + ```bash + sudo dnf install python3-pyside6 spectacle ffmpeg qt6-qtbase-devel kf6-purpose-devel kf6-kcoreaddons-devel + ``` +- **Ubuntu / Debian**: + ```bash + sudo apt install python3-pyside6 spectacle ffmpeg qt6-base-dev libkf6purpose-dev libkf6kcoreaddons-dev + ``` --- diff --git a/browser-extension/manifest.json b/browser-extension/manifest.json index 6ec5935..c8901ad 100644 --- a/browser-extension/manifest.json +++ b/browser-extension/manifest.json @@ -5,7 +5,12 @@ "browser_specific_settings": { "gecko": { "id": "f0ckm-uploader@local", - "strict_min_version": "109.0" + "strict_min_version": "109.0", + "data_collection_permissions": { + "required": [ + "none" + ] + } } }, "description": "Upload images, media, links, and URLs directly to f0ckm from context menu or toolbar.", diff --git a/install.sh b/install.sh index c102237..0fae4f1 100755 --- a/install.sh +++ b/install.sh @@ -6,8 +6,10 @@ APP_DIR="$HOME/.local/share/applications" SERVICE_MENU_DIR="$HOME/.local/share/kio/servicemenus" LEGACY_SERVICE_MENU_DIR="$HOME/.local/share/kservices5/ServiceMenus" -# Check Python 3 and PySide6 dependency +# Check dependencies echo "Checking dependencies..." +MISSING_OPTIONAL=() + if ! command -v python3 &>/dev/null; then echo "Error: Python 3 is required but not found on your system." exit 1 @@ -35,7 +37,65 @@ if ! python3 -c "import PySide6" &>/dev/null; then fi if ! python3 -c "import PySide6" &>/dev/null; then - echo "Warning: Could not automatically install PySide6. Please install 'PySide6' via pip or your distro package manager (e.g. python3-pyside6)." + echo "Warning: Could not automatically install PySide6. Please install 'PySide6' via pip or package manager." +fi + +if ! command -v spectacle &>/dev/null; then + MISSING_OPTIONAL+=("spectacle (KDE screenshot capture tool)") +fi + +if ! command -v ffmpeg &>/dev/null; then + MISSING_OPTIONAL+=("ffmpeg (Video notification thumbnail generator)") +fi + +# Check Qt6 / KF6 Purpose plugin build requirements +HAS_QT6_MOC=false +for m in /usr/lib/qt6/moc /usr/lib/qt6/libexec/moc /usr/libexec/qt6/moc /usr/lib64/qt6/libexec/moc /usr/lib/qt6/bin/moc moc-qt6 moc; do + if [ -x "$m" ] || command -v "$m" &>/dev/null; then + bin_path="$m" + [ -x "$m" ] || bin_path="$(command -v "$m")" + ver="$("$bin_path" -v 2>&1 || true)" + if [[ "$ver" =~ moc\ 6\. ]] || [[ "$ver" =~ Qt\ 6\. ]] || [[ "$ver" =~ 6\.[0-9]+ ]]; then + HAS_QT6_MOC=true + break + fi + fi +done + +HAS_PURPOSE_HDR=false +for h in /usr/include/KF6/Purpose /usr/include/purpose; do + if [ -d "$h" ]; then + HAS_PURPOSE_HDR=true + break + fi +done + +if [ "$HAS_QT6_MOC" = false ] || [ "$HAS_PURPOSE_HDR" = false ]; then + MISSING_OPTIONAL+=("qt6-base & kf6-purpose (KDE Gwenview Share Menu integration)") +fi + +if [ ${#MISSING_OPTIONAL[@]} -gt 0 ]; then + echo "" + echo "--------------------------------------------------------" + echo " Notice: Optional dependencies missing:" + for dep in "${MISSING_OPTIONAL[@]}"; do + echo " - $dep" + done + echo "" + echo " To install missing dependencies:" + if command -v pacman &>/dev/null; then + echo " Arch Linux: sudo pacman -S python-pyside6 spectacle ffmpeg qt6-base kf6-purpose kf6-kcoreaddons" + elif command -v dnf &>/dev/null; then + echo " Fedora: sudo dnf install python3-pyside6 spectacle ffmpeg qt6-qtbase-devel kf6-purpose-devel kf6-kcoreaddons-devel" + elif command -v apt-get &>/dev/null; then + echo " Debian/Ubuntu: sudo apt install python3-pyside6 spectacle ffmpeg qt6-base-dev libkf6purpose-dev libkf6kcoreaddons-dev" + else + echo " Arch Linux: sudo pacman -S python-pyside6 spectacle ffmpeg qt6-base kf6-purpose kf6-kcoreaddons" + echo " Fedora: sudo dnf install python3-pyside6 spectacle ffmpeg qt6-qtbase-devel kf6-purpose-devel kf6-kcoreaddons-devel" + echo " Debian/Ubuntu: sudo apt install python3-pyside6 spectacle ffmpeg qt6-base-dev libkf6purpose-dev libkf6kcoreaddons-dev" + fi + echo "--------------------------------------------------------" + echo "" fi # Create necessary directories @@ -139,9 +199,12 @@ if [ -f "purpose_plugin/build_plugin.sh" ]; then cp "purpose_plugin/f0ckmpurposeplugin.so" "$PURPOSE_USER_DIR64/f0ckmpurposeplugin.so" cp "purpose_plugin/f0ckmpurposeplugin.so" "$PURPOSE_USER_DIR32/f0ckmpurposeplugin.so" - if [ -w "/usr/lib64/qt6/plugins/kf6/purpose" ]; then + if [ -w "/usr/lib/qt6/plugins/kf6/purpose" ]; then + cp "purpose_plugin/f0ckmpurposeplugin.so" "/usr/lib/qt6/plugins/kf6/purpose/f0ckmpurposeplugin.so" &>/dev/null || true + elif [ -w "/usr/lib64/qt6/plugins/kf6/purpose" ]; then cp "purpose_plugin/f0ckmpurposeplugin.so" "/usr/lib64/qt6/plugins/kf6/purpose/f0ckmpurposeplugin.so" &>/dev/null || true elif sudo -n true 2>/dev/null; then + sudo cp "purpose_plugin/f0ckmpurposeplugin.so" "/usr/lib/qt6/plugins/kf6/purpose/f0ckmpurposeplugin.so" &>/dev/null || true sudo cp "purpose_plugin/f0ckmpurposeplugin.so" "/usr/lib64/qt6/plugins/kf6/purpose/f0ckmpurposeplugin.so" &>/dev/null || true fi diff --git a/purpose_plugin/CMakeLists.txt b/purpose_plugin/CMakeLists.txt index 99320e3..d8964f0 100644 --- a/purpose_plugin/CMakeLists.txt +++ b/purpose_plugin/CMakeLists.txt @@ -5,8 +5,10 @@ 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(ECM 5.90.0 QUIET NO_MODULE) +if(ECM_FOUND) + set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) +endif() find_package(Qt6 REQUIRED COMPONENTS Core Gui) find_package(KF6 REQUIRED COMPONENTS Purpose CoreAddons) @@ -22,3 +24,4 @@ target_link_libraries(f0ckmpurposeplugin KF6::Purpose KF6::CoreAddons ) + diff --git a/purpose_plugin/build_plugin.sh b/purpose_plugin/build_plugin.sh index 6c1ee1c..bfa0338 100755 --- a/purpose_plugin/build_plugin.sh +++ b/purpose_plugin/build_plugin.sh @@ -7,50 +7,93 @@ 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 +MOC_CANDIDATES=( + /usr/lib/qt6/moc + /usr/lib/qt6/libexec/moc + /usr/libexec/qt6/moc + /usr/lib64/qt6/libexec/moc + /usr/lib/qt6/bin/moc + /usr/lib64/qt6/bin/moc + moc-qt6 + moc6 + moc +) + +for candidate in "${MOC_CANDIDATES[@]}"; do + TARGET_BIN="" + if [ -x "$candidate" ]; then + TARGET_BIN="$candidate" + elif command -v "$candidate" &>/dev/null; then + TARGET_BIN="$(command -v "$candidate")" + fi + + if [ -n "$TARGET_BIN" ]; then + VER_OUT="$("$TARGET_BIN" -v 2>&1 || true)" + if [[ "$VER_OUT" =~ moc\ 6\. ]] || [[ "$VER_OUT" =~ Qt\ 6\. ]] || [[ "$VER_OUT" =~ 6\.[0-9]+ ]]; then + MOC_BIN="$TARGET_BIN" + break + fi fi done if [ -z "$MOC_BIN" ]; then - echo "Warning: Qt6 moc compiler not found. Skipping Purpose plugin compilation." + echo "Warning: Qt6 moc compiler not found (detected Qt5 moc or no moc)." + echo "On Arch Linux, please ensure Qt6 development tools are installed:" + echo " sudo pacman -S qt6-base kf6-purpose kf6-kcoreaddons" 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 +for path in \ + /usr/include/KF6/Purpose \ + /usr/include/KF6/KCoreAddons \ + /usr/include/KF6 \ + /usr/include/purpose \ + /tmp/purpose_devel/usr/include/KF6/Purpose \ + /tmp/purpose_devel/usr/include/KF6; do + if [ -d "$path" ]; then + INC_ARGS+=("-I$path") + fi +done + +for path in \ + /usr/include/qt6 \ + /usr/include/qt6/QtCore \ + /usr/include/qt6/QtGui \ + /usr/include/x86_64-linux-gnu/qt6 \ + /usr/include/x86_64-linux-gnu/qt6/QtCore \ + /usr/include/x86_64-linux-gnu/qt6/QtGui; do + if [ -d "$path" ]; then + INC_ARGS+=("-I$path") + fi +done if [ ${#INC_ARGS[@]} -eq 0 ]; then - echo "Warning: KF6 Purpose headers not found. Skipping Purpose plugin compilation." + echo "Warning: KF6 Purpose/Qt6 headers not found. Skipping Purpose plugin compilation." + echo "On Arch Linux, install development packages: sudo pacman -S kf6-purpose kf6-kcoreaddons qt6-base" 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 +for lib_path in \ + /usr/lib/libKF6Purpose.so.6 /usr/lib64/libKF6Purpose.so.6 /usr/lib/x86_64-linux-gnu/libKF6Purpose.so.6 \ + /usr/lib/libKF6Purpose.so /usr/lib64/libKF6Purpose.so /usr/lib/x86_64-linux-gnu/libKF6Purpose.so; do + if [ -f "$lib_path" ]; then + LIB_ARGS+=("$lib_path") + break + fi +done -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 +for lib_path in \ + /usr/lib/libKF6CoreAddons.so.6 /usr/lib64/libKF6CoreAddons.so.6 /usr/lib/x86_64-linux-gnu/libKF6CoreAddons.so.6 \ + /usr/lib/libKF6CoreAddons.so /usr/lib64/libKF6CoreAddons.so /usr/lib/x86_64-linux-gnu/libKF6CoreAddons.so; do + if [ -f "$lib_path" ]; then + LIB_ARGS+=("$lib_path") + break + fi +done BUILD_DIR="$(mktemp -d)" trap 'rm -rf "$BUILD_DIR"' EXIT @@ -67,3 +110,4 @@ g++ -shared -fPIC -O2 f0ckmplugin.cpp \ popd >/dev/null echo "Successfully built f0ckmpurposeplugin.so at $OUTPUT_DIR/f0ckmpurposeplugin.so" +