From 75f2dab3c87d9d88979553792473a5aace4c96bf Mon Sep 17 00:00:00 2001 From: Ghosty Date: Fri, 3 Dec 2021 03:02:58 +0100 Subject: [PATCH 01/14] NOISSUE Implemented copy screenshots to the clipboard - Added context-menu entry - Ctrl+C keybind works as well - If multiple screenshots are selected, only the first one gets copied --- .../ui/pages/instance/ScreenshotsPage.cpp | 22 +++++++++++++++++++ launcher/ui/pages/instance/ScreenshotsPage.h | 1 + launcher/ui/pages/instance/ScreenshotsPage.ui | 9 ++++++++ 3 files changed, 32 insertions(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index 06c4379f3..e391b95de 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -250,6 +250,12 @@ bool ScreenshotsPage::eventFilter(QObject *obj, QEvent *evt) return QWidget::eventFilter(obj, evt); } QKeyEvent *keyEvent = static_cast(evt); + + if (keyEvent->matches(QKeySequence::Copy)) { + on_actionCopy_triggered(); + return true; + } + switch (keyEvent->key()) { case Qt::Key_Delete: @@ -372,6 +378,22 @@ void ScreenshotsPage::on_actionUpload_triggered() m_uploadActive = false; } +void ScreenshotsPage::on_actionCopy_triggered() +{ + auto selection = ui->listView->selectionModel()->selectedRows(); + if(selection.size() < 1) + { + return; + } + + // You can only copy one image to the clipboard. In the case of multiple selected files, only the first one gets copied. + auto item = selection[0]; + auto info = m_model->fileInfo(item); + QImage image(info.absoluteFilePath()); + Q_ASSERT(!image.isNull()); + QApplication::clipboard()->setImage(image, QClipboard::Clipboard); +} + void ScreenshotsPage::on_actionDelete_triggered() { auto mbox = CustomMessageBox::selectable( diff --git a/launcher/ui/pages/instance/ScreenshotsPage.h b/launcher/ui/pages/instance/ScreenshotsPage.h index d2f448373..d32f08fff 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.h +++ b/launcher/ui/pages/instance/ScreenshotsPage.h @@ -73,6 +73,7 @@ protected: private slots: void on_actionUpload_triggered(); + void on_actionCopy_triggered(); void on_actionDelete_triggered(); void on_actionRename_triggered(); void on_actionView_Folder_triggered(); diff --git a/launcher/ui/pages/instance/ScreenshotsPage.ui b/launcher/ui/pages/instance/ScreenshotsPage.ui index ec4610877..bb4213de7 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.ui +++ b/launcher/ui/pages/instance/ScreenshotsPage.ui @@ -50,6 +50,7 @@ false + @@ -74,6 +75,14 @@ View Folder + + + Copy + + + Copy + + From e9c52ec69663b2cb28a40428c96de749bdf49547 Mon Sep 17 00:00:00 2001 From: Ghosty Date: Fri, 3 Dec 2021 16:08:11 +0100 Subject: [PATCH 02/14] NOISSUE Added Copy File(s) feature for the screenshot page - Ctrl+C now copies the file instead of the image data - Renamed Copy to Copy Image --- .../ui/pages/instance/ScreenshotsPage.cpp | 24 +++++++++++++++++-- launcher/ui/pages/instance/ScreenshotsPage.h | 3 ++- launcher/ui/pages/instance/ScreenshotsPage.ui | 17 +++++++++---- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index e391b95de..7aead6234 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -252,7 +252,7 @@ bool ScreenshotsPage::eventFilter(QObject *obj, QEvent *evt) QKeyEvent *keyEvent = static_cast(evt); if (keyEvent->matches(QKeySequence::Copy)) { - on_actionCopy_triggered(); + on_actionCopy_File_s_triggered(); return true; } @@ -378,7 +378,7 @@ void ScreenshotsPage::on_actionUpload_triggered() m_uploadActive = false; } -void ScreenshotsPage::on_actionCopy_triggered() +void ScreenshotsPage::on_actionCopy_Image_triggered() { auto selection = ui->listView->selectionModel()->selectedRows(); if(selection.size() < 1) @@ -394,6 +394,26 @@ void ScreenshotsPage::on_actionCopy_triggered() QApplication::clipboard()->setImage(image, QClipboard::Clipboard); } +void ScreenshotsPage::on_actionCopy_File_s_triggered() +{ + auto selection = ui->listView->selectionModel()->selectedRows(); + if(selection.size() < 1) + { + // Don't do anything so we don't empty the users clipboard + return; + } + + QString buf = ""; + for (auto item : selection) + { + auto info = m_model->fileInfo(item); + buf += "file:///" + info.absoluteFilePath() + "\r\n"; + } + QMimeData* mimeData = new QMimeData(); + mimeData->setData("text/uri-list", buf.toLocal8Bit()); + QApplication::clipboard()->setMimeData(mimeData); +} + void ScreenshotsPage::on_actionDelete_triggered() { auto mbox = CustomMessageBox::selectable( diff --git a/launcher/ui/pages/instance/ScreenshotsPage.h b/launcher/ui/pages/instance/ScreenshotsPage.h index d32f08fff..2a1fdeeee 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.h +++ b/launcher/ui/pages/instance/ScreenshotsPage.h @@ -73,7 +73,8 @@ protected: private slots: void on_actionUpload_triggered(); - void on_actionCopy_triggered(); + void on_actionCopy_Image_triggered(); + void on_actionCopy_File_s_triggered(); void on_actionDelete_triggered(); void on_actionRename_triggered(); void on_actionView_Folder_triggered(); diff --git a/launcher/ui/pages/instance/ScreenshotsPage.ui b/launcher/ui/pages/instance/ScreenshotsPage.ui index bb4213de7..2e2227a29 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.ui +++ b/launcher/ui/pages/instance/ScreenshotsPage.ui @@ -50,7 +50,8 @@ false - + + @@ -75,12 +76,20 @@ View Folder - + - Copy + Copy Image - Copy + Copy Image + + + + + Copy File(s) + + + Copy File(s) From a97d0a36f4807e082273d0f137186a5cebf6cd5d Mon Sep 17 00:00:00 2001 From: Ghosty Date: Fri, 3 Dec 2021 16:29:28 +0100 Subject: [PATCH 03/14] NOISSUE Copy Image is not shown if the selection is > 1 --- launcher/ui/pages/instance/ScreenshotsPage.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/launcher/ui/pages/instance/ScreenshotsPage.cpp b/launcher/ui/pages/instance/ScreenshotsPage.cpp index 7aead6234..ccde78e7d 100644 --- a/launcher/ui/pages/instance/ScreenshotsPage.cpp +++ b/launcher/ui/pages/instance/ScreenshotsPage.cpp @@ -278,6 +278,11 @@ ScreenshotsPage::~ScreenshotsPage() void ScreenshotsPage::ShowContextMenu(const QPoint& pos) { auto menu = ui->toolBar->createContextMenu(this, tr("Context menu")); + + if (ui->listView->selectionModel()->selectedRows().size() > 1) { + menu->removeAction( ui->actionCopy_Image ); + } + menu->exec(ui->listView->mapToGlobal(pos)); delete menu; } From 03d730073281c44d3d7a3cdb3ecaa78c178d1fd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 8 Jan 2022 11:14:07 +0100 Subject: [PATCH 04/14] GH-4125 workaround for java printing garbage to stdout on bedrock linux --- launcher/java/JavaChecker.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 80c599cc1..c3132af35 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -61,6 +61,10 @@ void JavaChecker::stdoutReady() QByteArray data = process->readAllStandardOutput(); QString added = QString::fromLocal8Bit(data); added.remove('\r'); + // NOTE: workaround for GH-4125, where garbage is getting printed into stdout on bedrock linux + if (added.contains("/bedrock/strata")) { + return; + } m_stdout += added; } From addf5f4e52cf869375e2803afa0fa14dbaf71b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 8 Jan 2022 11:45:10 +0100 Subject: [PATCH 05/14] NOISSUE update README for clarity --- README.md | 55 ++++++++++++++----------------------------------------- 1 file changed, 14 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 7c2788666..89b21f0b1 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ MultiMC logo

-MultiMC 5 -========= +MultiMC +======= MultiMC is a custom launcher for Minecraft that focuses on predictability, long term stability and simplicity. @@ -15,7 +15,7 @@ While blindly submitting PRs is definitely possible, they're not necessarily goi We aren't looking for flashy features, but expanding upon the existing feature set without distruption or endangering future viability of the project is OK. ### Building -If you want to build MultiMC yourself, check [BUILD.md](BUILD.md) for build instructions. +If you want to build the launcher yourself, check [BUILD.md](BUILD.md) for build instructions. ### Code formatting Just follow the existing formatting. @@ -27,18 +27,9 @@ In general, in order of importance: * Indent with 4 space unless it's in a submodule. * Keep lists (of arguments, parameters, initializers...) as lists, not paragraphs. It should either read from top to bottom, or left to right. Not both. - ## Translations Translations can be done [on crowdin](https://translate.multimc.org). Please avoid making direct pull requests to the translations repository. -## Forking/Redistributing/Custom builds policy -We keep Launcher open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license. - -Part of the reason for using the Apache license is that we don't want people using the "MultiMC" name when redistributing the project. This means people must take the time to go through the source code and remove all references to "MultiMC", including but not limited to the project icon and the title of windows, (no *MultiMC-fork* in the title). - -Apache covers reasonable use for the name - a mention of the project's origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork *without* implying that you have our blessing. - - ## License Copyright © 2013-2021 MultiMC Contributors @@ -46,35 +37,17 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -## Build status -### Linux (Intel32) - -Build: - - -Deploy: - +## Forking/Redistributing/Custom builds policy +We keep Launcher open source because we think it's important to be able to see the source code for a project like this, and we do so using the Apache license. -### Linux (AMD64) - -Build: - - -Deploy: - +The license gives you access to the source MultiMC is build from, but: +- Not the name, logo and other branding. +- Not the API tokens required to talk to services the launcher depends on. -### macOS (AMD64) - -Build: - - -Deploy: - +Because of the nature of the agreements required to interact with the Microsoft identity platform, it's impossible for us to continue allowing everyone to build the code as 'MultiMC'. The source code has been debranded and now builds as `DevLauncher` by default. -### Windows (Intel32) - -Build: - - -Deploy: - +You must provide your own branding if you want to distribute your own builds. + +You will also have to register your own app on Azure to be able to handle Microsoft account logins. + +If you decide to fork the project, a mention of its origins in the About dialog and the license is acceptable. However, it should be abundantly clear that the project is a fork *without* implying that you have our blessing. From 52420963cf1f258f14cedd7ff41412338d73b369 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sat, 8 Jan 2022 12:26:16 +0100 Subject: [PATCH 06/14] GH-4125 fix it better --- launcher/java/JavaChecker.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index c3132af35..4557784b0 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -61,10 +61,6 @@ void JavaChecker::stdoutReady() QByteArray data = process->readAllStandardOutput(); QString added = QString::fromLocal8Bit(data); added.remove('\r'); - // NOTE: workaround for GH-4125, where garbage is getting printed into stdout on bedrock linux - if (added.contains("/bedrock/strata")) { - return; - } m_stdout += added; } @@ -107,6 +103,10 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) for(QString line : lines) { line = line.trimmed(); + // NOTE: workaround for GH-4125, where garbage is getting printed into stdout on bedrock linux + if (line.contains("/bedrock/strata")) { + continue; + } auto parts = line.split('=', QString::SkipEmptyParts); if(parts.size() != 2 || parts[0].isEmpty() || parts[1].isEmpty()) From 86d99f80c3b3c161688f6ce2fa222eb1a3ed5a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 16 Jan 2022 11:43:19 +0100 Subject: [PATCH 07/14] NOISSUE add some logging to profile fetching failures --- launcher/minecraft/auth/steps/MinecraftProfileStep.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp index 9fef99b0d..dc3df44f4 100644 --- a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp +++ b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp @@ -56,6 +56,11 @@ void MinecraftProfileStep::onRequestDone( return; } if (error != QNetworkReply::NoError) { + qWarning() << "Error getting profile:"; + qWarning() << " HTTP Status: " << requestor->httpStatus_; + qWarning() << " Internal error no.: " << error; + qWarning() << " Error string: " << requestor->errorString_; + emit finished( AccountTaskState::STATE_FAILED_SOFT, tr("Minecraft Java profile acquisition failed.") From c1bf31cb27a2b0ac675d70b6204003c1d834bbf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 16 Jan 2022 12:05:40 +0100 Subject: [PATCH 08/14] NOISSUE in java checker, ignore invalid lines altogether Declaring them as errors is just causing problems because Java randomly prints garbage to STDOUT now. --- launcher/java/JavaChecker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/java/JavaChecker.cpp b/launcher/java/JavaChecker.cpp index 4557784b0..35ddc35c2 100644 --- a/launcher/java/JavaChecker.cpp +++ b/launcher/java/JavaChecker.cpp @@ -111,7 +111,7 @@ void JavaChecker::finished(int exitcode, QProcess::ExitStatus status) auto parts = line.split('=', QString::SkipEmptyParts); if(parts.size() != 2 || parts[0].isEmpty() || parts[1].isEmpty()) { - success = false; + continue; } else { From aa770b63fba8ede60636c6c2473a20d4fe48d3a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 16 Jan 2022 12:46:20 +0100 Subject: [PATCH 09/14] NOISSUE correctly set http status code in auth reply --- launcher/minecraft/auth/AuthRequest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/auth/AuthRequest.cpp b/launcher/minecraft/auth/AuthRequest.cpp index 459d2354e..feface80f 100644 --- a/launcher/minecraft/auth/AuthRequest.cpp +++ b/launcher/minecraft/auth/AuthRequest.cpp @@ -44,7 +44,7 @@ void AuthRequest::onRequestFinished() { if (reply_ != qobject_cast(sender())) { return; } - httpStatus_ = 200; + httpStatus_ = reply_->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); finish(); } From 917f8a31e33e021d1eed84f6d731d3c1dc15b3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Sun, 16 Jan 2022 12:51:42 +0100 Subject: [PATCH 10/14] NOISSUE log server response when failing to fetch profile --- launcher/minecraft/auth/steps/MinecraftProfileStep.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp index dc3df44f4..add916599 100644 --- a/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp +++ b/launcher/minecraft/auth/steps/MinecraftProfileStep.cpp @@ -61,6 +61,9 @@ void MinecraftProfileStep::onRequestDone( qWarning() << " Internal error no.: " << error; qWarning() << " Error string: " << requestor->errorString_; + qWarning() << " Response:"; + qWarning() << QString::fromUtf8(data); + emit finished( AccountTaskState::STATE_FAILED_SOFT, tr("Minecraft Java profile acquisition failed.") From 9a33fb1f49cd1ce3c69bb358ee79527838d72afa Mon Sep 17 00:00:00 2001 From: MandipJoshi <90699866+MandipJoshi@users.noreply.github.com> Date: Mon, 17 Jan 2022 12:09:36 +0545 Subject: [PATCH 11/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89b21f0b1..b158625c0 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ In general, in order of importance: Translations can be done [on crowdin](https://translate.multimc.org). Please avoid making direct pull requests to the translations repository. ## License -Copyright © 2013-2021 MultiMC Contributors +Copyright © 2013-2022 MultiMC Contributors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this program except in compliance with the License. You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0). From 8b31c638f344322822b9e05daead542b4ad70638 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sat, 22 Jan 2022 21:58:32 +0100 Subject: [PATCH 12/14] Fix error message The code is trying to get a string from a json object, and if that fails it should log "is not a string", not "is not a timestamp". --- launcher/minecraft/auth/Parsers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/minecraft/auth/Parsers.cpp b/launcher/minecraft/auth/Parsers.cpp index ed31e9346..2dd36562f 100644 --- a/launcher/minecraft/auth/Parsers.cpp +++ b/launcher/minecraft/auth/Parsers.cpp @@ -94,7 +94,7 @@ bool parseXTokenResponse(QByteArray & data, Katabasis::Token &output, QString na return false; } if(!getString(obj.value("Token"), output.token)) { - qWarning() << "User Token is not a timestamp"; + qWarning() << "User Token is not a string"; return false; } auto arrayVal = obj.value("DisplayClaims").toObject().value("xui"); From 3aa9f5c376720f33c4ca77dc3c8803d6db5e7575 Mon Sep 17 00:00:00 2001 From: Jan200101 Date: Fri, 28 Jan 2022 19:42:30 +0100 Subject: [PATCH 13/14] Update rpm spec to support OpenSuse and conform to Fedora guidelines --- launcher/package/rpm/MultiMC5.spec | 31 +++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/launcher/package/rpm/MultiMC5.spec b/launcher/package/rpm/MultiMC5.spec index 20839f118..4b7e5002f 100644 --- a/launcher/package/rpm/MultiMC5.spec +++ b/launcher/package/rpm/MultiMC5.spec @@ -1,14 +1,20 @@ Name: MultiMC5 Version: 1.4 -Release: 3%{?dist} +Release: 4%{?dist} Summary: A local install wrapper for MultiMC License: ASL 2.0 URL: https://multimc.org -BuildArch: x86_64 +ExclusiveArch: %{ix86} x86_64 + +BuildRequires: desktop-file-utils +BuildRequires: libappstream-glib +Requires: zenity %{?suse_version:lib}qt5-qtbase wget xrandr +Provides: multimc = %{version} +Provides: MultiMC = %{version} +Provides: multimc5 = %{version} + -Requires: zenity qt5-qtbase wget xrandr -Provides: multimc MultiMC multimc5 %description A local install wrapper for MultiMC @@ -23,22 +29,29 @@ mkdir -p %{buildroot}/opt/multimc install -m 0644 ../ubuntu/multimc/opt/multimc/icon.svg %{buildroot}/opt/multimc/icon.svg install -m 0755 ../ubuntu/multimc/opt/multimc/run.sh %{buildroot}/opt/multimc/run.sh mkdir -p %{buildroot}/%{_datadir}/applications -install -m 0644 ../ubuntu/multimc/usr/share/applications/multimc.desktop %{buildroot}/%{_datadir}/applications/multimc.desktop +desktop-file-install --dir=%{buildroot}%{_datadir}/applications ../ubuntu/multimc/usr/share/applications/multimc.desktop + mkdir -p %{buildroot}/%{_datadir}/metainfo -install -m 0644 ../ubuntu/multimc/usr/share/metainfo/multimc.metainfo.xml %{buildroot}/%{_datadir}/metainfo/multimc.metainfo.xml +install -m 0644 ../ubuntu/multimc/usr/share/metainfo/multimc.metainfo.xml %{buildroot}/%{_metainfodir}/multimc.metainfo.xml mkdir -p %{buildroot}/%{_mandir}/man1 install -m 0644 ../ubuntu/multimc/usr/share/man/man1/multimc.1 %{buildroot}/%{_mandir}/man1/multimc.1 +%check +appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/multimc.metainfo.xml + %files %dir /opt/multimc /opt/multimc/icon.svg /opt/multimc/run.sh %{_datadir}/applications/multimc.desktop -%{_datadir}/metainfo/multimc.metainfo.xml -%dir /usr/share/man/man1 -%{_mandir}/man1/multimc.1.gz +%{_metainfodir}/multimc.metainfo.xml +%dir %{_mandir}/man1 +%{_mandir}/man1/multimc.1* %changelog +* Fri Jan 28 2022 Jan Drögehoff - 1.4-4 +- Update spec to support OpenSuse and conform to Fedora guidelines + * Sun Oct 03 2021 imperatorstorm <30777770+ImperatorStorm@users.noreply.github.com> - added manpage From eda06df8781339736df25c34e77781e75fc9b915 Mon Sep 17 00:00:00 2001 From: Oreoezi <37777619+Oreoezi@users.noreply.github.com> Date: Tue, 1 Feb 2022 20:33:38 +0000 Subject: [PATCH 14/14] Update BUILD.md --- BUILD.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD.md b/BUILD.md index ecc46260a..585b088c8 100644 --- a/BUILD.md +++ b/BUILD.md @@ -40,7 +40,7 @@ Getting the project to build and run on Linux is easy if you use any modern and ## Build dependencies * A C++ compiler capable of building C++11 code. -* Qt 5.6+ Development tools (http://qt-project.org/downloads) ("Qt Online Installer for Linux (64 bit)") or the equivalent from your package manager. It is always better to use the Qt from your distribution, as long as it has a new enough version. +* Qt 5.6+ Development tools (http://qt-project.org/downloads) ("Qt Online Installer for Linux (64 bit)") or the equivalent from your package manager. It is always better to use the Qt from your distribution, as long as it has a new enough version. (for example, `qttools5-dev`) * cmake 3.1 or newer * zlib (for example, `zlib1g-dev`) * Java JDK 8 (for example, `openjdk-8-jdk`)