1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
//===========================================
// Lumina-DE source code
// Copyright (c) 2013, Ken Moore
// Available under the 3-clause BSD license
// See the LICENSE file for full details
//===========================================
// These structures/classes are for conforming to the FreeDesktop standards
// REFERENCE: (*.desktop files) http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s05.html
// -- Current Implementation (OCT 2013) --
// Desktop File Version Compliance: 1.0 (except "DBusActivatable")
// Icon Theme Compliance: Built in to Qt (QIcon::fromTheme()) with "oxygen" theme default
// *.desktop Exec Compliance Updated: 9/9/2014
// Mime Application Version Compliance: 1.0.1 (11/14/14) (Skips random *.desktop parsing: ~80% compliant)
//===========================================
#ifndef _LUMINA_LIBRARY_XDG_H
#define _LUMINA_LIBRARY_XDG_H
#include <QFile>
#include <QFileSystemWatcher>
#include <QDir>
#include <QFileInfo>
#include <QStringList>
#include <QString>
#include <QIcon>
#include <QList>
#include <QHash>
#include <QLocale>
#include <QTextStream>
#include <QDateTime>
#include <QDebug>
// ======================
// FreeDesktop Desktop Actions Framework (data structure)
// ======================
class XDGDesktopAction{
public:
//Admin variables
QString ID; //The ID name for this action (should correspond to an entry in the "actionList" for the XDGDesktop below)
//General Variables
QString name, icon, exec;
};
// ======================
// FreeDesktop Desktop Entry Framework (data structure)
// ======================
class XDGDesktop{
public:
enum XDGDesktopType { BAD, APP, LINK, DIR };
//Admin variables
QString filePath; //which file this structure contains the information for (absolute path)
QDateTime lastRead; //when this structure was created from the file
XDGDesktopType type;
//General variables
QString name, genericName, comment, icon;
QStringList showInList, notShowInList;
bool isHidden;
//Type 1 (APP) variables
QString exec, tryexec, path, startupWM;
QStringList actionList, mimeList, catList, keyList;
bool useTerminal, startupNotify;
QList<XDGDesktopAction> actions;
//Type 2 (LINK) variables
QString url;
//Constructor/destructor
XDGDesktop(){}
~XDGDesktop(){}
};
// ========================
// Data Structure for keeping track of known system applications
// ========================
class XDGDesktopList : public QObject{
Q_OBJECT
public:
//Functions
XDGDesktopList(QObject *parent = 0, bool watchdirs = false);
~XDGDesktopList();
//Main Interface functions
QList<XDGDesktop> apps(bool showAll, bool showHidden); //showAll: include invalid files, showHidden: include NoShow/Hidden files
//Administration variables (not typically used directly)
QDateTime lastCheck;
QStringList newApps, removedApps; //list of "new/removed" apps found during the last check
QHash<QString, XDGDesktop> files; //<filepath>/<XDGDesktop structure>
public slots:
void updateList(); //run the check routine
private:
QFileSystemWatcher *watcher;
private slots:
void watcherChanged();
signals:
void appsUpdated();
};
// ========================
// File Information simplification class (combine QFileInfo with XDGDesktop)
// Need some extra information not usually available by a QFileInfo
// ========================
class LFileInfo : public QFileInfo{
private:
QString mime, icon;
XDGDesktop desk;
void loadExtraInfo();
public:
//Couple overloaded contructors
LFileInfo(QString filepath);
LFileInfo(QFileInfo info);
~LFileInfo(){}
//Functions for accessing the extra information
// -- Return the mimetype for the file
QString mimetype();
// -- Return the icon file to use for this file
QString iconfile(); //Note: This string is auto-formatted for use in the LXDG::findIcon() routine.
// -- Check if this is an XDG desktop file
bool isDesktopFile();
// -- Allow access to the internal XDG desktop data structure
XDGDesktop* XDG();
//Other file type identification routines
bool isImage(); //Is a readable image file (for thumbnail support)
bool isAVFile(); //Is an audio/video file
};
typedef QList<LFileInfo> LFileInfoList;
// ================================
// Collection of FreeDesktop standards interaction routines
// ================================
class LXDG{
public:
//Read/write a *.desktop file
static XDGDesktop loadDesktopFile(QString filePath, bool& ok);
static bool saveDesktopFile(XDGDesktop dFile, bool merge = true);
//Check a *.desktop file for validity (showAll skips the DE-exclusivity checks)
static bool checkValidity(XDGDesktop dFile, bool showAll = true);
//Check for a valid executable
static bool checkExec(QString exec);
//Get a list of all the directories where *.desktop files exist
static QStringList systemApplicationDirs();
//Get a list of all the *.desktop files available on the system
static XDGDesktopList* systemAppsList(); //return a pointer to the entire class
static QList<XDGDesktop> systemDesktopFiles(bool showAll = false, bool showHidden = false); //simplification for getting just the files
//Sort a list of Desktop files into the proper categories
static QHash< QString, QList<XDGDesktop> > sortDesktopCats(QList<XDGDesktop> apps);
//Return the icon to use for the given category
static QString DesktopCatToIcon(QString cat);
//Sort a list of Desktop files by name
static QList<XDGDesktop> sortDesktopNames(QList<XDGDesktop> apps);
//Get the executable line from a Desktop file
static QString getDesktopExec(XDGDesktop app, QString ActionID = "");
//Set all the default XDG Environment variables
static void setEnvironmentVars();
//Find an icon from the current/default theme
static QIcon findIcon(QString iconName, QString fallback = "");
//Recursivly compile a list of child directories with *.png files in them
static QStringList getChildIconDirs(QString parent);
//List all the mime-type directories
static QStringList systemMimeDirs();
//Find the mime-type icon for a particular file extension
static QIcon findMimeIcon(QString extension);
//Find the mime-type of a particular file extension
static QString findAppMimeForFile(QString filename, bool multiple = false);
//Find the file extension for a particular mime-type
static QStringList findFilesForMime(QString mime);
// Simplification function for finding all info regarding current mime defaults
static QStringList listFileMimeDefaults();
//Find the localized comment string for a particular mime-type
static QString findMimeComment(QString mime);
//Find the default application for a mime-type
static QString findDefaultAppForMime(QString mime);
//Fine the available applications for a mime-type
static QStringList findAvailableAppsForMime(QString mime);
//Set the default application for a mime-type
static void setDefaultAppForMime(QString mime, QString app);
//List all the registered audio/video file extensions
static QStringList findAVFileExtensions();
//Load all the "globs2" mime database files
static QStringList loadMimeFileGlobs2();
//Find all the autostart *.desktop files
static QList<XDGDesktop> findAutoStartFiles(bool includeInvalid = false);
static bool setAutoStarted(bool autostart, XDGDesktop app);
static bool setAutoStarted(bool autostart, QString filePath); //for convenience
};
#endif
|