mirror-chatterino2/src/util/XDGDesktopFile.hpp
Sam Heybey 69c983e0d9
Add support for opening links in incognito mode on Linux & BSD (#4745)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2023-08-06 15:57:01 +02:00

50 lines
1.4 KiB
C++

#pragma once
#include "util/QStringHash.hpp"
#include <optional>
#include <unordered_map>
#if defined(Q_OS_UNIX) and !defined(Q_OS_DARWIN)
namespace chatterino {
// See https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#group-header
using XDGEntries = std::unordered_map<QString, QString>;
class XDGDesktopFile
{
public:
// Read the file at `filename` as an XDG desktop file, parsing its groups & their entries
//
// Use the `isValid` function to check if the file was read properly
explicit XDGDesktopFile(const QString &filename);
/// Returns a map of entries for the given group header
XDGEntries getEntries(const QString &groupHeader) const;
/// isValid returns true if the file exists and is readable
bool isValid() const
{
return valid;
}
/// Find the first desktop file based on the given desktop file ID
///
/// This will look through all Data XDG directories
///
/// Can return std::nullopt if no desktop file was found for the given desktop file ID
///
/// References: https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s02.html#desktop-file-id
static std::optional<XDGDesktopFile> findDesktopFile(
const QString &desktopFileID);
private:
bool valid{};
std::unordered_map<QString, XDGEntries> groups;
};
} // namespace chatterino
#endif