aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml25
-rw-r--r--launcher/Application.cpp11
-rw-r--r--launcher/DesktopServices.cpp24
-rw-r--r--launcher/DesktopServices.h13
-rw-r--r--snap/snapcraft.yaml64
5 files changed, 131 insertions, 6 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c710d54b..a234cd29 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -569,6 +569,31 @@ jobs:
run: |
ccache -s
+ snap:
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Checkout
+ if: inputs.build_type == 'Debug'
+ uses: actions/checkout@v3
+ with:
+ submodules: 'true'
+ - name: Set short version
+ shell: bash
+ if: inputs.build_type == 'Debug'
+ run: |
+ ver_short=`git rev-parse --short HEAD`
+ echo "VERSION=$ver_short" >> $GITHUB_ENV
+ - name: Package Snap (Linux)
+ id: snapcraft
+ if: inputs.build_type == 'Debug'
+ uses: snapcore/action-build@v1
+ - name: Upload Snap (Linux)
+ if: inputs.build_type == 'Debug'
+ uses: actions/upload-artifact@v3
+ with:
+ name: prismlauncher_${{ env.VERSION }}_amd64.snap
+ path: ${{ steps.snapcraft.outputs.snap }}
+
flatpak:
runs-on: ubuntu-latest
container:
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index aeea90f1..fd253dab 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -281,7 +281,16 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
}
else
{
- QDir foo(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), ".."));
+ QDir foo;
+ if (DesktopServices::isSnap())
+ {
+ foo = QDir(getenv("SNAP_USER_COMMON"));
+ }
+ else
+ {
+ foo = QDir(FS::PathCombine(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), ".."));
+ }
+
dataPath = foo.absolutePath();
adjustedBy = "Persistent data path";
diff --git a/launcher/DesktopServices.cpp b/launcher/DesktopServices.cpp
index 2984a1b4..81362f09 100644
--- a/launcher/DesktopServices.cpp
+++ b/launcher/DesktopServices.cpp
@@ -118,7 +118,7 @@ bool openDirectory(const QString &path, bool ensureExists)
return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath()));
};
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
- if(!isFlatpak())
+ if(!isSandbox())
{
return IndirectOpen(f);
}
@@ -139,7 +139,7 @@ bool openFile(const QString &path)
return QDesktopServices::openUrl(QUrl::fromLocalFile(path));
};
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
- if(!isFlatpak())
+ if(!isSandbox())
{
return IndirectOpen(f);
}
@@ -157,7 +157,7 @@ bool openFile(const QString &application, const QString &path, const QString &wo
qDebug() << "Opening file" << path << "using" << application;
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
// FIXME: the pid here is fake. So if something depends on it, it will likely misbehave
- if(!isFlatpak())
+ if(!isSandbox())
{
return IndirectOpen([&]()
{
@@ -177,7 +177,7 @@ bool run(const QString &application, const QStringList &args, const QString &wor
{
qDebug() << "Running" << application << "with args" << args.join(' ');
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
- if(!isFlatpak())
+ if(!isSandbox())
{
// FIXME: the pid here is fake. So if something depends on it, it will likely misbehave
return IndirectOpen([&]()
@@ -202,7 +202,7 @@ bool openUrl(const QUrl &url)
return QDesktopServices::openUrl(url);
};
#if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)
- if(!isFlatpak())
+ if(!isSandbox())
{
return IndirectOpen(f);
}
@@ -224,4 +224,18 @@ bool isFlatpak()
#endif
}
+bool isSnap()
+{
+#ifdef Q_OS_LINUX
+ return getenv("SNAP");
+#else
+ return false;
+#endif
+}
+
+bool isSandbox()
+{
+ return isSnap() || isFlatpak();
+}
+
}
diff --git a/launcher/DesktopServices.h b/launcher/DesktopServices.h
index 21c9cae0..b1948cc2 100644
--- a/launcher/DesktopServices.h
+++ b/launcher/DesktopServices.h
@@ -34,5 +34,18 @@ namespace DesktopServices
*/
bool openUrl(const QUrl &url);
+ /**
+ * Determine whether the launcher is running in a Flatpak environment
+ */
bool isFlatpak();
+
+ /**
+ * Determine whether the launcher is running in a Snap environment
+ */
+ bool isSnap();
+
+ /**
+ * Determine whether the launcher is running in a sandboxed (Flatpak or Snap) environment
+ */
+ bool isSandbox();
}
diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml
new file mode 100644
index 00000000..41c0ce07
--- /dev/null
+++ b/snap/snapcraft.yaml
@@ -0,0 +1,64 @@
+name: prismlauncher
+license: GPL-3.0-only
+base: core22
+website: https://prismlauncher.org/
+source-code: https://github.com/PrismLauncher/PrismLauncher
+issues: https://github.com/PrismLauncher/PrismLauncher/issues
+donation: https://opencollective.com/prismlauncher
+contact: https://discord.gg/prismlauncher
+summary: A custom Minecraft launcher with modpack support
+adopt-info: prismlauncher
+
+grade: devel
+confinement: strict
+
+architectures:
+ - build-on: amd64
+ - build-on: arm64
+
+parts:
+ prismlauncher:
+ parse-info:
+ - usr/share/metainfo/org.prismlauncher.PrismLauncher.metainfo.xml
+ plugin: cmake
+ build-packages:
+ - zlib1g-dev
+ - openjdk-17-jdk
+ - scdoc
+ - libgl1-mesa-dev
+ - extra-cmake-modules
+ build-snaps:
+ - kf5-5-106-qt-5-15-9-core22
+ - kf5-5-106-qt-5-15-9-core22-sdk
+ stage-packages:
+ - openjdk-17-jre
+ - openjdk-8-jre
+ source: .
+ override-pull: |
+ craftctl default
+ # Fix the icon reference in the desktop file
+ sed -i.bak -e 's|Icon=org.prismlauncher.PrismLauncher|Icon=/usr/share/icons/hicolor/scalable/apps/org.prismlauncher.PrismLauncher.svg|g' program_info/org.prismlauncher.PrismLauncher.desktop.in
+ # Remove the build directory so that local development doesn't interfere with Snap compilation
+ rm -rf build
+ git submodule update --init --recursive
+ cmake-generator: Ninja
+ cmake-parameters:
+ - "-DCMAKE_INSTALL_PREFIX=/usr"
+ - "-DCMAKE_BUILD_TYPE=RelWithDebInfo"
+ - "-DENABLE_LTO=ON"
+ - "-DLauncher_BUILD_PLATFORM=snap"
+ - "-DLauncher_QT_VERSION_MAJOR='5'"
+
+apps:
+ prismlauncher:
+ common-id: org.prismlauncher.PrismLauncher
+ desktop: usr/share/applications/org.prismlauncher.PrismLauncher.desktop
+ command: usr/bin/prismlauncher
+ extensions:
+ - kde-neon
+ plugs:
+ - home
+ - opengl
+ - network
+ - network-bind
+ - audio-playback