From b5512d831139fce00139127f2469e80a0748497f Mon Sep 17 00:00:00 2001 From: kervala Date: Mon, 25 Jul 2016 18:27:53 +0200 Subject: [PATCH] Changed: Create .desktop file under Linux, see #279 --HG-- branch : develop --- .../client/ryzom_installer/res/resources.qrc | 3 + .../ryzom_installer/res/template.desktop | 10 +++ .../client/ryzom_installer/src/utils.cpp | 70 +++++++++---------- .../tools/client/ryzom_installer/src/utils.h | 2 +- 4 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 code/ryzom/tools/client/ryzom_installer/res/template.desktop diff --git a/code/ryzom/tools/client/ryzom_installer/res/resources.qrc b/code/ryzom/tools/client/ryzom_installer/res/resources.qrc index 0e7224f4e..66d8f502e 100644 --- a/code/ryzom/tools/client/ryzom_installer/res/resources.qrc +++ b/code/ryzom/tools/client/ryzom_installer/res/resources.qrc @@ -5,4 +5,7 @@ ryzom.ico + + template.desktop + diff --git a/code/ryzom/tools/client/ryzom_installer/res/template.desktop b/code/ryzom/tools/client/ryzom_installer/res/template.desktop new file mode 100644 index 000000000..83c42f5a6 --- /dev/null +++ b/code/ryzom/tools/client/ryzom_installer/res/template.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Name=$NAME +Type=Application +GenericName=MMORPG +Exec=$COMMAND +Icon=$ICON +Terminal=false +Hidden=false +Categories=Game;RolePlaying; diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp index ba65bd2ad..1e3c324a7 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp +++ b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp @@ -97,21 +97,7 @@ wchar_t* qToWide(const QString &str) #ifdef Q_OS_WIN32 -// CreateLink - Uses the Shell's IShellLink and IPersistFile interfaces -// to create and store a shortcut to the specified object. -// -// Returns the result of calling the member functions of the interfaces. -// -// Parameters: -// lpszPathObj - Address of a buffer that contains the path of the object, -// including the file name. -// lpszPathLink - Address of a buffer that contains the path where the -// Shell link is to be stored, including the file name. -// lpszDesc - Address of a buffer that contains a description of the -// Shell link, stored in the Comment field of the link -// properties. - -bool createLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc) +bool createLink(const QString &link, const QString &name, const QString &executable, const QString &arguments, const QString &icon, const QString &workingDir) { IShellLinkW* psl; @@ -123,8 +109,9 @@ bool createLink(const QString &pathObj, const QString &pathLink, const QString & IPersistFile* ppf; // Set the path to the shortcut target and add the description. - psl->SetPath(qToWide(QDir::toNativeSeparators(pathObj))); - psl->SetDescription(qToWide(desc)); + psl->SetPath(qToWide(QDir::toNativeSeparators(executable))); + psl->SetIconLocation(qToWide(QDir::toNativeSeparators(icon)), 0); + psl->SetDescription(qToWide(name)); psl->SetArguments(qToWide(arguments)); psl->SetWorkingDirectory(qToWide(QDir::toNativeSeparators(workingDir))); @@ -138,7 +125,7 @@ bool createLink(const QString &pathObj, const QString &pathLink, const QString & // for success. // Save the link by calling IPersistFile::Save. - hres = ppf->Save(qToWide(QDir::toNativeSeparators(pathLink)), TRUE); + hres = ppf->Save(qToWide(QDir::toNativeSeparators(link)), TRUE); ppf->Release(); } psl->Release(); @@ -146,23 +133,6 @@ bool createLink(const QString &pathObj, const QString &pathLink, const QString & return SUCCEEDED(hres); } -// ResolveIt - Uses the Shell's IShellLink and IPersistFile interfaces -// to retrieve the path and description from an existing shortcut. -// -// Returns the result of calling the member functions of the interfaces. -// -// Parameters: -// hwnd - A handle to the parent window. The Shell uses this window to -// display a dialog box if it needs to prompt the user for more -// information while resolving the link. -// lpszLinkFile - Address of a buffer that contains the path of the link, -// including the file name. -// lpszPath - Address of a buffer that receives the path of the link -// target, including the file name. -// lpszDesc - Address of a buffer that receives the description of the -// Shell link, stored in the Comment field of the link -// properties. - bool resolveLink(const QWidget &window, const QString &linkFile, QString &path) { IShellLinkW* psl; @@ -232,11 +202,35 @@ bool resolveLink(const QWidget &window, const QString &linkFile, QString &path) #else -bool createLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc) +bool createLink(const QString &link, const QString &name, const QString &executable, const QString &arguments, const QString &icon, const QString &workingDir) { - // TODO: create .desktop file under Linux + // open template + QFile file(":/templates/template.desktop"); - return false; + if (!file.open(QFile::ReadOnly)) return false; + + QString data = QString::fromUtf8(file.readAll()); + + file.close(); + + // build command + QString command = executable; + if (!arguments.isEmpty()) command += " " + arguments; + + // replace strings + data.replace("$NAME", name); + data.replace("$COMMAND", command); + data.replace("$ICON", icon); + + // write file + file.setFileName(link); + + if (!file.open(QFile::WriteOnly)) return false; + + file.write(data.toUtf8()); + file.close(); + + return true; } bool resolveLink(const QWidget &window, const QString &pathLink, QString &pathObj) diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.h b/code/ryzom/tools/client/ryzom_installer/src/utils.h index c729ba2cb..8072f69d6 100644 --- a/code/ryzom/tools/client/ryzom_installer/src/utils.h +++ b/code/ryzom/tools/client/ryzom_installer/src/utils.h @@ -48,7 +48,7 @@ QString qFromWide(const wchar_t *str); wchar_t* qToWide(const QString &str); -bool createLink(const QString &pathObj, const QString &pathLink, const QString &arguments, const QString &workingDir, const QString &desc); +bool createLink(const QString &link, const QString &name, const QString &executable, const QString &arguments, const QString &icon, const QString &workingDir); bool resolveLink(const QWidget &window, const QString &pathLink, QString &pathObj); bool copyInstallerExecutable(const QString &destination);